| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "gm.h" | 8 #include "gm.h" |
| 9 | 9 |
| 10 #include "SkColorFilter.h" | 10 #include "SkColorFilter.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 SkPaint fill; | 49 SkPaint fill; |
| 50 fill.setStyle(SkPaint::kFill_Style); | 50 fill.setStyle(SkPaint::kFill_Style); |
| 51 fill.setColor(fillColor); | 51 fill.setColor(fillColor); |
| 52 | 52 |
| 53 SkPaint stroke; | 53 SkPaint stroke; |
| 54 stroke.setStyle(SkPaint::kStroke_Style); | 54 stroke.setStyle(SkPaint::kStroke_Style); |
| 55 stroke.setStrokeWidth(3); | 55 stroke.setStrokeWidth(3); |
| 56 | 56 |
| 57 SkPictureRecorder recorder; | 57 SkPictureRecorder recorder; |
| 58 | 58 |
| 59 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(kPicWidth), | 59 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(kPicWidth), |
| 60 SkIntToScalar(kPicHeight)); | 60 SkIntToScalar(kPicHeight)); |
| 61 | 61 |
| 62 SkScalar xPos, yPos = 0; | 62 SkScalar xPos, yPos = 0; |
| 63 | 63 |
| 64 for (int y = 0; y < kNumHexY; ++y) { | 64 for (int y = 0; y < kNumHexY; ++y) { |
| 65 xPos = 0; | 65 xPos = 0; |
| 66 | 66 |
| 67 for (int x = 0; x < kNumHexX; ++x) { | 67 for (int x = 0; x < kNumHexX; ++x) { |
| 68 canvas->saveLayer(NULL, NULL); | 68 canvas->saveLayer(NULL, NULL); |
| 69 canvas->translate(xPos, yPos + ((x % 2) ? kRoot3Over2 * kHexSide : 0
)); | 69 canvas->translate(xPos, yPos + ((x % 2) ? kRoot3Over2 * kHexSide : 0
)); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 | 131 |
| 132 canvas->save(); | 132 canvas->save(); |
| 133 canvas->translate(-SkScalarHalf(kTriSide), 1.5f * kTriSide / kRoot3); | 133 canvas->translate(-SkScalarHalf(kTriSide), 1.5f * kTriSide / kRoot3); |
| 134 canvas->drawPicture(tri); | 134 canvas->drawPicture(tri); |
| 135 canvas->restore(); | 135 canvas->restore(); |
| 136 | 136 |
| 137 return recorder.endRecording(); | 137 return recorder.endRecording(); |
| 138 } | 138 } |
| 139 | 139 |
| 140 // Create a Sierpinkski-like picture that starts with a top row with a picture | 140 // Create a Sierpinkski-like picture that starts with a top row with a picture |
| 141 // that just contains a triangle. Subsequent rows take the prior row's picture, | 141 // that just contains a triangle. Subsequent rows take the prior row's picture, |
| 142 // shrinks it and replicates it 3 times then draws and appropriate number of | 142 // shrinks it and replicates it 3 times then draws and appropriate number of |
| 143 // copies of it. | 143 // copies of it. |
| 144 static const SkPicture* make_sierpinski_picture() { | 144 static const SkPicture* make_sierpinski_picture() { |
| 145 SkAutoTUnref<const SkPicture> pic(make_tri_picture()); | 145 SkAutoTUnref<const SkPicture> pic(make_tri_picture()); |
| 146 | 146 |
| 147 SkPictureRecorder recorder; | 147 SkPictureRecorder recorder; |
| 148 | 148 |
| 149 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(kPicWidth), | 149 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(kPicWidth), |
| 150 SkIntToScalar(kPicHeight)); | 150 SkIntToScalar(kPicHeight)); |
| 151 | 151 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 | 210 |
| 211 canvas->drawPicture(pictures[1]); | 211 canvas->drawPicture(pictures[1]); |
| 212 } | 212 } |
| 213 | 213 |
| 214 // Two pictures with a round rect clip on the second one | 214 // Two pictures with a round rect clip on the second one |
| 215 static void rrect_clip(SkCanvas* canvas, const SkPicture* pictures[kNumPictures]
) { | 215 static void rrect_clip(SkCanvas* canvas, const SkPicture* pictures[kNumPictures]
) { |
| 216 canvas->drawPicture(pictures[0]); | 216 canvas->drawPicture(pictures[0]); |
| 217 | 217 |
| 218 SkRect rect = pictures[0]->cullRect(); | 218 SkRect rect = pictures[0]->cullRect(); |
| 219 rect.inset(kInset, kInset); | 219 rect.inset(kInset, kInset); |
| 220 | 220 |
| 221 SkRRect rrect; | 221 SkRRect rrect; |
| 222 rrect.setRectXY(rect, kInset, kInset); | 222 rrect.setRectXY(rect, kInset, kInset); |
| 223 | 223 |
| 224 canvas->clipRRect(rrect); | 224 canvas->clipRRect(rrect); |
| 225 | 225 |
| 226 canvas->drawPicture(pictures[1]); | 226 canvas->drawPicture(pictures[1]); |
| 227 } | 227 } |
| 228 | 228 |
| 229 // Two pictures with a clip path on the second one | 229 // Two pictures with a clip path on the second one |
| 230 static void path_clip(SkCanvas* canvas, const SkPicture* pictures[kNumPictures])
{ | 230 static void path_clip(SkCanvas* canvas, const SkPicture* pictures[kNumPictures])
{ |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 }; | 273 }; |
| 274 | 274 |
| 275 static void create_content(SkMultiPictureDraw* mpd, PFContentMtd pfGen, | 275 static void create_content(SkMultiPictureDraw* mpd, PFContentMtd pfGen, |
| 276 const SkPicture* pictures[kNumPictures], | 276 const SkPicture* pictures[kNumPictures], |
| 277 SkCanvas* dest, const SkMatrix& xform) { | 277 SkCanvas* dest, const SkMatrix& xform) { |
| 278 SkAutoTUnref<SkPicture> composite; | 278 SkAutoTUnref<SkPicture> composite; |
| 279 | 279 |
| 280 { | 280 { |
| 281 SkPictureRecorder recorder; | 281 SkPictureRecorder recorder; |
| 282 | 282 |
| 283 SkCanvas* pictureCanvas = recorder.beginRecording(SkIntToScalar(kPicWidt
h), | 283 SkCanvas* pictureCanvas = recorder.beginRecording(SkIntToScalar(kPicWidt
h), |
| 284 SkIntToScalar(kPicHeig
ht)); | 284 SkIntToScalar(kPicHeig
ht)); |
| 285 | 285 |
| 286 (*pfGen)(pictureCanvas, pictures); | 286 (*pfGen)(pictureCanvas, pictures); |
| 287 | 287 |
| 288 composite.reset(recorder.endRecording()); | 288 composite.reset(recorder.endRecording()); |
| 289 } | 289 } |
| 290 | 290 |
| 291 mpd->add(dest, composite, &xform); | 291 mpd->add(dest, composite, &xform); |
| 292 } | 292 } |
| 293 | 293 |
| 294 typedef void(*PFLayoutMtd)(SkCanvas* finalCanvas, SkMultiPictureDraw* mpd, | 294 typedef void(*PFLayoutMtd)(SkCanvas* finalCanvas, SkMultiPictureDraw* mpd, |
| 295 PFContentMtd pfGen, const SkPicture* pictures[kNumPic
tures], | 295 PFContentMtd pfGen, const SkPicture* pictures[kNumPic
tures], |
| 296 SkTArray<ComposeStep>* composeSteps); | 296 SkTArray<ComposeStep>* composeSteps); |
| 297 | 297 |
| 298 // Draw the content into a single canvas | 298 // Draw the content into a single canvas |
| 299 static void simple(SkCanvas* finalCanvas, SkMultiPictureDraw* mpd, | 299 static void simple(SkCanvas* finalCanvas, SkMultiPictureDraw* mpd, |
| 300 PFContentMtd pfGen, | 300 PFContentMtd pfGen, |
| 301 const SkPicture* pictures[kNumPictures], | 301 const SkPicture* pictures[kNumPictures], |
| 302 SkTArray<ComposeStep> *composeSteps) { | 302 SkTArray<ComposeStep> *composeSteps) { |
| 303 | 303 |
| 304 ComposeStep& step = composeSteps->push_back(); | 304 ComposeStep& step = composeSteps->push_back(); |
| 305 | 305 |
| 306 step.fSurf = create_compat_surface(finalCanvas, kPicWidth, kPicHeight); | 306 step.fSurf = create_compat_surface(finalCanvas, kPicWidth, kPicHeight); |
| 307 | 307 |
| 308 SkCanvas* subCanvas = step.fSurf->getCanvas(); | 308 SkCanvas* subCanvas = step.fSurf->getCanvas(); |
| 309 | 309 |
| 310 create_content(mpd, pfGen, pictures, subCanvas, SkMatrix::I()); | 310 create_content(mpd, pfGen, pictures, subCanvas, SkMatrix::I()); |
| 311 } | 311 } |
| 312 | 312 |
| 313 // Draw the content into multiple canvases/tiles | 313 // Draw the content into multiple canvases/tiles |
| 314 static void tiled(SkCanvas* finalCanvas, SkMultiPictureDraw* mpd, | 314 static void tiled(SkCanvas* finalCanvas, SkMultiPictureDraw* mpd, |
| 315 PFContentMtd pfGen, | 315 PFContentMtd pfGen, |
| 316 const SkPicture* pictures[kNumPictures], | 316 const SkPicture* pictures[kNumPictures], |
| 317 SkTArray<ComposeStep> *composeSteps) { | 317 SkTArray<ComposeStep> *composeSteps) { |
| 318 static const int kNumTilesX = 2; | 318 static const int kNumTilesX = 2; |
| 319 static const int kNumTilesY = 2; | 319 static const int kNumTilesY = 2; |
| 320 static const int kTileWidth = kPicWidth / kNumTilesX; | 320 static const int kTileWidth = kPicWidth / kNumTilesX; |
| 321 static const int kTileHeight = kPicHeight / kNumTilesY; | 321 static const int kTileHeight = kPicHeight / kNumTilesY; |
| 322 | 322 |
| 323 SkASSERT(kPicWidth == kNumTilesX * kTileWidth); | 323 SkASSERT(kPicWidth == kNumTilesX * kTileWidth); |
| 324 SkASSERT(kPicHeight == kNumTilesY * kTileHeight); | 324 SkASSERT(kPicHeight == kNumTilesY * kTileHeight); |
| 325 | 325 |
| 326 static const SkColor colors[kNumTilesX][kNumTilesY] = { | 326 static const SkColor colors[kNumTilesX][kNumTilesY] = { |
| 327 { SK_ColorCYAN, SK_ColorMAGENTA }, | 327 { SK_ColorCYAN, SK_ColorMAGENTA }, |
| 328 { SK_ColorYELLOW, SK_ColorGREEN } | 328 { SK_ColorYELLOW, SK_ColorGREEN } |
| 329 }; | 329 }; |
| 330 | 330 |
| 331 for (int y = 0; y < kNumTilesY; ++y) { | 331 for (int y = 0; y < kNumTilesY; ++y) { |
| 332 for (int x = 0; x < kNumTilesX; ++x) { | 332 for (int x = 0; x < kNumTilesX; ++x) { |
| 333 ComposeStep& step = composeSteps->push_back(); | 333 ComposeStep& step = composeSteps->push_back(); |
| 334 | 334 |
| 335 step.fX = SkIntToScalar(x*kTileWidth); | 335 step.fX = SkIntToScalar(x*kTileWidth); |
| 336 step.fY = SkIntToScalar(y*kTileHeight); | 336 step.fY = SkIntToScalar(y*kTileHeight); |
| 337 step.fPaint = SkNEW(SkPaint); | 337 step.fPaint = SkNEW(SkPaint); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 fPictures[0] = make_hex_plane_picture(SK_ColorWHITE); | 408 fPictures[0] = make_hex_plane_picture(SK_ColorWHITE); |
| 409 fPictures[1] = make_hex_plane_picture(SK_ColorGRAY); | 409 fPictures[1] = make_hex_plane_picture(SK_ColorGRAY); |
| 410 fPictures[2] = make_sierpinski_picture(); | 410 fPictures[2] = make_sierpinski_picture(); |
| 411 } | 411 } |
| 412 | 412 |
| 413 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { | 413 virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { |
| 414 SkMultiPictureDraw mpd; | 414 SkMultiPictureDraw mpd; |
| 415 SkTArray<ComposeStep> composeSteps; | 415 SkTArray<ComposeStep> composeSteps; |
| 416 | 416 |
| 417 // Fill up the MultiPictureDraw | 417 // Fill up the MultiPictureDraw |
| 418 (*gLayoutMthds[fLayout])(canvas, &mpd, | 418 (*gLayoutMthds[fLayout])(canvas, &mpd, |
| 419 gContentMthds[fContent], | 419 gContentMthds[fContent], |
| 420 fPictures, &composeSteps); | 420 fPictures, &composeSteps); |
| 421 | 421 |
| 422 mpd.draw(); | 422 mpd.draw(); |
| 423 | 423 |
| 424 // Compose all the drawn canvases into the final canvas | 424 // Compose all the drawn canvases into the final canvas |
| 425 for (int i = 0; i < composeSteps.count(); ++i) { | 425 for (int i = 0; i < composeSteps.count(); ++i) { |
| 426 const ComposeStep& step = composeSteps[i]; | 426 const ComposeStep& step = composeSteps[i]; |
| 427 | 427 |
| 428 SkAutoTUnref<SkImage> image(step.fSurf->newImageSnapshot()); | 428 SkAutoTUnref<SkImage> image(step.fSurf->newImageSnapshot()); |
| 429 | 429 |
| 430 image->draw(canvas, step.fX, step.fY, step.fPaint); | 430 canvas->drawImage(image, step.fX, step.fY, step.fPaint); |
| 431 } | 431 } |
| 432 } | 432 } |
| 433 | 433 |
| 434 virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(kPicWidth,
kPicHeight); } | 434 virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(kPicWidth,
kPicHeight); } |
| 435 | 435 |
| 436 virtual SkString onShortName() SK_OVERRIDE { | 436 virtual SkString onShortName() SK_OVERRIDE { |
| 437 static const char* gContentNames[] = { | 437 static const char* gContentNames[] = { |
| 438 "noclip", "rectclip", "rrectclip", "pathclip", "invpathclip", "s
ierpinski" | 438 "noclip", "rectclip", "rrectclip", "pathclip", "invpathclip", "s
ierpinski" |
| 439 }; | 439 }; |
| 440 static const char* gLayoutNames[] = { "simple", "tiled" }; | 440 static const char* gLayoutNames[] = { "simple", "tiled" }; |
| 441 | 441 |
| 442 SkASSERT(SK_ARRAY_COUNT(gLayoutNames) == kLayoutCnt); | 442 SkASSERT(SK_ARRAY_COUNT(gLayoutNames) == kLayoutCnt); |
| 443 SkASSERT(SK_ARRAY_COUNT(gContentNames) == kContentCnt); | 443 SkASSERT(SK_ARRAY_COUNT(gContentNames) == kContentCnt); |
| 444 | 444 |
| 445 SkString name("multipicturedraw_"); | 445 SkString name("multipicturedraw_"); |
| 446 | 446 |
| 447 name.append(gContentNames[fContent]); | 447 name.append(gContentNames[fContent]); |
| 448 name.append("_"); | 448 name.append("_"); |
| 449 name.append(gLayoutNames[fLayout]); | 449 name.append(gLayoutNames[fLayout]); |
| 450 return name; | 450 return name; |
| 451 } | 451 } |
| 452 | 452 |
| 453 virtual uint32_t onGetFlags() const SK_OVERRIDE { return kAsBench_Flag |
kSkipTiled_Flag; } | 453 virtual uint32_t onGetFlags() const SK_OVERRIDE { return kAsBench_Flag |
kSkipTiled_Flag; } |
| 454 | 454 |
| 455 private: | 455 private: |
| 456 typedef GM INHERITED; | 456 typedef GM INHERITED; |
| 457 }; | 457 }; |
| 458 | 458 |
| 459 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kNoClipSingle_
Content, | 459 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kNoClipSingle_
Content, |
| 460 MultiPictureDraw::kSimple_Layout
));) | 460 MultiPictureDraw::kSimple_Layout
));) |
| 461 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kRectClipMulti
_Content, | 461 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kRectClipMulti
_Content, |
| 462 MultiPictureDraw::kSimple_Layout
));) | 462 MultiPictureDraw::kSimple_Layout
));) |
| 463 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kRRectClipMult
i_Content, | 463 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kRRectClipMult
i_Content, |
| 464 MultiPictureDraw::kSimple_Layout
));) | 464 MultiPictureDraw::kSimple_Layout
));) |
| 465 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kPathClipMulti
_Content, | 465 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kPathClipMulti
_Content, |
| 466 MultiPictureDraw::kSimple_Layout
));) | 466 MultiPictureDraw::kSimple_Layout
));) |
| 467 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kInvPathClipMu
lti_Content, | 467 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kInvPathClipMu
lti_Content, |
| 468 MultiPictureDraw::kSimple_Layout
));) | 468 MultiPictureDraw::kSimple_Layout
));) |
| 469 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kSierpinski_Co
ntent, | 469 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kSierpinski_Co
ntent, |
| 470 MultiPictureDraw::kSimple_Layout
));) | 470 MultiPictureDraw::kSimple_Layout
));) |
| 471 | 471 |
| 472 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kNoClipSingle_
Content, | 472 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kNoClipSingle_
Content, |
| 473 MultiPictureDraw::kTiled_Layout)
);) | 473 MultiPictureDraw::kTiled_Layout)
);) |
| 474 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kRectClipMulti
_Content, | 474 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kRectClipMulti
_Content, |
| 475 MultiPictureDraw::kTiled_Layout)
);) | 475 MultiPictureDraw::kTiled_Layout)
);) |
| 476 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kRRectClipMult
i_Content, | 476 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kRRectClipMult
i_Content, |
| 477 MultiPictureDraw::kTiled_Layout)
);) | 477 MultiPictureDraw::kTiled_Layout)
);) |
| 478 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kPathClipMulti
_Content, | 478 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kPathClipMulti
_Content, |
| 479 MultiPictureDraw::kTiled_Layout)
);) | 479 MultiPictureDraw::kTiled_Layout)
);) |
| 480 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kInvPathClipMu
lti_Content, | 480 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kInvPathClipMu
lti_Content, |
| 481 MultiPictureDraw::kTiled_Layout)
);) | 481 MultiPictureDraw::kTiled_Layout)
);) |
| 482 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kSierpinski_Co
ntent, | 482 DEF_GM(return SkNEW_ARGS(MultiPictureDraw, (MultiPictureDraw::kSierpinski_Co
ntent, |
| 483 MultiPictureDraw::kTiled_Layout)
);) | 483 MultiPictureDraw::kTiled_Layout)
);) |
| 484 } | 484 } |
| OLD | NEW |