blob: ba404da515068ab22904795894e77da769f4359e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
Scroggo2c8208f2011-06-15 16:49:08 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 Skia
Scroggo2c8208f2011-06-15 16:49:08 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
Scroggo2c8208f2011-06-15 16:49:08 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
Scroggo2c8208f2011-06-15 16:49:08 +000010#ifndef SampleWindow_DEFINED
11#define SampleWindow_DEFINED
12
13#include "SkWindow.h"
14
15#include "SampleCode.h"
16#include "SkPath.h"
17#include "SkScalar.h"
18#include "SkTDArray.h"
19#include "SkTouchGesture.h"
20#include "SkWindow.h"
yangsu@google.com921091f2011-08-02 13:39:12 +000021#include "SkOSMenu.h"
Scroggo2c8208f2011-06-15 16:49:08 +000022
23class GrContext;
reed@google.com29038ed2011-07-06 17:56:47 +000024class GrRenderTarget;
Scroggo2c8208f2011-06-15 16:49:08 +000025
26class SkEvent;
27class SkCanvas;
Scroggo2c8208f2011-06-15 16:49:08 +000028class SkPicture;
29class SkTypeface;
yangsu@google.com501775e2011-06-24 16:04:50 +000030class SkData;
Scroggo2c8208f2011-06-15 16:49:08 +000031
Scroggo2c8208f2011-06-15 16:49:08 +000032class SampleWindow : public SkOSWindow {
bsalomon@google.com48dd1a22011-10-31 14:18:20 +000033 SkTDArray<const SkViewFactory*> fSamples;
Scroggo2c8208f2011-06-15 16:49:08 +000034public:
bsalomon@google.com098e96d2011-07-14 14:30:46 +000035 enum DeviceType {
36 kRaster_DeviceType,
37 kPicture_DeviceType,
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,
41#endif
bsalomon@google.com74913722011-10-27 20:44:19 +000042 kNullGPU_DeviceType
bsalomon@google.com098e96d2011-07-14 14:30:46 +000043 };
44 /**
45 * SampleApp ports can subclass this manager class if they want to:
46 * * filter the types of devices supported
47 * * customize plugging of SkDevice objects into an SkCanvas
48 * * customize publishing the results of draw to the OS window
49 * * manage GrContext / GrRenderTarget lifetimes
50 */
51 class DeviceManager : public SkRefCnt {
52 public:
bsalomon@google.com3c4d0322012-04-03 18:04:51 +000053 virtual void setUpBackend(SampleWindow* win) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000054
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000055 virtual void tearDownBackend(SampleWindow* win) = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000056
57 // called before drawing. should install correct device
58 // type on the canvas. Will skip drawing if returns false.
59 virtual bool prepareCanvas(DeviceType dType,
60 SkCanvas* canvas,
61 SampleWindow* win) = 0;
62
63 // called after drawing, should get the results onto the
64 // screen.
65 virtual void publishCanvas(DeviceType dType,
66 SkCanvas* canvas,
67 SampleWindow* win) = 0;
68
69 // called when window changes size, guaranteed to be called
70 // at least once before first draw (after init)
71 virtual void windowSizeChanged(SampleWindow* win) = 0;
72
73 // return the GrContext backing gpu devices
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000074 virtual GrContext* getGrContext() = 0;
bsalomon@google.com098e96d2011-07-14 14:30:46 +000075 };
76
77 SampleWindow(void* hwnd, int argc, char** argv, DeviceManager*);
Scroggo2c8208f2011-06-15 16:49:08 +000078 virtual ~SampleWindow();
79
80 virtual void draw(SkCanvas* canvas);
81
yangsu@google.com921091f2011-08-02 13:39:12 +000082 void setDeviceType(DeviceType type);
Scroggo2c8208f2011-06-15 16:49:08 +000083 void toggleRendering();
84 void toggleSlideshow();
85 void toggleFPS();
yangsu@google.comdb03eaa2011-08-08 15:37:23 +000086 void showOverview();
bsalomon@google.com098e96d2011-07-14 14:30:46 +000087
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000088 GrContext* getGrContext() const { return fDevManager->getGrContext(); }
bsalomon@google.com098e96d2011-07-14 14:30:46 +000089
Scroggo2c8208f2011-06-15 16:49:08 +000090 void setZoomCenter(float x, float y);
91 void changeZoomLevel(float delta);
92 bool nextSample();
93 bool previousSample();
yangsu@google.com501775e2011-06-24 16:04:50 +000094 bool goToSample(int i);
95 SkString getSampleTitle(int i);
96 int sampleCount();
Scroggoa54e2f62011-06-17 12:46:17 +000097 bool handleTouch(int ownerId, float x, float y,
98 SkView::Click::State state);
Scroggo8ac0d542011-06-21 14:44:57 +000099 void saveToPdf();
yangsu@google.com501775e2011-06-24 16:04:50 +0000100 SkData* getPDFData() { return fPDFData; }
Scroggo62b65b02011-06-21 16:01:26 +0000101 void postInvalDelay();
Scroggo2c8208f2011-06-15 16:49:08 +0000102
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000103 DeviceType getDeviceType() const { return fDeviceType; }
104
Scroggo2c8208f2011-06-15 16:49:08 +0000105protected:
106 virtual void onDraw(SkCanvas* canvas);
107 virtual bool onHandleKey(SkKey key);
108 virtual bool onHandleChar(SkUnichar);
109 virtual void onSizeChange();
110
111 virtual SkCanvas* beforeChildren(SkCanvas*);
112 virtual void afterChildren(SkCanvas*);
113 virtual void beforeChild(SkView* child, SkCanvas* canvas);
114 virtual void afterChild(SkView* child, SkCanvas* canvas);
115
116 virtual bool onEvent(const SkEvent& evt);
117 virtual bool onQuery(SkEvent* evt);
118
Scroggod3aed392011-06-22 13:26:56 +0000119 virtual bool onDispatchClick(int x, int y, Click::State, void* owner);
Scroggo2c8208f2011-06-15 16:49:08 +0000120 virtual bool onClick(Click* click);
121 virtual Click* onFindClickHandler(SkScalar x, SkScalar y);
122
123private:
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000124 class DefaultDeviceManager;
125
Scroggo2c8208f2011-06-15 16:49:08 +0000126 int fCurrIndex;
127
128 SkPicture* fPicture;
Scroggo2c8208f2011-06-15 16:49:08 +0000129 SkPath fClipPath;
130
131 SkTouchGesture fGesture;
132 SkScalar fZoomLevel;
133 SkScalar fZoomScale;
134
bsalomon@google.com098e96d2011-07-14 14:30:46 +0000135 DeviceType fDeviceType;
136 DeviceManager* fDevManager;
Scroggo2c8208f2011-06-15 16:49:08 +0000137
Scroggo8ac0d542011-06-21 14:44:57 +0000138 bool fSaveToPdf;
139 SkCanvas* fPdfCanvas;
yangsu@google.com501775e2011-06-24 16:04:50 +0000140 SkData* fPDFData;
Scroggo8ac0d542011-06-21 14:44:57 +0000141
Scroggo2c8208f2011-06-15 16:49:08 +0000142 bool fUseClip;
143 bool fNClip;
Scroggo2c8208f2011-06-15 16:49:08 +0000144 bool fAnimating;
145 bool fRotate;
bsalomon@google.come8f09102011-09-08 18:48:12 +0000146 bool fPerspAnim;
147 SkScalar fPerspAnimTime;
Scroggo2c8208f2011-06-15 16:49:08 +0000148 bool fScale;
149 bool fRequestGrabImage;
Scroggo2c8208f2011-06-15 16:49:08 +0000150 bool fMeasureFPS;
151 SkMSec fMeasureFPS_Time;
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000152 bool fMagnify;
153
yangsu@google.comef7bdfa2011-08-12 14:27:47 +0000154
155 bool fUsePipe;
156 int fUsePipeMenuItemID;
157 bool fDebugger;
158
Scroggo2c8208f2011-06-15 16:49:08 +0000159 // The following are for the 'fatbits' drawing
160 // Latest position of the mouse.
161 int fMouseX, fMouseY;
162 int fFatBitsScale;
163 // Used by the text showing position and color values.
164 SkTypeface* fTypeface;
165 bool fShowZoomer;
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000166
167 SkOSMenu::TriState fLCDState;
168 SkOSMenu::TriState fAAState;
169 SkOSMenu::TriState fFilterState;
170 SkOSMenu::TriState fHintingState;
Scroggo2c8208f2011-06-15 16:49:08 +0000171 unsigned fFlipAxis;
172
173 int fScrollTestX, fScrollTestY;
174 SkScalar fZoomCenterX, fZoomCenterY;
175
yangsu@google.com921091f2011-08-02 13:39:12 +0000176 //Stores global settings
177 SkOSMenu fAppMenu;
178 //Stores slide specific settings
179 SkOSMenu fSlideMenu;
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000180 int fTransitionNext;
181 int fTransitionPrev;
yangsu@google.com921091f2011-08-02 13:39:12 +0000182
Scroggo2c8208f2011-06-15 16:49:08 +0000183 void loadView(SkView*);
184 void updateTitle();
185
Scroggo2c8208f2011-06-15 16:49:08 +0000186 bool zoomIn();
187 bool zoomOut();
188 void updatePointer(int x, int y);
yangsu@google.comdb03eaa2011-08-08 15:37:23 +0000189 void magnify(SkCanvas* canvas);
Scroggo2c8208f2011-06-15 16:49:08 +0000190 void showZoomer(SkCanvas* canvas);
reed@google.comf03bb562011-11-11 21:42:12 +0000191 void updateMatrix();
Scroggo2c8208f2011-06-15 16:49:08 +0000192 void postAnimatingEvent();
reed@google.come23f1942011-12-08 19:36:00 +0000193 void installDrawFilter(SkCanvas*);
mike@reedtribe.org6f6e8c32011-12-27 22:33:50 +0000194 int findByTitle(const char*);
Scroggo2c8208f2011-06-15 16:49:08 +0000195
Scroggo2c8208f2011-06-15 16:49:08 +0000196 typedef SkOSWindow INHERITED;
197};
198
199#endif