blob: a1b222d7a18e899819dada0fdc599930f0ff428e [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
mtkleinfd8ed692015-07-28 09:54:52 -070013#include "../private/SkTHash.h"
14#include "SkWindow.h"
mtklein64593522015-11-12 10:41:05 -080015#include <functional>
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
hendrikw885bf092015-08-27 10:38:39 -070021#if SK_COMMAND_BUFFER
22class SkCommandBufferGLContext;
23#endif
24
reed@android.com8a1c16f2008-12-17 15:59:43 +000025class SkOSWindow : public SkWindow {
26public:
bsalomon1e7951f2015-06-16 07:04:43 -070027 struct WindowInit {
bsalomon48297f72015-06-16 12:21:00 -070028 const TCHAR* fClass;
29 HINSTANCE fInstance;
bsalomon1e7951f2015-06-16 07:04:43 -070030 };
reed@android.com8a1c16f2008-12-17 15:59:43 +000031
bsalomon1e7951f2015-06-16 07:04:43 -070032 SkOSWindow(const void* winInit);
33 virtual ~SkOSWindow();
reed@android.com8a1c16f2008-12-17 15:59:43 +000034
35 static bool PostEvent(SkEvent* evt, SkEventSinkID, SkMSec delay);
reed@android.comf2b98d62010-12-20 18:26:13 +000036
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000037 enum SkBackEndTypes {
38 kNone_BackEndType,
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000039#if SK_SUPPORT_GPU
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000040 kNativeGL_BackEndType,
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000041#if SK_ANGLE
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000042 kANGLE_BackEndType,
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000043#endif // SK_ANGLE
hendrikw885bf092015-08-27 10:38:39 -070044#if SK_COMMAND_BUFFER
kkinnunenf655e932016-03-03 07:39:48 -080045 kCommandBuffer_BackEndType,
hendrikw885bf092015-08-27 10:38:39 -070046#endif // SK_COMMAND_BUFFER
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000047#endif // SK_SUPPORT_GPU
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000048 };
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +000049
bsalomon@google.com64cc8102013-03-05 20:06:05 +000050 bool attach(SkBackEndTypes attachType, int msaaSampleCount, AttachmentInfo*);
mtklein18300a32016-03-16 13:53:35 -070051 void release();
robertphillips@google.comb442a6d2012-04-02 19:24:21 +000052 void present();
reed@android.comf2b98d62010-12-20 18:26:13 +000053
reed@android.come191b162009-12-18 21:33:39 +000054 bool wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
55 static bool QuitOnDeactivate(HWND hWnd);
reed@android.com8a1c16f2008-12-17 15:59:43 +000056
57 enum {
58 SK_WM_SkEvent = WM_APP + 1000,
59 SK_WM_SkTimerID = 0xFFFF // just need a non-zero value
60 };
61
bsalomon85ab5512015-06-16 12:47:25 -070062 bool makeFullscreen();
63 void setVsync(bool);
64 void closeWindow();
bsalomon1e7951f2015-06-16 07:04:43 -070065
66 static SkOSWindow* GetOSWindowForHWND(void* hwnd) {
67 SkOSWindow** win = gHwndToOSWindowMap.find(hwnd);
68 if (!win) {
69 return NULL;
70 }
71 return *win;
72 }
73
mtklein64593522015-11-12 10:41:05 -080074 // Iterates f over all the SkOSWindows and their corresponding HWNDs.
75 // The void* argument to f is a HWND.
76 static void ForAllWindows(const std::function<void(void*, SkOSWindow**)>& f) {
bsalomon1e7951f2015-06-16 07:04:43 -070077 gHwndToOSWindowMap.foreach(f);
78 }
79
reed@android.com8a1c16f2008-12-17 15:59:43 +000080protected:
81 virtual bool quitOnDeactivate() { return true; }
82
83 // overrides from SkWindow
84 virtual void onHandleInval(const SkIRect&);
85 // overrides from SkView
86 virtual void onAddMenu(const SkOSMenu*);
87
reed@android.comf2b98d62010-12-20 18:26:13 +000088 virtual void onSetTitle(const char title[]);
89
reed@android.com8a1c16f2008-12-17 15:59:43 +000090private:
bsalomon1e7951f2015-06-16 07:04:43 -070091 static SkTHashMap<void*, SkOSWindow*> gHwndToOSWindowMap;
92
93 WindowInit fWinInit;
reed@android.comf2b98d62010-12-20 18:26:13 +000094 void* fHWND;
rmistry@google.comfbfcd562012-08-23 18:09:54 +000095
reed@android.comf2b98d62010-12-20 18:26:13 +000096 void doPaint(void* ctx);
reed@android.com8a1c16f2008-12-17 15:59:43 +000097
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +000098#if SK_SUPPORT_GPU
reed@android.comf2b98d62010-12-20 18:26:13 +000099 void* fHGLRC;
robertphillips@google.comd3b9fbb2012-03-28 16:19:11 +0000100#if SK_ANGLE
robertphillips@google.comd5c8fe62012-04-02 15:04:16 +0000101 EGLDisplay fDisplay;
102 EGLContext fContext;
103 EGLSurface fSurface;
bsalomon@google.com64cc8102013-03-05 20:06:05 +0000104 EGLConfig fConfig;
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000105#endif // SK_ANGLE
hendrikw885bf092015-08-27 10:38:39 -0700106#if SK_COMMAND_BUFFER
107 SkCommandBufferGLContext* fCommandBuffer;
108#endif // SK_COMMAND_BUFFER
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000109#endif // SK_SUPPORT_GPU
reed@android.com8a1c16f2008-12-17 15:59:43 +0000110
bsalomon1e7951f2015-06-16 07:04:43 -0700111 bool fFullscreen;
112 struct SavedWindowState {
113 bool fZoomed;
114 LONG fStyle;
115 LONG fExStyle;
116 RECT fRect;
117 LONG fScreenWidth;
118 LONG fScreenHeight;
119 LONG fScreenBits;
120 void* fHWND;
121 } fSavedWindowState;
122
reed@android.comf2b98d62010-12-20 18:26:13 +0000123 HMENU fMBar;
124
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000125 SkBackEndTypes fAttached;
126
bsalomon1e7951f2015-06-16 07:04:43 -0700127 void updateSize();
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000128#if SK_SUPPORT_GPU
bsalomon@google.com64cc8102013-03-05 20:06:05 +0000129 bool attachGL(int msaaSampleCount, AttachmentInfo* info);
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000130 void detachGL();
131 void presentGL();
132
133#if SK_ANGLE
bsalomon@google.com64cc8102013-03-05 20:06:05 +0000134 bool attachANGLE(int msaaSampleCount, AttachmentInfo* info);
bsalomon@google.com3c4d0322012-04-03 18:04:51 +0000135 void detachANGLE();
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000136 void presentANGLE();
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000137#endif // SK_ANGLE
hendrikw885bf092015-08-27 10:38:39 -0700138
139#if SK_COMMAND_BUFFER
140 bool attachCommandBuffer(int msaaSampleCount, AttachmentInfo* info);
141 void detachCommandBuffer();
142 void presentCommandBuffer();
143#endif // SK_COMMAND_BUFFER
bsalomon@google.comcf8fb1f2012-08-02 14:03:32 +0000144#endif // SK_SUPPORT_GPU
robertphillips@google.comb442a6d2012-04-02 19:24:21 +0000145
rmistry@google.comfbfcd562012-08-23 18:09:54 +0000146 typedef SkWindow INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000147};
148
149#endif