/* * 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/SkTHash.h" #include "SkWindow.h" #include <functional> #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 kCommandBufferES2_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 f over all the SkOSWindows and their corresponding HWNDs. // The void* argument to f is a HWND. static void ForAllWindows(const std::function<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