1 2 /* 3 * Copyright 2006 The Android Open Source Project 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef SkOSWindow_Win_DEFINED 11 #define SkOSWindow_Win_DEFINED 12 13 #include "../private/SkTHash.h" 14 #include "SkWindow.h" 15 #include <functional> 16 17 #if SK_ANGLE 18 #include "EGL/egl.h" 19 #endif 20 21 #if SK_COMMAND_BUFFER 22 class SkCommandBufferGLContext; 23 #endif 24 25 class SkOSWindow : public SkWindow { 26 public: 27 struct WindowInit { 28 const TCHAR* fClass; 29 HINSTANCE fInstance; 30 }; 31 32 SkOSWindow(const void* winInit); 33 virtual ~SkOSWindow(); 34 35 static bool PostEvent(SkEvent* evt, SkEventSinkID, SkMSec delay); 36 37 enum SkBackEndTypes { 38 kNone_BackEndType, 39 #if SK_SUPPORT_GPU 40 kNativeGL_BackEndType, 41 #if SK_ANGLE 42 kANGLE_BackEndType, 43 #endif // SK_ANGLE 44 #if SK_COMMAND_BUFFER 45 kCommandBufferES2_BackEndType, 46 #endif // SK_COMMAND_BUFFER 47 #endif // SK_SUPPORT_GPU 48 }; 49 50 bool attach(SkBackEndTypes attachType, int msaaSampleCount, AttachmentInfo*); 51 void detach(); 52 void present(); 53 54 bool wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 55 static bool QuitOnDeactivate(HWND hWnd); 56 57 enum { 58 SK_WM_SkEvent = WM_APP + 1000, 59 SK_WM_SkTimerID = 0xFFFF // just need a non-zero value 60 }; 61 62 bool makeFullscreen(); 63 void setVsync(bool); 64 void closeWindow(); 65 GetOSWindowForHWND(void * hwnd)66 static SkOSWindow* GetOSWindowForHWND(void* hwnd) { 67 SkOSWindow** win = gHwndToOSWindowMap.find(hwnd); 68 if (!win) { 69 return NULL; 70 } 71 return *win; 72 } 73 74 // Iterates f over all the SkOSWindows and their corresponding HWNDs. 75 // The void* argument to f is a HWND. ForAllWindows(const std::function<void (void *,SkOSWindow **)> & f)76 static void ForAllWindows(const std::function<void(void*, SkOSWindow**)>& f) { 77 gHwndToOSWindowMap.foreach(f); 78 } 79 80 protected: quitOnDeactivate()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 88 virtual void onSetTitle(const char title[]); 89 90 private: 91 static SkTHashMap<void*, SkOSWindow*> gHwndToOSWindowMap; 92 93 WindowInit fWinInit; 94 void* fHWND; 95 96 void doPaint(void* ctx); 97 98 #if SK_SUPPORT_GPU 99 void* fHGLRC; 100 #if SK_ANGLE 101 EGLDisplay fDisplay; 102 EGLContext fContext; 103 EGLSurface fSurface; 104 EGLConfig fConfig; 105 #endif // SK_ANGLE 106 #if SK_COMMAND_BUFFER 107 SkCommandBufferGLContext* fCommandBuffer; 108 #endif // SK_COMMAND_BUFFER 109 #endif // SK_SUPPORT_GPU 110 111 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 123 HMENU fMBar; 124 125 SkBackEndTypes fAttached; 126 127 void updateSize(); 128 #if SK_SUPPORT_GPU 129 bool attachGL(int msaaSampleCount, AttachmentInfo* info); 130 void detachGL(); 131 void presentGL(); 132 133 #if SK_ANGLE 134 bool attachANGLE(int msaaSampleCount, AttachmentInfo* info); 135 void detachANGLE(); 136 void presentANGLE(); 137 #endif // SK_ANGLE 138 139 #if SK_COMMAND_BUFFER 140 bool attachCommandBuffer(int msaaSampleCount, AttachmentInfo* info); 141 void detachCommandBuffer(); 142 void presentCommandBuffer(); 143 #endif // SK_COMMAND_BUFFER 144 #endif // SK_SUPPORT_GPU 145 146 typedef SkWindow INHERITED; 147 }; 148 149 #endif 150