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; |
}; |