Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: tests/DeferredCanvasTest.cpp

Issue 20628005: Fixing SkDeferredCanvas::writePixels to trigger appropriate change notifications to SkSurface (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2012 Google Inc. 3 * Copyright 2012 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 #include "Test.h" 8 #include "Test.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkBitmapProcShader.h" 10 #include "SkBitmapProcShader.h"
11 #include "SkDeferredCanvas.h" 11 #include "SkDeferredCanvas.h"
12 #include "SkDevice.h" 12 #include "SkDevice.h"
13 #include "SkGradientShader.h" 13 #include "SkGradientShader.h"
14 #include "SkShader.h" 14 #include "SkShader.h"
15 #include "SkSurface.h" 15 #include "../src/image/SkSurface_Base.h"
Justin Novosad 2013/08/01 18:48:01 For mocking
16 #include "../src/image/SkImagePriv.h"
16 #if SK_SUPPORT_GPU 17 #if SK_SUPPORT_GPU
17 #include "GrContextFactory.h" 18 #include "GrContextFactory.h"
18 #else 19 #else
19 class GrContextFactory; 20 class GrContextFactory;
20 #endif 21 #endif
21 22
22 static const int gWidth = 2; 23 static const int gWidth = 2;
23 static const int gHeight = 2; 24 static const int gHeight = 2;
24 25
25 static void create(SkBitmap* bm, SkBitmap::Config config, SkColor color) { 26 static void create(SkBitmap* bm, SkBitmap::Config config, SkColor color) {
(...skipping 16 matching lines...) Expand all
42 43
43 canvas->clear(0x00000000); 44 canvas->clear(0x00000000);
44 45
45 SkAutoLockPixels alp(store); 46 SkAutoLockPixels alp(store);
46 REPORTER_ASSERT(reporter, store.getColor(0,0) == 0xFFFFFFFF); //verify that clear was deferred 47 REPORTER_ASSERT(reporter, store.getColor(0,0) == 0xFFFFFFFF); //verify that clear was deferred
47 SkBitmap accessed = canvas->getDevice()->accessBitmap(false); 48 SkBitmap accessed = canvas->getDevice()->accessBitmap(false);
48 REPORTER_ASSERT(reporter, store.getColor(0,0) == 0x00000000); //verify that clear was executed 49 REPORTER_ASSERT(reporter, store.getColor(0,0) == 0x00000000); //verify that clear was executed
49 REPORTER_ASSERT(reporter, accessed.pixelRef() == store.pixelRef()); 50 REPORTER_ASSERT(reporter, accessed.pixelRef() == store.pixelRef());
50 } 51 }
51 52
53 class MockSurface : public SkSurface_Base {
54 public:
55 MockSurface(int width, int height) : SkSurface_Base(width, height) {
56 clearCounts();
57 fBitmap.setConfig(SkBitmap::kARGB_8888_Config, width, height);
58 fBitmap.allocPixels();
59 }
60
61 virtual SkCanvas* onNewCanvas() SK_OVERRIDE {
62 return SkNEW_ARGS(SkCanvas, (fBitmap));
63 }
64
65 virtual SkSurface* onNewSurface(const SkImage::Info&) SK_OVERRIDE {
66 return NULL;
67 }
68
69 virtual SkImage* onNewImageSnapshot() SK_OVERRIDE {
70 return SkNewImageFromBitmap(fBitmap, true);
71 }
72
73 virtual void onCopyOnWrite(ContentChangeMode mode) SK_OVERRIDE {
74 if (mode == SkSurface::kDiscard_ContentChangeMode) {
75 fDiscardCount++;
76 } else {
77 fRetainCount++;
78 }
79 }
80
81 void clearCounts() {
82 fDiscardCount = 0;
83 fRetainCount = 0;
84 }
85
86 int fDiscardCount, fRetainCount;
87 SkBitmap fBitmap;
88 };
89
90 static void TestDeferredCanvasWritePixelsToSurface(skiatest::Reporter* reporter) {
91 SkAutoTUnref<MockSurface> surface(SkNEW_ARGS(MockSurface, (10, 10)));
92 SkAutoTUnref<SkDeferredCanvas> canvas(
93 #if SK_DEFERRED_CANVAS_USES_FACTORIES
94 SkDeferredCanvas::Create(surface.get()));
95 #else
96 SkNEW_ARGS(SkDeferredCanvas, (surface.get())));
97 #endif
98
99 SkBitmap srcBitmap;
100 srcBitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10);
101 srcBitmap.allocPixels();
102 srcBitmap.eraseColor(SK_ColorGREEN);
103 // Tests below depend on this bitmap being recognized as opaque
104
105 // Preliminary sanity check: no copy on write if no active snapshot
106 surface->clearCounts();
107 canvas->clear(SK_ColorWHITE);
108 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
109 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
110
111 surface->clearCounts();
112 canvas->flush();
113 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
114 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
115
116 // Case 1: Discard notification happens upon flushing
117 // with an Image attached.
118 surface->clearCounts();
119 SkAutoTUnref<SkImage> image1(canvas->newImageSnapshot());
120 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
121 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
122
123 surface->clearCounts();
124 canvas->clear(SK_ColorWHITE);
125 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
126 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
127
128 surface->clearCounts();
129 canvas->flush();
130 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount);
131 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
132
133 // Case 2: Opaque writePixels
134 surface->clearCounts();
135 SkAutoTUnref<SkImage> image2(canvas->newImageSnapshot());
136 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
137 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
138
139 surface->clearCounts();
140 canvas->writePixels(srcBitmap, 0, 0);
141 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
142 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
143
144 surface->clearCounts();
145 canvas->flush();
146 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount);
147 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
148
149 // Case 3: writePixels that partially covers the canvas
150 surface->clearCounts();
151 SkAutoTUnref<SkImage> image3(canvas->newImageSnapshot());
152 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
153 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
154
155 surface->clearCounts();
156 canvas->writePixels(srcBitmap, 5, 0);
157 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
158 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
159
160 surface->clearCounts();
161 canvas->flush();
162 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
163 REPORTER_ASSERT(reporter, 1 == surface->fRetainCount);
164
165 // Case 4: unpremultiplied opaque writePixels that entirely
166 // covers the canvas
167 surface->clearCounts();
168 SkAutoTUnref<SkImage> image4(canvas->newImageSnapshot());
169 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
170 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
171
172 surface->clearCounts();
173 canvas->writePixels(srcBitmap, 0, 0, SkCanvas::kRGBA_Unpremul_Config8888);
174 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount);
Justin Novosad 2013/08/01 18:48:01 This one failed before the fix
175 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
176
177 surface->clearCounts();
178 canvas->flush();
179 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
180 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
181
182 // Case 5: unpremultiplied opaque writePixels that partially
183 // covers the canvas
184 surface->clearCounts();
185 SkAutoTUnref<SkImage> image5(canvas->newImageSnapshot());
186 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
187 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
188
189 surface->clearCounts();
190 canvas->writePixels(srcBitmap, 5, 0, SkCanvas::kRGBA_Unpremul_Config8888);
191 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
192 REPORTER_ASSERT(reporter, 1 == surface->fRetainCount);
Justin Novosad 2013/08/01 18:48:01 This one failed before the fix
193
194 surface->clearCounts();
195 canvas->flush();
196 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
197 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
198
199 // Case 6: unpremultiplied opaque writePixels that entirely
200 // covers the canvas, preceded by clear
201 surface->clearCounts();
202 SkAutoTUnref<SkImage> image6(canvas->newImageSnapshot());
203 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
204 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
205
206 surface->clearCounts();
207 canvas->clear(SK_ColorWHITE);
208 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
209 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
210
211 surface->clearCounts();
212 canvas->writePixels(srcBitmap, 0, 0, SkCanvas::kRGBA_Unpremul_Config8888);
213 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount);
214 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
215
216 surface->clearCounts();
217 canvas->flush();
218 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
219 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
220
221 // Case 7: unpremultiplied opaque writePixels that partially
222 // covers the canvas, preceeded by a clear
223 surface->clearCounts();
224 SkAutoTUnref<SkImage> image7(canvas->newImageSnapshot());
225 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
226 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
227
228 surface->clearCounts();
229 canvas->clear(SK_ColorWHITE);
230 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
231 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
232
233 surface->clearCounts();
234 canvas->writePixels(srcBitmap, 5, 0, SkCanvas::kRGBA_Unpremul_Config8888);
235 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); // because of the cl ear
236 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
237
238 surface->clearCounts();
239 canvas->flush();
240 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
241 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
242
243 // Case 8: unpremultiplied opaque writePixels that partially
244 // covers the canvas, preceeded by a drawREct that partially
245 // covers the canvas
246 surface->clearCounts();
247 SkAutoTUnref<SkImage> image8(canvas->newImageSnapshot());
248 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
249 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
250
251 surface->clearCounts();
252 SkPaint paint;
253 canvas->drawRect(SkRect::MakeLTRB(0, 0, 5, 5), paint);
254 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
255 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
256
257 surface->clearCounts();
258 canvas->writePixels(srcBitmap, 5, 0, SkCanvas::kRGBA_Unpremul_Config8888);
259 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
260 REPORTER_ASSERT(reporter, 1 == surface->fRetainCount);
261
262 surface->clearCounts();
263 canvas->flush();
264 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount);
265 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount);
266 }
267
52 static void TestDeferredCanvasFlush(skiatest::Reporter* reporter) { 268 static void TestDeferredCanvasFlush(skiatest::Reporter* reporter) {
53 SkBitmap store; 269 SkBitmap store;
54 270
55 create(&store, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF); 271 create(&store, SkBitmap::kARGB_8888_Config, 0xFFFFFFFF);
56 SkDevice device(store); 272 SkDevice device(store);
57 SkAutoTUnref<SkDeferredCanvas> canvas( 273 SkAutoTUnref<SkDeferredCanvas> canvas(
58 #if SK_DEFERRED_CANVAS_USES_FACTORIES 274 #if SK_DEFERRED_CANVAS_USES_FACTORIES
59 SkDeferredCanvas::Create(&device)); 275 SkDeferredCanvas::Create(&device));
60 #else 276 #else
61 SkNEW_ARGS(SkDeferredCanvas, (&device))); 277 SkNEW_ARGS(SkDeferredCanvas, (&device)));
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 static void TestDeferredCanvas(skiatest::Reporter* reporter, GrContextFactory* f actory) { 898 static void TestDeferredCanvas(skiatest::Reporter* reporter, GrContextFactory* f actory) {
683 TestDeferredCanvasBitmapAccess(reporter); 899 TestDeferredCanvasBitmapAccess(reporter);
684 TestDeferredCanvasFlush(reporter); 900 TestDeferredCanvasFlush(reporter);
685 TestDeferredCanvasFreshFrame(reporter); 901 TestDeferredCanvasFreshFrame(reporter);
686 TestDeferredCanvasMemoryLimit(reporter); 902 TestDeferredCanvasMemoryLimit(reporter);
687 TestDeferredCanvasBitmapCaching(reporter); 903 TestDeferredCanvasBitmapCaching(reporter);
688 TestDeferredCanvasSkip(reporter); 904 TestDeferredCanvasSkip(reporter);
689 TestDeferredCanvasBitmapShaderNoLeak(reporter); 905 TestDeferredCanvasBitmapShaderNoLeak(reporter);
690 TestDeferredCanvasBitmapSizeThreshold(reporter); 906 TestDeferredCanvasBitmapSizeThreshold(reporter);
691 TestDeferredCanvasCreateCompatibleDevice(reporter); 907 TestDeferredCanvasCreateCompatibleDevice(reporter);
908 TestDeferredCanvasWritePixelsToSurface(reporter);
692 TestDeferredCanvasSurface(reporter, NULL); 909 TestDeferredCanvasSurface(reporter, NULL);
693 TestDeferredCanvasSetSurface(reporter, NULL); 910 TestDeferredCanvasSetSurface(reporter, NULL);
694 if (NULL != factory) { 911 if (NULL != factory) {
695 TestDeferredCanvasSurface(reporter, factory); 912 TestDeferredCanvasSurface(reporter, factory);
696 TestDeferredCanvasSetSurface(reporter, factory); 913 TestDeferredCanvasSetSurface(reporter, factory);
697 } 914 }
698 } 915 }
699 916
700 #include "TestClassDef.h" 917 #include "TestClassDef.h"
701 DEFINE_GPUTESTCLASS("DeferredCanvas", TestDeferredCanvasClass, TestDeferredCanva s) 918 DEFINE_GPUTESTCLASS("DeferredCanvas", TestDeferredCanvasClass, TestDeferredCanva s)
OLDNEW
« src/utils/SkDeferredCanvas.cpp ('K') | « src/utils/SkDeferredCanvas.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698