static void test_cache_purge_shared_id(skiatest::Reporter* reporter, SkResourceCache& cache) { for (int i = 0; i < COUNT; ++i) { TestingKey key(i, i & 1); // every other key will have a 1 for its sharedID cache.add(SkNEW_ARGS(TestingRec, (key, i))); } // Ensure that everyone is present for (int i = 0; i < COUNT; ++i) { TestingKey key(i, i & 1); // every other key will have a 1 for its sharedID intptr_t value = -1; REPORTER_ASSERT(reporter, cache.find(key, TestingRec::Visitor, &value)); REPORTER_ASSERT(reporter, value == i); } // Now purge the ones that had a non-zero sharedID (the odd-indexed ones) cache.purgeSharedID(1); // Ensure that only the even ones are still present for (int i = 0; i < COUNT; ++i) { TestingKey key(i, i & 1); // every other key will have a 1 for its sharedID intptr_t value = -1; if (i & 1) { REPORTER_ASSERT(reporter, !cache.find(key, TestingRec::Visitor, &value)); } else { REPORTER_ASSERT(reporter, cache.find(key, TestingRec::Visitor, &value)); REPORTER_ASSERT(reporter, value == i); } } }
static void test_cache(skiatest::Reporter* reporter, SkResourceCache& cache, bool testPurge) { for (int i = 0; i < COUNT; ++i) { TestingKey key(i); intptr_t value = -1; REPORTER_ASSERT(reporter, !cache.find(key, TestingRec::Visitor, &value)); REPORTER_ASSERT(reporter, -1 == value); cache.add(SkNEW_ARGS(TestingRec, (key, i))); REPORTER_ASSERT(reporter, cache.find(key, TestingRec::Visitor, &value)); REPORTER_ASSERT(reporter, i == value); } if (testPurge) { // stress test, should trigger purges for (int i = 0; i < COUNT * 100; ++i) { TestingKey key(i); cache.add(SkNEW_ARGS(TestingRec, (key, i))); } } // test the originals after all that purging for (int i = 0; i < COUNT; ++i) { intptr_t value; (void)cache.find(TestingKey(i), TestingRec::Visitor, &value); } cache.setTotalByteLimit(0); }
/** Does not take ownership of request. */ SkTypeface* findAndRef(Request* request) { SkTypeface* face = nullptr; fCachedResults.find(*request, [](const SkResourceCache::Rec& rec, void* context) -> bool { const Result& result = static_cast<const Result&>(rec); SkTypeface** face = static_cast<SkTypeface**>(context); *face = result.fFace; return true; }, &face); return SkSafeRef(face); }