OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "../src/image/SkImagePriv.h" | 8 #include "../src/image/SkImagePriv.h" |
9 #include "../src/image/SkSurface_Base.h" | 9 #include "../src/image/SkSurface_Base.h" |
10 #include "SkBitmap.h" | 10 #include "SkBitmap.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 SkSurface* onNewSurface(const SkImageInfo&) SK_OVERRIDE { | 63 SkSurface* onNewSurface(const SkImageInfo&) SK_OVERRIDE { |
64 return NULL; | 64 return NULL; |
65 } | 65 } |
66 | 66 |
67 SkImage* onNewImageSnapshot(Budgeted) SK_OVERRIDE { | 67 SkImage* onNewImageSnapshot(Budgeted) SK_OVERRIDE { |
68 return SkNewImageFromBitmap(fBitmap, true, &this->props()); | 68 return SkNewImageFromBitmap(fBitmap, true, &this->props()); |
69 } | 69 } |
70 | 70 |
71 void onCopyOnWrite(ContentChangeMode mode) SK_OVERRIDE { | 71 void onCopyOnWrite(ContentChangeMode mode) SK_OVERRIDE { |
72 if (mode == SkSurface::kDiscard_ContentChangeMode) { | 72 if (mode == SkSurface::kDiscard_ContentChangeMode) { |
73 fDiscardCount++; | 73 fCOWDiscardCount++; |
74 } else { | 74 } else { |
75 fRetainCount++; | 75 fCOWRetainCount++; |
76 } | 76 } |
77 } | 77 } |
78 | 78 |
79 void clearCounts() { | 79 void onDiscard() SK_OVERRIDE { |
80 fDiscardCount = 0; | 80 fDiscardCount++; |
81 fRetainCount = 0; | |
82 } | 81 } |
83 | 82 |
84 int fDiscardCount, fRetainCount; | 83 void clearCounts() { |
| 84 fCOWDiscardCount = 0; |
| 85 fCOWRetainCount = 0; |
| 86 fDiscardCount = 0; |
| 87 } |
| 88 |
| 89 int fCOWDiscardCount; |
| 90 int fCOWRetainCount; |
| 91 int fDiscardCount; |
85 SkBitmap fBitmap; | 92 SkBitmap fBitmap; |
86 }; | 93 }; |
87 | 94 |
88 static void TestDeferredCanvasWritePixelsToSurface(skiatest::Reporter* reporter)
{ | 95 static void TestDeferredCanvasWritePixelsToSurface(skiatest::Reporter* reporter)
{ |
89 SkAutoTUnref<MockSurface> surface(SkNEW_ARGS(MockSurface, (10, 10))); | 96 SkAutoTUnref<MockSurface> surface(SkNEW_ARGS(MockSurface, (10, 10))); |
90 SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get()
)); | 97 SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get()
)); |
91 | 98 |
92 SkBitmap srcBitmap; | 99 SkBitmap srcBitmap; |
93 srcBitmap.allocPixels(SkImageInfo::Make(10, 10, kRGBA_8888_SkColorType, kUnp
remul_SkAlphaType)); | 100 srcBitmap.allocPixels(SkImageInfo::Make(10, 10, kRGBA_8888_SkColorType, kUnp
remul_SkAlphaType)); |
94 srcBitmap.eraseColor(SK_ColorGREEN); | 101 srcBitmap.eraseColor(SK_ColorGREEN); |
95 // Tests below depend on this bitmap being recognized as opaque | 102 // Tests below depend on this bitmap being recognized as opaque |
96 | 103 |
97 // Preliminary sanity check: no copy on write if no active snapshot | 104 // Preliminary sanity check: no copy on write if no active snapshot |
| 105 // Discard notification happens on SkSurface::onDiscard, since no |
| 106 // active snapshot. |
98 surface->clearCounts(); | 107 surface->clearCounts(); |
99 canvas->clear(SK_ColorWHITE); | 108 canvas->clear(SK_ColorWHITE); |
| 109 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 110 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
100 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 111 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
101 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
102 | 112 |
103 surface->clearCounts(); | 113 surface->clearCounts(); |
104 canvas->flush(); | 114 canvas->flush(); |
105 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 115 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
106 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | 116 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
| 117 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); |
107 | 118 |
108 // Case 1: Discard notification happens upon flushing | 119 // Case 1: Discard notification happens upon flushing |
109 // with an Image attached. | 120 // with an Image attached. |
110 surface->clearCounts(); | 121 surface->clearCounts(); |
111 SkAutoTUnref<SkImage> image1(canvas->newImageSnapshot()); | 122 SkAutoTUnref<SkImage> image1(canvas->newImageSnapshot()); |
| 123 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 124 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
112 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 125 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
113 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
114 | 126 |
115 surface->clearCounts(); | 127 surface->clearCounts(); |
116 canvas->clear(SK_ColorWHITE); | 128 canvas->clear(SK_ColorWHITE); |
| 129 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 130 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
117 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 131 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
118 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
119 | 132 |
120 surface->clearCounts(); | 133 surface->clearCounts(); |
121 canvas->flush(); | 134 canvas->flush(); |
122 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); | 135 REPORTER_ASSERT(reporter, 1 == surface->fCOWDiscardCount); |
123 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | 136 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
| 137 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
124 | 138 |
125 // Case 2: Opaque writePixels | 139 // Case 2: Opaque writePixels |
126 surface->clearCounts(); | 140 surface->clearCounts(); |
127 SkAutoTUnref<SkImage> image2(canvas->newImageSnapshot()); | 141 SkAutoTUnref<SkImage> image2(canvas->newImageSnapshot()); |
| 142 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 143 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
128 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 144 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
129 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
130 | 145 |
131 // Case 3: writePixels that partially covers the canvas | 146 // Case 3: writePixels that partially covers the canvas |
132 surface->clearCounts(); | 147 surface->clearCounts(); |
133 SkAutoTUnref<SkImage> image3(canvas->newImageSnapshot()); | 148 SkAutoTUnref<SkImage> image3(canvas->newImageSnapshot()); |
| 149 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 150 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
134 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 151 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
135 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
136 | 152 |
137 // Case 4: unpremultiplied opaque writePixels that entirely | 153 // Case 4: unpremultiplied opaque writePixels that entirely |
138 // covers the canvas | 154 // covers the canvas |
139 surface->clearCounts(); | 155 surface->clearCounts(); |
140 SkAutoTUnref<SkImage> image4(canvas->newImageSnapshot()); | 156 SkAutoTUnref<SkImage> image4(canvas->newImageSnapshot()); |
| 157 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 158 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
141 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 159 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
142 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
143 | 160 |
144 surface->clearCounts(); | 161 surface->clearCounts(); |
145 canvas->writePixels(srcBitmap, 0, 0); | 162 canvas->writePixels(srcBitmap, 0, 0); |
146 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); | 163 REPORTER_ASSERT(reporter, 1 == surface->fCOWDiscardCount); |
147 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | 164 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
| 165 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
148 | 166 |
149 surface->clearCounts(); | 167 surface->clearCounts(); |
150 canvas->flush(); | 168 canvas->flush(); |
| 169 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 170 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
151 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 171 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
152 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
153 | 172 |
154 // Case 5: unpremultiplied opaque writePixels that partially | 173 // Case 5: unpremultiplied opaque writePixels that partially |
155 // covers the canvas | 174 // covers the canvas |
156 surface->clearCounts(); | 175 surface->clearCounts(); |
157 SkAutoTUnref<SkImage> image5(canvas->newImageSnapshot()); | 176 SkAutoTUnref<SkImage> image5(canvas->newImageSnapshot()); |
| 177 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 178 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
158 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 179 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
159 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
160 | 180 |
161 surface->clearCounts(); | 181 surface->clearCounts(); |
162 canvas->writePixels(srcBitmap, 5, 0); | 182 canvas->writePixels(srcBitmap, 5, 0); |
| 183 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 184 REPORTER_ASSERT(reporter, 1 == surface->fCOWRetainCount); |
163 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 185 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
164 REPORTER_ASSERT(reporter, 1 == surface->fRetainCount); | |
165 | 186 |
166 surface->clearCounts(); | 187 surface->clearCounts(); |
167 canvas->flush(); | 188 canvas->flush(); |
| 189 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 190 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
168 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 191 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
169 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
170 | 192 |
171 // Case 6: unpremultiplied opaque writePixels that entirely | 193 // Case 6: unpremultiplied opaque writePixels that entirely |
172 // covers the canvas, preceded by clear | 194 // covers the canvas, preceded by clear |
173 surface->clearCounts(); | 195 surface->clearCounts(); |
174 SkAutoTUnref<SkImage> image6(canvas->newImageSnapshot()); | 196 SkAutoTUnref<SkImage> image6(canvas->newImageSnapshot()); |
| 197 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 198 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
175 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 199 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
176 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
177 | 200 |
178 surface->clearCounts(); | 201 surface->clearCounts(); |
179 canvas->clear(SK_ColorWHITE); | 202 canvas->clear(SK_ColorWHITE); |
| 203 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 204 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
180 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 205 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
181 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
182 | 206 |
183 surface->clearCounts(); | 207 surface->clearCounts(); |
184 canvas->writePixels(srcBitmap, 0, 0); | 208 canvas->writePixels(srcBitmap, 0, 0); |
185 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); | 209 REPORTER_ASSERT(reporter, 1 == surface->fCOWDiscardCount); |
186 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | 210 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
| 211 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
187 | 212 |
188 surface->clearCounts(); | 213 surface->clearCounts(); |
189 canvas->flush(); | 214 canvas->flush(); |
| 215 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 216 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
190 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 217 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
191 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
192 | 218 |
193 // Case 7: unpremultiplied opaque writePixels that partially | 219 // Case 7: unpremultiplied opaque writePixels that partially |
194 // covers the canvas, preceeded by a clear | 220 // covers the canvas, preceeded by a clear |
195 surface->clearCounts(); | 221 surface->clearCounts(); |
196 SkAutoTUnref<SkImage> image7(canvas->newImageSnapshot()); | 222 SkAutoTUnref<SkImage> image7(canvas->newImageSnapshot()); |
| 223 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 224 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
197 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 225 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
198 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
199 | 226 |
200 surface->clearCounts(); | 227 surface->clearCounts(); |
201 canvas->clear(SK_ColorWHITE); | 228 canvas->clear(SK_ColorWHITE); |
| 229 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 230 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
202 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 231 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
203 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
204 | 232 |
205 surface->clearCounts(); | 233 surface->clearCounts(); |
206 canvas->writePixels(srcBitmap, 5, 0); | 234 canvas->writePixels(srcBitmap, 5, 0); |
207 REPORTER_ASSERT(reporter, 1 == surface->fDiscardCount); // because of the cl
ear | 235 REPORTER_ASSERT(reporter, 1 == surface->fCOWDiscardCount); // because of the
clear |
208 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | 236 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
| 237 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
209 | 238 |
210 surface->clearCounts(); | 239 surface->clearCounts(); |
211 canvas->flush(); | 240 canvas->flush(); |
| 241 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 242 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
212 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 243 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
213 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
214 | 244 |
215 // Case 8: unpremultiplied opaque writePixels that partially | 245 // Case 8: unpremultiplied opaque writePixels that partially |
216 // covers the canvas, preceeded by a drawREct that partially | 246 // covers the canvas, preceeded by a drawREct that partially |
217 // covers the canvas | 247 // covers the canvas |
218 surface->clearCounts(); | 248 surface->clearCounts(); |
219 SkAutoTUnref<SkImage> image8(canvas->newImageSnapshot()); | 249 SkAutoTUnref<SkImage> image8(canvas->newImageSnapshot()); |
| 250 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 251 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
220 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 252 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
221 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
222 | 253 |
223 surface->clearCounts(); | 254 surface->clearCounts(); |
224 SkPaint paint; | 255 SkPaint paint; |
225 canvas->drawRect(SkRect::MakeLTRB(0, 0, 5, 5), paint); | 256 canvas->drawRect(SkRect::MakeLTRB(0, 0, 5, 5), paint); |
| 257 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 258 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
226 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 259 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
227 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
228 | 260 |
229 surface->clearCounts(); | 261 surface->clearCounts(); |
230 canvas->writePixels(srcBitmap, 5, 0); | 262 canvas->writePixels(srcBitmap, 5, 0); |
| 263 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 264 REPORTER_ASSERT(reporter, 1 == surface->fCOWRetainCount); |
231 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 265 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
232 REPORTER_ASSERT(reporter, 1 == surface->fRetainCount); | |
233 | 266 |
234 surface->clearCounts(); | 267 surface->clearCounts(); |
235 canvas->flush(); | 268 canvas->flush(); |
| 269 REPORTER_ASSERT(reporter, 0 == surface->fCOWDiscardCount); |
| 270 REPORTER_ASSERT(reporter, 0 == surface->fCOWRetainCount); |
236 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); | 271 REPORTER_ASSERT(reporter, 0 == surface->fDiscardCount); |
237 REPORTER_ASSERT(reporter, 0 == surface->fRetainCount); | |
238 } | 272 } |
239 | 273 |
240 static void TestDeferredCanvasFlush(skiatest::Reporter* reporter) { | 274 static void TestDeferredCanvasFlush(skiatest::Reporter* reporter) { |
241 SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); | 275 SkAutoTUnref<SkSurface> surface(createSurface(0xFFFFFFFF)); |
242 SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get()
)); | 276 SkAutoTUnref<SkDeferredCanvas> canvas(SkDeferredCanvas::Create(surface.get()
)); |
243 | 277 |
244 canvas->clear(0x00000000); | 278 canvas->clear(0x00000000); |
245 | 279 |
246 // verify that clear was deferred | 280 // verify that clear was deferred |
247 REPORTER_ASSERT(reporter, 0xFFFFFFFF == read_pixel(surface, 0, 0)); | 281 REPORTER_ASSERT(reporter, 0xFFFFFFFF == read_pixel(surface, 0, 0)); |
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
902 TestDeferredCanvasSurface(reporter, NULL); | 936 TestDeferredCanvasSurface(reporter, NULL); |
903 TestDeferredCanvasSetSurface(reporter, NULL); | 937 TestDeferredCanvasSetSurface(reporter, NULL); |
904 } | 938 } |
905 | 939 |
906 DEF_GPUTEST(DeferredCanvas_GPU, reporter, factory) { | 940 DEF_GPUTEST(DeferredCanvas_GPU, reporter, factory) { |
907 if (factory != NULL) { | 941 if (factory != NULL) { |
908 TestDeferredCanvasSurface(reporter, factory); | 942 TestDeferredCanvasSurface(reporter, factory); |
909 TestDeferredCanvasSetSurface(reporter, factory); | 943 TestDeferredCanvasSetSurface(reporter, factory); |
910 } | 944 } |
911 } | 945 } |
OLD | NEW |