11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Skia 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef SampleWindow_DEFINED 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SampleWindow_DEFINED 121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkWindow.h" 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SampleCode.h" 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPath.h" 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkScalar.h" 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTDArray.h" 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkTouchGesture.h" 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkWindow.h" 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkOSMenu.h" 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrContext; 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrRenderTarget; 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkEvent; 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkCanvas; 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkPicture; 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkTypeface; 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkData; 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SampleWindow : public SkOSWindow { 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkTDArray<const SkViewFactory*> fSamples; 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger enum DeviceType { 361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kRaster_DeviceType, 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kPicture_DeviceType, 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kGPU_DeviceType, 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger kNullGPU_DeviceType 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * SampleApp ports can subclass this manager class if they want to: 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * * filter the types of devices supported 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * * customize plugging of SkDevice objects into an SkCanvas 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * * customize publishing the results of draw to the OS window 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * * manage GrContext / GrRenderTarget lifetimes 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger class DeviceManager : public SkRefCnt { 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger public: 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // called at end of SampleWindow cons 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void init(SampleWindow* win) = 0; 521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // called when selecting a new device type 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // can disallow a device type by returning false. 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool supportsDeviceType(DeviceType dType) = 0; 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // called before drawing. should install correct device 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // type on the canvas. Will skip drawing if returns false. 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool prepareCanvas(DeviceType dType, 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkCanvas* canvas, 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SampleWindow* win) = 0; 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // called after drawing, should get the results onto the 641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // screen. 651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void publishCanvas(DeviceType dType, 661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkCanvas* canvas, 671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SampleWindow* win) = 0; 681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // called when window changes size, guaranteed to be called 701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // at least once before first draw (after init) 711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void windowSizeChanged(SampleWindow* win) = 0; 721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // return the GrContext backing gpu devices 741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual GrContext* getGrContext(DeviceType dType) = 0; 751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger }; 761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SampleWindow(void* hwnd, int argc, char** argv, DeviceManager*); 781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual ~SampleWindow(); 791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void draw(SkCanvas* canvas); 811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void setDeviceType(DeviceType type); 831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void toggleRendering(); 841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void toggleSlideshow(); 851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void toggleFPS(); 861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void showOverview(); 871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrContext* getGrContext() const { return fDevManager->getGrContext(fDeviceType); } 891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void setZoomCenter(float x, float y); 911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void changeZoomLevel(float delta); 921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool nextSample(); 931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool previousSample(); 941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool goToSample(int i); 951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkString getSampleTitle(int i); 961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int sampleCount(); 971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool handleTouch(int ownerId, float x, float y, 981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkView::Click::State state); 991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void saveToPdf(); 1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkData* getPDFData() { return fPDFData; } 1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void postInvalDelay(); 1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDraw(SkCanvas* canvas); 1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onHandleKey(SkKey key); 1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onHandleChar(SkUnichar); 1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onSizeChange(); 1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual SkCanvas* beforeChildren(SkCanvas*); 1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void afterChildren(SkCanvas*); 1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void beforeChild(SkView* child, SkCanvas* canvas); 1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void afterChild(SkView* child, SkCanvas* canvas); 1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onEvent(const SkEvent& evt); 1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onQuery(SkEvent* evt); 1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onDispatchClick(int x, int y, Click::State, void* owner); 1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual bool onClick(Click* click); 1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual Click* onFindClickHandler(SkScalar x, SkScalar y); 1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger class DefaultDeviceManager; 1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fCurrIndex; 1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPicture* fPicture; 1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkPath fClipPath; 1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkTouchGesture fGesture; 1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar fZoomLevel; 1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar fZoomScale; 1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger DeviceType fDeviceType; 1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger DeviceManager* fDevManager; 1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fSaveToPdf; 1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkCanvas* fPdfCanvas; 1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkData* fPDFData; 1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fUseClip; 1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fNClip; 1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fAnimating; 1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fRotate; 1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fPerspAnim; 1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar fPerspAnimTime; 1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fScale; 1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fRequestGrabImage; 1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fMeasureFPS; 1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkMSec fMeasureFPS_Time; 1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fMagnify; 1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fUsePipe; 1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fUsePipeMenuItemID; 1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fDebugger; 1561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // The following are for the 'fatbits' drawing 1581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Latest position of the mouse. 1591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fMouseX, fMouseY; 1601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fFatBitsScale; 1611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger // Used by the text showing position and color values. 1621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkTypeface* fTypeface; 1631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool fShowZoomer; 1641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkOSMenu::TriState fLCDState; 1661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkOSMenu::TriState fAAState; 1671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkOSMenu::TriState fFilterState; 1681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkOSMenu::TriState fHintingState; 1691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger unsigned fFlipAxis; 1701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fScrollTestX, fScrollTestY; 1721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar fZoomCenterX, fZoomCenterY; 1731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger //Stores global settings 1751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkOSMenu fAppMenu; 1761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger //Stores slide specific settings 1771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkOSMenu fSlideMenu; 1781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fTransitionNext; 1791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int fTransitionPrev; 1801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void loadView(SkView*); 1821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void updateTitle(); 1831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool zoomIn(); 1851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool zoomOut(); 1861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void updatePointer(int x, int y); 1871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void magnify(SkCanvas* canvas); 1881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void showZoomer(SkCanvas* canvas); 1891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void updateMatrix(); 1901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void postAnimatingEvent(); 1911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger void installDrawFilter(SkCanvas*); 1921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int findByTitle(const char*); 1931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger typedef SkOSWindow INHERITED; 1951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 1961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 198