blob: 4c65fa3f9d8e08d018a3c980a669ef56c6727951 [file] [log] [blame]
djsollen@google.com1f584ed2013-09-19 12:08:40 +00001/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
bungeman82a455f2016-04-14 08:04:45 -07008#include "SkRefCnt.h"
djsollen@google.com1f584ed2013-09-19 12:08:40 +00009#include "SkTypeface.h"
bungeman82a455f2016-04-14 08:04:45 -070010#include "SkTypefaceCache.h"
tfarina@chromium.org8f6884a2014-01-24 20:56:26 +000011#include "Test.h"
djsollen@google.com1f584ed2013-09-19 12:08:40 +000012
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +000013DEF_TEST(Typeface, reporter) {
djsollen@google.com1f584ed2013-09-19 12:08:40 +000014
mbocee6a9912016-05-31 11:42:36 -070015 sk_sp<SkTypeface> t1(SkTypeface::MakeFromName(nullptr, SkFontStyle()));
bungeman13b9c952016-05-12 10:09:30 -070016 sk_sp<SkTypeface> t2(SkTypeface::MakeDefault(SkTypeface::kNormal));
djsollen@google.com1f584ed2013-09-19 12:08:40 +000017
18 REPORTER_ASSERT(reporter, SkTypeface::Equal(t1.get(), t2.get()));
19 REPORTER_ASSERT(reporter, SkTypeface::Equal(0, t1.get()));
20 REPORTER_ASSERT(reporter, SkTypeface::Equal(0, t2.get()));
21 REPORTER_ASSERT(reporter, SkTypeface::Equal(t1.get(), 0));
22 REPORTER_ASSERT(reporter, SkTypeface::Equal(t2.get(), 0));
23
24#ifdef SK_BUILD_FOR_ANDROID
mbocee6a9912016-05-31 11:42:36 -070025 sk_sp<SkTypeface> t3(SkTypeface::MakeFromName("non-existent-font", SkFontStyle()));
bungeman13b9c952016-05-12 10:09:30 -070026 REPORTER_ASSERT(reporter, nullptr == t3);
djsollen@google.com1f584ed2013-09-19 12:08:40 +000027#endif
28}
bungeman82a455f2016-04-14 08:04:45 -070029
bungemana821af82016-04-14 09:44:34 -070030namespace {
31
bungeman82a455f2016-04-14 08:04:45 -070032class SkEmptyTypeface : public SkTypeface {
33public:
bungemane3aea102016-07-13 05:16:58 -070034 static sk_sp<SkTypeface> Create() { return sk_sp<SkTypeface>(new SkEmptyTypeface()); }
bungeman82a455f2016-04-14 08:04:45 -070035protected:
bungemane3aea102016-07-13 05:16:58 -070036 SkEmptyTypeface() : SkTypeface(SkFontStyle(), true) { }
bungeman82a455f2016-04-14 08:04:45 -070037
38 SkStreamAsset* onOpenStream(int* ttcIndex) const override { return nullptr; }
39 SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&,
40 const SkDescriptor*) const override {
41 return nullptr;
42 }
43 void onFilterRec(SkScalerContextRec*) const override { }
44 virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics(
45 PerGlyphInfo,
46 const uint32_t*, uint32_t) const override { return nullptr; }
47 void onGetFontDescriptor(SkFontDescriptor*, bool*) const override { }
48 virtual int onCharsToGlyphs(const void* chars, Encoding encoding,
49 uint16_t glyphs[], int glyphCount) const override {
50 SK_ABORT("unimplemented");
51 return 0;
52 }
53 int onCountGlyphs() const override { return 0; };
54 int onGetUPEM() const override { return 0; };
55 void onGetFamilyName(SkString* familyName) const override { familyName->reset(); }
56 SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override {
57 SK_ABORT("unimplemented");
58 return nullptr;
59 };
60 int onGetTableTags(SkFontTableTag tags[]) const override { return 0; }
61 size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override { return 0; }
62};
63
bungemana821af82016-04-14 09:44:34 -070064}
65
bungeman82a455f2016-04-14 08:04:45 -070066static bool count_proc(SkTypeface* face, void* ctx) {
67 int* count = static_cast<int*>(ctx);
68 *count = *count + 1;
69 return false;
70}
71static int count(skiatest::Reporter* reporter, const SkTypefaceCache& cache) {
72 int count = 0;
73 SkTypeface* none = cache.findByProcAndRef(count_proc, &count);
74 REPORTER_ASSERT(reporter, none == nullptr);
75 return count;
76}
77
78DEF_TEST(TypefaceCache, reporter) {
bungemane3aea102016-07-13 05:16:58 -070079 sk_sp<SkTypeface> t1(SkEmptyTypeface::Create());
bungeman82a455f2016-04-14 08:04:45 -070080 {
81 SkTypefaceCache cache;
82 REPORTER_ASSERT(reporter, count(reporter, cache) == 0);
83 {
bungemane3aea102016-07-13 05:16:58 -070084 sk_sp<SkTypeface> t0(SkEmptyTypeface::Create());
bungeman82a455f2016-04-14 08:04:45 -070085 cache.add(t0.get());
86 REPORTER_ASSERT(reporter, count(reporter, cache) == 1);
87 cache.add(t1.get());
88 REPORTER_ASSERT(reporter, count(reporter, cache) == 2);
89 cache.purgeAll();
90 REPORTER_ASSERT(reporter, count(reporter, cache) == 2);
91 }
92 REPORTER_ASSERT(reporter, count(reporter, cache) == 2);
93 cache.purgeAll();
94 REPORTER_ASSERT(reporter, count(reporter, cache) == 1);
95 }
96 REPORTER_ASSERT(reporter, t1->unique());
97}