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

Side by Side Diff: tests/PictureTest.cpp

Issue 1811703002: return pictures as sk_sp (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rely on RVO in picturerecorder Created 4 years, 9 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
« no previous file with comments | « tests/PictureShaderTest.cpp ('k') | tests/RecordOptsTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "SkBBoxHierarchy.h" 8 #include "SkBBoxHierarchy.h"
9 #include "SkBlurImageFilter.h" 9 #include "SkBlurImageFilter.h"
10 #include "SkCanvas.h" 10 #include "SkCanvas.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 47
48 // For a while willPlayBackBitmaps() ignored SkImages and just looked for SkBitm aps. 48 // For a while willPlayBackBitmaps() ignored SkImages and just looked for SkBitm aps.
49 static void test_images_are_found_by_willPlayBackBitmaps(skiatest::Reporter* rep orter) { 49 static void test_images_are_found_by_willPlayBackBitmaps(skiatest::Reporter* rep orter) {
50 // We just need _some_ SkImage 50 // We just need _some_ SkImage
51 const SkPMColor pixel = 0; 51 const SkPMColor pixel = 0;
52 const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); 52 const SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1);
53 sk_sp<SkImage> image(SkImage::MakeRasterCopy(SkPixmap(info, &pixel, sizeof(p ixel)))); 53 sk_sp<SkImage> image(SkImage::MakeRasterCopy(SkPixmap(info, &pixel, sizeof(p ixel))));
54 54
55 SkPictureRecorder recorder; 55 SkPictureRecorder recorder;
56 recorder.beginRecording(100,100)->drawImage(image, 0,0); 56 recorder.beginRecording(100,100)->drawImage(image, 0,0);
57 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 57 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
58 58
59 REPORTER_ASSERT(reporter, picture->willPlayBackBitmaps()); 59 REPORTER_ASSERT(reporter, picture->willPlayBackBitmaps());
60 } 60 }
61 61
62 /* Hit a few SkPicture::Analysis cases not handled elsewhere. */ 62 /* Hit a few SkPicture::Analysis cases not handled elsewhere. */
63 static void test_analysis(skiatest::Reporter* reporter) { 63 static void test_analysis(skiatest::Reporter* reporter) {
64 SkPictureRecorder recorder; 64 SkPictureRecorder recorder;
65 65
66 SkCanvas* canvas = recorder.beginRecording(100, 100); 66 SkCanvas* canvas = recorder.beginRecording(100, 100);
67 { 67 {
68 canvas->drawRect(SkRect::MakeWH(10, 10), SkPaint ()); 68 canvas->drawRect(SkRect::MakeWH(10, 10), SkPaint ());
69 } 69 }
70 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 70 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
71 REPORTER_ASSERT(reporter, !picture->willPlayBackBitmaps()); 71 REPORTER_ASSERT(reporter, !picture->willPlayBackBitmaps());
72 72
73 canvas = recorder.beginRecording(100, 100); 73 canvas = recorder.beginRecording(100, 100);
74 { 74 {
75 SkPaint paint; 75 SkPaint paint;
76 // CreateBitmapShader is too smart for us; an empty (or 1x1) bitmap shad er 76 // CreateBitmapShader is too smart for us; an empty (or 1x1) bitmap shad er
77 // gets optimized into a non-bitmap form, so we create a 2x2 bitmap here . 77 // gets optimized into a non-bitmap form, so we create a 2x2 bitmap here .
78 SkBitmap bitmap; 78 SkBitmap bitmap;
79 bitmap.allocPixels(SkImageInfo::MakeN32Premul(2, 2)); 79 bitmap.allocPixels(SkImageInfo::MakeN32Premul(2, 2));
80 bitmap.eraseColor(SK_ColorBLUE); 80 bitmap.eraseColor(SK_ColorBLUE);
81 *(bitmap.getAddr32(0, 0)) = SK_ColorGREEN; 81 *(bitmap.getAddr32(0, 0)) = SK_ColorGREEN;
82 paint.setShader(SkShader::MakeBitmapShader(bitmap, SkShader::kClamp_Tile Mode, 82 paint.setShader(SkShader::MakeBitmapShader(bitmap, SkShader::kClamp_Tile Mode,
83 SkShader::kClamp_TileMode)); 83 SkShader::kClamp_TileMode));
84 REPORTER_ASSERT(reporter, paint.getShader()->isABitmap()); 84 REPORTER_ASSERT(reporter, paint.getShader()->isABitmap());
85 85
86 canvas->drawRect(SkRect::MakeWH(10, 10), paint); 86 canvas->drawRect(SkRect::MakeWH(10, 10), paint);
87 } 87 }
88 picture.reset(recorder.endRecording()); 88 REPORTER_ASSERT(reporter, recorder.finishRecordingAsPicture()->willPlayBackB itmaps());
89 REPORTER_ASSERT(reporter, picture->willPlayBackBitmaps());
90 } 89 }
91 90
92 91
93 #ifdef SK_DEBUG 92 #ifdef SK_DEBUG
94 // Ensure that deleting an empty SkPicture does not assert. Asserts only fire 93 // Ensure that deleting an empty SkPicture does not assert. Asserts only fire
95 // in debug mode, so only run in debug mode. 94 // in debug mode, so only run in debug mode.
96 static void test_deleting_empty_picture() { 95 static void test_deleting_empty_picture() {
97 SkPictureRecorder recorder; 96 SkPictureRecorder recorder;
98 // Creates an SkPictureRecord 97 // Creates an SkPictureRecord
99 recorder.beginRecording(0, 0); 98 recorder.beginRecording(0, 0);
100 // Turns that into an SkPicture 99 // Turns that into an SkPicture
101 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 100 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
102 // Ceates a new SkPictureRecord 101 // Ceates a new SkPictureRecord
103 recorder.beginRecording(0, 0); 102 recorder.beginRecording(0, 0);
104 } 103 }
105 104
106 // Ensure that serializing an empty picture does not assert. Likewise only runs in debug mode. 105 // Ensure that serializing an empty picture does not assert. Likewise only runs in debug mode.
107 static void test_serializing_empty_picture() { 106 static void test_serializing_empty_picture() {
108 SkPictureRecorder recorder; 107 SkPictureRecorder recorder;
109 recorder.beginRecording(0, 0); 108 recorder.beginRecording(0, 0);
110 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 109 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
111 SkDynamicMemoryWStream stream; 110 SkDynamicMemoryWStream stream;
112 picture->serialize(&stream); 111 picture->serialize(&stream);
113 } 112 }
114 #endif 113 #endif
115 114
116 static void rand_op(SkCanvas* canvas, SkRandom& rand) { 115 static void rand_op(SkCanvas* canvas, SkRandom& rand) {
117 SkPaint paint; 116 SkPaint paint;
118 SkRect rect = SkRect::MakeWH(50, 50); 117 SkRect rect = SkRect::MakeWH(50, 50);
119 118
120 SkScalar unit = rand.nextUScalar1(); 119 SkScalar unit = rand.nextUScalar1();
(...skipping 27 matching lines...) Expand all
148 SkAutoTUnref<SkPathEffect> dash(SkDashPathEffect::Create(intervals, 2, 0 )); 147 SkAutoTUnref<SkPathEffect> dash(SkDashPathEffect::Create(intervals, 2, 0 ));
149 148
150 SkPaint paint; 149 SkPaint paint;
151 paint.setStyle(SkPaint::kStroke_Style); 150 paint.setStyle(SkPaint::kStroke_Style);
152 paint.setPathEffect(dash); 151 paint.setPathEffect(dash);
153 152
154 for (int i = 0; i < 50; ++i) { 153 for (int i = 0; i < 50; ++i) {
155 canvas->drawPath(path, paint); 154 canvas->drawPath(path, paint);
156 } 155 }
157 } 156 }
158 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 157 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
159 // path effects currently render an SkPicture undesireable for GPU rendering 158 // path effects currently render an SkPicture undesireable for GPU rendering
160 159
161 const char *reason = nullptr; 160 const char *reason = nullptr;
162 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr, &re ason)); 161 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr, &re ason));
163 REPORTER_ASSERT(reporter, reason); 162 REPORTER_ASSERT(reporter, reason);
164 163
165 canvas = recorder.beginRecording(100, 100); 164 canvas = recorder.beginRecording(100, 100);
166 { 165 {
167 SkPath path; 166 SkPath path;
168 167
169 path.moveTo(0, 0); 168 path.moveTo(0, 0);
170 path.lineTo(0, 50); 169 path.lineTo(0, 50);
171 path.lineTo(25, 25); 170 path.lineTo(25, 25);
172 path.lineTo(50, 50); 171 path.lineTo(50, 50);
173 path.lineTo(50, 0); 172 path.lineTo(50, 0);
174 path.close(); 173 path.close();
175 REPORTER_ASSERT(reporter, !path.isConvex()); 174 REPORTER_ASSERT(reporter, !path.isConvex());
176 175
177 SkPaint paint; 176 SkPaint paint;
178 paint.setAntiAlias(true); 177 paint.setAntiAlias(true);
179 for (int i = 0; i < 50; ++i) { 178 for (int i = 0; i < 50; ++i) {
180 canvas->drawPath(path, paint); 179 canvas->drawPath(path, paint);
181 } 180 }
182 } 181 }
183 picture.reset(recorder.endRecording()); 182 picture = recorder.finishRecordingAsPicture();
184 // A lot of small AA concave paths should be fine for GPU rendering 183 // A lot of small AA concave paths should be fine for GPU rendering
185 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); 184 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr));
186 185
187 canvas = recorder.beginRecording(100, 100); 186 canvas = recorder.beginRecording(100, 100);
188 { 187 {
189 SkPath path; 188 SkPath path;
190 189
191 path.moveTo(0, 0); 190 path.moveTo(0, 0);
192 path.lineTo(0, 100); 191 path.lineTo(0, 100);
193 path.lineTo(50, 50); 192 path.lineTo(50, 50);
194 path.lineTo(100, 100); 193 path.lineTo(100, 100);
195 path.lineTo(100, 0); 194 path.lineTo(100, 0);
196 path.close(); 195 path.close();
197 REPORTER_ASSERT(reporter, !path.isConvex()); 196 REPORTER_ASSERT(reporter, !path.isConvex());
198 197
199 SkPaint paint; 198 SkPaint paint;
200 paint.setAntiAlias(true); 199 paint.setAntiAlias(true);
201 for (int i = 0; i < 50; ++i) { 200 for (int i = 0; i < 50; ++i) {
202 canvas->drawPath(path, paint); 201 canvas->drawPath(path, paint);
203 } 202 }
204 } 203 }
205 picture.reset(recorder.endRecording()); 204 picture = recorder.finishRecordingAsPicture();
206 // A lot of large AA concave paths currently render an SkPicture undesireabl e for GPU rendering 205 // A lot of large AA concave paths currently render an SkPicture undesireabl e for GPU rendering
207 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); 206 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr));
208 207
209 canvas = recorder.beginRecording(100, 100); 208 canvas = recorder.beginRecording(100, 100);
210 { 209 {
211 SkPath path; 210 SkPath path;
212 211
213 path.moveTo(0, 0); 212 path.moveTo(0, 0);
214 path.lineTo(0, 50); 213 path.lineTo(0, 50);
215 path.lineTo(25, 25); 214 path.lineTo(25, 25);
216 path.lineTo(50, 50); 215 path.lineTo(50, 50);
217 path.lineTo(50, 0); 216 path.lineTo(50, 0);
218 path.close(); 217 path.close();
219 REPORTER_ASSERT(reporter, !path.isConvex()); 218 REPORTER_ASSERT(reporter, !path.isConvex());
220 219
221 SkPaint paint; 220 SkPaint paint;
222 paint.setAntiAlias(true); 221 paint.setAntiAlias(true);
223 paint.setStyle(SkPaint::kStroke_Style); 222 paint.setStyle(SkPaint::kStroke_Style);
224 paint.setStrokeWidth(0); 223 paint.setStrokeWidth(0);
225 for (int i = 0; i < 50; ++i) { 224 for (int i = 0; i < 50; ++i) {
226 canvas->drawPath(path, paint); 225 canvas->drawPath(path, paint);
227 } 226 }
228 } 227 }
229 picture.reset(recorder.endRecording()); 228 picture = recorder.finishRecordingAsPicture();
230 // hairline stroked AA concave paths are fine for GPU rendering 229 // hairline stroked AA concave paths are fine for GPU rendering
231 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); 230 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr));
232 231
233 canvas = recorder.beginRecording(100, 100); 232 canvas = recorder.beginRecording(100, 100);
234 { 233 {
235 SkPaint paint; 234 SkPaint paint;
236 SkScalar intervals [] = { 10, 20 }; 235 SkScalar intervals [] = { 10, 20 };
237 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); 236 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25);
238 paint.setPathEffect(pe)->unref(); 237 paint.setPathEffect(pe)->unref();
239 238
240 SkPoint points [2] = { { 0, 0 }, { 100, 0 } }; 239 SkPoint points [2] = { { 0, 0 }, { 100, 0 } };
241 240
242 for (int i = 0; i < 50; ++i) { 241 for (int i = 0; i < 50; ++i) {
243 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint); 242 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint);
244 } 243 }
245 } 244 }
246 picture.reset(recorder.endRecording()); 245 picture = recorder.finishRecordingAsPicture();
247 // fast-path dashed effects are fine for GPU rendering ... 246 // fast-path dashed effects are fine for GPU rendering ...
248 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); 247 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr));
249 248
250 canvas = recorder.beginRecording(100, 100); 249 canvas = recorder.beginRecording(100, 100);
251 { 250 {
252 SkPaint paint; 251 SkPaint paint;
253 SkScalar intervals [] = { 10, 20 }; 252 SkScalar intervals [] = { 10, 20 };
254 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); 253 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25);
255 paint.setPathEffect(pe)->unref(); 254 paint.setPathEffect(pe)->unref();
256 255
257 for (int i = 0; i < 50; ++i) { 256 for (int i = 0; i < 50; ++i) {
258 canvas->drawRect(SkRect::MakeWH(10, 10), paint); 257 canvas->drawRect(SkRect::MakeWH(10, 10), paint);
259 } 258 }
260 } 259 }
261 picture.reset(recorder.endRecording()); 260 picture = recorder.finishRecordingAsPicture();
262 // ... but only when applied to drawPoint() calls 261 // ... but only when applied to drawPoint() calls
263 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); 262 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr));
264 263
265 // Nest the previous picture inside a new one. 264 // Nest the previous picture inside a new one.
266 canvas = recorder.beginRecording(100, 100); 265 canvas = recorder.beginRecording(100, 100);
267 { 266 {
268 canvas->drawPicture(picture.get()); 267 canvas->drawPicture(picture.get());
269 } 268 }
270 picture.reset(recorder.endRecording()); 269 picture = recorder.finishRecordingAsPicture();
271 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); 270 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr));
272 } 271 }
273 272
274 #endif 273 #endif
275 274
276 static void test_savelayer_extraction(skiatest::Reporter* reporter) { 275 static void test_savelayer_extraction(skiatest::Reporter* reporter) {
277 static const int kWidth = 100; 276 static const int kWidth = 100;
278 static const int kHeight = 100; 277 static const int kHeight = 100;
279 278
280 // Create complex paint that the bounding box computation code can't 279 // Create complex paint that the bounding box computation code can't
281 // optimize away 280 // optimize away
282 SkScalar blueToRedMatrix[20] = { 0 }; 281 SkScalar blueToRedMatrix[20] = { 0 };
283 blueToRedMatrix[2] = blueToRedMatrix[18] = SK_Scalar1; 282 blueToRedMatrix[2] = blueToRedMatrix[18] = SK_Scalar1;
284 SkAutoTUnref<SkColorFilter> blueToRed(SkColorMatrixFilter::Create(blueToRedM atrix)); 283 SkAutoTUnref<SkColorFilter> blueToRed(SkColorMatrixFilter::Create(blueToRedM atrix));
285 SkAutoTUnref<SkImageFilter> filter(SkColorFilterImageFilter::Create(blueToRe d.get())); 284 SkAutoTUnref<SkImageFilter> filter(SkColorFilterImageFilter::Create(blueToRe d.get()));
286 285
287 SkPaint complexPaint; 286 SkPaint complexPaint;
288 complexPaint.setImageFilter(filter); 287 complexPaint.setImageFilter(filter);
289 288
290 SkAutoTUnref<SkPicture> pict, child; 289 sk_sp<SkPicture> pict, child;
291 SkRTreeFactory bbhFactory; 290 SkRTreeFactory bbhFactory;
292 291
293 { 292 {
294 SkPictureRecorder recorder; 293 SkPictureRecorder recorder;
295 294
296 SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), SkIntToScal ar(kHeight), 295 SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), SkIntToScal ar(kHeight),
297 &bbhFactory, 296 &bbhFactory,
298 SkPictureRecorder::kComputeSaveLay erInfo_RecordFlag); 297 SkPictureRecorder::kComputeSaveLay erInfo_RecordFlag);
299 298
300 c->saveLayer(nullptr, &complexPaint); 299 c->saveLayer(nullptr, &complexPaint);
301 c->restore(); 300 c->restore();
302 301
303 child.reset(recorder.endRecording()); 302 child = recorder.finishRecordingAsPicture();
304 } 303 }
305 304
306 // create a picture with the structure: 305 // create a picture with the structure:
307 // 1) 306 // 1)
308 // SaveLayer 307 // SaveLayer
309 // Restore 308 // Restore
310 // 2) 309 // 2)
311 // SaveLayer 310 // SaveLayer
312 // Translate 311 // Translate
313 // SaveLayer w/ bound 312 // SaveLayer w/ bound
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 { 360 {
362 SkPaint picturePaint; 361 SkPaint picturePaint;
363 SkMatrix trans; 362 SkMatrix trans;
364 trans.setTranslate(10, 10); 363 trans.setTranslate(10, 10);
365 364
366 c->saveLayer(nullptr, &layerPaint); // layer #6 365 c->saveLayer(nullptr, &layerPaint); // layer #6
367 c->drawPicture(child, &trans, &picturePaint); // layer #7 inside picture 366 c->drawPicture(child, &trans, &picturePaint); // layer #7 inside picture
368 c->restore(); 367 c->restore();
369 } 368 }
370 369
371 pict.reset(recorder.endRecording()); 370 pict = recorder.finishRecordingAsPicture();
372 } 371 }
373 372
374 // Now test out the SaveLayer extraction 373 // Now test out the SaveLayer extraction
375 if (!SkCanvas::Internal_Private_GetIgnoreSaveLayerBounds()) { 374 if (!SkCanvas::Internal_Private_GetIgnoreSaveLayerBounds()) {
376 const SkBigPicture* bp = pict->asSkBigPicture(); 375 const SkBigPicture* bp = pict->asSkBigPicture();
377 REPORTER_ASSERT(reporter, bp); 376 REPORTER_ASSERT(reporter, bp);
378 377
379 const SkBigPicture::AccelData* data = bp->accelData(); 378 const SkBigPicture::AccelData* data = bp->accelData();
380 REPORTER_ASSERT(reporter, data); 379 REPORTER_ASSERT(reporter, data);
381 380
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 REPORTER_ASSERT(reporter, nullptr == info4.fPicture); 438 REPORTER_ASSERT(reporter, nullptr == info4.fPicture);
440 REPORTER_ASSERT(reporter, kWidth == info4.fBounds.width() && 439 REPORTER_ASSERT(reporter, kWidth == info4.fBounds.width() &&
441 kHeight == info4.fBounds.height()); 440 kHeight == info4.fBounds.height());
442 REPORTER_ASSERT(reporter, 0 == info4.fBounds.fLeft && 0 == info4.fBounds .fTop); 441 REPORTER_ASSERT(reporter, 0 == info4.fBounds.fLeft && 0 == info4.fBounds .fTop);
443 REPORTER_ASSERT(reporter, info4.fLocalMat.isIdentity()); 442 REPORTER_ASSERT(reporter, info4.fLocalMat.isIdentity());
444 REPORTER_ASSERT(reporter, info4.fPreMat.isIdentity()); 443 REPORTER_ASSERT(reporter, info4.fPreMat.isIdentity());
445 REPORTER_ASSERT(reporter, info4.fPaint); 444 REPORTER_ASSERT(reporter, info4.fPaint);
446 REPORTER_ASSERT(reporter, !info4.fIsNested && 445 REPORTER_ASSERT(reporter, !info4.fIsNested &&
447 info4.fHasNestedLayers); // has a nested SL 446 info4.fHasNestedLayers); // has a nested SL
448 447
449 REPORTER_ASSERT(reporter, child == info5.fPicture); // in a child pictur e 448 REPORTER_ASSERT(reporter, child.get() == info5.fPicture); // in a child picture
450 REPORTER_ASSERT(reporter, kWidth == info5.fBounds.width() && 449 REPORTER_ASSERT(reporter, kWidth == info5.fBounds.width() &&
451 kHeight == info5.fBounds.height()); 450 kHeight == info5.fBounds.height());
452 REPORTER_ASSERT(reporter, 0 == info5.fBounds.fLeft && 0 == info5.fBounds .fTop); 451 REPORTER_ASSERT(reporter, 0 == info5.fBounds.fLeft && 0 == info5.fBounds .fTop);
453 REPORTER_ASSERT(reporter, info5.fLocalMat.isIdentity()); 452 REPORTER_ASSERT(reporter, info5.fLocalMat.isIdentity());
454 REPORTER_ASSERT(reporter, info5.fPreMat.isIdentity()); 453 REPORTER_ASSERT(reporter, info5.fPreMat.isIdentity());
455 REPORTER_ASSERT(reporter, nullptr != info5.fPaint); 454 REPORTER_ASSERT(reporter, nullptr != info5.fPaint);
456 REPORTER_ASSERT(reporter, info5.fIsNested && !info5.fHasNestedLayers); / / is nested 455 REPORTER_ASSERT(reporter, info5.fIsNested && !info5.fHasNestedLayers); / / is nested
457 456
458 REPORTER_ASSERT(reporter, nullptr == info6.fPicture); 457 REPORTER_ASSERT(reporter, nullptr == info6.fPicture);
459 REPORTER_ASSERT(reporter, kWidth-10 == info6.fBounds.width() && 458 REPORTER_ASSERT(reporter, kWidth-10 == info6.fBounds.width() &&
460 kHeight-10 == info6.fBounds.height()); 459 kHeight-10 == info6.fBounds.height());
461 REPORTER_ASSERT(reporter, 10 == info6.fBounds.fLeft && 10 == info6.fBoun ds.fTop); 460 REPORTER_ASSERT(reporter, 10 == info6.fBounds.fLeft && 10 == info6.fBoun ds.fTop);
462 REPORTER_ASSERT(reporter, info6.fLocalMat.isIdentity()); 461 REPORTER_ASSERT(reporter, info6.fLocalMat.isIdentity());
463 REPORTER_ASSERT(reporter, info6.fPreMat.isIdentity()); 462 REPORTER_ASSERT(reporter, info6.fPreMat.isIdentity());
464 REPORTER_ASSERT(reporter, info6.fPaint); 463 REPORTER_ASSERT(reporter, info6.fPaint);
465 REPORTER_ASSERT(reporter, !info6.fIsNested && 464 REPORTER_ASSERT(reporter, !info6.fIsNested &&
466 info6.fHasNestedLayers); // has a nested SL 465 info6.fHasNestedLayers); // has a nested SL
467 466
468 REPORTER_ASSERT(reporter, child == info7.fPicture); // in a child pictur e 467 REPORTER_ASSERT(reporter, child.get() == info7.fPicture); // in a child picture
469 REPORTER_ASSERT(reporter, kWidth == info7.fBounds.width() && 468 REPORTER_ASSERT(reporter, kWidth == info7.fBounds.width() &&
470 kHeight == info7.fBounds.height()); 469 kHeight == info7.fBounds.height());
471 REPORTER_ASSERT(reporter, 0 == info7.fBounds.fLeft && 0 == info7.fBounds .fTop); 470 REPORTER_ASSERT(reporter, 0 == info7.fBounds.fLeft && 0 == info7.fBounds .fTop);
472 REPORTER_ASSERT(reporter, info7.fLocalMat.isIdentity()); 471 REPORTER_ASSERT(reporter, info7.fLocalMat.isIdentity());
473 REPORTER_ASSERT(reporter, info7.fPreMat.isIdentity()); 472 REPORTER_ASSERT(reporter, info7.fPreMat.isIdentity());
474 REPORTER_ASSERT(reporter, nullptr != info7.fPaint); 473 REPORTER_ASSERT(reporter, nullptr != info7.fPaint);
475 REPORTER_ASSERT(reporter, info7.fIsNested && !info7.fHasNestedLayers); / / is nested 474 REPORTER_ASSERT(reporter, info7.fIsNested && !info7.fHasNestedLayers); / / is nested
476 } 475 }
477 } 476 }
478 477
479 static void test_has_text(skiatest::Reporter* reporter) { 478 static void test_has_text(skiatest::Reporter* reporter) {
480 SkPictureRecorder recorder; 479 SkPictureRecorder recorder;
481 480
482 SkCanvas* canvas = recorder.beginRecording(100,100); 481 SkCanvas* canvas = recorder.beginRecording(100,100);
483 { 482 {
484 canvas->drawRect(SkRect::MakeWH(20, 20), SkPaint()); 483 canvas->drawRect(SkRect::MakeWH(20, 20), SkPaint());
485 } 484 }
486 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 485 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
487 REPORTER_ASSERT(reporter, !picture->hasText()); 486 REPORTER_ASSERT(reporter, !picture->hasText());
488 487
489 SkPoint point = SkPoint::Make(10, 10); 488 SkPoint point = SkPoint::Make(10, 10);
490 canvas = recorder.beginRecording(100,100); 489 canvas = recorder.beginRecording(100,100);
491 { 490 {
492 canvas->drawText("Q", 1, point.fX, point.fY, SkPaint()); 491 canvas->drawText("Q", 1, point.fX, point.fY, SkPaint());
493 } 492 }
494 picture.reset(recorder.endRecording()); 493 picture = recorder.finishRecordingAsPicture();
495 REPORTER_ASSERT(reporter, picture->hasText()); 494 REPORTER_ASSERT(reporter, picture->hasText());
496 495
497 canvas = recorder.beginRecording(100,100); 496 canvas = recorder.beginRecording(100,100);
498 { 497 {
499 canvas->drawPosText("Q", 1, &point, SkPaint()); 498 canvas->drawPosText("Q", 1, &point, SkPaint());
500 } 499 }
501 picture.reset(recorder.endRecording()); 500 picture = recorder.finishRecordingAsPicture();
502 REPORTER_ASSERT(reporter, picture->hasText()); 501 REPORTER_ASSERT(reporter, picture->hasText());
503 502
504 canvas = recorder.beginRecording(100,100); 503 canvas = recorder.beginRecording(100,100);
505 { 504 {
506 canvas->drawPosTextH("Q", 1, &point.fX, point.fY, SkPaint()); 505 canvas->drawPosTextH("Q", 1, &point.fX, point.fY, SkPaint());
507 } 506 }
508 picture.reset(recorder.endRecording()); 507 picture = recorder.finishRecordingAsPicture();
509 REPORTER_ASSERT(reporter, picture->hasText()); 508 REPORTER_ASSERT(reporter, picture->hasText());
510 509
511 canvas = recorder.beginRecording(100,100); 510 canvas = recorder.beginRecording(100,100);
512 { 511 {
513 SkPath path; 512 SkPath path;
514 path.moveTo(0, 0); 513 path.moveTo(0, 0);
515 path.lineTo(50, 50); 514 path.lineTo(50, 50);
516 515
517 canvas->drawTextOnPathHV("Q", 1, path, point.fX, point.fY, SkPaint()); 516 canvas->drawTextOnPathHV("Q", 1, path, point.fX, point.fY, SkPaint());
518 } 517 }
519 picture.reset(recorder.endRecording()); 518 picture = recorder.finishRecordingAsPicture();
520 REPORTER_ASSERT(reporter, picture->hasText()); 519 REPORTER_ASSERT(reporter, picture->hasText());
521 520
522 canvas = recorder.beginRecording(100,100); 521 canvas = recorder.beginRecording(100,100);
523 { 522 {
524 SkPath path; 523 SkPath path;
525 path.moveTo(0, 0); 524 path.moveTo(0, 0);
526 path.lineTo(50, 50); 525 path.lineTo(50, 50);
527 526
528 canvas->drawTextOnPath("Q", 1, path, nullptr, SkPaint()); 527 canvas->drawTextOnPath("Q", 1, path, nullptr, SkPaint());
529 } 528 }
530 picture.reset(recorder.endRecording()); 529 picture = recorder.finishRecordingAsPicture();
531 REPORTER_ASSERT(reporter, picture->hasText()); 530 REPORTER_ASSERT(reporter, picture->hasText());
532 531
533 // Nest the previous picture inside a new one. 532 // Nest the previous picture inside a new one.
534 canvas = recorder.beginRecording(100,100); 533 canvas = recorder.beginRecording(100,100);
535 { 534 {
536 canvas->drawPicture(picture.get()); 535 canvas->drawPicture(picture.get());
537 } 536 }
538 picture.reset(recorder.endRecording()); 537 picture = recorder.finishRecordingAsPicture();
539 REPORTER_ASSERT(reporter, picture->hasText()); 538 REPORTER_ASSERT(reporter, picture->hasText());
540 } 539 }
541 540
542 static void set_canvas_to_save_count_4(SkCanvas* canvas) { 541 static void set_canvas_to_save_count_4(SkCanvas* canvas) {
543 canvas->restoreToCount(1); 542 canvas->restoreToCount(1);
544 canvas->save(); 543 canvas->save();
545 canvas->save(); 544 canvas->save();
546 canvas->save(); 545 canvas->save();
547 } 546 }
548 547
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 // so expect to have seen no more than num{Saves,SaveLayers,Restores}. 596 // so expect to have seen no more than num{Saves,SaveLayers,Restores}.
598 REPORTER_ASSERT(reporter, numSaves >= canvas.getSaveCount()); 597 REPORTER_ASSERT(reporter, numSaves >= canvas.getSaveCount());
599 REPORTER_ASSERT(reporter, numSaveLayers >= canvas.getSaveLayerCount()); 598 REPORTER_ASSERT(reporter, numSaveLayers >= canvas.getSaveLayerCount());
600 REPORTER_ASSERT(reporter, numRestores >= canvas.getRestoreCount()); 599 REPORTER_ASSERT(reporter, numRestores >= canvas.getRestoreCount());
601 } 600 }
602 601
603 // This class exists so SkPicture can friend it and give it access to 602 // This class exists so SkPicture can friend it and give it access to
604 // the 'partialReplay' method. 603 // the 'partialReplay' method.
605 class SkPictureRecorderReplayTester { 604 class SkPictureRecorderReplayTester {
606 public: 605 public:
607 static SkPicture* Copy(SkPictureRecorder* recorder) { 606 static sk_sp<SkPicture> Copy(SkPictureRecorder* recorder) {
608 SkPictureRecorder recorder2; 607 SkPictureRecorder recorder2;
609 608
610 SkCanvas* canvas = recorder2.beginRecording(10, 10); 609 SkCanvas* canvas = recorder2.beginRecording(10, 10);
611 610
612 recorder->partialReplay(canvas); 611 recorder->partialReplay(canvas);
613 612
614 return recorder2.endRecording(); 613 return recorder2.finishRecordingAsPicture();
615 } 614 }
616 }; 615 };
617 616
618 static void create_imbalance(SkCanvas* canvas) { 617 static void create_imbalance(SkCanvas* canvas) {
619 SkRect clipRect = SkRect::MakeWH(2, 2); 618 SkRect clipRect = SkRect::MakeWH(2, 2);
620 SkRect drawRect = SkRect::MakeWH(10, 10); 619 SkRect drawRect = SkRect::MakeWH(10, 10);
621 canvas->save(); 620 canvas->save();
622 canvas->clipRect(clipRect, SkRegion::kReplace_Op); 621 canvas->clipRect(clipRect, SkRegion::kReplace_Op);
623 canvas->translate(1.0f, 1.0f); 622 canvas->translate(1.0f, 1.0f);
624 SkPaint p; 623 SkPaint p;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 // Test out SkPictureRecorder::partialReplay 656 // Test out SkPictureRecorder::partialReplay
658 DEF_TEST(PictureRecorder_replay, reporter) { 657 DEF_TEST(PictureRecorder_replay, reporter) {
659 // check save/saveLayer state 658 // check save/saveLayer state
660 { 659 {
661 SkPictureRecorder recorder; 660 SkPictureRecorder recorder;
662 661
663 SkCanvas* canvas = recorder.beginRecording(10, 10); 662 SkCanvas* canvas = recorder.beginRecording(10, 10);
664 663
665 canvas->saveLayer(nullptr, nullptr); 664 canvas->saveLayer(nullptr, nullptr);
666 665
667 SkAutoTUnref<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&record er)); 666 sk_sp<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&recorder));
668 667
669 // The extra save and restore comes from the Copy process. 668 // The extra save and restore comes from the Copy process.
670 check_save_state(reporter, copy, 2, 1, 3); 669 check_save_state(reporter, copy.get(), 2, 1, 3);
671 670
672 canvas->saveLayer(nullptr, nullptr); 671 canvas->saveLayer(nullptr, nullptr);
673 672
674 SkAutoTUnref<SkPicture> final(recorder.endRecording()); 673 sk_sp<SkPicture> final(recorder.finishRecordingAsPicture());
675 674
676 check_save_state(reporter, final, 1, 2, 3); 675 check_save_state(reporter, final.get(), 1, 2, 3);
677 676
678 // The copy shouldn't pick up any operations added after it was made 677 // The copy shouldn't pick up any operations added after it was made
679 check_save_state(reporter, copy, 2, 1, 3); 678 check_save_state(reporter, copy.get(), 2, 1, 3);
680 } 679 }
681 680
682 // (partially) check leakage of draw ops 681 // (partially) check leakage of draw ops
683 { 682 {
684 SkPictureRecorder recorder; 683 SkPictureRecorder recorder;
685 684
686 SkCanvas* canvas = recorder.beginRecording(10, 10); 685 SkCanvas* canvas = recorder.beginRecording(10, 10);
687 686
688 SkRect r = SkRect::MakeWH(5, 5); 687 SkRect r = SkRect::MakeWH(5, 5);
689 SkPaint p; 688 SkPaint p;
690 689
691 canvas->drawRect(r, p); 690 canvas->drawRect(r, p);
692 691
693 SkAutoTUnref<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&record er)); 692 sk_sp<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&recorder));
694 693
695 REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps()); 694 REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps());
696 695
697 SkBitmap bm; 696 SkBitmap bm;
698 make_bm(&bm, 10, 10, SK_ColorRED, true); 697 make_bm(&bm, 10, 10, SK_ColorRED, true);
699 698
700 r.offset(5.0f, 5.0f); 699 r.offset(5.0f, 5.0f);
701 canvas->drawBitmapRect(bm, r, nullptr); 700 canvas->drawBitmapRect(bm, r, nullptr);
702 701
703 SkAutoTUnref<SkPicture> final(recorder.endRecording()); 702 sk_sp<SkPicture> final(recorder.finishRecordingAsPicture());
704 REPORTER_ASSERT(reporter, final->willPlayBackBitmaps()); 703 REPORTER_ASSERT(reporter, final->willPlayBackBitmaps());
705 704
706 REPORTER_ASSERT(reporter, copy->uniqueID() != final->uniqueID()); 705 REPORTER_ASSERT(reporter, copy->uniqueID() != final->uniqueID());
707 706
708 // The snapshot shouldn't pick up any operations added after it was made 707 // The snapshot shouldn't pick up any operations added after it was made
709 REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps()); 708 REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps());
710 } 709 }
711 710
712 // Recreate the Android partialReplay test case 711 // Recreate the Android partialReplay test case
713 { 712 {
714 SkPictureRecorder recorder; 713 SkPictureRecorder recorder;
715 714
716 SkCanvas* canvas = recorder.beginRecording(4, 3, nullptr, 0); 715 SkCanvas* canvas = recorder.beginRecording(4, 3, nullptr, 0);
717 create_imbalance(canvas); 716 create_imbalance(canvas);
718 717
719 int expectedSaveCount = canvas->getSaveCount(); 718 int expectedSaveCount = canvas->getSaveCount();
720 719
721 SkAutoTUnref<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&record er)); 720 sk_sp<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&recorder));
722 check_balance(reporter, copy); 721 check_balance(reporter, copy.get());
723 722
724 REPORTER_ASSERT(reporter, expectedSaveCount = canvas->getSaveCount()); 723 REPORTER_ASSERT(reporter, expectedSaveCount = canvas->getSaveCount());
725 724
726 // End the recording of source to test the picture finalization 725 // End the recording of source to test the picture finalization
727 // process isn't complicated by the partialReplay step 726 // process isn't complicated by the partialReplay step
728 SkAutoTUnref<SkPicture> final(recorder.endRecording()); 727 sk_sp<SkPicture> final(recorder.finishRecordingAsPicture());
729 } 728 }
730 } 729 }
731 730
732 static void test_unbalanced_save_restores(skiatest::Reporter* reporter) { 731 static void test_unbalanced_save_restores(skiatest::Reporter* reporter) {
733 SkCanvas testCanvas(100, 100); 732 SkCanvas testCanvas(100, 100);
734 set_canvas_to_save_count_4(&testCanvas); 733 set_canvas_to_save_count_4(&testCanvas);
735 734
736 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); 735 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount());
737 736
738 SkPaint paint; 737 SkPaint paint;
739 SkRect rect = SkRect::MakeLTRB(-10000000, -10000000, 10000000, 10000000); 738 SkRect rect = SkRect::MakeLTRB(-10000000, -10000000, 10000000, 10000000);
740 739
741 SkPictureRecorder recorder; 740 SkPictureRecorder recorder;
742 741
743 { 742 {
744 // Create picture with 2 unbalanced saves 743 // Create picture with 2 unbalanced saves
745 SkCanvas* canvas = recorder.beginRecording(100, 100); 744 SkCanvas* canvas = recorder.beginRecording(100, 100);
746 canvas->save(); 745 canvas->save();
747 canvas->translate(10, 10); 746 canvas->translate(10, 10);
748 canvas->drawRect(rect, paint); 747 canvas->drawRect(rect, paint);
749 canvas->save(); 748 canvas->save();
750 canvas->translate(10, 10); 749 canvas->translate(10, 10);
751 canvas->drawRect(rect, paint); 750 canvas->drawRect(rect, paint);
752 SkAutoTUnref<SkPicture> extraSavePicture(recorder.endRecording()); 751 sk_sp<SkPicture> extraSavePicture(recorder.finishRecordingAsPicture());
753 752
754 testCanvas.drawPicture(extraSavePicture); 753 testCanvas.drawPicture(extraSavePicture);
755 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); 754 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount());
756 } 755 }
757 756
758 set_canvas_to_save_count_4(&testCanvas); 757 set_canvas_to_save_count_4(&testCanvas);
759 758
760 { 759 {
761 // Create picture with 2 unbalanced restores 760 // Create picture with 2 unbalanced restores
762 SkCanvas* canvas = recorder.beginRecording(100, 100); 761 SkCanvas* canvas = recorder.beginRecording(100, 100);
763 canvas->save(); 762 canvas->save();
764 canvas->translate(10, 10); 763 canvas->translate(10, 10);
765 canvas->drawRect(rect, paint); 764 canvas->drawRect(rect, paint);
766 canvas->save(); 765 canvas->save();
767 canvas->translate(10, 10); 766 canvas->translate(10, 10);
768 canvas->drawRect(rect, paint); 767 canvas->drawRect(rect, paint);
769 canvas->restore(); 768 canvas->restore();
770 canvas->restore(); 769 canvas->restore();
771 canvas->restore(); 770 canvas->restore();
772 canvas->restore(); 771 canvas->restore();
773 SkAutoTUnref<SkPicture> extraRestorePicture(recorder.endRecording()); 772 sk_sp<SkPicture> extraRestorePicture(recorder.finishRecordingAsPicture() );
774 773
775 testCanvas.drawPicture(extraRestorePicture); 774 testCanvas.drawPicture(extraRestorePicture);
776 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); 775 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount());
777 } 776 }
778 777
779 set_canvas_to_save_count_4(&testCanvas); 778 set_canvas_to_save_count_4(&testCanvas);
780 779
781 { 780 {
782 SkCanvas* canvas = recorder.beginRecording(100, 100); 781 SkCanvas* canvas = recorder.beginRecording(100, 100);
783 canvas->translate(10, 10); 782 canvas->translate(10, 10);
784 canvas->drawRect(rect, paint); 783 canvas->drawRect(rect, paint);
785 SkAutoTUnref<SkPicture> noSavePicture(recorder.endRecording()); 784 sk_sp<SkPicture> noSavePicture(recorder.finishRecordingAsPicture());
786 785
787 testCanvas.drawPicture(noSavePicture); 786 testCanvas.drawPicture(noSavePicture);
788 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount()); 787 REPORTER_ASSERT(reporter, 4 == testCanvas.getSaveCount());
789 REPORTER_ASSERT(reporter, testCanvas.getTotalMatrix().isIdentity()); 788 REPORTER_ASSERT(reporter, testCanvas.getTotalMatrix().isIdentity());
790 } 789 }
791 } 790 }
792 791
793 static void test_peephole() { 792 static void test_peephole() {
794 SkRandom rand; 793 SkRandom rand;
795 794
796 SkPictureRecorder recorder; 795 SkPictureRecorder recorder;
797 796
798 for (int j = 0; j < 100; j++) { 797 for (int j = 0; j < 100; j++) {
799 SkRandom rand2(rand); // remember the seed 798 SkRandom rand2(rand); // remember the seed
800 799
801 SkCanvas* canvas = recorder.beginRecording(100, 100); 800 SkCanvas* canvas = recorder.beginRecording(100, 100);
802 801
803 for (int i = 0; i < 1000; ++i) { 802 for (int i = 0; i < 1000; ++i) {
804 rand_op(canvas, rand); 803 rand_op(canvas, rand);
805 } 804 }
806 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 805 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
807 806
808 rand = rand2; 807 rand = rand2;
809 } 808 }
810 809
811 { 810 {
812 SkCanvas* canvas = recorder.beginRecording(100, 100); 811 SkCanvas* canvas = recorder.beginRecording(100, 100);
813 SkRect rect = SkRect::MakeWH(50, 50); 812 SkRect rect = SkRect::MakeWH(50, 50);
814 813
815 for (int i = 0; i < 100; ++i) { 814 for (int i = 0; i < 100; ++i) {
816 canvas->save(); 815 canvas->save();
817 } 816 }
818 while (canvas->getSaveCount() > 1) { 817 while (canvas->getSaveCount() > 1) {
819 canvas->clipRect(rect); 818 canvas->clipRect(rect);
820 canvas->restore(); 819 canvas->restore();
821 } 820 }
822 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 821 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
823 } 822 }
824 } 823 }
825 824
826 #ifndef SK_DEBUG 825 #ifndef SK_DEBUG
827 // Only test this is in release mode. We deliberately crash in debug mode, since a valid caller 826 // Only test this is in release mode. We deliberately crash in debug mode, since a valid caller
828 // should never do this. 827 // should never do this.
829 static void test_bad_bitmap() { 828 static void test_bad_bitmap() {
830 // This bitmap has a width and height but no pixels. As a result, attempting to record it will 829 // This bitmap has a width and height but no pixels. As a result, attempting to record it will
831 // fail. 830 // fail.
832 SkBitmap bm; 831 SkBitmap bm;
833 bm.setInfo(SkImageInfo::MakeN32Premul(100, 100)); 832 bm.setInfo(SkImageInfo::MakeN32Premul(100, 100));
834 SkPictureRecorder recorder; 833 SkPictureRecorder recorder;
835 SkCanvas* recordingCanvas = recorder.beginRecording(100, 100); 834 SkCanvas* recordingCanvas = recorder.beginRecording(100, 100);
836 recordingCanvas->drawBitmap(bm, 0, 0); 835 recordingCanvas->drawBitmap(bm, 0, 0);
837 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 836 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
838 837
839 SkCanvas canvas; 838 SkCanvas canvas;
840 canvas.drawPicture(picture); 839 canvas.drawPicture(picture);
841 } 840 }
842 #endif 841 #endif
843 842
844 static SkData* serialized_picture_from_bitmap(const SkBitmap& bitmap) { 843 static SkData* serialized_picture_from_bitmap(const SkBitmap& bitmap) {
845 SkPictureRecorder recorder; 844 SkPictureRecorder recorder;
846 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(bitmap.width()), 845 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(bitmap.width()),
847 SkIntToScalar(bitmap.height())); 846 SkIntToScalar(bitmap.height()));
848 canvas->drawBitmap(bitmap, 0, 0); 847 canvas->drawBitmap(bitmap, 0, 0);
849 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 848 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
850 849
851 SkDynamicMemoryWStream wStream; 850 SkDynamicMemoryWStream wStream;
852 SkAutoTUnref<SkPixelSerializer> serializer( 851 SkAutoTUnref<SkPixelSerializer> serializer(
853 SkImageEncoder::CreatePixelSerializer()); 852 SkImageEncoder::CreatePixelSerializer());
854 picture->serialize(&wStream, serializer); 853 picture->serialize(&wStream, serializer);
855 return wStream.copyToData(); 854 return wStream.copyToData();
856 } 855 }
857 856
858 struct ErrorContext { 857 struct ErrorContext {
859 int fErrors; 858 int fErrors;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
904 REPORTER_ASSERT(reporter, picture1->equals(picture2)); 903 REPORTER_ASSERT(reporter, picture1->equals(picture2));
905 904
906 // Now test that a parse error was generated when trying to create a new SkP icture without 905 // Now test that a parse error was generated when trying to create a new SkP icture without
907 // providing a function to decode the bitmap. 906 // providing a function to decode the bitmap.
908 ErrorContext context; 907 ErrorContext context;
909 context.fErrors = 0; 908 context.fErrors = 0;
910 context.fReporter = reporter; 909 context.fReporter = reporter;
911 SkSetErrorCallback(assert_one_parse_error_cb, &context); 910 SkSetErrorCallback(assert_one_parse_error_cb, &context);
912 SkMemoryStream pictureStream(picture1); 911 SkMemoryStream pictureStream(picture1);
913 SkClearLastError(); 912 SkClearLastError();
914 SkAutoTUnref<SkPicture> pictureFromStream(SkPicture::CreateFromStream(&pictu reStream, nullptr)); 913 sk_sp<SkPicture> pictureFromStream(SkPicture::MakeFromStream(&pictureStream, nullptr));
915 REPORTER_ASSERT(reporter, pictureFromStream.get() != nullptr); 914 REPORTER_ASSERT(reporter, pictureFromStream.get() != nullptr);
916 SkClearLastError(); 915 SkClearLastError();
917 SkSetErrorCallback(nullptr, nullptr); 916 SkSetErrorCallback(nullptr, nullptr);
918 917
919 // Test that using the version of CreateFromStream that just takes a stream also decodes the 918 // Test that using the version of CreateFromStream that just takes a stream also decodes the
920 // bitmap. Drawing this picture should look exactly like the original bitmap . 919 // bitmap. Drawing this picture should look exactly like the original bitmap .
921 SkMD5::Digest referenceDigest; 920 SkMD5::Digest referenceDigest;
922 md5(original, &referenceDigest); 921 md5(original, &referenceDigest);
923 922
924 SkBitmap dst; 923 SkBitmap dst;
925 dst.allocPixels(original.info()); 924 dst.allocPixels(original.info());
926 dst.eraseColor(SK_ColorRED); 925 dst.eraseColor(SK_ColorRED);
927 SkCanvas canvas(dst); 926 SkCanvas canvas(dst);
928 927
929 pictureStream.rewind(); 928 pictureStream.rewind();
930 pictureFromStream.reset(SkPicture::CreateFromStream(&pictureStream)); 929 pictureFromStream = SkPicture::MakeFromStream(&pictureStream);
931 canvas.drawPicture(pictureFromStream.get()); 930 canvas.drawPicture(pictureFromStream.get());
932 931
933 SkMD5::Digest digest2; 932 SkMD5::Digest digest2;
934 md5(dst, &digest2); 933 md5(dst, &digest2);
935 REPORTER_ASSERT(reporter, referenceDigest == digest2); 934 REPORTER_ASSERT(reporter, referenceDigest == digest2);
936 } 935 }
937 936
938 static void test_clip_bound_opt(skiatest::Reporter* reporter) { 937 static void test_clip_bound_opt(skiatest::Reporter* reporter) {
939 // Test for crbug.com/229011 938 // Test for crbug.com/229011
940 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(4), SkIntToScalar(4), 939 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(4), SkIntToScalar(4),
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 1024
1026 static void test_cull_rect_reset(skiatest::Reporter* reporter) { 1025 static void test_cull_rect_reset(skiatest::Reporter* reporter) {
1027 SkPictureRecorder recorder; 1026 SkPictureRecorder recorder;
1028 SkRect bounds = SkRect::MakeWH(10, 10); 1027 SkRect bounds = SkRect::MakeWH(10, 10);
1029 SkRTreeFactory factory; 1028 SkRTreeFactory factory;
1030 SkCanvas* canvas = recorder.beginRecording(bounds, &factory); 1029 SkCanvas* canvas = recorder.beginRecording(bounds, &factory);
1031 bounds = SkRect::MakeWH(100, 100); 1030 bounds = SkRect::MakeWH(100, 100);
1032 SkPaint paint; 1031 SkPaint paint;
1033 canvas->drawRect(bounds, paint); 1032 canvas->drawRect(bounds, paint);
1034 canvas->drawRect(bounds, paint); 1033 canvas->drawRect(bounds, paint);
1035 SkAutoTUnref<const SkPicture> p(recorder.endRecordingAsPicture(bounds)); 1034 sk_sp<SkPicture> p(recorder.finishRecordingAsPictureWithCull(bounds));
1036 const SkBigPicture* picture = p->asSkBigPicture(); 1035 const SkBigPicture* picture = p->asSkBigPicture();
1037 REPORTER_ASSERT(reporter, picture); 1036 REPORTER_ASSERT(reporter, picture);
1038 1037
1039 SkRect finalCullRect = picture->cullRect(); 1038 SkRect finalCullRect = picture->cullRect();
1040 REPORTER_ASSERT(reporter, 0 == finalCullRect.fLeft); 1039 REPORTER_ASSERT(reporter, 0 == finalCullRect.fLeft);
1041 REPORTER_ASSERT(reporter, 0 == finalCullRect.fTop); 1040 REPORTER_ASSERT(reporter, 0 == finalCullRect.fTop);
1042 REPORTER_ASSERT(reporter, 100 == finalCullRect.fBottom); 1041 REPORTER_ASSERT(reporter, 100 == finalCullRect.fBottom);
1043 REPORTER_ASSERT(reporter, 100 == finalCullRect.fRight); 1042 REPORTER_ASSERT(reporter, 100 == finalCullRect.fRight);
1044 1043
1045 const SkBBoxHierarchy* pictureBBH = picture->bbh(); 1044 const SkBBoxHierarchy* pictureBBH = picture->bbh();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1099 SkPictureRecorder recorder; 1098 SkPictureRecorder recorder;
1100 SkCanvas* canvas = recorder.beginRecording(10, 10); 1099 SkCanvas* canvas = recorder.beginRecording(10, 10);
1101 1100
1102 canvas->clipRect(SkRect::MakeEmpty(), SkRegion::kReplace_Op); 1101 canvas->clipRect(SkRect::MakeEmpty(), SkRegion::kReplace_Op);
1103 // The following expanding clip should not be skipped. 1102 // The following expanding clip should not be skipped.
1104 canvas->clipRect(SkRect::MakeXYWH(4, 4, 3, 3), SkRegion::kUnion_Op); 1103 canvas->clipRect(SkRect::MakeXYWH(4, 4, 3, 3), SkRegion::kUnion_Op);
1105 // Draw something so the optimizer doesn't just fold the world. 1104 // Draw something so the optimizer doesn't just fold the world.
1106 SkPaint p; 1105 SkPaint p;
1107 p.setColor(SK_ColorBLUE); 1106 p.setColor(SK_ColorBLUE);
1108 canvas->drawPaint(p); 1107 canvas->drawPaint(p);
1109 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 1108 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
1110 1109
1111 ClipCountingCanvas testCanvas(10, 10); 1110 ClipCountingCanvas testCanvas(10, 10);
1112 picture->playback(&testCanvas); 1111 picture->playback(&testCanvas);
1113 1112
1114 // Both clips should be present on playback. 1113 // Both clips should be present on playback.
1115 REPORTER_ASSERT(reporter, testCanvas.getClipCount() == 2); 1114 REPORTER_ASSERT(reporter, testCanvas.getClipCount() == 2);
1116 } 1115 }
1117 1116
1118 static void test_hierarchical(skiatest::Reporter* reporter) { 1117 static void test_hierarchical(skiatest::Reporter* reporter) {
1119 SkBitmap bm; 1118 SkBitmap bm;
1120 make_bm(&bm, 10, 10, SK_ColorRED, true); 1119 make_bm(&bm, 10, 10, SK_ColorRED, true);
1121 1120
1122 SkPictureRecorder recorder; 1121 SkPictureRecorder recorder;
1123 1122
1124 recorder.beginRecording(10, 10); 1123 recorder.beginRecording(10, 10);
1125 SkAutoTUnref<SkPicture> childPlain(recorder.endRecording()); 1124 sk_sp<SkPicture> childPlain(recorder.finishRecordingAsPicture());
1126 REPORTER_ASSERT(reporter, !childPlain->willPlayBackBitmaps()); // 0 1125 REPORTER_ASSERT(reporter, !childPlain->willPlayBackBitmaps()); // 0
1127 1126
1128 recorder.beginRecording(10, 10)->drawBitmap(bm, 0, 0); 1127 recorder.beginRecording(10, 10)->drawBitmap(bm, 0, 0);
1129 SkAutoTUnref<SkPicture> childWithBitmap(recorder.endRecording()); 1128 sk_sp<SkPicture> childWithBitmap(recorder.finishRecordingAsPicture());
1130 REPORTER_ASSERT(reporter, childWithBitmap->willPlayBackBitmaps()); // 1 1129 REPORTER_ASSERT(reporter, childWithBitmap->willPlayBackBitmaps()); // 1
1131 1130
1132 { 1131 {
1133 SkCanvas* canvas = recorder.beginRecording(10, 10); 1132 SkCanvas* canvas = recorder.beginRecording(10, 10);
1134 canvas->drawPicture(childPlain); 1133 canvas->drawPicture(childPlain);
1135 SkAutoTUnref<SkPicture> parentPP(recorder.endRecording()); 1134 sk_sp<SkPicture> parentPP(recorder.finishRecordingAsPicture());
1136 REPORTER_ASSERT(reporter, !parentPP->willPlayBackBitmaps()); // 0 1135 REPORTER_ASSERT(reporter, !parentPP->willPlayBackBitmaps()); // 0
1137 } 1136 }
1138 { 1137 {
1139 SkCanvas* canvas = recorder.beginRecording(10, 10); 1138 SkCanvas* canvas = recorder.beginRecording(10, 10);
1140 canvas->drawPicture(childWithBitmap); 1139 canvas->drawPicture(childWithBitmap);
1141 SkAutoTUnref<SkPicture> parentPWB(recorder.endRecording()); 1140 sk_sp<SkPicture> parentPWB(recorder.finishRecordingAsPicture());
1142 REPORTER_ASSERT(reporter, parentPWB->willPlayBackBitmaps()); // 1 1141 REPORTER_ASSERT(reporter, parentPWB->willPlayBackBitmaps()); // 1
1143 } 1142 }
1144 { 1143 {
1145 SkCanvas* canvas = recorder.beginRecording(10, 10); 1144 SkCanvas* canvas = recorder.beginRecording(10, 10);
1146 canvas->drawBitmap(bm, 0, 0); 1145 canvas->drawBitmap(bm, 0, 0);
1147 canvas->drawPicture(childPlain); 1146 canvas->drawPicture(childPlain);
1148 SkAutoTUnref<SkPicture> parentWBP(recorder.endRecording()); 1147 sk_sp<SkPicture> parentWBP(recorder.finishRecordingAsPicture());
1149 REPORTER_ASSERT(reporter, parentWBP->willPlayBackBitmaps()); // 1 1148 REPORTER_ASSERT(reporter, parentWBP->willPlayBackBitmaps()); // 1
1150 } 1149 }
1151 { 1150 {
1152 SkCanvas* canvas = recorder.beginRecording(10, 10); 1151 SkCanvas* canvas = recorder.beginRecording(10, 10);
1153 canvas->drawBitmap(bm, 0, 0); 1152 canvas->drawBitmap(bm, 0, 0);
1154 canvas->drawPicture(childWithBitmap); 1153 canvas->drawPicture(childWithBitmap);
1155 SkAutoTUnref<SkPicture> parentWBWB(recorder.endRecording()); 1154 sk_sp<SkPicture> parentWBWB(recorder.finishRecordingAsPicture());
1156 REPORTER_ASSERT(reporter, parentWBWB->willPlayBackBitmaps()); // 2 1155 REPORTER_ASSERT(reporter, parentWBWB->willPlayBackBitmaps()); // 2
1157 } 1156 }
1158 } 1157 }
1159 1158
1160 static void test_gen_id(skiatest::Reporter* reporter) { 1159 static void test_gen_id(skiatest::Reporter* reporter) {
1161 1160
1162 SkPictureRecorder recorder; 1161 SkPictureRecorder recorder;
1163 recorder.beginRecording(0, 0); 1162 recorder.beginRecording(0, 0);
1164 SkAutoTUnref<SkPicture> empty(recorder.endRecording()); 1163 sk_sp<SkPicture> empty(recorder.finishRecordingAsPicture());
1165 1164
1166 // Empty pictures should still have a valid ID 1165 // Empty pictures should still have a valid ID
1167 REPORTER_ASSERT(reporter, empty->uniqueID() != SK_InvalidGenID); 1166 REPORTER_ASSERT(reporter, empty->uniqueID() != SK_InvalidGenID);
1168 1167
1169 SkCanvas* canvas = recorder.beginRecording(1, 1); 1168 SkCanvas* canvas = recorder.beginRecording(1, 1);
1170 canvas->drawARGB(255, 255, 255, 255); 1169 canvas->drawARGB(255, 255, 255, 255);
1171 SkAutoTUnref<SkPicture> hasData(recorder.endRecording()); 1170 sk_sp<SkPicture> hasData(recorder.finishRecordingAsPicture());
1172 // picture should have a non-zero id after recording 1171 // picture should have a non-zero id after recording
1173 REPORTER_ASSERT(reporter, hasData->uniqueID() != SK_InvalidGenID); 1172 REPORTER_ASSERT(reporter, hasData->uniqueID() != SK_InvalidGenID);
1174 1173
1175 // both pictures should have different ids 1174 // both pictures should have different ids
1176 REPORTER_ASSERT(reporter, hasData->uniqueID() != empty->uniqueID()); 1175 REPORTER_ASSERT(reporter, hasData->uniqueID() != empty->uniqueID());
1177 } 1176 }
1178 1177
1179 static void test_typeface(skiatest::Reporter* reporter) { 1178 static void test_typeface(skiatest::Reporter* reporter) {
1180 SkPictureRecorder recorder; 1179 SkPictureRecorder recorder;
1181 SkCanvas* canvas = recorder.beginRecording(10, 10); 1180 SkCanvas* canvas = recorder.beginRecording(10, 10);
1182 SkPaint paint; 1181 SkPaint paint;
1183 paint.setTypeface(SkTypeface::CreateFromName("Arial", SkTypeface::kItalic)); 1182 paint.setTypeface(SkTypeface::CreateFromName("Arial", SkTypeface::kItalic));
1184 canvas->drawText("Q", 1, 0, 10, paint); 1183 canvas->drawText("Q", 1, 0, 10, paint);
1185 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 1184 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
1186 REPORTER_ASSERT(reporter, picture->hasText()); 1185 REPORTER_ASSERT(reporter, picture->hasText());
1187 SkDynamicMemoryWStream stream; 1186 SkDynamicMemoryWStream stream;
1188 picture->serialize(&stream); 1187 picture->serialize(&stream);
1189 } 1188 }
1190 1189
1191 DEF_TEST(Picture, reporter) { 1190 DEF_TEST(Picture, reporter) {
1192 test_typeface(reporter); 1191 test_typeface(reporter);
1193 #ifdef SK_DEBUG 1192 #ifdef SK_DEBUG
1194 test_deleting_empty_picture(); 1193 test_deleting_empty_picture();
1195 test_serializing_empty_picture(); 1194 test_serializing_empty_picture();
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1227 static void test_draw_bitmaps(SkCanvas* canvas) { 1226 static void test_draw_bitmaps(SkCanvas* canvas) {
1228 SkBitmap empty; 1227 SkBitmap empty;
1229 draw_bitmaps(empty, canvas); 1228 draw_bitmaps(empty, canvas);
1230 empty.setInfo(SkImageInfo::MakeN32Premul(10, 10)); 1229 empty.setInfo(SkImageInfo::MakeN32Premul(10, 10));
1231 draw_bitmaps(empty, canvas); 1230 draw_bitmaps(empty, canvas);
1232 } 1231 }
1233 1232
1234 DEF_TEST(Picture_EmptyBitmap, r) { 1233 DEF_TEST(Picture_EmptyBitmap, r) {
1235 SkPictureRecorder recorder; 1234 SkPictureRecorder recorder;
1236 test_draw_bitmaps(recorder.beginRecording(10, 10)); 1235 test_draw_bitmaps(recorder.beginRecording(10, 10));
1237 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 1236 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
1238 } 1237 }
1239 1238
1240 DEF_TEST(Canvas_EmptyBitmap, r) { 1239 DEF_TEST(Canvas_EmptyBitmap, r) {
1241 SkBitmap dst; 1240 SkBitmap dst;
1242 dst.allocN32Pixels(10, 10); 1241 dst.allocN32Pixels(10, 10);
1243 SkCanvas canvas(dst); 1242 SkCanvas canvas(dst);
1244 1243
1245 test_draw_bitmaps(&canvas); 1244 test_draw_bitmaps(&canvas);
1246 } 1245 }
1247 1246
(...skipping 22 matching lines...) Expand all
1270 1269
1271 SkPictureRecorder recorder; 1270 SkPictureRecorder recorder;
1272 SkCanvas* canvas = recorder.beginRecording(100, 100); 1271 SkCanvas* canvas = recorder.beginRecording(100, 100);
1273 canvas->drawARGB(0, 0, 0, 0); 1272 canvas->drawARGB(0, 0, 0, 0);
1274 1273
1275 canvas->saveLayer(0, &semiTransparent); 1274 canvas->saveLayer(0, &semiTransparent);
1276 canvas->drawBitmap(blueBM, 25, 25); 1275 canvas->drawBitmap(blueBM, 25, 25);
1277 canvas->drawBitmap(redBM, 50, 50); 1276 canvas->drawBitmap(redBM, 50, 50);
1278 canvas->restore(); 1277 canvas->restore();
1279 1278
1280 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 1279 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
1281 1280
1282 // Now replay the picture back on another canvas 1281 // Now replay the picture back on another canvas
1283 // and check a couple of its pixels. 1282 // and check a couple of its pixels.
1284 SkBitmap replayBM; 1283 SkBitmap replayBM;
1285 make_bm(&replayBM, 100, 100, SK_ColorBLACK, false); 1284 make_bm(&replayBM, 100, 100, SK_ColorBLACK, false);
1286 SkCanvas replayCanvas(replayBM); 1285 SkCanvas replayCanvas(replayBM);
1287 picture->playback(&replayCanvas); 1286 picture->playback(&replayCanvas);
1288 replayCanvas.flush(); 1287 replayCanvas.flush();
1289 1288
1290 // With the bug present, at (55, 55) we would get a fully opaque red 1289 // With the bug present, at (55, 55) we would get a fully opaque red
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1322 DEF_TEST(Picture_SkipBBH, r) { 1321 DEF_TEST(Picture_SkipBBH, r) {
1323 SkRect bound = SkRect::MakeWH(320, 240); 1322 SkRect bound = SkRect::MakeWH(320, 240);
1324 CountingBBH bbh(bound); 1323 CountingBBH bbh(bound);
1325 SpoonFedBBHFactory factory(&bbh); 1324 SpoonFedBBHFactory factory(&bbh);
1326 1325
1327 SkPictureRecorder recorder; 1326 SkPictureRecorder recorder;
1328 SkCanvas* c = recorder.beginRecording(bound, &factory); 1327 SkCanvas* c = recorder.beginRecording(bound, &factory);
1329 // Record a few ops so we don't hit a small- or empty- picture optimization. 1328 // Record a few ops so we don't hit a small- or empty- picture optimization.
1330 c->drawRect(bound, SkPaint()); 1329 c->drawRect(bound, SkPaint());
1331 c->drawRect(bound, SkPaint()); 1330 c->drawRect(bound, SkPaint());
1332 SkAutoTUnref<const SkPicture> picture(recorder.endRecording()); 1331 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
1333 1332
1334 SkCanvas big(640, 480), small(300, 200); 1333 SkCanvas big(640, 480), small(300, 200);
1335 1334
1336 picture->playback(&big); 1335 picture->playback(&big);
1337 REPORTER_ASSERT(r, bbh.searchCalls == 0); 1336 REPORTER_ASSERT(r, bbh.searchCalls == 0);
1338 1337
1339 picture->playback(&small); 1338 picture->playback(&small);
1340 REPORTER_ASSERT(r, bbh.searchCalls == 1); 1339 REPORTER_ASSERT(r, bbh.searchCalls == 1);
1341 } 1340 }
1342 1341
1343 DEF_TEST(Picture_BitmapLeak, r) { 1342 DEF_TEST(Picture_BitmapLeak, r) {
1344 SkBitmap mut, immut; 1343 SkBitmap mut, immut;
1345 mut.allocN32Pixels(300, 200); 1344 mut.allocN32Pixels(300, 200);
1346 immut.allocN32Pixels(300, 200); 1345 immut.allocN32Pixels(300, 200);
1347 immut.setImmutable(); 1346 immut.setImmutable();
1348 SkASSERT(!mut.isImmutable()); 1347 SkASSERT(!mut.isImmutable());
1349 SkASSERT(immut.isImmutable()); 1348 SkASSERT(immut.isImmutable());
1350 1349
1351 // No one can hold a ref on our pixels yet. 1350 // No one can hold a ref on our pixels yet.
1352 REPORTER_ASSERT(r, mut.pixelRef()->unique()); 1351 REPORTER_ASSERT(r, mut.pixelRef()->unique());
1353 REPORTER_ASSERT(r, immut.pixelRef()->unique()); 1352 REPORTER_ASSERT(r, immut.pixelRef()->unique());
1354 1353
1355 SkAutoTUnref<const SkPicture> pic; 1354 sk_sp<SkPicture> pic;
1356 { 1355 {
1357 // we want the recorder to go out of scope before our subsequent checks, so we 1356 // we want the recorder to go out of scope before our subsequent checks, so we
1358 // place it inside local braces. 1357 // place it inside local braces.
1359 SkPictureRecorder rec; 1358 SkPictureRecorder rec;
1360 SkCanvas* canvas = rec.beginRecording(1920, 1200); 1359 SkCanvas* canvas = rec.beginRecording(1920, 1200);
1361 canvas->drawBitmap(mut, 0, 0); 1360 canvas->drawBitmap(mut, 0, 0);
1362 canvas->drawBitmap(immut, 800, 600); 1361 canvas->drawBitmap(immut, 800, 600);
1363 pic.reset(rec.endRecording()); 1362 pic = rec.finishRecordingAsPicture();
1364 } 1363 }
1365 1364
1366 // The picture shares the immutable pixels but copies the mutable ones. 1365 // The picture shares the immutable pixels but copies the mutable ones.
1367 REPORTER_ASSERT(r, mut.pixelRef()->unique()); 1366 REPORTER_ASSERT(r, mut.pixelRef()->unique());
1368 REPORTER_ASSERT(r, !immut.pixelRef()->unique()); 1367 REPORTER_ASSERT(r, !immut.pixelRef()->unique());
1369 1368
1370 // When the picture goes away, it's just our bitmaps holding the refs. 1369 // When the picture goes away, it's just our bitmaps holding the refs.
1371 pic.reset(nullptr); 1370 pic = nullptr;
1372 REPORTER_ASSERT(r, mut.pixelRef()->unique()); 1371 REPORTER_ASSERT(r, mut.pixelRef()->unique());
1373 REPORTER_ASSERT(r, immut.pixelRef()->unique()); 1372 REPORTER_ASSERT(r, immut.pixelRef()->unique());
1374 } 1373 }
1375 1374
1376 // getRecordingCanvas() should return a SkCanvas when recording, null when not r ecording. 1375 // getRecordingCanvas() should return a SkCanvas when recording, null when not r ecording.
1377 DEF_TEST(Picture_getRecordingCanvas, r) { 1376 DEF_TEST(Picture_getRecordingCanvas, r) {
1378 SkPictureRecorder rec; 1377 SkPictureRecorder rec;
1379 REPORTER_ASSERT(r, !rec.getRecordingCanvas()); 1378 REPORTER_ASSERT(r, !rec.getRecordingCanvas());
1380 for (int i = 0; i < 3; i++) { 1379 for (int i = 0; i < 3; i++) {
1381 rec.beginRecording(100, 100); 1380 rec.beginRecording(100, 100);
1382 REPORTER_ASSERT(r, rec.getRecordingCanvas()); 1381 REPORTER_ASSERT(r, rec.getRecordingCanvas());
1383 rec.endRecording()->unref(); 1382 rec.finishRecordingAsPicture();
1384 REPORTER_ASSERT(r, !rec.getRecordingCanvas()); 1383 REPORTER_ASSERT(r, !rec.getRecordingCanvas());
1385 } 1384 }
1386 } 1385 }
1387 1386
1388 DEF_TEST(MiniRecorderLeftHanging, r) { 1387 DEF_TEST(MiniRecorderLeftHanging, r) {
1389 // Any shader or other ref-counted effect will do just fine here. 1388 // Any shader or other ref-counted effect will do just fine here.
1390 SkPaint paint; 1389 SkPaint paint;
1391 paint.setShader(SkShader::MakeColorShader(SK_ColorRED)); 1390 paint.setShader(SkShader::MakeColorShader(SK_ColorRED));
1392 1391
1393 SkMiniRecorder rec; 1392 SkMiniRecorder rec;
1394 REPORTER_ASSERT(r, rec.drawRect(SkRect::MakeWH(20,30), paint)); 1393 REPORTER_ASSERT(r, rec.drawRect(SkRect::MakeWH(20,30), paint));
1395 // Don't call rec.detachPicture(). Test succeeds by not asserting or leakin g the shader. 1394 // Don't call rec.detachPicture(). Test succeeds by not asserting or leakin g the shader.
1396 } 1395 }
1397 1396
1398 DEF_TEST(Picture_preserveCullRect, r) { 1397 DEF_TEST(Picture_preserveCullRect, r) {
1399 SkPictureRecorder recorder; 1398 SkPictureRecorder recorder;
1400 1399
1401 SkCanvas* c = recorder.beginRecording(SkRect::MakeLTRB(1, 2, 3, 4)); 1400 SkCanvas* c = recorder.beginRecording(SkRect::MakeLTRB(1, 2, 3, 4));
1402 c->clear(SK_ColorCYAN); 1401 c->clear(SK_ColorCYAN);
1403 1402
1404 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 1403 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture());
1405 SkDynamicMemoryWStream wstream; 1404 SkDynamicMemoryWStream wstream;
1406 picture->serialize(&wstream); 1405 picture->serialize(&wstream);
1407 1406
1408 SkAutoTDelete<SkStream> rstream(wstream.detachAsStream()); 1407 SkAutoTDelete<SkStream> rstream(wstream.detachAsStream());
1409 SkAutoTUnref<SkPicture> deserializedPicture(SkPicture::CreateFromStream(rstr eam)); 1408 sk_sp<SkPicture> deserializedPicture(SkPicture::MakeFromStream(rstream));
1410 1409
1411 REPORTER_ASSERT(r, deserializedPicture != nullptr); 1410 REPORTER_ASSERT(r, deserializedPicture != nullptr);
1412 REPORTER_ASSERT(r, deserializedPicture->cullRect().left() == 1); 1411 REPORTER_ASSERT(r, deserializedPicture->cullRect().left() == 1);
1413 REPORTER_ASSERT(r, deserializedPicture->cullRect().top() == 2); 1412 REPORTER_ASSERT(r, deserializedPicture->cullRect().top() == 2);
1414 REPORTER_ASSERT(r, deserializedPicture->cullRect().right() == 3); 1413 REPORTER_ASSERT(r, deserializedPicture->cullRect().right() == 3);
1415 REPORTER_ASSERT(r, deserializedPicture->cullRect().bottom() == 4); 1414 REPORTER_ASSERT(r, deserializedPicture->cullRect().bottom() == 4);
1416 } 1415 }
OLDNEW
« no previous file with comments | « tests/PictureShaderTest.cpp ('k') | tests/RecordOptsTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698