aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/views/SkOSWindow_Win.h
blob: b65d4c29dfb18efa3845a9cae63c5f6dd9f7f8c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149

/*
 * Copyright 2006 The Android Open Source Project
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#ifndef SkOSWindow_Win_DEFINED
#define SkOSWindow_Win_DEFINED

#include "../private/SkFunction.h"
#include "../private/SkTHash.h"
#include "SkWindow.h"

#if SK_ANGLE
#include "EGL/egl.h"
#endif

#if SK_COMMAND_BUFFER
class SkCommandBufferGLContext;
#endif

class SkOSWindow : public SkWindow {
public:
    struct WindowInit {
        const TCHAR*    fClass;
        HINSTANCE       fInstance;
    };

    SkOSWindow(const void* winInit);
    virtual ~SkOSWindow();

    static bool PostEvent(SkEvent* evt, SkEventSinkID, SkMSec delay);

    enum SkBackEndTypes {
        kNone_BackEndType,
#if SK_SUPPORT_GPU
        kNativeGL_BackEndType,
#if SK_ANGLE
        kANGLE_BackEndType,
#endif // SK_ANGLE
#if SK_COMMAND_BUFFER
        kCommandBuffer_BackEndType,
#endif // SK_COMMAND_BUFFER
#endif // SK_SUPPORT_GPU
    };

    bool attach(SkBackEndTypes attachType, int msaaSampleCount, AttachmentInfo*);
    void detach();
    void present();

    bool wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
    static bool QuitOnDeactivate(HWND hWnd);

    enum {
        SK_WM_SkEvent = WM_APP + 1000,
        SK_WM_SkTimerID = 0xFFFF    // just need a non-zero value
    };

    bool makeFullscreen();
    void setVsync(bool);
    void closeWindow();

    static SkOSWindow* GetOSWindowForHWND(void* hwnd) {
        SkOSWindow** win = gHwndToOSWindowMap.find(hwnd);
        if (!win) {
            return NULL;
        }
        return *win;
    }

    // Iterates SkFunction over all the SkOSWindows and their corresponding HWNDs.
    // The void* argument to the SkFunction is a HWND.
    static void ForAllWindows(const SkFunction<void(void*, SkOSWindow**)>& f) {
        gHwndToOSWindowMap.foreach(f);
    }

protected:
    virtual bool quitOnDeactivate() { return true; }

    // overrides from SkWindow
    virtual void onHandleInval(const SkIRect&);
    // overrides from SkView
    virtual void onAddMenu(const SkOSMenu*);

    virtual void onSetTitle(const char title[]);

private:
    static SkTHashMap<void*, SkOSWindow*> gHwndToOSWindowMap;

    WindowInit          fWinInit;
    void*               fHWND;

    void                doPaint(void* ctx);

#if SK_SUPPORT_GPU
    void*               fHGLRC;
#if SK_ANGLE
    EGLDisplay          fDisplay;
    EGLContext          fContext;
    EGLSurface          fSurface;
    EGLConfig           fConfig;
#endif // SK_ANGLE
#if SK_COMMAND_BUFFER
    SkCommandBufferGLContext* fCommandBuffer;
#endif // SK_COMMAND_BUFFER
#endif // SK_SUPPORT_GPU

    bool                fFullscreen;
    struct SavedWindowState {
        bool fZoomed;
        LONG fStyle;
        LONG fExStyle;
        RECT fRect;
        LONG fScreenWidth;
        LONG fScreenHeight;
        LONG fScreenBits;
        void* fHWND;
    } fSavedWindowState;

    HMENU               fMBar;

    SkBackEndTypes      fAttached;

    void updateSize();
#if SK_SUPPORT_GPU
    bool attachGL(int msaaSampleCount, AttachmentInfo* info);
    void detachGL();
    void presentGL();

#if SK_ANGLE
    bool attachANGLE(int msaaSampleCount, AttachmentInfo* info);
    void detachANGLE();
    void presentANGLE();
#endif // SK_ANGLE

#if SK_COMMAND_BUFFER
    bool attachCommandBuffer(int msaaSampleCount, AttachmentInfo* info);
    void detachCommandBuffer();
    void presentCommandBuffer();
#endif // SK_COMMAND_BUFFER
#endif // SK_SUPPORT_GPU

    typedef SkWindow INHERITED;
};

#endif