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 "PictureRenderer.h" | 8 #include "PictureRenderer.h" |
9 #include "picture_utils.h" | 9 #include "picture_utils.h" |
10 #include "SamplePipeControllers.h" | 10 #include "SamplePipeControllers.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 const SkString* mismatchPath, | 53 const SkString* mismatchPath, |
54 const SkString* inputFilename, | 54 const SkString* inputFilename, |
55 bool useChecksumBasedFilenames) { | 55 bool useChecksumBasedFilenames) { |
56 this->CopyString(&fWritePath, writePath); | 56 this->CopyString(&fWritePath, writePath); |
57 this->CopyString(&fMismatchPath, mismatchPath); | 57 this->CopyString(&fMismatchPath, mismatchPath); |
58 this->CopyString(&fInputFilename, inputFilename); | 58 this->CopyString(&fInputFilename, inputFilename); |
59 fUseChecksumBasedFilenames = useChecksumBasedFilenames; | 59 fUseChecksumBasedFilenames = useChecksumBasedFilenames; |
60 | 60 |
61 SkASSERT(NULL == fPicture); | 61 SkASSERT(NULL == fPicture); |
62 SkASSERT(NULL == fCanvas.get()); | 62 SkASSERT(NULL == fCanvas.get()); |
63 if (NULL != fPicture || NULL != fCanvas.get()) { | 63 if (fPicture || fCanvas.get()) { |
64 return; | 64 return; |
65 } | 65 } |
66 | 66 |
67 SkASSERT(pict != NULL); | 67 SkASSERT(pict != NULL); |
68 if (NULL == pict) { | 68 if (NULL == pict) { |
69 return; | 69 return; |
70 } | 70 } |
71 | 71 |
72 fPicture.reset(pict)->ref(); | 72 fPicture.reset(pict)->ref(); |
73 fCanvas.reset(this->setupCanvas()); | 73 fCanvas.reset(this->setupCanvas()); |
74 } | 74 } |
75 | 75 |
76 void PictureRenderer::CopyString(SkString* dest, const SkString* src) { | 76 void PictureRenderer::CopyString(SkString* dest, const SkString* src) { |
77 if (NULL != src) { | 77 if (src) { |
78 dest->set(*src); | 78 dest->set(*src); |
79 } else { | 79 } else { |
80 dest->reset(); | 80 dest->reset(); |
81 } | 81 } |
82 } | 82 } |
83 | 83 |
84 class FlagsDrawFilter : public SkDrawFilter { | 84 class FlagsDrawFilter : public SkDrawFilter { |
85 public: | 85 public: |
86 FlagsDrawFilter(PictureRenderer::DrawFilterFlags* flags) : | 86 FlagsDrawFilter(PictureRenderer::DrawFilterFlags* flags) : |
87 fFlags(flags) {} | 87 fFlags(flags) {} |
88 | 88 |
89 virtual bool filter(SkPaint* paint, Type t) { | 89 virtual bool filter(SkPaint* paint, Type t) { |
90 paint->setFlags(paint->getFlags() & ~fFlags[t] & SkPaint::kAllFlags); | 90 paint->setFlags(paint->getFlags() & ~fFlags[t] & SkPaint::kAllFlags); |
91 if (PictureRenderer::kMaskFilter_DrawFilterFlag & fFlags[t]) { | 91 if (PictureRenderer::kMaskFilter_DrawFilterFlag & fFlags[t]) { |
92 SkMaskFilter* maskFilter = paint->getMaskFilter(); | 92 SkMaskFilter* maskFilter = paint->getMaskFilter(); |
93 if (NULL != maskFilter) { | 93 if (maskFilter) { |
94 paint->setMaskFilter(NULL); | 94 paint->setMaskFilter(NULL); |
95 } | 95 } |
96 } | 96 } |
97 if (PictureRenderer::kHinting_DrawFilterFlag & fFlags[t]) { | 97 if (PictureRenderer::kHinting_DrawFilterFlag & fFlags[t]) { |
98 paint->setHinting(SkPaint::kNo_Hinting); | 98 paint->setHinting(SkPaint::kNo_Hinting); |
99 } else if (PictureRenderer::kSlightHinting_DrawFilterFlag & fFlags[t]) { | 99 } else if (PictureRenderer::kSlightHinting_DrawFilterFlag & fFlags[t]) { |
100 paint->setHinting(SkPaint::kSlight_Hinting); | 100 paint->setHinting(SkPaint::kSlight_Hinting); |
101 } | 101 } |
102 return true; | 102 return true; |
103 } | 103 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 height = SkMin32(height, fViewport.height()); | 205 height = SkMin32(height, fViewport.height()); |
206 } | 206 } |
207 return height; | 207 return height; |
208 } | 208 } |
209 | 209 |
210 /** Converts fPicture to a picture that uses a BBoxHierarchy. | 210 /** Converts fPicture to a picture that uses a BBoxHierarchy. |
211 * PictureRenderer subclasses that are used to test picture playback | 211 * PictureRenderer subclasses that are used to test picture playback |
212 * should call this method during init. | 212 * should call this method during init. |
213 */ | 213 */ |
214 void PictureRenderer::buildBBoxHierarchy() { | 214 void PictureRenderer::buildBBoxHierarchy() { |
215 SkASSERT(NULL != fPicture); | 215 SkASSERT(fPicture); |
216 if (kNone_BBoxHierarchyType != fBBoxHierarchyType && NULL != fPicture) { | 216 if (kNone_BBoxHierarchyType != fBBoxHierarchyType && fPicture) { |
217 SkAutoTDelete<SkBBHFactory> factory(this->getFactory()); | 217 SkAutoTDelete<SkBBHFactory> factory(this->getFactory()); |
218 SkPictureRecorder recorder; | 218 SkPictureRecorder recorder; |
219 SkCanvas* canvas = recorder.beginRecording(fPicture->cullRect().width(),
| 219 SkCanvas* canvas = recorder.beginRecording(fPicture->cullRect().width(),
|
220 fPicture->cullRect().height()
, | 220 fPicture->cullRect().height()
, |
221 factory.get(), | 221 factory.get(), |
222 this->recordFlags()); | 222 this->recordFlags()); |
223 fPicture->playback(canvas); | 223 fPicture->playback(canvas); |
224 fPicture.reset(recorder.endRecording()); | 224 fPicture.reset(recorder.endRecording()); |
225 } | 225 } |
226 } | 226 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 SkString outputFilename; | 298 SkString outputFilename; |
299 const char *outputSubdirPtr = NULL; | 299 const char *outputSubdirPtr = NULL; |
300 if (useChecksumBasedFilenames) { | 300 if (useChecksumBasedFilenames) { |
301 ImageDigest *imageDigestPtr = bitmapAndDigest.getImageDigestPtr(); | 301 ImageDigest *imageDigestPtr = bitmapAndDigest.getImageDigestPtr(); |
302 outputSubdirPtr = escapedInputFilename.c_str(); | 302 outputSubdirPtr = escapedInputFilename.c_str(); |
303 outputFilename.set(imageDigestPtr->getHashType()); | 303 outputFilename.set(imageDigestPtr->getHashType()); |
304 outputFilename.append("_"); | 304 outputFilename.append("_"); |
305 outputFilename.appendU64(imageDigestPtr->getHashValue()); | 305 outputFilename.appendU64(imageDigestPtr->getHashValue()); |
306 } else { | 306 } else { |
307 outputFilename.set(escapedInputFilename); | 307 outputFilename.set(escapedInputFilename); |
308 if (NULL != tileNumberPtr) { | 308 if (tileNumberPtr) { |
309 outputFilename.append("-tile"); | 309 outputFilename.append("-tile"); |
310 outputFilename.appendS32(*tileNumberPtr); | 310 outputFilename.appendS32(*tileNumberPtr); |
311 } | 311 } |
312 } | 312 } |
313 outputFilename.append(".png"); | 313 outputFilename.append(".png"); |
314 | 314 |
315 if (NULL != jsonSummaryPtr) { | 315 if (jsonSummaryPtr) { |
316 ImageDigest *imageDigestPtr = bitmapAndDigest.getImageDigestPtr(); | 316 ImageDigest *imageDigestPtr = bitmapAndDigest.getImageDigestPtr(); |
317 SkString outputRelativePath; | 317 SkString outputRelativePath; |
318 if (outputSubdirPtr) { | 318 if (outputSubdirPtr) { |
319 outputRelativePath.set(outputSubdirPtr); | 319 outputRelativePath.set(outputSubdirPtr); |
320 outputRelativePath.append("/"); // always use "/", even on Windows | 320 outputRelativePath.append("/"); // always use "/", even on Windows |
321 outputRelativePath.append(outputFilename); | 321 outputRelativePath.append(outputFilename); |
322 } else { | 322 } else { |
323 outputRelativePath.set(outputFilename); | 323 outputRelativePath.set(outputFilename); |
324 } | 324 } |
325 | 325 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 if (NULL == fCanvas.get() || NULL == fPicture) { | 385 if (NULL == fCanvas.get() || NULL == fPicture) { |
386 return false; | 386 return false; |
387 } | 387 } |
388 | 388 |
389 PipeController pipeController(fCanvas.get()); | 389 PipeController pipeController(fCanvas.get()); |
390 SkGPipeWriter writer; | 390 SkGPipeWriter writer; |
391 SkCanvas* pipeCanvas = writer.startRecording(&pipeController); | 391 SkCanvas* pipeCanvas = writer.startRecording(&pipeController); |
392 pipeCanvas->drawPicture(fPicture); | 392 pipeCanvas->drawPicture(fPicture); |
393 writer.endRecording(); | 393 writer.endRecording(); |
394 fCanvas->flush(); | 394 fCanvas->flush(); |
395 if (NULL != out) { | 395 if (out) { |
396 *out = SkNEW(SkBitmap); | 396 *out = SkNEW(SkBitmap); |
397 setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), | 397 setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), |
398 SkScalarCeilToInt(fPicture->cullRect().height())); | 398 SkScalarCeilToInt(fPicture->cullRect().height())); |
399 fCanvas->readPixels(*out, 0, 0); | 399 fCanvas->readPixels(*out, 0, 0); |
400 } | 400 } |
401 if (fEnableWrites) { | 401 if (fEnableWrites) { |
402 return write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSu
mmaryPtr, | 402 return write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSu
mmaryPtr, |
403 fUseChecksumBasedFilenames); | 403 fUseChecksumBasedFilenames); |
404 } else { | 404 } else { |
405 return true; | 405 return true; |
406 } | 406 } |
407 } | 407 } |
408 | 408 |
409 SkString PipePictureRenderer::getConfigNameInternal() { | 409 SkString PipePictureRenderer::getConfigNameInternal() { |
410 return SkString("pipe"); | 410 return SkString("pipe"); |
411 } | 411 } |
412 | 412 |
413 ////////////////////////////////////////////////////////////////////////////////
/////////////// | 413 ////////////////////////////////////////////////////////////////////////////////
/////////////// |
414 | 414 |
415 void SimplePictureRenderer::init(const SkPicture* picture, const SkString* write
Path, | 415 void SimplePictureRenderer::init(const SkPicture* picture, const SkString* write
Path, |
416 const SkString* mismatchPath, const SkString* i
nputFilename, | 416 const SkString* mismatchPath, const SkString* i
nputFilename, |
417 bool useChecksumBasedFilenames) { | 417 bool useChecksumBasedFilenames) { |
418 INHERITED::init(picture, writePath, mismatchPath, inputFilename, useChecksum
BasedFilenames); | 418 INHERITED::init(picture, writePath, mismatchPath, inputFilename, useChecksum
BasedFilenames); |
419 this->buildBBoxHierarchy(); | 419 this->buildBBoxHierarchy(); |
420 } | 420 } |
421 | 421 |
422 bool SimplePictureRenderer::render(SkBitmap** out) { | 422 bool SimplePictureRenderer::render(SkBitmap** out) { |
423 SkASSERT(fCanvas.get() != NULL); | 423 SkASSERT(fCanvas.get() != NULL); |
424 SkASSERT(NULL != fPicture); | 424 SkASSERT(fPicture); |
425 if (NULL == fCanvas.get() || NULL == fPicture) { | 425 if (NULL == fCanvas.get() || NULL == fPicture) { |
426 return false; | 426 return false; |
427 } | 427 } |
428 | 428 |
429 fCanvas->drawPicture(fPicture); | 429 fCanvas->drawPicture(fPicture); |
430 fCanvas->flush(); | 430 fCanvas->flush(); |
431 if (NULL != out) { | 431 if (out) { |
432 *out = SkNEW(SkBitmap); | 432 *out = SkNEW(SkBitmap); |
433 setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), | 433 setup_bitmap(*out, SkScalarCeilToInt(fPicture->cullRect().width()), |
434 SkScalarCeilToInt(fPicture->cullRect().height())); | 434 SkScalarCeilToInt(fPicture->cullRect().height())); |
435 fCanvas->readPixels(*out, 0, 0); | 435 fCanvas->readPixels(*out, 0, 0); |
436 } | 436 } |
437 if (fEnableWrites) { | 437 if (fEnableWrites) { |
438 return write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSu
mmaryPtr, | 438 return write(fCanvas, fWritePath, fMismatchPath, fInputFilename, fJsonSu
mmaryPtr, |
439 fUseChecksumBasedFilenames); | 439 fUseChecksumBasedFilenames); |
440 } else { | 440 } else { |
441 return true; | 441 return true; |
(...skipping 18 matching lines...) Expand all Loading... |
460 , fTileWidthPercentage(0.0) | 460 , fTileWidthPercentage(0.0) |
461 , fTileHeightPercentage(0.0) | 461 , fTileHeightPercentage(0.0) |
462 , fTileMinPowerOf2Width(0) | 462 , fTileMinPowerOf2Width(0) |
463 , fCurrentTileOffset(-1) | 463 , fCurrentTileOffset(-1) |
464 , fTilesX(0) | 464 , fTilesX(0) |
465 , fTilesY(0) { } | 465 , fTilesY(0) { } |
466 | 466 |
467 void TiledPictureRenderer::init(const SkPicture* pict, const SkString* writePath
, | 467 void TiledPictureRenderer::init(const SkPicture* pict, const SkString* writePath
, |
468 const SkString* mismatchPath, const SkString* in
putFilename, | 468 const SkString* mismatchPath, const SkString* in
putFilename, |
469 bool useChecksumBasedFilenames) { | 469 bool useChecksumBasedFilenames) { |
470 SkASSERT(NULL != pict); | 470 SkASSERT(pict); |
471 SkASSERT(0 == fTileRects.count()); | 471 SkASSERT(0 == fTileRects.count()); |
472 if (NULL == pict || fTileRects.count() != 0) { | 472 if (NULL == pict || fTileRects.count() != 0) { |
473 return; | 473 return; |
474 } | 474 } |
475 | 475 |
476 // Do not call INHERITED::init(), which would create a (potentially large) c
anvas which is not | 476 // Do not call INHERITED::init(), which would create a (potentially large) c
anvas which is not |
477 // used by bench_pictures. | 477 // used by bench_pictures. |
478 fPicture.reset(pict)->ref(); | 478 fPicture.reset(pict)->ref(); |
479 this->CopyString(&fWritePath, writePath); | 479 this->CopyString(&fWritePath, writePath); |
480 this->CopyString(&fMismatchPath, mismatchPath); | 480 this->CopyString(&fMismatchPath, mismatchPath); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 SkScalarCeilToInt(fPicture->cullRect().height())); | 655 SkScalarCeilToInt(fPicture->cullRect().height())); |
656 setup_bitmap(&bitmap, fTileWidth, fTileHeight); | 656 setup_bitmap(&bitmap, fTileWidth, fTileHeight); |
657 } | 657 } |
658 bool success = true; | 658 bool success = true; |
659 for (int i = 0; i < fTileRects.count(); ++i) { | 659 for (int i = 0; i < fTileRects.count(); ++i) { |
660 draw_tile_to_canvas(fCanvas, fTileRects[i], fPicture); | 660 draw_tile_to_canvas(fCanvas, fTileRects[i], fPicture); |
661 if (fEnableWrites) { | 661 if (fEnableWrites) { |
662 success &= write(fCanvas, fWritePath, fMismatchPath, fInputFilename,
fJsonSummaryPtr, | 662 success &= write(fCanvas, fWritePath, fMismatchPath, fInputFilename,
fJsonSummaryPtr, |
663 fUseChecksumBasedFilenames, &i); | 663 fUseChecksumBasedFilenames, &i); |
664 } | 664 } |
665 if (NULL != out) { | 665 if (out) { |
666 if (fCanvas->readPixels(&bitmap, 0, 0)) { | 666 if (fCanvas->readPixels(&bitmap, 0, 0)) { |
667 // Add this tile to the entire bitmap. | 667 // Add this tile to the entire bitmap. |
668 bitmapCopyAtOffset(bitmap, *out, SkScalarFloorToInt(fTileRects[i
].left()), | 668 bitmapCopyAtOffset(bitmap, *out, SkScalarFloorToInt(fTileRects[i
].left()), |
669 SkScalarFloorToInt(fTileRects[i].top())); | 669 SkScalarFloorToInt(fTileRects[i].top())); |
670 } else { | 670 } else { |
671 success = false; | 671 success = false; |
672 } | 672 } |
673 } | 673 } |
674 } | 674 } |
675 return success; | 675 return success; |
676 } | 676 } |
677 | 677 |
678 SkCanvas* TiledPictureRenderer::setupCanvas(int width, int height) { | 678 SkCanvas* TiledPictureRenderer::setupCanvas(int width, int height) { |
679 SkCanvas* canvas = this->INHERITED::setupCanvas(width, height); | 679 SkCanvas* canvas = this->INHERITED::setupCanvas(width, height); |
680 SkASSERT(NULL != fPicture); | 680 SkASSERT(fPicture); |
681 // Clip the tile to an area that is completely inside both the SkPicture and
the viewport. This | 681 // Clip the tile to an area that is completely inside both the SkPicture and
the viewport. This |
682 // is mostly important for tiles on the right and bottom edges as they may g
o over this area and | 682 // is mostly important for tiles on the right and bottom edges as they may g
o over this area and |
683 // the picture may have some commands that draw outside of this area and so
should not actually | 683 // the picture may have some commands that draw outside of this area and so
should not actually |
684 // be written. | 684 // be written. |
685 // Uses a clipRegion so that it will be unaffected by the scale factor, whic
h may have been set | 685 // Uses a clipRegion so that it will be unaffected by the scale factor, whic
h may have been set |
686 // by INHERITED::setupCanvas. | 686 // by INHERITED::setupCanvas. |
687 SkRegion clipRegion; | 687 SkRegion clipRegion; |
688 clipRegion.setRect(0, 0, this->getViewWidth(), this->getViewHeight()); | 688 clipRegion.setRect(0, 0, this->getViewWidth(), this->getViewHeight()); |
689 canvas->clipRegion(clipRegion); | 689 canvas->clipRegion(clipRegion); |
690 return canvas; | 690 return canvas; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 PictureRenderer* CreateGatherPixelRefsRenderer(const GrContext::Options& opts) { | 780 PictureRenderer* CreateGatherPixelRefsRenderer(const GrContext::Options& opts) { |
781 return SkNEW_ARGS(GatherRenderer, (opts)); | 781 return SkNEW_ARGS(GatherRenderer, (opts)); |
782 } | 782 } |
783 #else | 783 #else |
784 PictureRenderer* CreateGatherPixelRefsRenderer() { | 784 PictureRenderer* CreateGatherPixelRefsRenderer() { |
785 return SkNEW(GatherRenderer); | 785 return SkNEW(GatherRenderer); |
786 } | 786 } |
787 #endif | 787 #endif |
788 | 788 |
789 } // namespace sk_tools | 789 } // namespace sk_tools |
OLD | NEW |