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