blob: 9f7b5dbd71d9b208c513e2e27b88d556145b871e [file] [log] [blame]
Scroggo2c8208f2011-06-15 16:49:08 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2011 Skia
Scroggo2c8208f2011-06-15 16:49:08 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
Scroggo2c8208f2011-06-15 16:49:08 +00006 */
7
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +00008#ifndef SampleApp_DEFINED
9#define SampleApp_DEFINED
epoger@google.comec3ed6a2011-07-28 14:26:00 +000010
Yuqian Liba0ce4b2017-09-01 14:24:40 -040011#include "SkExecutor.h"
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +000012#include "SkOSMenu.h"
Scroggo2c8208f2011-06-15 16:49:08 +000013#include "SkPath.h"
robertphillips@google.com84b18c72014-04-13 19:09:42 +000014#include "SkPicture.h"
robertphillips@google.com770963f2014-04-18 18:04:41 +000015#include "SkPictureRecorder.h"
Scroggo2c8208f2011-06-15 16:49:08 +000016#include "SkScalar.h"
reed54dc4872016-09-13 08:09:45 -070017#include "SkStream.h"
jvanverth38c72152016-10-10 07:39:38 -070018#include "SkSurface.h"
Scroggo2c8208f2011-06-15 16:49:08 +000019#include "SkTDArray.h"
20#include "SkTouchGesture.h"
21#include "SkWindow.h"
jvanverth4d0d81a2015-08-11 11:07:07 -070022#include "timer/Timer.h"
Scroggo2c8208f2011-06-15 16:49:08 +000023
reed54dc4872016-09-13 08:09:45 -070024#include "SkPipe.h"
25
csmartdalton008b9d82017-02-22 12:00:42 -070026#if SK_SUPPORT_GPU
27#include "GrContextOptions.h"
28#endif
29
Scroggo2c8208f2011-06-15 16:49:08 +000030class GrContext;
reed@google.com29038ed2011-07-06 17:56:47 +000031class GrRenderTarget;
Scroggo2c8208f2011-06-15 16:49:08 +000032
Scroggo2c8208f2011-06-15 16:49:08 +000033class SkCanvas;
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +000034class SkData;
reedddb5eca2014-10-08 11:10:51 -070035class SkDocument;
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +000036class SkEvent;
Scroggo2c8208f2011-06-15 16:49:08 +000037class SkTypeface;
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +000038class SkViewFactory;
Scroggo2c8208f2011-06-15 16:49:08 +000039
Scroggo2c8208f2011-06-15 16:49:08 +000040class SampleWindow : public SkOSWindow {
bsalomon@google.com48dd1a22011-10-31 14:18:20 +000041 SkTDArray<const SkViewFactory*> fSamples;
Scroggo2c8208f2011-06-15 16:49:08 +000042public:
bsalomon@google.com098e96d2011-07-14 14:30:46 +000043 enum DeviceType {
44 kRaster_DeviceType,
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000045#if SK_SUPPORT_GPU
bsalomon@google.com74913722011-10-27 20:44:19 +000046 kGPU_DeviceType,
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000047#if SK_ANGLE
48 kANGLE_DeviceType,
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000049#endif // SK_ANGLE
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000050#endif // SK_SUPPORT_GPU
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000051 kDeviceTypeCnt
bsalomon@google.com098e96d2011-07-14 14:30:46 +000052 };
bsalomon@google.com82502e22013-01-24 20:47:18 +000053
54 static bool IsGpuDeviceType(DeviceType devType) {
55 #if SK_SUPPORT_GPU
56 switch (devType) {
57 case kGPU_DeviceType:
58 #if SK_ANGLE
59 case kANGLE_DeviceType:
60 #endif // SK_ANGLE
bsalomon@google.com82502e22013-01-24 20:47:18 +000061 return true;
reed@google.com58c0aaa2013-01-24 22:09:06 +000062 default:
63 return false;
bsalomon@google.com82502e22013-01-24 20:47:18 +000064 }
65 #endif // SK_SUPPORT_GPU
66 return false;
67 }
68
bsalomon@google.com098e96d2011-07-14 14:30:46 +000069 /**
70 * SampleApp ports can subclass this manager class if they want to:
71 * * filter the types of devices supported
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000072 * * customize plugging of SkBaseDevice objects into an SkCanvas
bsalomon@google.com098e96d2011-07-14 14:30:46 +000073 * * customize publishing the results of draw to the OS window
74 * * manage GrContext / GrRenderTarget lifetimes
75 */
76 class DeviceManager : public SkRefCnt {
77 public:
csmartdalton008b9d82017-02-22 12:00:42 -070078 struct BackendOptions {
79#if SK_SUPPORT_GPU
80 GrContextOptions fGrContextOptions;
81 int fMSAASampleCount;
82 bool fDeepColor;
83#endif
84 };
halcanary9d524f22016-03-29 09:03:52 -070085
csmartdalton008b9d82017-02-22 12:00:42 -070086 virtual void setUpBackend(SampleWindow* win, const BackendOptions&) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000087
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000088 virtual void tearDownBackend(SampleWindow* win) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000089
90 // called before drawing. should install correct device
91 // type on the canvas. Will skip drawing if returns false.
robertphillipsecf3dbe2016-07-28 15:17:34 -070092 virtual sk_sp<SkSurface> makeSurface(DeviceType dType, SampleWindow* win) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000093
94 // called after drawing, should get the results onto the
95 // screen.
Ben Wagner55963bc2017-07-24 15:00:35 +000096 virtual void publishCanvas(DeviceType dType,
97 SkCanvas* canvas,
98 SampleWindow* win) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000099
100 // called when window changes size, guaranteed to be called
101 // at least once before first draw (after init)
102 virtual void windowSizeChanged(SampleWindow* win) = 0;
103
halcanary96fcdcc2015-08-27 07:41:13 -0700104 // return the GrContext backing gpu devices (nullptr if not built with GPU support)
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000105 virtual GrContext* getGrContext() = 0;
bsalomon@google.com11959252012-04-06 20:13:38 +0000106
halcanary96fcdcc2015-08-27 07:41:13 -0700107 // return the GrRenderTarget backing gpu devices (nullptr if not built with GPU support)
robertphillipsecf3dbe2016-07-28 15:17:34 -0700108 virtual int numColorSamples() const = 0;
brianosman2d1ee792016-05-05 12:24:31 -0700109
110 // return the color depth of the output device
111 virtual int getColorBits() = 0;
112
robertphillips@google.coma22e2112012-08-16 14:58:06 +0000113 private:
114 typedef SkRefCnt INHERITED;
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000115 };
116
117 SampleWindow(void* hwnd, int argc, char** argv, DeviceManager*);
Brian Salomond3b65972017-03-22 12:05:03 -0400118 ~SampleWindow() override;
Scroggo2c8208f2011-06-15 16:49:08 +0000119
robertphillipsecf3dbe2016-07-28 15:17:34 -0700120 sk_sp<SkSurface> makeSurface() override {
121 sk_sp<SkSurface> surface;
reed@google.com5957f472012-10-01 20:31:56 +0000122 if (fDevManager) {
robertphillipsecf3dbe2016-07-28 15:17:34 -0700123 surface = fDevManager->makeSurface(fDeviceType, this);
reed@google.com5957f472012-10-01 20:31:56 +0000124 }
robertphillipsecf3dbe2016-07-28 15:17:34 -0700125 if (!surface) {
126 surface = this->INHERITED::makeSurface();
reed@google.com5957f472012-10-01 20:31:56 +0000127 }
reed0397e9f2014-09-18 11:29:01 -0700128 return surface;
reed@google.com5957f472012-10-01 20:31:56 +0000129 }
130
mtklein36352bf2015-03-25 18:17:31 -0700131 void draw(SkCanvas*) override;
Scroggo2c8208f2011-06-15 16:49:08 +0000132
yangsu@google.com921091f2011-08-02 13:39:12 +0000133 void setDeviceType(DeviceType type);
brianosmanb109b8c2016-06-16 13:03:24 -0700134 void setDeviceColorType(SkColorType, sk_sp<SkColorSpace>);
Scroggo2c8208f2011-06-15 16:49:08 +0000135 void toggleRendering();
136 void toggleSlideshow();
137 void toggleFPS();
Yuqian Li5458cf82017-05-24 09:58:07 -0400138 void resetFPS();
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000139 void showOverview();
reed4302ae92014-10-06 12:29:56 -0700140 void toggleDistanceFieldFonts();
bungeman5a59a422016-03-31 08:30:38 -0700141 void setPixelGeometry(int pixelGeometryIndex);
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000142
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000143 GrContext* getGrContext() const { return fDevManager->getGrContext(); }
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000144
Scroggo2c8208f2011-06-15 16:49:08 +0000145 void setZoomCenter(float x, float y);
146 void changeZoomLevel(float delta);
bungemance560262016-03-03 13:32:38 -0800147 void changeOffset(SkVector delta);
Scroggo2c8208f2011-06-15 16:49:08 +0000148 bool nextSample();
149 bool previousSample();
yangsu@google.com501775e2011-06-24 16:04:50 +0000150 bool goToSample(int i);
151 SkString getSampleTitle(int i);
152 int sampleCount();
Scroggoa54e2f62011-06-17 12:46:17 +0000153 bool handleTouch(int ownerId, float x, float y,
154 SkView::Click::State state);
Scroggo8ac0d542011-06-21 14:44:57 +0000155 void saveToPdf();
Scroggo62b65b02011-06-21 16:01:26 +0000156 void postInvalDelay();
Scroggo2c8208f2011-06-15 16:49:08 +0000157
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000158 DeviceType getDeviceType() const { return fDeviceType; }
brianosman35a02a82016-09-29 14:37:02 -0700159 int getColorConfigIndex() const { return fColorConfigIndex; }
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000160
Yuqian Li70898af2017-06-05 13:36:32 -0400161 int getTiles() const { return fTiles; }
Yuqian Liba0ce4b2017-09-01 14:24:40 -0400162 void setTiles(int tiles) { fTiles = tiles; this->resetExecutor(); }
Yuqian Lib55dd552017-04-03 10:52:48 -0400163 int getThreads() const { return fThreads; }
Yuqian Liba0ce4b2017-09-01 14:24:40 -0400164 void setThreads(int threads) { fThreads = threads; this->resetExecutor(); }
165
Yuqian Lib55dd552017-04-03 10:52:48 -0400166
Scroggo2c8208f2011-06-15 16:49:08 +0000167protected:
mtklein36352bf2015-03-25 18:17:31 -0700168 void onDraw(SkCanvas* canvas) override;
169 bool onHandleKey(SkKey key) override;
170 bool onHandleChar(SkUnichar) override;
171 void onSizeChange() override;
Scroggo2c8208f2011-06-15 16:49:08 +0000172
mtklein36352bf2015-03-25 18:17:31 -0700173 SkCanvas* beforeChildren(SkCanvas*) override;
174 void afterChildren(SkCanvas*) override;
175 void beforeChild(SkView* child, SkCanvas* canvas) override;
Scroggo2c8208f2011-06-15 16:49:08 +0000176
mtklein36352bf2015-03-25 18:17:31 -0700177 bool onEvent(const SkEvent& evt) override;
178 bool onQuery(SkEvent* evt) override;
Scroggo2c8208f2011-06-15 16:49:08 +0000179
reed@google.com4d5c26d2013-01-08 16:17:50 +0000180 virtual bool onDispatchClick(int x, int y, Click::State, void* owner,
mtklein36352bf2015-03-25 18:17:31 -0700181 unsigned modi) override;
182 bool onClick(Click* click) override;
reed@google.com4d5c26d2013-01-08 16:17:50 +0000183 virtual Click* onFindClickHandler(SkScalar x, SkScalar y,
mtklein36352bf2015-03-25 18:17:31 -0700184 unsigned modi) override;
Scroggo2c8208f2011-06-15 16:49:08 +0000185
186private:
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000187 class DefaultDeviceManager;
188
Scroggo2c8208f2011-06-15 16:49:08 +0000189 int fCurrIndex;
190
reed54dc4872016-09-13 08:09:45 -0700191 std::unique_ptr<SkDynamicMemoryWStream> fPipeStream;
192 SkPipeSerializer fPipeSerializer;
193 SkPipeDeserializer fPipeDeserializer;
194
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000195 SkPictureRecorder fRecorder;
Ben Wagner145dbcd2016-11-03 14:40:50 -0400196 std::unique_ptr<SkCanvas> fFlagsFilterCanvas;
Scroggo2c8208f2011-06-15 16:49:08 +0000197 SkPath fClipPath;
198
199 SkTouchGesture fGesture;
200 SkScalar fZoomLevel;
201 SkScalar fZoomScale;
bungemance560262016-03-03 13:32:38 -0800202 SkVector fOffset;
Scroggo2c8208f2011-06-15 16:49:08 +0000203
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000204 DeviceType fDeviceType;
205 DeviceManager* fDevManager;
Scroggo2c8208f2011-06-15 16:49:08 +0000206
Scroggo8ac0d542011-06-21 14:44:57 +0000207 bool fSaveToPdf;
reed093b4e82015-08-04 18:46:38 -0700208 bool fSaveToSKP;
halcanary676ab682016-05-03 12:10:04 -0700209 sk_sp<SkDocument> fPDFDocument;
Scroggo8ac0d542011-06-21 14:44:57 +0000210
Scroggo2c8208f2011-06-15 16:49:08 +0000211 bool fUseClip;
reed91b4dfb2016-01-08 08:23:19 -0800212 bool fUsePicture;
Scroggo2c8208f2011-06-15 16:49:08 +0000213 bool fAnimating;
214 bool fRotate;
bsalomon@google.come8f09102011-09-08 18:48:12 +0000215 bool fPerspAnim;
Scroggo2c8208f2011-06-15 16:49:08 +0000216 bool fRequestGrabImage;
Scroggo2c8208f2011-06-15 16:49:08 +0000217 bool fMeasureFPS;
reedbabc3de2016-07-08 08:43:27 -0700218 bool fUseDeferredCanvas;
jvanverth4d0d81a2015-08-11 11:07:07 -0700219 WallTimer fTimer;
220 double fMeasureFPS_Time;
Yuqian Li5458cf82017-05-24 09:58:07 -0400221 double fCumulativeFPS_Time;
222 int fCumulativeFPS_Count;
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000223 bool fMagnify;
commit-bot@chromium.orgcc63b322013-12-06 20:14:55 +0000224 int fTilingMode;
chudy@google.com4605a3f2012-08-01 17:58:01 +0000225
Scroggo2c8208f2011-06-15 16:49:08 +0000226 // The following are for the 'fatbits' drawing
227 // Latest position of the mouse.
228 int fMouseX, fMouseY;
229 int fFatBitsScale;
230 // Used by the text showing position and color values.
bungeman13b9c952016-05-12 10:09:30 -0700231 sk_sp<SkTypeface> fTypeface;
Scroggo2c8208f2011-06-15 16:49:08 +0000232 bool fShowZoomer;
chudy@google.com4605a3f2012-08-01 17:58:01 +0000233
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000234 SkOSMenu::TriState fLCDState;
235 SkOSMenu::TriState fAAState;
bungeman@google.com96aabc82013-06-03 21:26:34 +0000236 SkOSMenu::TriState fSubpixelState;
237 int fHintingState;
bungeman5a59a422016-03-31 08:30:38 -0700238 int fPixelGeometryIndex;
reed93a12152015-03-16 10:08:34 -0700239 int fFilterQualityIndex;
Scroggo2c8208f2011-06-15 16:49:08 +0000240 unsigned fFlipAxis;
241
csmartdalton008b9d82017-02-22 12:00:42 -0700242 DeviceManager::BackendOptions fBackendOptions;
243
brianosman35a02a82016-09-29 14:37:02 -0700244 int fColorConfigIndex;
bsalomon@google.com11959252012-04-06 20:13:38 +0000245
Scroggo2c8208f2011-06-15 16:49:08 +0000246 SkScalar fZoomCenterX, fZoomCenterY;
247
yangsu@google.com921091f2011-08-02 13:39:12 +0000248 //Stores global settings
scroggo@google.com7dadc742012-04-18 14:07:57 +0000249 SkOSMenu* fAppMenu; // We pass ownership to SkWindow, when we call addMenu
yangsu@google.com921091f2011-08-02 13:39:12 +0000250 //Stores slide specific settings
scroggo@google.com7dadc742012-04-18 14:07:57 +0000251 SkOSMenu* fSlideMenu; // We pass ownership to SkWindow, when we call addMenu
252
Yuqian Li70898af2017-06-05 13:36:32 -0400253 int fTiles = 0;
Yuqian Lib55dd552017-04-03 10:52:48 -0400254 int fThreads = 0;
Yuqian Liba0ce4b2017-09-01 14:24:40 -0400255 std::unique_ptr<SkExecutor> fExecutor;
Yuqian Lib55dd552017-04-03 10:52:48 -0400256
Yuqian Li94fddf82017-09-25 14:45:25 -0400257 int fMeasureMS; // the number of milliseconds to measure the FPS before we close the SampleApp
258
Scroggo2c8208f2011-06-15 16:49:08 +0000259 void loadView(SkView*);
260 void updateTitle();
reedddb5eca2014-10-08 11:10:51 -0700261 bool getRawTitle(SkString*);
Scroggo2c8208f2011-06-15 16:49:08 +0000262
Scroggo2c8208f2011-06-15 16:49:08 +0000263 bool zoomIn();
264 bool zoomOut();
265 void updatePointer(int x, int y);
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000266 void magnify(SkCanvas* canvas);
Scroggo2c8208f2011-06-15 16:49:08 +0000267 void showZoomer(SkCanvas* canvas);
reed@google.comf03bb562011-11-11 21:42:12 +0000268 void updateMatrix();
Scroggo2c8208f2011-06-15 16:49:08 +0000269 void postAnimatingEvent();
mike@reedtribe.org6f6e8c32011-12-27 22:33:50 +0000270 int findByTitle(const char*);
robertphillips@google.com7265e722012-05-03 18:22:28 +0000271 void listTitles();
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000272 SkSize tileSize() const;
reedd9adfe62015-02-01 19:01:04 -0800273 bool sendAnimatePulse();
Scroggo2c8208f2011-06-15 16:49:08 +0000274
Yuqian Liba0ce4b2017-09-01 14:24:40 -0400275 void resetExecutor() {
276 fExecutor = SkExecutor::MakeFIFOThreadPool(fThreads == 0 ? fTiles : fThreads);
277 }
278
Scroggo2c8208f2011-06-15 16:49:08 +0000279 typedef SkOSWindow INHERITED;
280};
281
282#endif