blob: a7946f49ca5e7168f3384c2267df281546b011d1 [file] [log] [blame]
reed@google.com772443a2013-12-11 15:30:24 +00001 /*
reed@google.com602a1d72013-07-23 19:13:54 +00002 * 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
8#include "Test.h"
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +00009#include "TestClassDef.h"
reed@google.come4eb1222013-12-09 22:29:30 +000010#include "SkDiscardableMemory.h"
reed@google.com602a1d72013-07-23 19:13:54 +000011#include "SkScaledImageCache.h"
12
13static void make_bm(SkBitmap* bm, int w, int h) {
14 bm->setConfig(SkBitmap::kARGB_8888_Config, w, h);
15 bm->allocPixels();
16}
17
reed@google.come4eb1222013-12-09 22:29:30 +000018static const int COUNT = 10;
19static const int DIM = 256;
20
21static void test_cache(skiatest::Reporter* reporter, SkScaledImageCache& cache,
22 bool testPurge) {
reed@google.com602a1d72013-07-23 19:13:54 +000023 SkScaledImageCache::ID* id;
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000024
reed@google.com602a1d72013-07-23 19:13:54 +000025 SkBitmap bm[COUNT];
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000026
reed@google.com772443a2013-12-11 15:30:24 +000027 const SkScalar scale = 2;
28 for (int i = 0; i < COUNT; ++i) {
29 make_bm(&bm[i], DIM, DIM);
30 }
tfarina@chromium.org4f3c3052013-12-14 15:12:48 +000031
reed@google.com0e661622013-07-23 19:27:48 +000032 for (int i = 0; i < COUNT; ++i) {
reed@google.com602a1d72013-07-23 19:13:54 +000033 SkBitmap tmp;
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000034
reed@google.com772443a2013-12-11 15:30:24 +000035 SkScaledImageCache::ID* id = cache.findAndLock(bm[i], scale, scale, &tmp);
reed@google.com602a1d72013-07-23 19:13:54 +000036 REPORTER_ASSERT(reporter, NULL == id);
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000037
reed@google.com602a1d72013-07-23 19:13:54 +000038 make_bm(&tmp, DIM, DIM);
39 id = cache.addAndLock(bm[i], scale, scale, tmp);
40 REPORTER_ASSERT(reporter, NULL != id);
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000041
reed@google.com602a1d72013-07-23 19:13:54 +000042 SkBitmap tmp2;
43 SkScaledImageCache::ID* id2 = cache.findAndLock(bm[i], scale, scale,
44 &tmp2);
45 REPORTER_ASSERT(reporter, id == id2);
46 REPORTER_ASSERT(reporter, tmp.pixelRef() == tmp2.pixelRef());
47 REPORTER_ASSERT(reporter, tmp.width() == tmp2.width());
48 REPORTER_ASSERT(reporter, tmp.height() == tmp2.height());
49 cache.unlock(id2);
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000050
reed@google.com602a1d72013-07-23 19:13:54 +000051 cache.unlock(id);
52 }
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000053
reed@google.come4eb1222013-12-09 22:29:30 +000054 if (testPurge) {
55 // stress test, should trigger purges
reed@google.com772443a2013-12-11 15:30:24 +000056 float incScale = 2;
reed@google.come4eb1222013-12-09 22:29:30 +000057 for (size_t i = 0; i < COUNT * 100; ++i) {
reed@google.com772443a2013-12-11 15:30:24 +000058 incScale += 1;
skia.committer@gmail.comcf0803b2013-12-10 07:02:03 +000059
reed@google.come4eb1222013-12-09 22:29:30 +000060 SkBitmap tmp;
reed@google.come4eb1222013-12-09 22:29:30 +000061 make_bm(&tmp, DIM, DIM);
reed@google.com772443a2013-12-11 15:30:24 +000062
63 SkScaledImageCache::ID* id = cache.addAndLock(bm[0], incScale,
64 incScale, tmp);
reed@google.come4eb1222013-12-09 22:29:30 +000065 REPORTER_ASSERT(reporter, NULL != id);
66 cache.unlock(id);
67 }
reed@google.com602a1d72013-07-23 19:13:54 +000068 }
reed@google.com772443a2013-12-11 15:30:24 +000069
70 // test the originals after all that purging
71 for (int i = 0; i < COUNT; ++i) {
72 SkBitmap tmp;
73 id = cache.findAndLock(bm[i], scale, scale, &tmp);
74 if (id) {
75 cache.unlock(id);
76 }
77 }
78
reed@google.com602a1d72013-07-23 19:13:54 +000079 cache.setByteLimit(0);
80}
81
reed@google.com772443a2013-12-11 15:30:24 +000082#include "SkDiscardableMemoryPool.h"
83
84static SkDiscardableMemoryPool* gPool;
85static SkDiscardableMemory* pool_factory(size_t bytes) {
86 return gPool->create(bytes);
87}
88
tfarina@chromium.orge4fafb12013-12-12 21:11:12 +000089DEF_TEST(ImageCache, reporter) {
reed@google.com772443a2013-12-11 15:30:24 +000090 static const size_t defLimit = DIM * DIM * 4 * COUNT + 1024; // 1K slop
91
reed@google.come4eb1222013-12-09 22:29:30 +000092 {
reed@google.come4eb1222013-12-09 22:29:30 +000093 SkScaledImageCache cache(defLimit);
94 test_cache(reporter, cache, true);
95 }
96 {
reed@google.com772443a2013-12-11 15:30:24 +000097 SkDiscardableMemoryPool pool(defLimit);
98 gPool = &pool;
99 SkScaledImageCache cache(pool_factory);
100 test_cache(reporter, cache, true);
101 }
102 {
reed@google.come4eb1222013-12-09 22:29:30 +0000103 SkScaledImageCache cache(SkDiscardableMemory::Create);
104 test_cache(reporter, cache, false);
105 }
106}
107
rmistry@google.comd6bab022013-12-02 13:50:38 +0000108DEF_TEST(ImageCache_doubleAdd, r) {
109 // Adding the same key twice should be safe.
110 SkScaledImageCache cache(1024);
111
112 SkBitmap original;
113 original.setConfig(SkBitmap::kARGB_8888_Config, 40, 40);
114 original.allocPixels();
115
116 SkBitmap scaled;
117 scaled.setConfig(SkBitmap::kARGB_8888_Config, 20, 20);
118 scaled.allocPixels();
119
120 SkScaledImageCache::ID* id1 = cache.addAndLock(original, 0.5f, 0.5f, scaled);
121 SkScaledImageCache::ID* id2 = cache.addAndLock(original, 0.5f, 0.5f, scaled);
122 // We don't really care if id1 == id2 as long as unlocking both works.
123 cache.unlock(id1);
124 cache.unlock(id2);
125}