1 /*
2  * Copyright 2006 The Android Open Source Project
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkWindow_DEFINED
9 #define SkWindow_DEFINED
10 
11 #include "../private/SkTDArray.h"
12 #include "SkView.h"
13 #include "SkBitmap.h"
14 #include "SkMatrix.h"
15 #include "SkRegion.h"
16 #include "SkEvent.h"
17 #include "SkKey.h"
18 #include "SkSurfaceProps.h"
19 
20 class SkSurface;
21 class SkOSMenu;
22 
23 #if SK_SUPPORT_GPU
24 struct GrGLInterface;
25 class GrContext;
26 class GrRenderTarget;
27 #endif
28 
29 class SkWindow : public SkView {
30 public:
31             SkWindow();
32     virtual ~SkWindow();
33 
34     struct AttachmentInfo {
35         int fSampleCount;
36         int fStencilBits;
37     };
38 
getSurfaceProps()39     SkSurfaceProps getSurfaceProps() const { return fSurfaceProps; }
setSurfaceProps(const SkSurfaceProps & props)40     void setSurfaceProps(const SkSurfaceProps& props) {
41         fSurfaceProps = props;
42     }
43 
info()44     SkImageInfo info() const { return fBitmap.info(); }
getBitmap()45     const SkBitmap& getBitmap() const { return fBitmap; }
46 
47     void    resize(int width, int height);
48     void    resize(const SkImageInfo&);
49     void    setColorType(SkColorType, SkColorProfileType);
50 
isDirty()51     bool    isDirty() const { return !fDirtyRgn.isEmpty(); }
52     bool    update(SkIRect* updateArea);
53     // does not call through to onHandleInval(), but does force the fDirtyRgn
54     // to be wide open. Call before update() to ensure we redraw everything.
55     void    forceInvalAll();
56     // return the bounds of the dirty/inval rgn, or [0,0,0,0] if none
getDirtyBounds()57     const SkIRect& getDirtyBounds() const { return fDirtyRgn.getBounds(); }
58 
59     bool    handleClick(int x, int y, Click::State, void* owner, unsigned modi = 0);
60     bool    handleChar(SkUnichar);
61     bool    handleKey(SkKey);
62     bool    handleKeyUp(SkKey);
63 
64     void    addMenu(SkOSMenu*);
getMenus()65     const SkTDArray<SkOSMenu*>* getMenus() { return &fMenus; }
66 
getTitle()67     const char* getTitle() const { return fTitle.c_str(); }
68     void    setTitle(const char title[]);
69 
getMatrix()70     const SkMatrix& getMatrix() const { return fMatrix; }
71     void    setMatrix(const SkMatrix&);
72     void    preConcat(const SkMatrix&);
73     void    postConcat(const SkMatrix&);
74 
75     virtual SkSurface* createSurface();
76 
77 protected:
78     virtual bool onEvent(const SkEvent&);
79     virtual bool onDispatchClick(int x, int y, Click::State, void* owner, unsigned modi);
80     // called if part of our bitmap is invalidated
81     virtual void onHandleInval(const SkIRect&);
82     virtual bool onHandleChar(SkUnichar);
83     virtual bool onHandleKey(SkKey);
84     virtual bool onHandleKeyUp(SkKey);
onAddMenu(const SkOSMenu *)85     virtual void onAddMenu(const SkOSMenu*) {};
onUpdateMenu(const SkOSMenu *)86     virtual void onUpdateMenu(const SkOSMenu*) {};
onSetTitle(const char title[])87     virtual void onSetTitle(const char title[]) {}
88 
89     // overrides from SkView
90     virtual bool handleInval(const SkRect*);
91     virtual bool onGetFocusView(SkView** focus) const;
92     virtual bool onSetFocusView(SkView* focus);
93 
94 #if SK_SUPPORT_GPU
95     GrRenderTarget* renderTarget(const AttachmentInfo& attachmentInfo,
96                                  const GrGLInterface* , GrContext* grContext);
97 #endif
98 
99 private:
100     SkSurfaceProps  fSurfaceProps;
101     SkBitmap    fBitmap;
102     SkRegion    fDirtyRgn;
103 
104     SkTDArray<Click*>       fClicks; // to track clicks
105 
106     SkTDArray<SkOSMenu*>    fMenus;
107 
108     SkView* fFocusView;
109     bool    fWaitingOnInval;
110 
111     SkString    fTitle;
112     SkMatrix    fMatrix;
113 
114     typedef SkView INHERITED;
115 };
116 
117 ////////////////////////////////////////////////////////////////////////////////
118 
119 #if defined(SK_USE_SDL)
120     #include "SkOSWindow_SDL.h"
121 #elif defined(SK_BUILD_FOR_MAC)
122     #include "SkOSWindow_Mac.h"
123 #elif defined(SK_BUILD_FOR_WIN)
124     #include "SkOSWindow_Win.h"
125 #elif defined(SK_BUILD_FOR_ANDROID)
126     #include "SkOSWindow_Android.h"
127 #elif defined(SK_BUILD_FOR_UNIX)
128     #include "SkOSWindow_Unix.h"
129 #elif defined(SK_BUILD_FOR_IOS)
130     #include "SkOSWindow_iOS.h"
131 #endif
132 
133 #endif
134