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

Side by Side Diff: tools/PictureRenderer.cpp

Issue 214953003: split SkPictureRecorder out of SkPicture (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: yet more cleanup Created 6 years, 8 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 | Annotate | Revision Log
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 "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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 } 82 }
83 83
84 void PictureRenderer::init(SkPicture* pict, const SkString* outputDir, 84 void PictureRenderer::init(SkPicture* pict, const SkString* outputDir,
85 const SkString* inputFilename, bool useChecksumBasedF ilenames) { 85 const SkString* inputFilename, bool useChecksumBasedF ilenames) {
86 this->CopyString(&fOutputDir, outputDir); 86 this->CopyString(&fOutputDir, outputDir);
87 this->CopyString(&fInputFilename, inputFilename); 87 this->CopyString(&fInputFilename, inputFilename);
88 fUseChecksumBasedFilenames = useChecksumBasedFilenames; 88 fUseChecksumBasedFilenames = useChecksumBasedFilenames;
89 89
90 SkASSERT(NULL == fPicture); 90 SkASSERT(NULL == fPicture);
91 SkASSERT(NULL == fCanvas.get()); 91 SkASSERT(NULL == fCanvas.get());
92 if (fPicture != NULL || NULL != fCanvas.get()) { 92 if (NULL != fPicture || NULL != fCanvas.get()) {
93 return; 93 return;
94 } 94 }
95 95
96 SkASSERT(pict != NULL); 96 SkASSERT(pict != NULL);
97 if (NULL == pict) { 97 if (NULL == pict) {
98 return; 98 return;
99 } 99 }
100 100
101 fPicture = pict; 101 fPicture.reset(pict)->ref();
102 fPicture->ref();
103 fCanvas.reset(this->setupCanvas()); 102 fCanvas.reset(this->setupCanvas());
104 } 103 }
105 104
106 void PictureRenderer::CopyString(SkString* dest, const SkString* src) { 105 void PictureRenderer::CopyString(SkString* dest, const SkString* src) {
107 if (NULL != src) { 106 if (NULL != src) {
108 dest->set(*src); 107 dest->set(*src);
109 } else { 108 } else {
110 dest->reset(); 109 dest->reset();
111 } 110 }
112 } 111 }
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 207
209 void PictureRenderer::scaleToScaleFactor(SkCanvas* canvas) { 208 void PictureRenderer::scaleToScaleFactor(SkCanvas* canvas) {
210 SkASSERT(canvas != NULL); 209 SkASSERT(canvas != NULL);
211 if (fScaleFactor != SK_Scalar1) { 210 if (fScaleFactor != SK_Scalar1) {
212 canvas->scale(fScaleFactor, fScaleFactor); 211 canvas->scale(fScaleFactor, fScaleFactor);
213 } 212 }
214 } 213 }
215 214
216 void PictureRenderer::end() { 215 void PictureRenderer::end() {
217 this->resetState(true); 216 this->resetState(true);
218 SkSafeUnref(fPicture); 217 fPicture.reset(NULL);
219 fPicture = NULL;
220 fCanvas.reset(NULL); 218 fCanvas.reset(NULL);
221 } 219 }
222 220
223 int PictureRenderer::getViewWidth() { 221 int PictureRenderer::getViewWidth() {
224 SkASSERT(fPicture != NULL); 222 SkASSERT(fPicture != NULL);
225 int width = SkScalarCeilToInt(fPicture->width() * fScaleFactor); 223 int width = SkScalarCeilToInt(fPicture->width() * fScaleFactor);
226 if (fViewport.width() > 0) { 224 if (fViewport.width() > 0) {
227 width = SkMin32(width, fViewport.width()); 225 width = SkMin32(width, fViewport.width());
228 } 226 }
229 return width; 227 return width;
230 } 228 }
231 229
232 int PictureRenderer::getViewHeight() { 230 int PictureRenderer::getViewHeight() {
233 SkASSERT(fPicture != NULL); 231 SkASSERT(fPicture != NULL);
234 int height = SkScalarCeilToInt(fPicture->height() * fScaleFactor); 232 int height = SkScalarCeilToInt(fPicture->height() * fScaleFactor);
235 if (fViewport.height() > 0) { 233 if (fViewport.height() > 0) {
236 height = SkMin32(height, fViewport.height()); 234 height = SkMin32(height, fViewport.height());
237 } 235 }
238 return height; 236 return height;
239 } 237 }
240 238
241 /** Converts fPicture to a picture that uses a BBoxHierarchy. 239 /** Converts fPicture to a picture that uses a BBoxHierarchy.
242 * PictureRenderer subclasses that are used to test picture playback 240 * PictureRenderer subclasses that are used to test picture playback
243 * should call this method during init. 241 * should call this method during init.
244 */ 242 */
245 void PictureRenderer::buildBBoxHierarchy() { 243 void PictureRenderer::buildBBoxHierarchy() {
246 SkASSERT(NULL != fPicture); 244 SkASSERT(NULL != fPicture);
247 if (kNone_BBoxHierarchyType != fBBoxHierarchyType && NULL != fPicture) { 245 if (kNone_BBoxHierarchyType != fBBoxHierarchyType && NULL != fPicture) {
248 SkPicture* newPicture = this->createPicture(); 246 SkAutoTUnref<SkPictureFactory> factory(this->getFactory());
249 SkCanvas* recorder = newPicture->beginRecording(fPicture->width(), fPict ure->height(), 247 SkPictureRecorder recorder(factory);
250 this->recordFlags()); 248 SkCanvas* canvas = recorder.beginRecording(fPicture->width(), fPicture-> height(),
251 fPicture->draw(recorder); 249 this->recordFlags());
252 newPicture->endRecording(); 250 fPicture->draw(canvas);
253 fPicture->unref(); 251 fPicture.reset(recorder.endRecording());
254 fPicture = newPicture;
255 } 252 }
256 } 253 }
257 254
258 void PictureRenderer::resetState(bool callFinish) { 255 void PictureRenderer::resetState(bool callFinish) {
259 #if SK_SUPPORT_GPU 256 #if SK_SUPPORT_GPU
260 SkGLContextHelper* glContext = this->getGLContext(); 257 SkGLContextHelper* glContext = this->getGLContext();
261 if (NULL == glContext) { 258 if (NULL == glContext) {
262 SkASSERT(kBitmap_DeviceType == fDeviceType); 259 SkASSERT(kBitmap_DeviceType == fDeviceType);
263 return; 260 return;
264 } 261 }
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 // defer the canvas setup until the render step 376 // defer the canvas setup until the render step
380 return NULL; 377 return NULL;
381 } 378 }
382 379
383 // the size_t* parameter is deprecated, so we ignore it 380 // the size_t* parameter is deprecated, so we ignore it
384 static SkData* encode_bitmap_to_data(size_t*, const SkBitmap& bm) { 381 static SkData* encode_bitmap_to_data(size_t*, const SkBitmap& bm) {
385 return SkImageEncoder::EncodeData(bm, SkImageEncoder::kPNG_Type, 100); 382 return SkImageEncoder::EncodeData(bm, SkImageEncoder::kPNG_Type, 100);
386 } 383 }
387 384
388 bool RecordPictureRenderer::render(SkBitmap** out) { 385 bool RecordPictureRenderer::render(SkBitmap** out) {
389 SkAutoTUnref<SkPicture> replayer(this->createPicture()); 386 SkAutoTUnref<SkPictureFactory> factory(this->getFactory());
390 SkCanvas* recorder = replayer->beginRecording(this->getViewWidth(), this->ge tViewHeight(), 387 SkPictureRecorder recorder(factory);
391 this->recordFlags()); 388 SkCanvas* canvas = recorder.beginRecording(this->getViewWidth(), this->getVi ewHeight(),
392 this->scaleToScaleFactor(recorder); 389 this->recordFlags());
393 fPicture->draw(recorder); 390 this->scaleToScaleFactor(canvas);
394 replayer->endRecording(); 391 fPicture->draw(canvas);
392 SkAutoTUnref<SkPicture> picture(recorder.endRecording());
395 if (!fOutputDir.isEmpty()) { 393 if (!fOutputDir.isEmpty()) {
396 // Record the new picture as a new SKP with PNG encoded bitmaps. 394 // Record the new picture as a new SKP with PNG encoded bitmaps.
397 SkString skpPath; 395 SkString skpPath;
398 make_filepath(&skpPath, fOutputDir, fInputFilename); 396 make_filepath(&skpPath, fOutputDir, fInputFilename);
399 SkFILEWStream stream(skpPath.c_str()); 397 SkFILEWStream stream(skpPath.c_str());
400 replayer->serialize(&stream, &encode_bitmap_to_data); 398 picture->serialize(&stream, &encode_bitmap_to_data);
401 return true; 399 return true;
402 } 400 }
403 return false; 401 return false;
404 } 402 }
405 403
406 SkString RecordPictureRenderer::getConfigNameInternal() { 404 SkString RecordPictureRenderer::getConfigNameInternal() {
407 return SkString("record"); 405 return SkString("record");
408 } 406 }
409 407
410 //////////////////////////////////////////////////////////////////////////////// /////////////// 408 //////////////////////////////////////////////////////////////////////////////// ///////////////
(...skipping 30 matching lines...) Expand all
441 //////////////////////////////////////////////////////////////////////////////// /////////////// 439 //////////////////////////////////////////////////////////////////////////////// ///////////////
442 440
443 void SimplePictureRenderer::init(SkPicture* picture, const SkString* outputDir, 441 void SimplePictureRenderer::init(SkPicture* picture, const SkString* outputDir,
444 const SkString* inputFilename, bool useChecksum BasedFilenames) { 442 const SkString* inputFilename, bool useChecksum BasedFilenames) {
445 INHERITED::init(picture, outputDir, inputFilename, useChecksumBasedFilenames ); 443 INHERITED::init(picture, outputDir, inputFilename, useChecksumBasedFilenames );
446 this->buildBBoxHierarchy(); 444 this->buildBBoxHierarchy();
447 } 445 }
448 446
449 bool SimplePictureRenderer::render(SkBitmap** out) { 447 bool SimplePictureRenderer::render(SkBitmap** out) {
450 SkASSERT(fCanvas.get() != NULL); 448 SkASSERT(fCanvas.get() != NULL);
451 SkASSERT(fPicture != NULL); 449 SkASSERT(NULL != fPicture);
452 if (NULL == fCanvas.get() || NULL == fPicture) { 450 if (NULL == fCanvas.get() || NULL == fPicture) {
453 return false; 451 return false;
454 } 452 }
455 453
456 fCanvas->drawPicture(*fPicture); 454 fCanvas->drawPicture(*fPicture);
457 fCanvas->flush(); 455 fCanvas->flush();
458 if (!fOutputDir.isEmpty()) { 456 if (!fOutputDir.isEmpty()) {
459 return write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr, 457 return write(fCanvas, fOutputDir, fInputFilename, fJsonSummaryPtr,
460 fUseChecksumBasedFilenames); 458 fUseChecksumBasedFilenames);
461 } 459 }
(...skipping 18 matching lines...) Expand all
480 , fTileHeight(kDefaultTileHeight) 478 , fTileHeight(kDefaultTileHeight)
481 , fTileWidthPercentage(0.0) 479 , fTileWidthPercentage(0.0)
482 , fTileHeightPercentage(0.0) 480 , fTileHeightPercentage(0.0)
483 , fTileMinPowerOf2Width(0) 481 , fTileMinPowerOf2Width(0)
484 , fCurrentTileOffset(-1) 482 , fCurrentTileOffset(-1)
485 , fTilesX(0) 483 , fTilesX(0)
486 , fTilesY(0) { } 484 , fTilesY(0) { }
487 485
488 void TiledPictureRenderer::init(SkPicture* pict, const SkString* outputDir, 486 void TiledPictureRenderer::init(SkPicture* pict, const SkString* outputDir,
489 const SkString* inputFilename, bool useChecksumB asedFilenames) { 487 const SkString* inputFilename, bool useChecksumB asedFilenames) {
490 SkASSERT(pict != NULL); 488 SkASSERT(NULL != pict);
491 SkASSERT(0 == fTileRects.count()); 489 SkASSERT(0 == fTileRects.count());
492 if (NULL == pict || fTileRects.count() != 0) { 490 if (NULL == pict || fTileRects.count() != 0) {
493 return; 491 return;
494 } 492 }
495 493
496 // Do not call INHERITED::init(), which would create a (potentially large) c anvas which is not 494 // Do not call INHERITED::init(), which would create a (potentially large) c anvas which is not
497 // used by bench_pictures. 495 // used by bench_pictures.
498 fPicture = pict; 496 fPicture.reset(pict)->ref();
499 this->CopyString(&fOutputDir, outputDir); 497 this->CopyString(&fOutputDir, outputDir);
500 this->CopyString(&fInputFilename, inputFilename); 498 this->CopyString(&fInputFilename, inputFilename);
501 fUseChecksumBasedFilenames = useChecksumBasedFilenames; 499 fUseChecksumBasedFilenames = useChecksumBasedFilenames;
502 fPicture->ref();
503 this->buildBBoxHierarchy(); 500 this->buildBBoxHierarchy();
504 501
505 if (fTileWidthPercentage > 0) { 502 if (fTileWidthPercentage > 0) {
506 fTileWidth = sk_float_ceil2int(float(fTileWidthPercentage * fPicture->wi dth() / 100)); 503 fTileWidth = sk_float_ceil2int(float(fTileWidthPercentage * fPicture->wi dth() / 100));
507 } 504 }
508 if (fTileHeightPercentage > 0) { 505 if (fTileHeightPercentage > 0) {
509 fTileHeight = sk_float_ceil2int(float(fTileHeightPercentage * fPicture-> height() / 100)); 506 fTileHeight = sk_float_ceil2int(float(fTileHeightPercentage * fPicture-> height() / 100));
510 } 507 }
511 508
512 if (fTileMinPowerOf2Width > 0) { 509 if (fTileMinPowerOf2Width > 0) {
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
899 896
900 SkString MultiCorePictureRenderer::getConfigNameInternal() { 897 SkString MultiCorePictureRenderer::getConfigNameInternal() {
901 SkString name = this->INHERITED::getConfigNameInternal(); 898 SkString name = this->INHERITED::getConfigNameInternal();
902 name.appendf("_multi_%i_threads", fNumThreads); 899 name.appendf("_multi_%i_threads", fNumThreads);
903 return name; 900 return name;
904 } 901 }
905 902
906 //////////////////////////////////////////////////////////////////////////////// /////////////// 903 //////////////////////////////////////////////////////////////////////////////// ///////////////
907 904
908 void PlaybackCreationRenderer::setup() { 905 void PlaybackCreationRenderer::setup() {
909 fReplayer.reset(this->createPicture()); 906 SkAutoTUnref<SkPictureFactory> factory(this->getFactory());
910 SkCanvas* recorder = fReplayer->beginRecording(this->getViewWidth(), this->g etViewHeight(), 907 fRecorder.reset(SkNEW_ARGS(SkPictureRecorder, (factory)));
911 this->recordFlags()); 908 SkCanvas* canvas = fRecorder->beginRecording(this->getViewWidth(), this->get ViewHeight(),
912 this->scaleToScaleFactor(recorder); 909 this->recordFlags());
913 fPicture->draw(recorder); 910 this->scaleToScaleFactor(canvas);
911 fPicture->draw(canvas);
914 } 912 }
915 913
916 bool PlaybackCreationRenderer::render(SkBitmap** out) { 914 bool PlaybackCreationRenderer::render(SkBitmap** out) {
917 fReplayer->endRecording(); 915 fPicture.reset(fRecorder->endRecording());
918 // Since this class does not actually render, return false. 916 // Since this class does not actually render, return false.
919 return false; 917 return false;
920 } 918 }
921 919
922 SkString PlaybackCreationRenderer::getConfigNameInternal() { 920 SkString PlaybackCreationRenderer::getConfigNameInternal() {
923 return SkString("playback_creation"); 921 return SkString("playback_creation");
924 } 922 }
925 923
926 //////////////////////////////////////////////////////////////////////////////// /////////////// 924 //////////////////////////////////////////////////////////////////////////////// ///////////////
927 // SkPicture variants for each BBoxHierarchy type 925 // SkPicture variants for each BBoxHierarchy type
928 926
929 class RTreePicture : public SkPicture { 927 class RTreePicture : public SkPicture {
930 public: 928 public:
931 virtual SkBBoxHierarchy* createBBoxHierarchy() const SK_OVERRIDE{ 929 virtual SkBBoxHierarchy* createBBoxHierarchy() const SK_OVERRIDE {
932 static const int kRTreeMinChildren = 6; 930 static const int kRTreeMinChildren = 6;
933 static const int kRTreeMaxChildren = 11; 931 static const int kRTreeMaxChildren = 11;
934 SkScalar aspectRatio = SkScalarDiv(SkIntToScalar(fWidth), 932 SkScalar aspectRatio = SkScalarDiv(SkIntToScalar(fWidth),
935 SkIntToScalar(fHeight)); 933 SkIntToScalar(fHeight));
936 bool sortDraws = false; 934 bool sortDraws = false;
937 return SkRTree::Create(kRTreeMinChildren, kRTreeMaxChildren, 935 return SkRTree::Create(kRTreeMinChildren, kRTreeMaxChildren,
938 aspectRatio, sortDraws); 936 aspectRatio, sortDraws);
939 } 937 }
940 }; 938 };
941 939
942 SkPicture* PictureRenderer::createPicture() { 940 class SkRTreePictureFactory : public SkPictureFactory {
941 private:
942 virtual SkPicture* create(int width, int height) SK_OVERRIDE {
943 return SkNEW(RTreePicture);
944 }
945
946 private:
947 typedef SkPictureFactory INHERITED;
948 };
949
950 SkPictureFactory* PictureRenderer::getFactory() {
943 switch (fBBoxHierarchyType) { 951 switch (fBBoxHierarchyType) {
944 case kNone_BBoxHierarchyType: 952 case kNone_BBoxHierarchyType:
945 return SkNEW(SkPicture); 953 return NULL;
946 case kQuadTree_BBoxHierarchyType: 954 case kQuadTree_BBoxHierarchyType:
947 return SkNEW_ARGS(SkQuadTreePicture, (SkIRect::MakeWH(fPicture->widt h(), 955 return SkNEW(SkQuadTreePictureFactory);
948 fPicture->height())));
949 case kRTree_BBoxHierarchyType: 956 case kRTree_BBoxHierarchyType:
950 return SkNEW(RTreePicture); 957 return SkNEW(SkRTreePictureFactory);
951 case kTileGrid_BBoxHierarchyType: 958 case kTileGrid_BBoxHierarchyType:
952 return SkNEW_ARGS(SkTileGridPicture, (fPicture->width(), 959 return new SkTileGridPictureFactory(fGridInfo);
953 fPicture->height(), fGridInfo));
954 } 960 }
955 SkASSERT(0); // invalid bbhType 961 SkASSERT(0); // invalid bbhType
956 return NULL; 962 return NULL;
957 } 963 }
958 964
959 /////////////////////////////////////////////////////////////////////////////// 965 ///////////////////////////////////////////////////////////////////////////////
960 966
961 class GatherRenderer : public PictureRenderer { 967 class GatherRenderer : public PictureRenderer {
962 public: 968 public:
963 virtual bool render(SkBitmap** out = NULL) 969 virtual bool render(SkBitmap** out = NULL)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 virtual SkString getConfigNameInternal() SK_OVERRIDE { 1004 virtual SkString getConfigNameInternal() SK_OVERRIDE {
999 return SkString("picture_clone"); 1005 return SkString("picture_clone");
1000 } 1006 }
1001 }; 1007 };
1002 1008
1003 PictureRenderer* CreatePictureCloneRenderer() { 1009 PictureRenderer* CreatePictureCloneRenderer() {
1004 return SkNEW(PictureCloneRenderer); 1010 return SkNEW(PictureCloneRenderer);
1005 } 1011 }
1006 1012
1007 } // namespace sk_tools 1013 } // namespace sk_tools
OLDNEW
« include/core/SkPicture.h ('K') | « tools/PictureRenderer.h ('k') | tools/bench_record.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698