summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/samplecode/SamplePictFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/samplecode/SamplePictFile.cpp')
-rw-r--r--chromium/third_party/skia/samplecode/SamplePictFile.cpp204
1 files changed, 204 insertions, 0 deletions
diff --git a/chromium/third_party/skia/samplecode/SamplePictFile.cpp b/chromium/third_party/skia/samplecode/SamplePictFile.cpp
new file mode 100644
index 00000000000..9e9764c4330
--- /dev/null
+++ b/chromium/third_party/skia/samplecode/SamplePictFile.cpp
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SampleCode.h"
+#include "SkDumpCanvas.h"
+#include "SkView.h"
+#include "SkCanvas.h"
+#include "SkGradientShader.h"
+#include "SkGraphics.h"
+#include "SkImageDecoder.h"
+#include "SkOSFile.h"
+#include "SkPath.h"
+#include "SkPicture.h"
+#include "SkPictureRecorder.h"
+#include "SkRandom.h"
+#include "SkRegion.h"
+#include "SkShader.h"
+#include "SkUtils.h"
+#include "SkColorPriv.h"
+#include "SkColorFilter.h"
+#include "SkTime.h"
+#include "SkTypeface.h"
+#include "SkXfermode.h"
+
+#include "SkStream.h"
+#include "SkSurface.h"
+#include "SkXMLParser.h"
+
+class PictFileView : public SampleView {
+public:
+ PictFileView(const char name[] = NULL)
+ : fFilename(name)
+ , fBBox(kNo_BBoxType)
+ , fTileSize(SkSize::Make(0, 0)) {
+ for (int i = 0; i < kBBoxTypeCount; ++i) {
+ fPictures[i] = NULL;
+ }
+ }
+
+ virtual ~PictFileView() {
+ for (int 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());
+ switch (fBBox) {
+ case kNo_BBoxType:
+ // No name appended
+ break;
+ case kRTree_BBoxType:
+ name.append(" <bbox: R>");
+ break;
+ case kQuadTree_BBoxType:
+ name.append(" <bbox: Q>");
+ break;
+ case kTileGrid_BBoxType:
+ name.append(" <bbox: T>");
+ break;
+ default:
+ SkASSERT(false);
+ break;
+ }
+ 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(static_cast<int>(fBBox) < kBBoxTypeCount);
+ SkPicture** picture = fPictures + fBBox;
+
+ if (!*picture) {
+ *picture = LoadPicture(fFilename.c_str(), fBBox);
+ }
+ if (*picture) {
+ canvas->drawPicture(*picture);
+ }
+ }
+
+private:
+ enum BBoxType {
+ kNo_BBoxType,
+ kQuadTree_BBoxType,
+ kRTree_BBoxType,
+ kTileGrid_BBoxType,
+
+ kLast_BBoxType = kTileGrid_BBoxType
+ };
+ static const int kBBoxTypeCount = kLast_BBoxType + 1;
+
+ SkString fFilename;
+ SkPicture* fPictures[kBBoxTypeCount];
+ BBoxType fBBox;
+ SkSize fTileSize;
+
+ SkPicture* LoadPicture(const char path[], BBoxType bbox) {
+ SkAutoTUnref<SkPicture> pic;
+
+ SkBitmap bm;
+ if (SkImageDecoder::DecodeFile(path, &bm)) {
+ bm.setImmutable();
+ SkPictureRecorder recorder;
+ SkCanvas* can = recorder.beginRecording(bm.width(), bm.height(), NULL, 0);
+ can->drawBitmap(bm, 0, 0, NULL);
+ pic.reset(recorder.endRecording());
+ } else {
+ SkFILEStream stream(path);
+ if (stream.isValid()) {
+ pic.reset(SkPicture::CreateFromStream(&stream));
+ } else {
+ SkDebugf("coun't load picture at \"path\"\n", path);
+ }
+
+ if (false) {
+ SkSurface* surf = SkSurface::NewRasterPMColor(pic->width(), pic->height());
+ surf->getCanvas()->drawPicture(pic);
+ surf->unref();
+ }
+ if (false) { // re-record
+ SkPictureRecorder recorder;
+ pic->draw(recorder.beginRecording(pic->width(), pic->height(), NULL, 0));
+ SkAutoTUnref<SkPicture> p2(recorder.endRecording());
+
+ SkString path2(path);
+ path2.append(".new.skp");
+ SkFILEWStream writer(path2.c_str());
+ p2->serialize(&writer);
+ }
+ }
+
+ if (NULL == pic) {
+ return NULL;
+ }
+
+ SkAutoTDelete<SkBBHFactory> factory;
+ switch (bbox) {
+ case kNo_BBoxType:
+ // no bbox playback necessary
+ return pic.detach();
+ case kRTree_BBoxType:
+ factory.reset(SkNEW(SkRTreeFactory));
+ break;
+ case kQuadTree_BBoxType:
+ factory.reset(SkNEW(SkQuadTreeFactory));
+ break;
+ case kTileGrid_BBoxType: {
+ SkASSERT(!fTileSize.isEmpty());
+ SkTileGridFactory::TileGridInfo gridInfo;
+ gridInfo.fMargin = SkISize::Make(0, 0);
+ gridInfo.fOffset = SkIPoint::Make(0, 0);
+ gridInfo.fTileInterval = fTileSize.toRound();
+ factory.reset(SkNEW_ARGS(SkTileGridFactory, (gridInfo)));
+ break;
+ }
+ default:
+ SkASSERT(false);
+ }
+
+ SkPictureRecorder recorder;
+ pic->draw(recorder.beginRecording(pic->width(), pic->height(), factory.get(), 0));
+ return recorder.endRecording();
+ }
+
+ typedef SampleView INHERITED;
+};
+
+SampleView* CreateSamplePictFileView(const char filename[]);
+SampleView* CreateSamplePictFileView(const char filename[]) {
+ return new PictFileView(filename);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+#if 0
+static SkView* MyFactory() { return new PictFileView; }
+static SkViewRegister reg(MyFactory);
+#endif