/* Copyright (C) 2009 Red Hat, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _H_PLATFORM_UTILS #define _H_PLATFORM_UTILS #define mb() __asm {lock add [esp], 0} template, T invalid = NULL > class AutoRes { public: AutoRes() : res (invalid) {} AutoRes(T inRes) : res (inRes) {} ~AutoRes() { set(invalid); } void set(T inRes) {if (res != invalid) free_res(res); res = inRes; } T get() {return res;} T release() {T tmp = res; res = invalid; return tmp; } bool valid() { return res != invalid; } private: AutoRes(const AutoRes&); AutoRes& operator = (const AutoRes&); private: T res; FreeRes free_res; }; class Delete_DC { public: void operator () (HDC dc) { DeleteDC(dc);} }; typedef AutoRes AutoDC; class Delete_Object { public: void operator () (HGDIOBJ obj) { DeleteObject(obj);} }; typedef AutoRes AutoGDIObject; class DeleteOGLContext { public: void operator () (HGLRC ctx) { wglDeleteContext(ctx);} }; typedef AutoRes AutoOGLCtx; HDC create_compatible_dc(); HBITMAP get_bitmap_res(int id); HBITMAP get_alpha_bitmap_res(int id); class WindowDC { public: WindowDC(HWND window) : _window (window), _dc (GetDC(window)) {} ~WindowDC() { ReleaseDC(_window, _dc);} HDC operator * () { return _dc;} private: HWND _window; HDC _dc; }; typedef AutoRes AutoReleaseDC; const char* sys_err_to_str(int error); #endif