blob: d8724955e07437aae4a7323ff93c6dc4d6e3c9fd [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
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +000011#include "SkOSMenu.h"
Scroggo2c8208f2011-06-15 16:49:08 +000012#include "SkPath.h"
robertphillips@google.com84b18c72014-04-13 19:09:42 +000013#include "SkPicture.h"
robertphillips@google.com770963f2014-04-18 18:04:41 +000014#include "SkPictureRecorder.h"
Scroggo2c8208f2011-06-15 16:49:08 +000015#include "SkScalar.h"
16#include "SkTDArray.h"
17#include "SkTouchGesture.h"
18#include "SkWindow.h"
jvanverth4d0d81a2015-08-11 11:07:07 -070019#include "timer/Timer.h"
Scroggo2c8208f2011-06-15 16:49:08 +000020
21class GrContext;
reed@google.com29038ed2011-07-06 17:56:47 +000022class GrRenderTarget;
Scroggo2c8208f2011-06-15 16:49:08 +000023
Scroggo2c8208f2011-06-15 16:49:08 +000024class SkCanvas;
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +000025class SkData;
reedddb5eca2014-10-08 11:10:51 -070026class SkDocument;
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +000027class SkEvent;
Scroggo2c8208f2011-06-15 16:49:08 +000028class SkTypeface;
tfarina@chromium.orgf726a1c2012-09-29 12:40:30 +000029class SkViewFactory;
Scroggo2c8208f2011-06-15 16:49:08 +000030
Scroggo2c8208f2011-06-15 16:49:08 +000031class SampleWindow : public SkOSWindow {
bsalomon@google.com48dd1a22011-10-31 14:18:20 +000032 SkTDArray<const SkViewFactory*> fSamples;
Scroggo2c8208f2011-06-15 16:49:08 +000033public:
bsalomon@google.com098e96d2011-07-14 14:30:46 +000034 enum DeviceType {
35 kRaster_DeviceType,
36 kPicture_DeviceType,
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000037#if SK_SUPPORT_GPU
bsalomon@google.com74913722011-10-27 20:44:19 +000038 kGPU_DeviceType,
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000039#if SK_ANGLE
40 kANGLE_DeviceType,
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000041#endif // SK_ANGLE
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000042#endif // SK_SUPPORT_GPU
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000043 kDeviceTypeCnt
bsalomon@google.com098e96d2011-07-14 14:30:46 +000044 };
bsalomon@google.com82502e22013-01-24 20:47:18 +000045
46 static bool IsGpuDeviceType(DeviceType devType) {
47 #if SK_SUPPORT_GPU
48 switch (devType) {
49 case kGPU_DeviceType:
50 #if SK_ANGLE
51 case kANGLE_DeviceType:
52 #endif // SK_ANGLE
bsalomon@google.com82502e22013-01-24 20:47:18 +000053 return true;
reed@google.com58c0aaa2013-01-24 22:09:06 +000054 default:
55 return false;
bsalomon@google.com82502e22013-01-24 20:47:18 +000056 }
57 #endif // SK_SUPPORT_GPU
58 return false;
59 }
60
bsalomon@google.com098e96d2011-07-14 14:30:46 +000061 /**
62 * SampleApp ports can subclass this manager class if they want to:
63 * * filter the types of devices supported
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000064 * * customize plugging of SkBaseDevice objects into an SkCanvas
bsalomon@google.com098e96d2011-07-14 14:30:46 +000065 * * customize publishing the results of draw to the OS window
66 * * manage GrContext / GrRenderTarget lifetimes
67 */
68 class DeviceManager : public SkRefCnt {
69 public:
mtklein2766c002015-06-26 11:45:03 -070070
robertphillips@google.coma22e2112012-08-16 14:58:06 +000071
bsalomon@google.com11959252012-04-06 20:13:38 +000072 virtual void setUpBackend(SampleWindow* win, int msaaSampleCount) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000073
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000074 virtual void tearDownBackend(SampleWindow* win) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000075
76 // called before drawing. should install correct device
77 // type on the canvas. Will skip drawing if returns false.
reed0397e9f2014-09-18 11:29:01 -070078 virtual SkSurface* createSurface(DeviceType dType, SampleWindow* win) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000079
80 // called after drawing, should get the results onto the
81 // screen.
82 virtual void publishCanvas(DeviceType dType,
83 SkCanvas* canvas,
84 SampleWindow* win) = 0;
85
86 // called when window changes size, guaranteed to be called
87 // at least once before first draw (after init)
88 virtual void windowSizeChanged(SampleWindow* win) = 0;
89
halcanary96fcdcc2015-08-27 07:41:13 -070090 // return the GrContext backing gpu devices (nullptr if not built with GPU support)
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000091 virtual GrContext* getGrContext() = 0;
bsalomon@google.com11959252012-04-06 20:13:38 +000092
halcanary96fcdcc2015-08-27 07:41:13 -070093 // return the GrRenderTarget backing gpu devices (nullptr if not built with GPU support)
bsalomon@google.com11959252012-04-06 20:13:38 +000094 virtual GrRenderTarget* getGrRenderTarget() = 0;
robertphillips@google.coma22e2112012-08-16 14:58:06 +000095 private:
96 typedef SkRefCnt INHERITED;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000097 };
98
99 SampleWindow(void* hwnd, int argc, char** argv, DeviceManager*);
Scroggo2c8208f2011-06-15 16:49:08 +0000100 virtual ~SampleWindow();
101
mtklein36352bf2015-03-25 18:17:31 -0700102 SkSurface* createSurface() override {
halcanary96fcdcc2015-08-27 07:41:13 -0700103 SkSurface* surface = nullptr;
reed@google.com5957f472012-10-01 20:31:56 +0000104 if (fDevManager) {
reed0397e9f2014-09-18 11:29:01 -0700105 surface = fDevManager->createSurface(fDeviceType, this);
reed@google.com5957f472012-10-01 20:31:56 +0000106 }
halcanary96fcdcc2015-08-27 07:41:13 -0700107 if (nullptr == surface) {
reed0397e9f2014-09-18 11:29:01 -0700108 surface = this->INHERITED::createSurface();
reed@google.com5957f472012-10-01 20:31:56 +0000109 }
reed0397e9f2014-09-18 11:29:01 -0700110 return surface;
reed@google.com5957f472012-10-01 20:31:56 +0000111 }
112
mtklein36352bf2015-03-25 18:17:31 -0700113 void draw(SkCanvas*) override;
Scroggo2c8208f2011-06-15 16:49:08 +0000114
yangsu@google.com921091f2011-08-02 13:39:12 +0000115 void setDeviceType(DeviceType type);
Scroggo2c8208f2011-06-15 16:49:08 +0000116 void toggleRendering();
117 void toggleSlideshow();
118 void toggleFPS();
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000119 void showOverview();
reed4302ae92014-10-06 12:29:56 -0700120 void toggleDistanceFieldFonts();
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000121
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000122 GrContext* getGrContext() const { return fDevManager->getGrContext(); }
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000123
Scroggo2c8208f2011-06-15 16:49:08 +0000124 void setZoomCenter(float x, float y);
125 void changeZoomLevel(float delta);
126 bool nextSample();
127 bool previousSample();
yangsu@google.com501775e2011-06-24 16:04:50 +0000128 bool goToSample(int i);
129 SkString getSampleTitle(int i);
130 int sampleCount();
Scroggoa54e2f62011-06-17 12:46:17 +0000131 bool handleTouch(int ownerId, float x, float y,
132 SkView::Click::State state);
Scroggo8ac0d542011-06-21 14:44:57 +0000133 void saveToPdf();
Scroggo62b65b02011-06-21 16:01:26 +0000134 void postInvalDelay();
Scroggo2c8208f2011-06-15 16:49:08 +0000135
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000136 DeviceType getDeviceType() const { return fDeviceType; }
137
Scroggo2c8208f2011-06-15 16:49:08 +0000138protected:
mtklein36352bf2015-03-25 18:17:31 -0700139 void onDraw(SkCanvas* canvas) override;
140 bool onHandleKey(SkKey key) override;
141 bool onHandleChar(SkUnichar) override;
142 void onSizeChange() override;
Scroggo2c8208f2011-06-15 16:49:08 +0000143
mtklein36352bf2015-03-25 18:17:31 -0700144 SkCanvas* beforeChildren(SkCanvas*) override;
145 void afterChildren(SkCanvas*) override;
146 void beforeChild(SkView* child, SkCanvas* canvas) override;
Scroggo2c8208f2011-06-15 16:49:08 +0000147
mtklein36352bf2015-03-25 18:17:31 -0700148 bool onEvent(const SkEvent& evt) override;
149 bool onQuery(SkEvent* evt) override;
Scroggo2c8208f2011-06-15 16:49:08 +0000150
reed@google.com4d5c26d2013-01-08 16:17:50 +0000151 virtual bool onDispatchClick(int x, int y, Click::State, void* owner,
mtklein36352bf2015-03-25 18:17:31 -0700152 unsigned modi) override;
153 bool onClick(Click* click) override;
reed@google.com4d5c26d2013-01-08 16:17:50 +0000154 virtual Click* onFindClickHandler(SkScalar x, SkScalar y,
mtklein36352bf2015-03-25 18:17:31 -0700155 unsigned modi) override;
Scroggo2c8208f2011-06-15 16:49:08 +0000156
157private:
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000158 class DefaultDeviceManager;
159
Scroggo2c8208f2011-06-15 16:49:08 +0000160 int fCurrIndex;
161
robertphillips@google.com84b18c72014-04-13 19:09:42 +0000162 SkPictureRecorder fRecorder;
fmalita822ace92015-06-15 07:07:32 -0700163 SkAutoTDelete<SkCanvas> fFlagsFilterCanvas;
Scroggo2c8208f2011-06-15 16:49:08 +0000164 SkPath fClipPath;
165
166 SkTouchGesture fGesture;
167 SkScalar fZoomLevel;
168 SkScalar fZoomScale;
169
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000170 DeviceType fDeviceType;
171 DeviceManager* fDevManager;
Scroggo2c8208f2011-06-15 16:49:08 +0000172
Scroggo8ac0d542011-06-21 14:44:57 +0000173 bool fSaveToPdf;
reed093b4e82015-08-04 18:46:38 -0700174 bool fSaveToSKP;
reedddb5eca2014-10-08 11:10:51 -0700175 SkAutoTUnref<SkDocument> fPDFDocument;
Scroggo8ac0d542011-06-21 14:44:57 +0000176
Scroggo2c8208f2011-06-15 16:49:08 +0000177 bool fUseClip;
Scroggo2c8208f2011-06-15 16:49:08 +0000178 bool fAnimating;
179 bool fRotate;
bsalomon@google.come8f09102011-09-08 18:48:12 +0000180 bool fPerspAnim;
Scroggo2c8208f2011-06-15 16:49:08 +0000181 bool fRequestGrabImage;
Scroggo2c8208f2011-06-15 16:49:08 +0000182 bool fMeasureFPS;
jvanverth4d0d81a2015-08-11 11:07:07 -0700183 WallTimer fTimer;
184 double fMeasureFPS_Time;
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000185 bool fMagnify;
commit-bot@chromium.orgcc63b322013-12-06 20:14:55 +0000186 int fTilingMode;
chudy@google.com4605a3f2012-08-01 17:58:01 +0000187
188
scroggo@google.comb073d922012-06-08 15:35:03 +0000189 SkOSMenu::TriState fPipeState; // Mixed uses a tiled pipe
190 // On uses a normal pipe
191 // Off uses no pipe
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000192 int fUsePipeMenuItemID;
chudy@google.com4605a3f2012-08-01 17:58:01 +0000193
Scroggo2c8208f2011-06-15 16:49:08 +0000194 // The following are for the 'fatbits' drawing
195 // Latest position of the mouse.
196 int fMouseX, fMouseY;
197 int fFatBitsScale;
198 // Used by the text showing position and color values.
199 SkTypeface* fTypeface;
200 bool fShowZoomer;
chudy@google.com4605a3f2012-08-01 17:58:01 +0000201
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000202 SkOSMenu::TriState fLCDState;
203 SkOSMenu::TriState fAAState;
bungeman@google.com96aabc82013-06-03 21:26:34 +0000204 SkOSMenu::TriState fSubpixelState;
205 int fHintingState;
reed93a12152015-03-16 10:08:34 -0700206 int fFilterQualityIndex;
Scroggo2c8208f2011-06-15 16:49:08 +0000207 unsigned fFlipAxis;
208
bsalomon@google.com11959252012-04-06 20:13:38 +0000209 int fMSAASampleCount;
210
Scroggo2c8208f2011-06-15 16:49:08 +0000211 int fScrollTestX, fScrollTestY;
212 SkScalar fZoomCenterX, fZoomCenterY;
213
yangsu@google.com921091f2011-08-02 13:39:12 +0000214 //Stores global settings
scroggo@google.com7dadc742012-04-18 14:07:57 +0000215 SkOSMenu* fAppMenu; // We pass ownership to SkWindow, when we call addMenu
yangsu@google.com921091f2011-08-02 13:39:12 +0000216 //Stores slide specific settings
scroggo@google.com7dadc742012-04-18 14:07:57 +0000217 SkOSMenu* fSlideMenu; // We pass ownership to SkWindow, when we call addMenu
218
Scroggo2c8208f2011-06-15 16:49:08 +0000219 void loadView(SkView*);
220 void updateTitle();
reedddb5eca2014-10-08 11:10:51 -0700221 bool getRawTitle(SkString*);
Scroggo2c8208f2011-06-15 16:49:08 +0000222
Scroggo2c8208f2011-06-15 16:49:08 +0000223 bool zoomIn();
224 bool zoomOut();
225 void updatePointer(int x, int y);
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000226 void magnify(SkCanvas* canvas);
Scroggo2c8208f2011-06-15 16:49:08 +0000227 void showZoomer(SkCanvas* canvas);
reed@google.comf03bb562011-11-11 21:42:12 +0000228 void updateMatrix();
Scroggo2c8208f2011-06-15 16:49:08 +0000229 void postAnimatingEvent();
mike@reedtribe.org6f6e8c32011-12-27 22:33:50 +0000230 int findByTitle(const char*);
robertphillips@google.com7265e722012-05-03 18:22:28 +0000231 void listTitles();
commit-bot@chromium.orgbbe43a92013-12-10 21:51:06 +0000232 SkSize tileSize() const;
reedd9adfe62015-02-01 19:01:04 -0800233 bool sendAnimatePulse();
Scroggo2c8208f2011-06-15 16:49:08 +0000234
Scroggo2c8208f2011-06-15 16:49:08 +0000235 typedef SkOSWindow INHERITED;
236};
237
238#endif