| Index: samplecode/SamplePictFile.cpp
|
| diff --git a/samplecode/SamplePictFile.cpp b/samplecode/SamplePictFile.cpp
|
| index b8298d4e19d2f34695adeab724a383147df01da7..e81a1ad665229184378abba71210df4ab8ea6c77 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;
|
| };
|
|
|
|
|