blob: 59a7f4b55aadac590f200080798978ba7354650e [file] [log] [blame]
reed@google.com1830c7a2012-06-04 12:05:43 +00001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
reed@google.combf0001d2014-01-13 14:53:55 +00007
reed@google.com1830c7a2012-06-04 12:05:43 +00008#include "SampleCode.h"
9#include "SkDumpCanvas.h"
10#include "SkView.h"
11#include "SkCanvas.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000012#include "SkGradientShader.h"
13#include "SkGraphics.h"
14#include "SkImageDecoder.h"
djsollen@google.com796763e2012-12-10 14:12:55 +000015#include "SkOSFile.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000016#include "SkPath.h"
17#include "SkPicture.h"
commit-bot@chromium.orgc22d1392014-02-03 18:08:33 +000018#include "SkQuadTreePicture.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000019#include "SkRandom.h"
20#include "SkRegion.h"
commit-bot@chromium.orgd393b172014-04-16 16:02:10 +000021#include "SkRTreePicture.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000022#include "SkShader.h"
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000023#include "SkTileGridPicture.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000024#include "SkUtils.h"
25#include "SkColorPriv.h"
26#include "SkColorFilter.h"
27#include "SkTime.h"
28#include "SkTypeface.h"
29#include "SkXfermode.h"
30
31#include "SkStream.h"
reed@google.com636d87a2013-09-17 20:03:43 +000032#include "SkSurface.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000033#include "SkXMLParser.h"
34
35class PictFileView : public SampleView {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000036public:
37 PictFileView(const char name[] = NULL)
38 : fFilename(name)
39 , fBBox(kNo_BBoxType)
40 , fTileSize(SkSize::Make(0, 0)) {
fmalita@google.com9a65e2c2013-12-10 22:25:53 +000041 for (int i = 0; i < kBBoxTypeCount; ++i) {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000042 fPictures[i] = NULL;
43 }
44 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000045
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000046 virtual ~PictFileView() {
fmalita@google.com9a65e2c2013-12-10 22:25:53 +000047 for (int i = 0; i < kBBoxTypeCount; ++i) {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000048 SkSafeUnref(fPictures[i]);
49 }
50 }
51
52 virtual void onTileSizeChanged(const SkSize &tileSize) SK_OVERRIDE {
53 if (tileSize != fTileSize) {
54 fTileSize = tileSize;
55 SkSafeSetNull(fPictures[kTileGrid_BBoxType]);
56 }
57 }
58
59protected:
60 // overrides from SkEventSink
61 virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
62 if (SampleCode::TitleQ(*evt)) {
63 SkString name("P:");
64 const char* basename = strrchr(fFilename.c_str(), SkPATH_SEPARATOR);
65 name.append(basename ? basename+1: fFilename.c_str());
commit-bot@chromium.orgc22d1392014-02-03 18:08:33 +000066 switch (fBBox) {
67 case kNo_BBoxType:
68 // No name appended
69 break;
70 case kRTree_BBoxType:
71 name.append(" <bbox: R>");
72 break;
73 case kQuadTree_BBoxType:
74 name.append(" <bbox: Q>");
75 break;
76 case kTileGrid_BBoxType:
77 name.append(" <bbox: T>");
78 break;
79 default:
80 SkASSERT(false);
81 break;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000082 }
83 SampleCode::TitleR(evt, name.c_str());
84 return true;
85 }
86 return this->INHERITED::onQuery(evt);
87 }
88
89 virtual bool onEvent(const SkEvent& evt) SK_OVERRIDE {
90 if (evt.isType("PictFileView::toggleBBox")) {
91 fBBox = (BBoxType)((fBBox + 1) % kBBoxTypeCount);
92 return true;
93 }
94 return this->INHERITED::onEvent(evt);
95 }
96
97 virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE {
commit-bot@chromium.org8c6f4b32014-02-03 19:40:32 +000098 SkASSERT(static_cast<int>(fBBox) < kBBoxTypeCount);
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000099 SkPicture** picture = fPictures + fBBox;
100
101 if (!*picture) {
102 *picture = LoadPicture(fFilename.c_str(), fBBox);
103 }
104 if (*picture) {
105 canvas->drawPicture(**picture);
106 }
107 }
108
109private:
110 enum BBoxType {
111 kNo_BBoxType,
commit-bot@chromium.orgc22d1392014-02-03 18:08:33 +0000112 kQuadTree_BBoxType,
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000113 kRTree_BBoxType,
114 kTileGrid_BBoxType,
115
116 kLast_BBoxType = kTileGrid_BBoxType
117 };
fmalita@google.come6a98d42013-12-10 22:12:40 +0000118 static const int kBBoxTypeCount = kLast_BBoxType + 1;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000119
120 SkString fFilename;
121 SkPicture* fPictures[kBBoxTypeCount];
122 BBoxType fBBox;
123 SkSize fTileSize;
124
125 SkPicture* LoadPicture(const char path[], BBoxType bbox) {
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000126 SkAutoTUnref<SkPicture> pic;
reed@google.comb1963742012-08-03 13:39:57 +0000127
128 SkBitmap bm;
129 if (SkImageDecoder::DecodeFile(path, &bm)) {
130 bm.setImmutable();
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000131 SkPictureRecorder recorder;
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000132 SkCanvas* can = recorder.beginRecording(bm.width(), bm.height(), NULL, 0);
reed@google.comb1963742012-08-03 13:39:57 +0000133 can->drawBitmap(bm, 0, 0, NULL);
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000134 pic.reset(recorder.endRecording());
reed@google.comb1963742012-08-03 13:39:57 +0000135 } else {
136 SkFILEStream stream(path);
137 if (stream.isValid()) {
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000138 pic.reset(SkPicture::CreateFromStream(&stream));
reed@google.comb8b830e2013-06-25 20:42:37 +0000139 } else {
140 SkDebugf("coun't load picture at \"path\"\n", path);
reed@google.comb1963742012-08-03 13:39:57 +0000141 }
skia.committer@gmail.com11f86922012-08-31 17:14:46 +0000142
reed@google.com636d87a2013-09-17 20:03:43 +0000143 if (false) {
144 SkSurface* surf = SkSurface::NewRasterPMColor(pic->width(), pic->height());
145 surf->getCanvas()->drawPicture(*pic);
146 surf->unref();
147 }
reed@google.com0a5c18b2012-08-31 13:32:47 +0000148 if (false) { // re-record
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000149 SkPictureRecorder recorder;
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000150 pic->draw(recorder.beginRecording(pic->width(), pic->height(), NULL, 0));
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000151 SkAutoTUnref<SkPicture> p2(recorder.endRecording());
skia.committer@gmail.com11f86922012-08-31 17:14:46 +0000152
reed@google.com0a5c18b2012-08-31 13:32:47 +0000153 SkString path2(path);
154 path2.append(".new.skp");
155 SkFILEWStream writer(path2.c_str());
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000156 p2->serialize(&writer);
reed@google.com0a5c18b2012-08-31 13:32:47 +0000157 }
reed@google.comb1963742012-08-03 13:39:57 +0000158 }
djsollen@google.com796763e2012-12-10 14:12:55 +0000159
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000160 if (NULL == pic) {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000161 return NULL;
162 }
163
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000164 SkAutoTDelete<SkBBHFactory> factory;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000165 switch (bbox) {
166 case kNo_BBoxType:
167 // no bbox playback necessary
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000168 return pic.detach();
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000169 case kRTree_BBoxType:
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000170 factory.reset(SkNEW(SkRTreeFactory));
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000171 break;
commit-bot@chromium.orgc22d1392014-02-03 18:08:33 +0000172 case kQuadTree_BBoxType:
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000173 factory.reset(SkNEW(SkQuadTreeFactory));
commit-bot@chromium.orgc22d1392014-02-03 18:08:33 +0000174 break;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000175 case kTileGrid_BBoxType: {
176 SkASSERT(!fTileSize.isEmpty());
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000177 SkTileGridFactory::TileGridInfo gridInfo;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000178 gridInfo.fMargin = SkISize::Make(0, 0);
179 gridInfo.fOffset = SkIPoint::Make(0, 0);
180 gridInfo.fTileInterval = fTileSize.toRound();
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000181 factory.reset(SkNEW_ARGS(SkTileGridFactory, (gridInfo)));
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000182 break;
183 }
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000184 default:
185 SkASSERT(false);
186 }
187
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000188 SkPictureRecorder recorder;
189 pic->draw(recorder.beginRecording(pic->width(), pic->height(), factory.get(), 0));
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000190 return recorder.endRecording();
reed@google.comb1963742012-08-03 13:39:57 +0000191 }
192
reed@google.com1830c7a2012-06-04 12:05:43 +0000193 typedef SampleView INHERITED;
194};
195
196SampleView* CreateSamplePictFileView(const char filename[]);
197SampleView* CreateSamplePictFileView(const char filename[]) {
198 return new PictFileView(filename);
199}
200
201//////////////////////////////////////////////////////////////////////////////
202
203#if 0
204static SkView* MyFactory() { return new PictFileView; }
205static SkViewRegister reg(MyFactory);
206#endif