blob: 7a0cb7c0fdd86b9c2416807c3991f9532dd967d6 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@android.com8a1c16f2008-12-17 15:59:43 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2006 The Android Open Source Project
reed@android.com8a1c16f2008-12-17 15:59:43 +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.
reed@android.com8a1c16f2008-12-17 15:59:43 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#ifndef SkOSWindow_Win_DEFINED
11#define SkOSWindow_Win_DEFINED
12
13#include "SkWindow.h"
bsalomon1e7951f2015-06-16 07:04:43 -070014#include "../../src/core/SkFunction.h"
15#include "../../src/core/SkTHash.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000016
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000017#if SK_ANGLE
18#include "EGL/egl.h"
19#endif
20
reed@android.com8a1c16f2008-12-17 15:59:43 +000021class SkOSWindow : public SkWindow {
22public:
bsalomon1e7951f2015-06-16 07:04:43 -070023 struct WindowInit {
24 TCHAR* fClass;
25 HINSTANCE fInstance;
26 };
reed@android.com8a1c16f2008-12-17 15:59:43 +000027
bsalomon1e7951f2015-06-16 07:04:43 -070028 SkOSWindow(const void* winInit);
29 virtual ~SkOSWindow();
reed@android.com8a1c16f2008-12-17 15:59:43 +000030
31 static bool PostEvent(SkEvent* evt, SkEventSinkID, SkMSec delay);
reed@android.comf2b98d62010-12-20 18:26:13 +000032
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000033 enum SkBackEndTypes {
34 kNone_BackEndType,
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000035#if SK_SUPPORT_GPU
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000036 kNativeGL_BackEndType,
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000037#if SK_ANGLE
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000038 kANGLE_BackEndType,
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000039#endif // SK_ANGLE
40#endif // SK_SUPPORT_GPU
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000041 };
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000042
bsalomon@google.com64cc8102013-03-05 20:06:05 +000043 bool attach(SkBackEndTypes attachType, int msaaSampleCount, AttachmentInfo*);
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000044 void detach();
45 void present();
reed@android.comf2b98d62010-12-20 18:26:13 +000046
reed@android.come191b162009-12-18 21:33:39 +000047 bool wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
48 static bool QuitOnDeactivate(HWND hWnd);
reed@android.com8a1c16f2008-12-17 15:59:43 +000049
50 enum {
51 SK_WM_SkEvent = WM_APP + 1000,
52 SK_WM_SkTimerID = 0xFFFF // just need a non-zero value
53 };
54
bsalomon1e7951f2015-06-16 07:04:43 -070055 void setFullscreen(bool) override;
56 void setVsync(bool) override;
57 void closeWindow() override;
58
59 static SkOSWindow* GetOSWindowForHWND(void* hwnd) {
60 SkOSWindow** win = gHwndToOSWindowMap.find(hwnd);
61 if (!win) {
62 return NULL;
63 }
64 return *win;
65 }
66
67 // Iterates SkFunction over all the SkOSWindows and their corresponding HWNDs.
68 // The void* argument to the SkFunction is a HWND.
69 static void ForAllWindows(const SkFunction<void(void*, SkOSWindow**)>& f) {
70 gHwndToOSWindowMap.foreach(f);
71 }
72
reed@android.com8a1c16f2008-12-17 15:59:43 +000073protected:
74 virtual bool quitOnDeactivate() { return true; }
75
76 // overrides from SkWindow
77 virtual void onHandleInval(const SkIRect&);
78 // overrides from SkView
79 virtual void onAddMenu(const SkOSMenu*);
80
reed@android.comf2b98d62010-12-20 18:26:13 +000081 virtual void onSetTitle(const char title[]);
82
reed@android.com8a1c16f2008-12-17 15:59:43 +000083private:
bsalomon1e7951f2015-06-16 07:04:43 -070084 static SkTHashMap<void*, SkOSWindow*> gHwndToOSWindowMap;
85
86 WindowInit fWinInit;
reed@android.comf2b98d62010-12-20 18:26:13 +000087 void* fHWND;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000088
reed@android.comf2b98d62010-12-20 18:26:13 +000089 void doPaint(void* ctx);
reed@android.com8a1c16f2008-12-17 15:59:43 +000090
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000091#if SK_SUPPORT_GPU
reed@android.comf2b98d62010-12-20 18:26:13 +000092 void* fHGLRC;
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000093#if SK_ANGLE
robertphillips@google.comd5c8fe62012-04-02 15:04:16 +000094 EGLDisplay fDisplay;
95 EGLContext fContext;
96 EGLSurface fSurface;
bsalomon@google.com64cc8102013-03-05 20:06:05 +000097 EGLConfig fConfig;
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000098#endif // SK_ANGLE
99#endif // SK_SUPPORT_GPU
reed@android.com8a1c16f2008-12-17 15:59:43 +0000100
bsalomon1e7951f2015-06-16 07:04:43 -0700101 bool fFullscreen;
102 struct SavedWindowState {
103 bool fZoomed;
104 LONG fStyle;
105 LONG fExStyle;
106 RECT fRect;
107 LONG fScreenWidth;
108 LONG fScreenHeight;
109 LONG fScreenBits;
110 void* fHWND;
111 } fSavedWindowState;
112
reed@android.comf2b98d62010-12-20 18:26:13 +0000113 HMENU fMBar;
114
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000115 SkBackEndTypes fAttached;
116
bsalomon1e7951f2015-06-16 07:04:43 -0700117 void updateSize();
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000118#if SK_SUPPORT_GPU
bsalomon@google.com64cc8102013-03-05 20:06:05 +0000119 bool attachGL(int msaaSampleCount, AttachmentInfo* info);
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000120 void detachGL();
121 void presentGL();
122
123#if SK_ANGLE
bsalomon@google.com64cc8102013-03-05 20:06:05 +0000124 bool attachANGLE(int msaaSampleCount, AttachmentInfo* info);
bsalomon@google.com3c4d0322012-04-03 18:04:51 +0000125 void detachANGLE();
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000126 void presentANGLE();
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000127#endif // SK_ANGLE
128#endif // SK_SUPPORT_GPU
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000129
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000130 typedef SkWindow INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000131};
132
133#endif