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

Side by Side Diff: gm/multipicturedraw.cpp

Issue 583453002: SkCanvas::drawImage is the new way for drawing an SkImage to a Canvas (Closed) Base URL: https://skia.googlesource.com/skia.git@refactor_skImage
Patch Set: Again Created 6 years, 2 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
OLDNEW
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « gm/image.cpp ('k') | include/core/SkCanvas.h » ('j') | src/core/SkCanvas.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698