Index: tests/TypefaceTest.cpp |
diff --git a/tests/TypefaceTest.cpp b/tests/TypefaceTest.cpp |
index b3bc157eba81ed09fd1aadf98ffb63af49e172d8..130cabf37a72562c96da12a545b47e02503800d6 100644 |
--- a/tests/TypefaceTest.cpp |
+++ b/tests/TypefaceTest.cpp |
@@ -5,7 +5,9 @@ |
* found in the LICENSE file. |
*/ |
+#include "SkRefCnt.h" |
#include "SkTypeface.h" |
+#include "SkTypefaceCache.h" |
#include "Test.h" |
DEF_TEST(Typeface, reporter) { |
@@ -24,3 +26,68 @@ DEF_TEST(Typeface, reporter) { |
REPORTER_ASSERT(reporter, nullptr == t3.get()); |
#endif |
} |
+ |
+class SkEmptyTypeface : public SkTypeface { |
+public: |
+ static sk_sp<SkTypeface> Create(SkFontID id) { return sk_sp<SkTypeface>(new SkEmptyTypeface(id)); } |
+protected: |
+ SkEmptyTypeface(SkFontID id) : SkTypeface(SkFontStyle(), id, true) { } |
+ |
+ SkStreamAsset* onOpenStream(int* ttcIndex) const override { return nullptr; } |
+ SkScalerContext* onCreateScalerContext(const SkScalerContextEffects&, |
+ const SkDescriptor*) const override { |
+ return nullptr; |
+ } |
+ void onFilterRec(SkScalerContextRec*) const override { } |
+ virtual SkAdvancedTypefaceMetrics* onGetAdvancedTypefaceMetrics( |
+ PerGlyphInfo, |
+ const uint32_t*, uint32_t) const override { return nullptr; } |
+ void onGetFontDescriptor(SkFontDescriptor*, bool*) const override { } |
+ virtual int onCharsToGlyphs(const void* chars, Encoding encoding, |
+ uint16_t glyphs[], int glyphCount) const override { |
+ SK_ABORT("unimplemented"); |
+ return 0; |
+ } |
+ int onCountGlyphs() const override { return 0; }; |
+ int onGetUPEM() const override { return 0; }; |
+ void onGetFamilyName(SkString* familyName) const override { familyName->reset(); } |
+ SkTypeface::LocalizedStrings* onCreateFamilyNameIterator() const override { |
+ SK_ABORT("unimplemented"); |
+ return nullptr; |
+ }; |
+ int onGetTableTags(SkFontTableTag tags[]) const override { return 0; } |
+ size_t onGetTableData(SkFontTableTag, size_t, size_t, void*) const override { return 0; } |
+}; |
+ |
+static bool count_proc(SkTypeface* face, void* ctx) { |
+ int* count = static_cast<int*>(ctx); |
+ *count = *count + 1; |
+ return false; |
+} |
+static int count(skiatest::Reporter* reporter, const SkTypefaceCache& cache) { |
+ int count = 0; |
+ SkTypeface* none = cache.findByProcAndRef(count_proc, &count); |
+ REPORTER_ASSERT(reporter, none == nullptr); |
+ return count; |
+} |
+ |
+DEF_TEST(TypefaceCache, reporter) { |
+ sk_sp<SkTypeface> t1(SkEmptyTypeface::Create(1)); |
+ { |
+ SkTypefaceCache cache; |
+ REPORTER_ASSERT(reporter, count(reporter, cache) == 0); |
+ { |
+ sk_sp<SkTypeface> t0(SkEmptyTypeface::Create(0)); |
+ cache.add(t0.get()); |
+ REPORTER_ASSERT(reporter, count(reporter, cache) == 1); |
+ cache.add(t1.get()); |
+ REPORTER_ASSERT(reporter, count(reporter, cache) == 2); |
+ cache.purgeAll(); |
+ REPORTER_ASSERT(reporter, count(reporter, cache) == 2); |
+ } |
+ REPORTER_ASSERT(reporter, count(reporter, cache) == 2); |
+ cache.purgeAll(); |
+ REPORTER_ASSERT(reporter, count(reporter, cache) == 1); |
+ } |
+ REPORTER_ASSERT(reporter, t1->unique()); |
+} |