diff options
| author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-10 21:51:06 +0000 |
|---|---|---|
| committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-10 21:51:06 +0000 |
| commit | bbe43a9ce0513d37cbd5dca583c391b7b1e39b3a (patch) | |
| tree | 77fa8d0aeec5f33b60c25c69b720cf217629d67b /samplecode/SamplePictFile.cpp | |
| parent | edd370f949a457f5d8f7a62efdaf685d4caf46fe (diff) | |
Add SkTileGridPicture SampleApp playback support.
SampleApp already supports switching to a bbox hierarchy playback mode
('b' shortcut). This CL adds an SkTileGridPicture bbox mode.
R=reed@google.com, robertphillips@google.com, fmalita@google.com
Author: fmalita@chromium.org
Review URL: https://codereview.chromium.org/108513006
git-svn-id: http://skia.googlecode.com/svn/trunk@12613 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SamplePictFile.cpp')
| -rw-r--r-- | samplecode/SamplePictFile.cpp | 158 |
1 files changed, 101 insertions, 57 deletions
diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp index b8298d4e19..e81a1ad665 100644 --- a/samplecode/SamplePictFile.cpp +++ b/samplecode/SamplePictFile.cpp @@ -19,6 +19,7 @@ #include "SkRandom.h" #include "SkRegion.h" #include "SkShader.h" +#include "SkTileGridPicture.h" #include "SkUtils.h" #include "SkColorPriv.h" #include "SkColorFilter.h" @@ -31,12 +32,81 @@ #include "SkXMLParser.h" class PictFileView : public SampleView { +public: + PictFileView(const char name[] = NULL) + : fFilename(name) + , fBBox(kNo_BBoxType) + , fTileSize(SkSize::Make(0, 0)) { + for (unsigned i = 0; i < kBBoxTypeCount; ++i) { + fPictures[i] = NULL; + } + } + + virtual ~PictFileView() { + for (unsigned i = 0; i < kBBoxTypeCount; ++i) { + SkSafeUnref(fPictures[i]); + } + } + + virtual void onTileSizeChanged(const SkSize &tileSize) SK_OVERRIDE { + if (tileSize != fTileSize) { + fTileSize = tileSize; + SkSafeSetNull(fPictures[kTileGrid_BBoxType]); + } + } + +protected: + // overrides from SkEventSink + virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { + if (SampleCode::TitleQ(*evt)) { + SkString name("P:"); + const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR); + name.append(basename ? basename+1: fFilename.c_str()); + if (fBBox != kNo_BBoxType) { + name.append(fBBox == kRTree_BBoxType ? " <bbox: R>" : " <bbox: T>"); + } + SampleCode::TitleR(evt, name.c_str()); + return true; + } + return this->INHERITED::onQuery(evt); + } + + virtual bool onEvent(const SkEvent& evt) SK_OVERRIDE { + if (evt.isType("PictFileView::toggleBBox")) { + fBBox = (BBoxType)((fBBox + 1) % kBBoxTypeCount); + return true; + } + return this->INHERITED::onEvent(evt); + } + + virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE { + SkASSERT(fBBox < kBBoxTypeCount); + SkPicture** picture = fPictures + fBBox; + + if (!*picture) { + *picture = LoadPicture(fFilename.c_str(), fBBox); + } + if (*picture) { + canvas->drawPicture(**picture); + } + } + +private: + enum BBoxType { + kNo_BBoxType, + kRTree_BBoxType, + kTileGrid_BBoxType, + + kLast_BBoxType = kTileGrid_BBoxType + }; + static const unsigned kBBoxTypeCount = kLast_BBoxType + 1; + SkString fFilename; - SkPicture* fPicture; - SkPicture* fBBoxPicture; - bool fUseBBox; + SkPicture* fPictures[kBBoxTypeCount]; + BBoxType fBBox; + SkSize fTileSize; - static SkPicture* LoadPicture(const char path[], bool useBBox) { + SkPicture* LoadPicture(const char path[], BBoxType bbox) { SkPicture* pic = NULL; SkBitmap bm; @@ -71,67 +141,41 @@ class PictFileView : public SampleView { } } - if (useBBox) { - SkPicture* bboxPicture = SkNEW(SkPicture); - pic->draw(bboxPicture->beginRecording(pic->width(), pic->height(), - SkPicture::kOptimizeForClippedPlayback_RecordingFlag)); - bboxPicture->endRecording(); - SkDELETE(pic); - return bboxPicture; - - } else { - return pic; + if (!pic) { + return NULL; } - } - -public: - PictFileView(const char name[] = NULL) : fFilename(name) { - fPicture = NULL; - fBBoxPicture = NULL; - fUseBBox = false; - } - virtual ~PictFileView() { - SkSafeUnref(fPicture); - SkSafeUnref(fBBoxPicture); - } - -protected: - // overrides from SkEventSink - virtual bool onQuery(SkEvent* evt) { - if (SampleCode::TitleQ(*evt)) { - SkString name("P:"); - const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR); - name.append(basename ? basename+1: fFilename.c_str()); - if (fUseBBox) { - name.append(" <bbox>"); - } - SampleCode::TitleR(evt, name.c_str()); - return true; + SkPicture* bboxPicture = NULL; + switch (bbox) { + case kNo_BBoxType: + // no bbox playback necessary + break; + case kRTree_BBoxType: + bboxPicture = SkNEW(SkPicture); + break; + case kTileGrid_BBoxType: { + SkASSERT(!fTileSize.isEmpty()); + SkTileGridPicture::TileGridInfo gridInfo; + gridInfo.fMargin = SkISize::Make(0, 0); + gridInfo.fOffset = SkIPoint::Make(0, 0); + gridInfo.fTileInterval = fTileSize.toRound(); + bboxPicture = SkNEW_ARGS(SkTileGridPicture, (pic->width(), pic->height(), gridInfo)); + } break; + default: + SkASSERT(false); } - return this->INHERITED::onQuery(evt); - } - virtual bool onEvent(const SkEvent& evt) { - if (evt.isType("PictFileView::toggleBBox")) { - fUseBBox = !fUseBBox; - return true; + if (bboxPicture) { + pic->draw(bboxPicture->beginRecording(pic->width(), pic->height(), + SkPicture::kOptimizeForClippedPlayback_RecordingFlag)); + bboxPicture->endRecording(); + SkDELETE(pic); + return bboxPicture; } - return this->INHERITED::onEvent(evt); - } - virtual void onDrawContent(SkCanvas* canvas) { - SkPicture** picture = fUseBBox ? &fBBoxPicture : &fPicture; - - if (!*picture) { - *picture = LoadPicture(fFilename.c_str(), fUseBBox); - } - if (*picture) { - canvas->drawPicture(**picture); - } + return pic; } -private: typedef SampleView INHERITED; }; |
