| 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 "SkBBoxHierarchy.h" | 8 #include "SkBBoxHierarchy.h" |
| 9 #include "SkBlurImageFilter.h" | 9 #include "SkBlurImageFilter.h" |
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 paint.setStyle(SkPaint::kStroke_Style); | 156 paint.setStyle(SkPaint::kStroke_Style); |
| 157 paint.setPathEffect(dash); | 157 paint.setPathEffect(dash); |
| 158 | 158 |
| 159 for (int i = 0; i < 50; ++i) { | 159 for (int i = 0; i < 50; ++i) { |
| 160 canvas->drawPath(path, paint); | 160 canvas->drawPath(path, paint); |
| 161 } | 161 } |
| 162 } | 162 } |
| 163 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); | 163 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); |
| 164 // path effects currently render an SkPicture undesireable for GPU rendering | 164 // path effects currently render an SkPicture undesireable for GPU rendering |
| 165 | 165 |
| 166 const char *reason = NULL; | 166 const char *reason = nullptr; |
| 167 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL, &reaso
n)); | 167 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr, &re
ason)); |
| 168 REPORTER_ASSERT(reporter, reason); | 168 REPORTER_ASSERT(reporter, reason); |
| 169 | 169 |
| 170 canvas = recorder.beginRecording(100, 100); | 170 canvas = recorder.beginRecording(100, 100); |
| 171 { | 171 { |
| 172 SkPath path; | 172 SkPath path; |
| 173 | 173 |
| 174 path.moveTo(0, 0); | 174 path.moveTo(0, 0); |
| 175 path.lineTo(0, 50); | 175 path.lineTo(0, 50); |
| 176 path.lineTo(25, 25); | 176 path.lineTo(25, 25); |
| 177 path.lineTo(50, 50); | 177 path.lineTo(50, 50); |
| 178 path.lineTo(50, 0); | 178 path.lineTo(50, 0); |
| 179 path.close(); | 179 path.close(); |
| 180 REPORTER_ASSERT(reporter, !path.isConvex()); | 180 REPORTER_ASSERT(reporter, !path.isConvex()); |
| 181 | 181 |
| 182 SkPaint paint; | 182 SkPaint paint; |
| 183 paint.setAntiAlias(true); | 183 paint.setAntiAlias(true); |
| 184 for (int i = 0; i < 50; ++i) { | 184 for (int i = 0; i < 50; ++i) { |
| 185 canvas->drawPath(path, paint); | 185 canvas->drawPath(path, paint); |
| 186 } | 186 } |
| 187 } | 187 } |
| 188 picture.reset(recorder.endRecording()); | 188 picture.reset(recorder.endRecording()); |
| 189 // A lot of small AA concave paths should be fine for GPU rendering | 189 // A lot of small AA concave paths should be fine for GPU rendering |
| 190 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(NULL)); | 190 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); |
| 191 | 191 |
| 192 canvas = recorder.beginRecording(100, 100); | 192 canvas = recorder.beginRecording(100, 100); |
| 193 { | 193 { |
| 194 SkPath path; | 194 SkPath path; |
| 195 | 195 |
| 196 path.moveTo(0, 0); | 196 path.moveTo(0, 0); |
| 197 path.lineTo(0, 100); | 197 path.lineTo(0, 100); |
| 198 path.lineTo(50, 50); | 198 path.lineTo(50, 50); |
| 199 path.lineTo(100, 100); | 199 path.lineTo(100, 100); |
| 200 path.lineTo(100, 0); | 200 path.lineTo(100, 0); |
| 201 path.close(); | 201 path.close(); |
| 202 REPORTER_ASSERT(reporter, !path.isConvex()); | 202 REPORTER_ASSERT(reporter, !path.isConvex()); |
| 203 | 203 |
| 204 SkPaint paint; | 204 SkPaint paint; |
| 205 paint.setAntiAlias(true); | 205 paint.setAntiAlias(true); |
| 206 for (int i = 0; i < 50; ++i) { | 206 for (int i = 0; i < 50; ++i) { |
| 207 canvas->drawPath(path, paint); | 207 canvas->drawPath(path, paint); |
| 208 } | 208 } |
| 209 } | 209 } |
| 210 picture.reset(recorder.endRecording()); | 210 picture.reset(recorder.endRecording()); |
| 211 // A lot of large AA concave paths currently render an SkPicture undesireabl
e for GPU rendering | 211 // A lot of large AA concave paths currently render an SkPicture undesireabl
e for GPU rendering |
| 212 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL)); | 212 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); |
| 213 | 213 |
| 214 canvas = recorder.beginRecording(100, 100); | 214 canvas = recorder.beginRecording(100, 100); |
| 215 { | 215 { |
| 216 SkPath path; | 216 SkPath path; |
| 217 | 217 |
| 218 path.moveTo(0, 0); | 218 path.moveTo(0, 0); |
| 219 path.lineTo(0, 50); | 219 path.lineTo(0, 50); |
| 220 path.lineTo(25, 25); | 220 path.lineTo(25, 25); |
| 221 path.lineTo(50, 50); | 221 path.lineTo(50, 50); |
| 222 path.lineTo(50, 0); | 222 path.lineTo(50, 0); |
| 223 path.close(); | 223 path.close(); |
| 224 REPORTER_ASSERT(reporter, !path.isConvex()); | 224 REPORTER_ASSERT(reporter, !path.isConvex()); |
| 225 | 225 |
| 226 SkPaint paint; | 226 SkPaint paint; |
| 227 paint.setAntiAlias(true); | 227 paint.setAntiAlias(true); |
| 228 paint.setStyle(SkPaint::kStroke_Style); | 228 paint.setStyle(SkPaint::kStroke_Style); |
| 229 paint.setStrokeWidth(0); | 229 paint.setStrokeWidth(0); |
| 230 for (int i = 0; i < 50; ++i) { | 230 for (int i = 0; i < 50; ++i) { |
| 231 canvas->drawPath(path, paint); | 231 canvas->drawPath(path, paint); |
| 232 } | 232 } |
| 233 } | 233 } |
| 234 picture.reset(recorder.endRecording()); | 234 picture.reset(recorder.endRecording()); |
| 235 // hairline stroked AA concave paths are fine for GPU rendering | 235 // hairline stroked AA concave paths are fine for GPU rendering |
| 236 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(NULL)); | 236 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); |
| 237 | 237 |
| 238 canvas = recorder.beginRecording(100, 100); | 238 canvas = recorder.beginRecording(100, 100); |
| 239 { | 239 { |
| 240 SkPaint paint; | 240 SkPaint paint; |
| 241 SkScalar intervals [] = { 10, 20 }; | 241 SkScalar intervals [] = { 10, 20 }; |
| 242 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); | 242 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); |
| 243 paint.setPathEffect(pe)->unref(); | 243 paint.setPathEffect(pe)->unref(); |
| 244 | 244 |
| 245 SkPoint points [2] = { { 0, 0 }, { 100, 0 } }; | 245 SkPoint points [2] = { { 0, 0 }, { 100, 0 } }; |
| 246 | 246 |
| 247 for (int i = 0; i < 50; ++i) { | 247 for (int i = 0; i < 50; ++i) { |
| 248 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint); | 248 canvas->drawPoints(SkCanvas::kLines_PointMode, 2, points, paint); |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 picture.reset(recorder.endRecording()); | 251 picture.reset(recorder.endRecording()); |
| 252 // fast-path dashed effects are fine for GPU rendering ... | 252 // fast-path dashed effects are fine for GPU rendering ... |
| 253 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(NULL)); | 253 REPORTER_ASSERT(reporter, picture->suitableForGpuRasterization(nullptr)); |
| 254 | 254 |
| 255 canvas = recorder.beginRecording(100, 100); | 255 canvas = recorder.beginRecording(100, 100); |
| 256 { | 256 { |
| 257 SkPaint paint; | 257 SkPaint paint; |
| 258 SkScalar intervals [] = { 10, 20 }; | 258 SkScalar intervals [] = { 10, 20 }; |
| 259 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); | 259 SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 25); |
| 260 paint.setPathEffect(pe)->unref(); | 260 paint.setPathEffect(pe)->unref(); |
| 261 | 261 |
| 262 for (int i = 0; i < 50; ++i) { | 262 for (int i = 0; i < 50; ++i) { |
| 263 canvas->drawRect(SkRect::MakeWH(10, 10), paint); | 263 canvas->drawRect(SkRect::MakeWH(10, 10), paint); |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 picture.reset(recorder.endRecording()); | 266 picture.reset(recorder.endRecording()); |
| 267 // ... but only when applied to drawPoint() calls | 267 // ... but only when applied to drawPoint() calls |
| 268 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL)); | 268 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); |
| 269 | 269 |
| 270 // Nest the previous picture inside a new one. | 270 // Nest the previous picture inside a new one. |
| 271 canvas = recorder.beginRecording(100, 100); | 271 canvas = recorder.beginRecording(100, 100); |
| 272 { | 272 { |
| 273 canvas->drawPicture(picture.get()); | 273 canvas->drawPicture(picture.get()); |
| 274 } | 274 } |
| 275 picture.reset(recorder.endRecording()); | 275 picture.reset(recorder.endRecording()); |
| 276 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL)); | 276 REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(nullptr)); |
| 277 } | 277 } |
| 278 | 278 |
| 279 #endif | 279 #endif |
| 280 | 280 |
| 281 static void test_savelayer_extraction(skiatest::Reporter* reporter) { | 281 static void test_savelayer_extraction(skiatest::Reporter* reporter) { |
| 282 static const int kWidth = 100; | 282 static const int kWidth = 100; |
| 283 static const int kHeight = 100; | 283 static const int kHeight = 100; |
| 284 | 284 |
| 285 // Create complex paint that the bounding box computation code can't | 285 // Create complex paint that the bounding box computation code can't |
| 286 // optimize away | 286 // optimize away |
| 287 SkScalar blueToRedMatrix[20] = { 0 }; | 287 SkScalar blueToRedMatrix[20] = { 0 }; |
| 288 blueToRedMatrix[2] = blueToRedMatrix[18] = SK_Scalar1; | 288 blueToRedMatrix[2] = blueToRedMatrix[18] = SK_Scalar1; |
| 289 SkAutoTUnref<SkColorFilter> blueToRed(SkColorMatrixFilter::Create(blueToRedM
atrix)); | 289 SkAutoTUnref<SkColorFilter> blueToRed(SkColorMatrixFilter::Create(blueToRedM
atrix)); |
| 290 SkAutoTUnref<SkImageFilter> filter(SkColorFilterImageFilter::Create(blueToRe
d.get())); | 290 SkAutoTUnref<SkImageFilter> filter(SkColorFilterImageFilter::Create(blueToRe
d.get())); |
| 291 | 291 |
| 292 SkPaint complexPaint; | 292 SkPaint complexPaint; |
| 293 complexPaint.setImageFilter(filter); | 293 complexPaint.setImageFilter(filter); |
| 294 | 294 |
| 295 SkAutoTUnref<SkPicture> pict, child; | 295 SkAutoTUnref<SkPicture> pict, child; |
| 296 SkRTreeFactory bbhFactory; | 296 SkRTreeFactory bbhFactory; |
| 297 | 297 |
| 298 { | 298 { |
| 299 SkPictureRecorder recorder; | 299 SkPictureRecorder recorder; |
| 300 | 300 |
| 301 SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), SkIntToScal
ar(kHeight), | 301 SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), SkIntToScal
ar(kHeight), |
| 302 &bbhFactory, | 302 &bbhFactory, |
| 303 SkPictureRecorder::kComputeSaveLay
erInfo_RecordFlag); | 303 SkPictureRecorder::kComputeSaveLay
erInfo_RecordFlag); |
| 304 | 304 |
| 305 c->saveLayer(NULL, &complexPaint); | 305 c->saveLayer(nullptr, &complexPaint); |
| 306 c->restore(); | 306 c->restore(); |
| 307 | 307 |
| 308 child.reset(recorder.endRecording()); | 308 child.reset(recorder.endRecording()); |
| 309 } | 309 } |
| 310 | 310 |
| 311 // create a picture with the structure: | 311 // create a picture with the structure: |
| 312 // 1) | 312 // 1) |
| 313 // SaveLayer | 313 // SaveLayer |
| 314 // Restore | 314 // Restore |
| 315 // 2) | 315 // 2) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 330 // DrawPicture with Matrix & Paint (with SaveLayer/Restore pair) | 330 // DrawPicture with Matrix & Paint (with SaveLayer/Restore pair) |
| 331 // Restore | 331 // Restore |
| 332 { | 332 { |
| 333 SkPictureRecorder recorder; | 333 SkPictureRecorder recorder; |
| 334 | 334 |
| 335 SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), | 335 SkCanvas* c = recorder.beginRecording(SkIntToScalar(kWidth), |
| 336 SkIntToScalar(kHeight), | 336 SkIntToScalar(kHeight), |
| 337 &bbhFactory, | 337 &bbhFactory, |
| 338 SkPictureRecorder::kComputeSaveLay
erInfo_RecordFlag); | 338 SkPictureRecorder::kComputeSaveLay
erInfo_RecordFlag); |
| 339 // 1) | 339 // 1) |
| 340 c->saveLayer(NULL, &complexPaint); // layer #0 | 340 c->saveLayer(nullptr, &complexPaint); // layer #0 |
| 341 c->restore(); | 341 c->restore(); |
| 342 | 342 |
| 343 // 2) | 343 // 2) |
| 344 c->saveLayer(NULL, NULL); // layer #1 | 344 c->saveLayer(nullptr, nullptr); // layer #1 |
| 345 c->translate(kWidth / 2.0f, kHeight / 2.0f); | 345 c->translate(kWidth / 2.0f, kHeight / 2.0f); |
| 346 SkRect r = SkRect::MakeXYWH(0, 0, kWidth/2, kHeight/2); | 346 SkRect r = SkRect::MakeXYWH(0, 0, kWidth/2, kHeight/2); |
| 347 c->saveLayer(&r, &complexPaint); // layer #2 | 347 c->saveLayer(&r, &complexPaint); // layer #2 |
| 348 c->restore(); | 348 c->restore(); |
| 349 c->restore(); | 349 c->restore(); |
| 350 | 350 |
| 351 // 3) | 351 // 3) |
| 352 { | 352 { |
| 353 c->saveLayer(NULL, &complexPaint); // layer #3 | 353 c->saveLayer(nullptr, &complexPaint); // layer #3 |
| 354 c->restore(); | 354 c->restore(); |
| 355 } | 355 } |
| 356 | 356 |
| 357 SkPaint layerPaint; | 357 SkPaint layerPaint; |
| 358 layerPaint.setColor(SK_ColorRED); // Non-alpha only to avoid SaveLayerD
rawRestoreNooper | 358 layerPaint.setColor(SK_ColorRED); // Non-alpha only to avoid SaveLayerD
rawRestoreNooper |
| 359 // 4) | 359 // 4) |
| 360 { | 360 { |
| 361 c->saveLayer(NULL, &layerPaint); // layer #4 | 361 c->saveLayer(nullptr, &layerPaint); // layer #4 |
| 362 c->drawPicture(child); // layer #5 inside picture | 362 c->drawPicture(child); // layer #5 inside picture |
| 363 c->restore(); | 363 c->restore(); |
| 364 } | 364 } |
| 365 // 5 | 365 // 5 |
| 366 { | 366 { |
| 367 SkPaint picturePaint; | 367 SkPaint picturePaint; |
| 368 SkMatrix trans; | 368 SkMatrix trans; |
| 369 trans.setTranslate(10, 10); | 369 trans.setTranslate(10, 10); |
| 370 | 370 |
| 371 c->saveLayer(NULL, &layerPaint); // layer #6 | 371 c->saveLayer(nullptr, &layerPaint); // layer #6 |
| 372 c->drawPicture(child, &trans, &picturePaint); // layer #7 inside
picture | 372 c->drawPicture(child, &trans, &picturePaint); // layer #7 inside
picture |
| 373 c->restore(); | 373 c->restore(); |
| 374 } | 374 } |
| 375 | 375 |
| 376 pict.reset(recorder.endRecording()); | 376 pict.reset(recorder.endRecording()); |
| 377 } | 377 } |
| 378 | 378 |
| 379 // Now test out the SaveLayer extraction | 379 // Now test out the SaveLayer extraction |
| 380 if (!SkCanvas::Internal_Private_GetIgnoreSaveLayerBounds()) { | 380 if (!SkCanvas::Internal_Private_GetIgnoreSaveLayerBounds()) { |
| 381 const SkBigPicture* bp = pict->asSkBigPicture(); | 381 const SkBigPicture* bp = pict->asSkBigPicture(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 395 const SkLayerInfo::BlockInfo& info3 = gpuData->block(3); | 395 const SkLayerInfo::BlockInfo& info3 = gpuData->block(3); |
| 396 | 396 |
| 397 // The parent/child layers appear in reverse order | 397 // The parent/child layers appear in reverse order |
| 398 const SkLayerInfo::BlockInfo& info4 = gpuData->block(5); | 398 const SkLayerInfo::BlockInfo& info4 = gpuData->block(5); |
| 399 const SkLayerInfo::BlockInfo& info5 = gpuData->block(4); | 399 const SkLayerInfo::BlockInfo& info5 = gpuData->block(4); |
| 400 | 400 |
| 401 // The parent/child layers appear in reverse order | 401 // The parent/child layers appear in reverse order |
| 402 const SkLayerInfo::BlockInfo& info6 = gpuData->block(7); | 402 const SkLayerInfo::BlockInfo& info6 = gpuData->block(7); |
| 403 const SkLayerInfo::BlockInfo& info7 = gpuData->block(6); | 403 const SkLayerInfo::BlockInfo& info7 = gpuData->block(6); |
| 404 | 404 |
| 405 REPORTER_ASSERT(reporter, NULL == info0.fPicture); | 405 REPORTER_ASSERT(reporter, nullptr == info0.fPicture); |
| 406 REPORTER_ASSERT(reporter, kWidth == info0.fBounds.width() && | 406 REPORTER_ASSERT(reporter, kWidth == info0.fBounds.width() && |
| 407 kHeight == info0.fBounds.height()); | 407 kHeight == info0.fBounds.height()); |
| 408 REPORTER_ASSERT(reporter, info0.fLocalMat.isIdentity()); | 408 REPORTER_ASSERT(reporter, info0.fLocalMat.isIdentity()); |
| 409 REPORTER_ASSERT(reporter, info0.fPreMat.isIdentity()); | 409 REPORTER_ASSERT(reporter, info0.fPreMat.isIdentity()); |
| 410 REPORTER_ASSERT(reporter, 0 == info0.fBounds.fLeft && 0 == info0.fBounds
.fTop); | 410 REPORTER_ASSERT(reporter, 0 == info0.fBounds.fLeft && 0 == info0.fBounds
.fTop); |
| 411 REPORTER_ASSERT(reporter, NULL != info0.fPaint); | 411 REPORTER_ASSERT(reporter, nullptr != info0.fPaint); |
| 412 REPORTER_ASSERT(reporter, !info0.fIsNested && !info0.fHasNestedLayers); | 412 REPORTER_ASSERT(reporter, !info0.fIsNested && !info0.fHasNestedLayers); |
| 413 | 413 |
| 414 REPORTER_ASSERT(reporter, NULL == info1.fPicture); | 414 REPORTER_ASSERT(reporter, nullptr == info1.fPicture); |
| 415 REPORTER_ASSERT(reporter, kWidth/2.0 == info1.fBounds.width() && | 415 REPORTER_ASSERT(reporter, kWidth/2.0 == info1.fBounds.width() && |
| 416 kHeight/2.0 == info1.fBounds.height()); | 416 kHeight/2.0 == info1.fBounds.height()); |
| 417 REPORTER_ASSERT(reporter, info1.fLocalMat.isIdentity()); | 417 REPORTER_ASSERT(reporter, info1.fLocalMat.isIdentity()); |
| 418 REPORTER_ASSERT(reporter, info1.fPreMat.isIdentity()); | 418 REPORTER_ASSERT(reporter, info1.fPreMat.isIdentity()); |
| 419 REPORTER_ASSERT(reporter, kWidth/2.0 == info1.fBounds.fLeft && | 419 REPORTER_ASSERT(reporter, kWidth/2.0 == info1.fBounds.fLeft && |
| 420 kHeight/2.0 == info1.fBounds.fTop); | 420 kHeight/2.0 == info1.fBounds.fTop); |
| 421 REPORTER_ASSERT(reporter, NULL == info1.fPaint); | 421 REPORTER_ASSERT(reporter, nullptr == info1.fPaint); |
| 422 REPORTER_ASSERT(reporter, !info1.fIsNested && | 422 REPORTER_ASSERT(reporter, !info1.fIsNested && |
| 423 info1.fHasNestedLayers); // has a nested SL | 423 info1.fHasNestedLayers); // has a nested SL |
| 424 | 424 |
| 425 REPORTER_ASSERT(reporter, NULL == info2.fPicture); | 425 REPORTER_ASSERT(reporter, nullptr == info2.fPicture); |
| 426 REPORTER_ASSERT(reporter, kWidth / 2 == info2.fBounds.width() && | 426 REPORTER_ASSERT(reporter, kWidth / 2 == info2.fBounds.width() && |
| 427 kHeight / 2 == info2.fBounds.height()); // bou
nd reduces size | 427 kHeight / 2 == info2.fBounds.height()); // bou
nd reduces size |
| 428 REPORTER_ASSERT(reporter, !info2.fLocalMat.isIdentity()); | 428 REPORTER_ASSERT(reporter, !info2.fLocalMat.isIdentity()); |
| 429 REPORTER_ASSERT(reporter, info2.fPreMat.isIdentity()); | 429 REPORTER_ASSERT(reporter, info2.fPreMat.isIdentity()); |
| 430 REPORTER_ASSERT(reporter, kWidth / 2 == info2.fBounds.fLeft && // tran
slated | 430 REPORTER_ASSERT(reporter, kWidth / 2 == info2.fBounds.fLeft && // tran
slated |
| 431 kHeight / 2 == info2.fBounds.fTop); | 431 kHeight / 2 == info2.fBounds.fTop); |
| 432 REPORTER_ASSERT(reporter, NULL != info2.fPaint); | 432 REPORTER_ASSERT(reporter, nullptr != info2.fPaint); |
| 433 REPORTER_ASSERT(reporter, info2.fIsNested && !info2.fHasNestedLayers); /
/ is nested | 433 REPORTER_ASSERT(reporter, info2.fIsNested && !info2.fHasNestedLayers); /
/ is nested |
| 434 | 434 |
| 435 REPORTER_ASSERT(reporter, NULL == info3.fPicture); | 435 REPORTER_ASSERT(reporter, nullptr == info3.fPicture); |
| 436 REPORTER_ASSERT(reporter, kWidth == info3.fBounds.width() && | 436 REPORTER_ASSERT(reporter, kWidth == info3.fBounds.width() && |
| 437 kHeight == info3.fBounds.height()); | 437 kHeight == info3.fBounds.height()); |
| 438 REPORTER_ASSERT(reporter, info3.fLocalMat.isIdentity()); | 438 REPORTER_ASSERT(reporter, info3.fLocalMat.isIdentity()); |
| 439 REPORTER_ASSERT(reporter, info3.fPreMat.isIdentity()); | 439 REPORTER_ASSERT(reporter, info3.fPreMat.isIdentity()); |
| 440 REPORTER_ASSERT(reporter, 0 == info3.fBounds.fLeft && 0 == info3.fBounds
.fTop); | 440 REPORTER_ASSERT(reporter, 0 == info3.fBounds.fLeft && 0 == info3.fBounds
.fTop); |
| 441 REPORTER_ASSERT(reporter, info3.fPaint); | 441 REPORTER_ASSERT(reporter, info3.fPaint); |
| 442 REPORTER_ASSERT(reporter, !info3.fIsNested && !info3.fHasNestedLayers); | 442 REPORTER_ASSERT(reporter, !info3.fIsNested && !info3.fHasNestedLayers); |
| 443 | 443 |
| 444 REPORTER_ASSERT(reporter, NULL == info4.fPicture); | 444 REPORTER_ASSERT(reporter, nullptr == info4.fPicture); |
| 445 REPORTER_ASSERT(reporter, kWidth == info4.fBounds.width() && | 445 REPORTER_ASSERT(reporter, kWidth == info4.fBounds.width() && |
| 446 kHeight == info4.fBounds.height()); | 446 kHeight == info4.fBounds.height()); |
| 447 REPORTER_ASSERT(reporter, 0 == info4.fBounds.fLeft && 0 == info4.fBounds
.fTop); | 447 REPORTER_ASSERT(reporter, 0 == info4.fBounds.fLeft && 0 == info4.fBounds
.fTop); |
| 448 REPORTER_ASSERT(reporter, info4.fLocalMat.isIdentity()); | 448 REPORTER_ASSERT(reporter, info4.fLocalMat.isIdentity()); |
| 449 REPORTER_ASSERT(reporter, info4.fPreMat.isIdentity()); | 449 REPORTER_ASSERT(reporter, info4.fPreMat.isIdentity()); |
| 450 REPORTER_ASSERT(reporter, info4.fPaint); | 450 REPORTER_ASSERT(reporter, info4.fPaint); |
| 451 REPORTER_ASSERT(reporter, !info4.fIsNested && | 451 REPORTER_ASSERT(reporter, !info4.fIsNested && |
| 452 info4.fHasNestedLayers); // has a nested SL | 452 info4.fHasNestedLayers); // has a nested SL |
| 453 | 453 |
| 454 REPORTER_ASSERT(reporter, child == info5.fPicture); // in a child pictur
e | 454 REPORTER_ASSERT(reporter, child == info5.fPicture); // in a child pictur
e |
| 455 REPORTER_ASSERT(reporter, kWidth == info5.fBounds.width() && | 455 REPORTER_ASSERT(reporter, kWidth == info5.fBounds.width() && |
| 456 kHeight == info5.fBounds.height()); | 456 kHeight == info5.fBounds.height()); |
| 457 REPORTER_ASSERT(reporter, 0 == info5.fBounds.fLeft && 0 == info5.fBounds
.fTop); | 457 REPORTER_ASSERT(reporter, 0 == info5.fBounds.fLeft && 0 == info5.fBounds
.fTop); |
| 458 REPORTER_ASSERT(reporter, info5.fLocalMat.isIdentity()); | 458 REPORTER_ASSERT(reporter, info5.fLocalMat.isIdentity()); |
| 459 REPORTER_ASSERT(reporter, info5.fPreMat.isIdentity()); | 459 REPORTER_ASSERT(reporter, info5.fPreMat.isIdentity()); |
| 460 REPORTER_ASSERT(reporter, NULL != info5.fPaint); | 460 REPORTER_ASSERT(reporter, nullptr != info5.fPaint); |
| 461 REPORTER_ASSERT(reporter, info5.fIsNested && !info5.fHasNestedLayers); /
/ is nested | 461 REPORTER_ASSERT(reporter, info5.fIsNested && !info5.fHasNestedLayers); /
/ is nested |
| 462 | 462 |
| 463 REPORTER_ASSERT(reporter, NULL == info6.fPicture); | 463 REPORTER_ASSERT(reporter, nullptr == info6.fPicture); |
| 464 REPORTER_ASSERT(reporter, kWidth-10 == info6.fBounds.width() && | 464 REPORTER_ASSERT(reporter, kWidth-10 == info6.fBounds.width() && |
| 465 kHeight-10 == info6.fBounds.height()); | 465 kHeight-10 == info6.fBounds.height()); |
| 466 REPORTER_ASSERT(reporter, 10 == info6.fBounds.fLeft && 10 == info6.fBoun
ds.fTop); | 466 REPORTER_ASSERT(reporter, 10 == info6.fBounds.fLeft && 10 == info6.fBoun
ds.fTop); |
| 467 REPORTER_ASSERT(reporter, info6.fLocalMat.isIdentity()); | 467 REPORTER_ASSERT(reporter, info6.fLocalMat.isIdentity()); |
| 468 REPORTER_ASSERT(reporter, info6.fPreMat.isIdentity()); | 468 REPORTER_ASSERT(reporter, info6.fPreMat.isIdentity()); |
| 469 REPORTER_ASSERT(reporter, info6.fPaint); | 469 REPORTER_ASSERT(reporter, info6.fPaint); |
| 470 REPORTER_ASSERT(reporter, !info6.fIsNested && | 470 REPORTER_ASSERT(reporter, !info6.fIsNested && |
| 471 info6.fHasNestedLayers); // has a nested SL | 471 info6.fHasNestedLayers); // has a nested SL |
| 472 | 472 |
| 473 REPORTER_ASSERT(reporter, child == info7.fPicture); // in a child pictur
e | 473 REPORTER_ASSERT(reporter, child == info7.fPicture); // in a child pictur
e |
| 474 REPORTER_ASSERT(reporter, kWidth == info7.fBounds.width() && | 474 REPORTER_ASSERT(reporter, kWidth == info7.fBounds.width() && |
| 475 kHeight == info7.fBounds.height()); | 475 kHeight == info7.fBounds.height()); |
| 476 REPORTER_ASSERT(reporter, 0 == info7.fBounds.fLeft && 0 == info7.fBounds
.fTop); | 476 REPORTER_ASSERT(reporter, 0 == info7.fBounds.fLeft && 0 == info7.fBounds
.fTop); |
| 477 REPORTER_ASSERT(reporter, info7.fLocalMat.isIdentity()); | 477 REPORTER_ASSERT(reporter, info7.fLocalMat.isIdentity()); |
| 478 REPORTER_ASSERT(reporter, info7.fPreMat.isIdentity()); | 478 REPORTER_ASSERT(reporter, info7.fPreMat.isIdentity()); |
| 479 REPORTER_ASSERT(reporter, NULL != info7.fPaint); | 479 REPORTER_ASSERT(reporter, nullptr != info7.fPaint); |
| 480 REPORTER_ASSERT(reporter, info7.fIsNested && !info7.fHasNestedLayers); /
/ is nested | 480 REPORTER_ASSERT(reporter, info7.fIsNested && !info7.fHasNestedLayers); /
/ is nested |
| 481 } | 481 } |
| 482 } | 482 } |
| 483 | 483 |
| 484 static void test_has_text(skiatest::Reporter* reporter) { | 484 static void test_has_text(skiatest::Reporter* reporter) { |
| 485 SkPictureRecorder recorder; | 485 SkPictureRecorder recorder; |
| 486 | 486 |
| 487 SkCanvas* canvas = recorder.beginRecording(100,100); | 487 SkCanvas* canvas = recorder.beginRecording(100,100); |
| 488 { | 488 { |
| 489 canvas->drawRect(SkRect::MakeWH(20, 20), SkPaint()); | 489 canvas->drawRect(SkRect::MakeWH(20, 20), SkPaint()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 } | 523 } |
| 524 picture.reset(recorder.endRecording()); | 524 picture.reset(recorder.endRecording()); |
| 525 REPORTER_ASSERT(reporter, picture->hasText()); | 525 REPORTER_ASSERT(reporter, picture->hasText()); |
| 526 | 526 |
| 527 canvas = recorder.beginRecording(100,100); | 527 canvas = recorder.beginRecording(100,100); |
| 528 { | 528 { |
| 529 SkPath path; | 529 SkPath path; |
| 530 path.moveTo(0, 0); | 530 path.moveTo(0, 0); |
| 531 path.lineTo(50, 50); | 531 path.lineTo(50, 50); |
| 532 | 532 |
| 533 canvas->drawTextOnPath("Q", 1, path, NULL, SkPaint()); | 533 canvas->drawTextOnPath("Q", 1, path, nullptr, SkPaint()); |
| 534 } | 534 } |
| 535 picture.reset(recorder.endRecording()); | 535 picture.reset(recorder.endRecording()); |
| 536 REPORTER_ASSERT(reporter, picture->hasText()); | 536 REPORTER_ASSERT(reporter, picture->hasText()); |
| 537 | 537 |
| 538 // Nest the previous picture inside a new one. | 538 // Nest the previous picture inside a new one. |
| 539 canvas = recorder.beginRecording(100,100); | 539 canvas = recorder.beginRecording(100,100); |
| 540 { | 540 { |
| 541 canvas->drawPicture(picture.get()); | 541 canvas->drawPicture(picture.get()); |
| 542 } | 542 } |
| 543 picture.reset(recorder.endRecording()); | 543 picture.reset(recorder.endRecording()); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 } | 661 } |
| 662 | 662 |
| 663 // Test out SkPictureRecorder::partialReplay | 663 // Test out SkPictureRecorder::partialReplay |
| 664 DEF_TEST(PictureRecorder_replay, reporter) { | 664 DEF_TEST(PictureRecorder_replay, reporter) { |
| 665 // check save/saveLayer state | 665 // check save/saveLayer state |
| 666 { | 666 { |
| 667 SkPictureRecorder recorder; | 667 SkPictureRecorder recorder; |
| 668 | 668 |
| 669 SkCanvas* canvas = recorder.beginRecording(10, 10); | 669 SkCanvas* canvas = recorder.beginRecording(10, 10); |
| 670 | 670 |
| 671 canvas->saveLayer(NULL, NULL); | 671 canvas->saveLayer(nullptr, nullptr); |
| 672 | 672 |
| 673 SkAutoTUnref<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&record
er)); | 673 SkAutoTUnref<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&record
er)); |
| 674 | 674 |
| 675 // The extra save and restore comes from the Copy process. | 675 // The extra save and restore comes from the Copy process. |
| 676 check_save_state(reporter, copy, 2, 1, 3); | 676 check_save_state(reporter, copy, 2, 1, 3); |
| 677 | 677 |
| 678 canvas->saveLayer(NULL, NULL); | 678 canvas->saveLayer(nullptr, nullptr); |
| 679 | 679 |
| 680 SkAutoTUnref<SkPicture> final(recorder.endRecording()); | 680 SkAutoTUnref<SkPicture> final(recorder.endRecording()); |
| 681 | 681 |
| 682 check_save_state(reporter, final, 1, 2, 3); | 682 check_save_state(reporter, final, 1, 2, 3); |
| 683 | 683 |
| 684 // The copy shouldn't pick up any operations added after it was made | 684 // The copy shouldn't pick up any operations added after it was made |
| 685 check_save_state(reporter, copy, 2, 1, 3); | 685 check_save_state(reporter, copy, 2, 1, 3); |
| 686 } | 686 } |
| 687 | 687 |
| 688 // (partially) check leakage of draw ops | 688 // (partially) check leakage of draw ops |
| (...skipping 23 matching lines...) Expand all Loading... |
| 712 REPORTER_ASSERT(reporter, copy->uniqueID() != final->uniqueID()); | 712 REPORTER_ASSERT(reporter, copy->uniqueID() != final->uniqueID()); |
| 713 | 713 |
| 714 // The snapshot shouldn't pick up any operations added after it was made | 714 // The snapshot shouldn't pick up any operations added after it was made |
| 715 REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps()); | 715 REPORTER_ASSERT(reporter, !copy->willPlayBackBitmaps()); |
| 716 } | 716 } |
| 717 | 717 |
| 718 // Recreate the Android partialReplay test case | 718 // Recreate the Android partialReplay test case |
| 719 { | 719 { |
| 720 SkPictureRecorder recorder; | 720 SkPictureRecorder recorder; |
| 721 | 721 |
| 722 SkCanvas* canvas = recorder.beginRecording(4, 3, NULL, 0); | 722 SkCanvas* canvas = recorder.beginRecording(4, 3, nullptr, 0); |
| 723 create_imbalance(canvas); | 723 create_imbalance(canvas); |
| 724 | 724 |
| 725 int expectedSaveCount = canvas->getSaveCount(); | 725 int expectedSaveCount = canvas->getSaveCount(); |
| 726 | 726 |
| 727 SkAutoTUnref<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&record
er)); | 727 SkAutoTUnref<SkPicture> copy(SkPictureRecorderReplayTester::Copy(&record
er)); |
| 728 check_balance(reporter, copy); | 728 check_balance(reporter, copy); |
| 729 | 729 |
| 730 REPORTER_ASSERT(reporter, expectedSaveCount = canvas->getSaveCount()); | 730 REPORTER_ASSERT(reporter, expectedSaveCount = canvas->getSaveCount()); |
| 731 | 731 |
| 732 // End the recording of source to test the picture finalization | 732 // End the recording of source to test the picture finalization |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 897 SkAutoDataUnref picture2(serialized_picture_from_bitmap(bm)); | 897 SkAutoDataUnref picture2(serialized_picture_from_bitmap(bm)); |
| 898 REPORTER_ASSERT(reporter, picture1->equals(picture2)); | 898 REPORTER_ASSERT(reporter, picture1->equals(picture2)); |
| 899 // Now test that a parse error was generated when trying to create a new SkP
icture without | 899 // Now test that a parse error was generated when trying to create a new SkP
icture without |
| 900 // providing a function to decode the bitmap. | 900 // providing a function to decode the bitmap. |
| 901 ErrorContext context; | 901 ErrorContext context; |
| 902 context.fErrors = 0; | 902 context.fErrors = 0; |
| 903 context.fReporter = reporter; | 903 context.fReporter = reporter; |
| 904 SkSetErrorCallback(assert_one_parse_error_cb, &context); | 904 SkSetErrorCallback(assert_one_parse_error_cb, &context); |
| 905 SkMemoryStream pictureStream(picture1); | 905 SkMemoryStream pictureStream(picture1); |
| 906 SkClearLastError(); | 906 SkClearLastError(); |
| 907 SkAutoTUnref<SkPicture> pictureFromStream(SkPicture::CreateFromStream(&pictu
reStream, NULL)); | 907 SkAutoTUnref<SkPicture> pictureFromStream(SkPicture::CreateFromStream(&pictu
reStream, nullptr)); |
| 908 REPORTER_ASSERT(reporter, pictureFromStream.get() != NULL); | 908 REPORTER_ASSERT(reporter, pictureFromStream.get() != nullptr); |
| 909 SkClearLastError(); | 909 SkClearLastError(); |
| 910 SkSetErrorCallback(NULL, NULL); | 910 SkSetErrorCallback(nullptr, nullptr); |
| 911 } | 911 } |
| 912 | 912 |
| 913 static void test_clip_bound_opt(skiatest::Reporter* reporter) { | 913 static void test_clip_bound_opt(skiatest::Reporter* reporter) { |
| 914 // Test for crbug.com/229011 | 914 // Test for crbug.com/229011 |
| 915 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(4), SkIntToScalar(4), | 915 SkRect rect1 = SkRect::MakeXYWH(SkIntToScalar(4), SkIntToScalar(4), |
| 916 SkIntToScalar(2), SkIntToScalar(2)); | 916 SkIntToScalar(2), SkIntToScalar(2)); |
| 917 SkRect rect2 = SkRect::MakeXYWH(SkIntToScalar(7), SkIntToScalar(7), | 917 SkRect rect2 = SkRect::MakeXYWH(SkIntToScalar(7), SkIntToScalar(7), |
| 918 SkIntToScalar(1), SkIntToScalar(1)); | 918 SkIntToScalar(1), SkIntToScalar(1)); |
| 919 SkRect rect3 = SkRect::MakeXYWH(SkIntToScalar(6), SkIntToScalar(6), | 919 SkRect rect3 = SkRect::MakeXYWH(SkIntToScalar(6), SkIntToScalar(6), |
| 920 SkIntToScalar(1), SkIntToScalar(1)); | 920 SkIntToScalar(1), SkIntToScalar(1)); |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1324 canvas->drawBitmap(mut, 0, 0); | 1324 canvas->drawBitmap(mut, 0, 0); |
| 1325 canvas->drawBitmap(immut, 800, 600); | 1325 canvas->drawBitmap(immut, 800, 600); |
| 1326 pic.reset(rec.endRecording()); | 1326 pic.reset(rec.endRecording()); |
| 1327 } | 1327 } |
| 1328 | 1328 |
| 1329 // The picture shares the immutable pixels but copies the mutable ones. | 1329 // The picture shares the immutable pixels but copies the mutable ones. |
| 1330 REPORTER_ASSERT(r, mut.pixelRef()->unique()); | 1330 REPORTER_ASSERT(r, mut.pixelRef()->unique()); |
| 1331 REPORTER_ASSERT(r, !immut.pixelRef()->unique()); | 1331 REPORTER_ASSERT(r, !immut.pixelRef()->unique()); |
| 1332 | 1332 |
| 1333 // When the picture goes away, it's just our bitmaps holding the refs. | 1333 // When the picture goes away, it's just our bitmaps holding the refs. |
| 1334 pic.reset(NULL); | 1334 pic.reset(nullptr); |
| 1335 REPORTER_ASSERT(r, mut.pixelRef()->unique()); | 1335 REPORTER_ASSERT(r, mut.pixelRef()->unique()); |
| 1336 REPORTER_ASSERT(r, immut.pixelRef()->unique()); | 1336 REPORTER_ASSERT(r, immut.pixelRef()->unique()); |
| 1337 } | 1337 } |
| 1338 | 1338 |
| 1339 // getRecordingCanvas() should return a SkCanvas when recording, null when not r
ecording. | 1339 // getRecordingCanvas() should return a SkCanvas when recording, null when not r
ecording. |
| 1340 DEF_TEST(Picture_getRecordingCanvas, r) { | 1340 DEF_TEST(Picture_getRecordingCanvas, r) { |
| 1341 SkPictureRecorder rec; | 1341 SkPictureRecorder rec; |
| 1342 REPORTER_ASSERT(r, !rec.getRecordingCanvas()); | 1342 REPORTER_ASSERT(r, !rec.getRecordingCanvas()); |
| 1343 for (int i = 0; i < 3; i++) { | 1343 for (int i = 0; i < 3; i++) { |
| 1344 rec.beginRecording(100, 100); | 1344 rec.beginRecording(100, 100); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1370 | 1370 |
| 1371 SkAutoTDelete<SkStream> rstream(wstream.detachAsStream()); | 1371 SkAutoTDelete<SkStream> rstream(wstream.detachAsStream()); |
| 1372 SkAutoTUnref<SkPicture> deserializedPicture(SkPicture::CreateFromStream(rstr
eam)); | 1372 SkAutoTUnref<SkPicture> deserializedPicture(SkPicture::CreateFromStream(rstr
eam)); |
| 1373 | 1373 |
| 1374 REPORTER_ASSERT(r, SkToBool(deserializedPicture)); | 1374 REPORTER_ASSERT(r, SkToBool(deserializedPicture)); |
| 1375 REPORTER_ASSERT(r, deserializedPicture->cullRect().left() == 1); | 1375 REPORTER_ASSERT(r, deserializedPicture->cullRect().left() == 1); |
| 1376 REPORTER_ASSERT(r, deserializedPicture->cullRect().top() == 2); | 1376 REPORTER_ASSERT(r, deserializedPicture->cullRect().top() == 2); |
| 1377 REPORTER_ASSERT(r, deserializedPicture->cullRect().right() == 3); | 1377 REPORTER_ASSERT(r, deserializedPicture->cullRect().right() == 3); |
| 1378 REPORTER_ASSERT(r, deserializedPicture->cullRect().bottom() == 4); | 1378 REPORTER_ASSERT(r, deserializedPicture->cullRect().bottom() == 4); |
| 1379 } | 1379 } |
| OLD | NEW |