blob: 0c08fd74eb1d744b7230eaef02705c3382c1ed7a [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
msarettd15750c2016-03-18 15:48:49 -07008#include "DecodeFile.h"
reed@google.com1830c7a2012-06-04 12:05:43 +00009#include "SampleCode.h"
10#include "SkDumpCanvas.h"
11#include "SkView.h"
12#include "SkCanvas.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000013#include "SkGradientShader.h"
14#include "SkGraphics.h"
djsollen@google.com796763e2012-12-10 14:12:55 +000015#include "SkOSFile.h"
Ben Wagnerbf111d72016-11-07 18:05:29 -050016#include "SkOSPath.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000017#include "SkPath.h"
18#include "SkPicture.h"
robertphillips@google.com770963f2014-04-18 18:04:41 +000019#include "SkPictureRecorder.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000020#include "SkRandom.h"
21#include "SkRegion.h"
22#include "SkShader.h"
23#include "SkUtils.h"
24#include "SkColorPriv.h"
25#include "SkColorFilter.h"
26#include "SkTime.h"
27#include "SkTypeface.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000028#include "SkStream.h"
reed@google.com636d87a2013-09-17 20:03:43 +000029#include "SkSurface.h"
reed@google.com1830c7a2012-06-04 12:05:43 +000030
reed40dab982015-01-28 13:28:53 -080031#include "SkGlyphCache.h"
32
reed@google.com1830c7a2012-06-04 12:05:43 +000033class PictFileView : public SampleView {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000034public:
halcanary96fcdcc2015-08-27 07:41:13 -070035 PictFileView(const char name[] = nullptr)
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000036 : fFilename(name)
37 , fBBox(kNo_BBoxType)
38 , fTileSize(SkSize::Make(0, 0)) {
fmalita@google.com9a65e2c2013-12-10 22:25:53 +000039 for (int i = 0; i < kBBoxTypeCount; ++i) {
halcanary96fcdcc2015-08-27 07:41:13 -070040 fPictures[i] = nullptr;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000041 }
reed093b4e82015-08-04 18:46:38 -070042 fCount = 0;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000043 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000044
reedccebcec2016-08-22 07:41:46 -070045 ~PictFileView() override {
46 this->freePictures();
47 }
48
49 void freePictures() {
fmalita@google.com9a65e2c2013-12-10 22:25:53 +000050 for (int i = 0; i < kBBoxTypeCount; ++i) {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000051 SkSafeUnref(fPictures[i]);
reedccebcec2016-08-22 07:41:46 -070052 fPictures[i] = nullptr;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000053 }
54 }
55
mtklein36352bf2015-03-25 18:17:31 -070056 void onTileSizeChanged(const SkSize &tileSize) override {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000057 if (tileSize != fTileSize) {
58 fTileSize = tileSize;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000059 }
60 }
61
62protected:
63 // overrides from SkEventSink
mtklein36352bf2015-03-25 18:17:31 -070064 bool onQuery(SkEvent* evt) override {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000065 if (SampleCode::TitleQ(*evt)) {
66 SkString name("P:");
Ben Wagnerbf111d72016-11-07 18:05:29 -050067 const char* basename = strrchr(fFilename.c_str(), SkOSPath::SEPARATOR);
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000068 name.append(basename ? basename+1: fFilename.c_str());
commit-bot@chromium.orgc22d1392014-02-03 18:08:33 +000069 switch (fBBox) {
70 case kNo_BBoxType:
71 // No name appended
72 break;
73 case kRTree_BBoxType:
74 name.append(" <bbox: R>");
75 break;
commit-bot@chromium.orgc22d1392014-02-03 18:08:33 +000076 default:
77 SkASSERT(false);
78 break;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000079 }
80 SampleCode::TitleR(evt, name.c_str());
81 return true;
82 }
reed093b4e82015-08-04 18:46:38 -070083 SkUnichar uni;
84 if (SampleCode::CharQ(*evt, &uni)) {
85 switch (uni) {
86 case 'n': fCount += 1; this->inval(nullptr); return true;
87 case 'p': fCount -= 1; this->inval(nullptr); return true;
88 case 's': fCount = 0; this->inval(nullptr); return true;
reedccebcec2016-08-22 07:41:46 -070089 case 'F':
90 fFilterQuality = (kNone_SkFilterQuality == fFilterQuality) ?
91 kHigh_SkFilterQuality : kNone_SkFilterQuality;
92 this->freePictures();
93 this->inval(nullptr);
94 return true;
reed093b4e82015-08-04 18:46:38 -070095 default: break;
96 }
97 }
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +000098 return this->INHERITED::onQuery(evt);
99 }
100
mtklein36352bf2015-03-25 18:17:31 -0700101 bool onEvent(const SkEvent& evt) override {
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000102 if (evt.isType("PictFileView::toggleBBox")) {
103 fBBox = (BBoxType)((fBBox + 1) % kBBoxTypeCount);
104 return true;
105 }
106 return this->INHERITED::onEvent(evt);
107 }
108
mtklein36352bf2015-03-25 18:17:31 -0700109 void onDrawContent(SkCanvas* canvas) override {
commit-bot@chromium.org8c6f4b32014-02-03 19:40:32 +0000110 SkASSERT(static_cast<int>(fBBox) < kBBoxTypeCount);
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000111 SkPicture** picture = fPictures + fBBox;
112
reed40dab982015-01-28 13:28:53 -0800113#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
114 SkGraphics::PurgeFontCache();
115#endif
116
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000117 if (!*picture) {
reedca2622b2016-03-18 07:25:55 -0700118 *picture = LoadPicture(fFilename.c_str(), fBBox).release();
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000119 }
reed40dab982015-01-28 13:28:53 -0800120
Florin Malita8cc93312017-05-30 11:39:12 -0400121 if (*picture) {
122 canvas->drawPicture(*picture);
123 }
124
reed40dab982015-01-28 13:28:53 -0800125#ifdef SK_GLYPHCACHE_TRACK_HASH_STATS
126 SkGlyphCache::Dump();
127 SkDebugf("\n");
128#endif
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000129 }
130
131private:
132 enum BBoxType {
133 kNo_BBoxType,
134 kRTree_BBoxType,
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000135
mtklein703dd2e2015-01-09 06:41:48 -0800136 kLast_BBoxType = kRTree_BBoxType,
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000137 };
fmalita@google.come6a98d42013-12-10 22:12:40 +0000138 static const int kBBoxTypeCount = kLast_BBoxType + 1;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000139
140 SkString fFilename;
141 SkPicture* fPictures[kBBoxTypeCount];
142 BBoxType fBBox;
143 SkSize fTileSize;
reed093b4e82015-08-04 18:46:38 -0700144 int fCount;
reedccebcec2016-08-22 07:41:46 -0700145 SkFilterQuality fFilterQuality = kNone_SkFilterQuality;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000146
reedca2622b2016-03-18 07:25:55 -0700147 sk_sp<SkPicture> LoadPicture(const char path[], BBoxType bbox) {
148 sk_sp<SkPicture> pic;
reed@google.comb1963742012-08-03 13:39:57 +0000149
reedccebcec2016-08-22 07:41:46 -0700150 if (sk_sp<SkImage> img = decode_file(path)) {
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000151 SkPictureRecorder recorder;
reedccebcec2016-08-22 07:41:46 -0700152 SkCanvas* can = recorder.beginRecording(SkIntToScalar(img->width()),
153 SkIntToScalar(img->height()),
halcanary96fcdcc2015-08-27 07:41:13 -0700154 nullptr, 0);
reedccebcec2016-08-22 07:41:46 -0700155 SkPaint paint;
156 paint.setFilterQuality(fFilterQuality);
157 can->drawImage(img, 0, 0, &paint);
reedca2622b2016-03-18 07:25:55 -0700158 pic = recorder.finishRecordingAsPicture();
reed@google.comb1963742012-08-03 13:39:57 +0000159 } else {
160 SkFILEStream stream(path);
161 if (stream.isValid()) {
reedca2622b2016-03-18 07:25:55 -0700162 pic = SkPicture::MakeFromStream(&stream);
reed@google.comb8b830e2013-06-25 20:42:37 +0000163 } else {
164 SkDebugf("coun't load picture at \"path\"\n", path);
reed@google.comb1963742012-08-03 13:39:57 +0000165 }
skia.committer@gmail.com11f86922012-08-31 17:14:46 +0000166
reed@google.com0a5c18b2012-08-31 13:32:47 +0000167 if (false) { // re-record
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000168 SkPictureRecorder recorder;
robertphillipsc5ba71d2014-09-04 08:42:50 -0700169 pic->playback(recorder.beginRecording(pic->cullRect().width(),
mtklein703dd2e2015-01-09 06:41:48 -0800170 pic->cullRect().height(),
halcanary96fcdcc2015-08-27 07:41:13 -0700171 nullptr, 0));
reedca2622b2016-03-18 07:25:55 -0700172 sk_sp<SkPicture> p2(recorder.finishRecordingAsPicture());
skia.committer@gmail.com11f86922012-08-31 17:14:46 +0000173
reed@google.com0a5c18b2012-08-31 13:32:47 +0000174 SkString path2(path);
175 path2.append(".new.skp");
176 SkFILEWStream writer(path2.c_str());
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000177 p2->serialize(&writer);
reed@google.com0a5c18b2012-08-31 13:32:47 +0000178 }
reed@google.comb1963742012-08-03 13:39:57 +0000179 }
djsollen@google.com796763e2012-12-10 14:12:55 +0000180
halcanary96fcdcc2015-08-27 07:41:13 -0700181 if (nullptr == pic) {
182 return nullptr;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000183 }
184
Ben Wagner145dbcd2016-11-03 14:40:50 -0400185 std::unique_ptr<SkBBHFactory> factory;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000186 switch (bbox) {
187 case kNo_BBoxType:
188 // no bbox playback necessary
fmalita3e33e6f2016-03-18 11:07:50 -0700189 return pic;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000190 case kRTree_BBoxType:
halcanary385fe4d2015-08-26 13:07:48 -0700191 factory.reset(new SkRTreeFactory);
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000192 break;
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000193 default:
194 SkASSERT(false);
195 }
196
commit-bot@chromium.org5fb2ce32014-04-17 23:35:06 +0000197 SkPictureRecorder recorder;
robertphillipsc5ba71d2014-09-04 08:42:50 -0700198 pic->playback(recorder.beginRecording(pic->cullRect().width(),
mtklein703dd2e2015-01-09 06:41:48 -0800199 pic->cullRect().height(),
robertphillipsc5ba71d2014-09-04 08:42:50 -0700200 factory.get(), 0));
reedca2622b2016-03-18 07:25:55 -0700201 return recorder.finishRecordingAsPicture();
reed@google.comb1963742012-08-03 13:39:57 +0000202 }
203
reed@google.com1830c7a2012-06-04 12:05:43 +0000204 typedef SampleView INHERITED;
205};
206
207SampleView* CreateSamplePictFileView(const char filename[]);
208SampleView* CreateSamplePictFileView(const char filename[]) {
209 return new PictFileView(filename);
210}
211
212//////////////////////////////////////////////////////////////////////////////
213
214#if 0
215static SkView* MyFactory() { return new PictFileView; }
216static SkViewRegister reg(MyFactory);
217#endif