1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef _DXCANVAS_WINSTUFF_HXX 25*b1cdbd2cSJim Jagielski #define _DXCANVAS_WINSTUFF_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <algorithm> 28*b1cdbd2cSJim Jagielski 29*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp> 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #include <basegfx/numeric/ftools.hxx> 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski #ifdef _WINDOWS_ 34*b1cdbd2cSJim Jagielski #error someone else included <windows.h> 35*b1cdbd2cSJim Jagielski #endif 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski // Enabling Direct3D Debug Information Further more, with registry key 38*b1cdbd2cSJim Jagielski // \\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Direct3D\D3D9Debugging\\EnableCreationStack 39*b1cdbd2cSJim Jagielski // set to 1, sets a backtrace each time an object is created to the 40*b1cdbd2cSJim Jagielski // following global variable: LPCWSTR CreationCallStack 41*b1cdbd2cSJim Jagielski #if OSL_DEBUG_LEVEL > 0 42*b1cdbd2cSJim Jagielski # define D3D_DEBUG_INFO 43*b1cdbd2cSJim Jagielski #endif 44*b1cdbd2cSJim Jagielski 45*b1cdbd2cSJim Jagielski #ifndef DIRECTX_VERSION 46*b1cdbd2cSJim Jagielski #error please define for which directx version we should compile 47*b1cdbd2cSJim Jagielski #endif 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski #if defined _MSC_VER 50*b1cdbd2cSJim Jagielski #pragma warning(push,1) 51*b1cdbd2cSJim Jagielski #endif 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski #define GradientStyle_RECT win32GradientStyle_RECT 55*b1cdbd2cSJim Jagielski #define Polygon win32Polygon 56*b1cdbd2cSJim Jagielski #define PolyPolygon win32PolyPolygon 57*b1cdbd2cSJim Jagielski #undef WB_LEFT 58*b1cdbd2cSJim Jagielski #undef WB_RIGHT 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski #define WIN32_LEAN_AND_MEAN 61*b1cdbd2cSJim Jagielski #include <windows.h> // TODO(Q1): extract minimal set of required headers for gdiplus 62*b1cdbd2cSJim Jagielski 63*b1cdbd2cSJim Jagielski #if DIRECTX_VERSION < 0x0900 64*b1cdbd2cSJim Jagielski 65*b1cdbd2cSJim Jagielski #include <multimon.h> 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski // Be compatible with directdraw 3.0. Lets see how far this takes us 68*b1cdbd2cSJim Jagielski #define DIRECTDRAW_VERSION 0x0300 69*b1cdbd2cSJim Jagielski #include <ddraw.h> 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski // Be compatible with direct3d 5.0. Lets see how far this takes us 72*b1cdbd2cSJim Jagielski #define DIRECT3D_VERSION 0x0500 73*b1cdbd2cSJim Jagielski #define D3D_OVERLOADS 74*b1cdbd2cSJim Jagielski #include <d3d.h> 75*b1cdbd2cSJim Jagielski 76*b1cdbd2cSJim Jagielski typedef IDirectDrawSurface surface_type; 77*b1cdbd2cSJim Jagielski 78*b1cdbd2cSJim Jagielski #else 79*b1cdbd2cSJim Jagielski 80*b1cdbd2cSJim Jagielski #include <d3d9.h> 81*b1cdbd2cSJim Jagielski #include <d3dx9.h> 82*b1cdbd2cSJim Jagielski // #include <dxerr9.h> #i107614# removing include, it has been changed in the latest sdk fron August2009 from dxerr9.h into dxerr.h 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski typedef IDirect3DSurface9 surface_type; 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski #endif 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski #undef DrawText 89*b1cdbd2cSJim Jagielski 90*b1cdbd2cSJim Jagielski #ifdef __MINGW32__ 91*b1cdbd2cSJim Jagielski using ::std::max; 92*b1cdbd2cSJim Jagielski using ::std::min; 93*b1cdbd2cSJim Jagielski #endif 94*b1cdbd2cSJim Jagielski 95*b1cdbd2cSJim Jagielski #include <gdiplus.h> 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski #ifdef min 98*b1cdbd2cSJim Jagielski # undef min 99*b1cdbd2cSJim Jagielski #endif 100*b1cdbd2cSJim Jagielski #ifdef max 101*b1cdbd2cSJim Jagielski # undef max 102*b1cdbd2cSJim Jagielski #endif 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski namespace dxcanvas 105*b1cdbd2cSJim Jagielski { 106*b1cdbd2cSJim Jagielski // some shared pointer typedefs to Gdiplus objects 107*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< Gdiplus::Graphics > GraphicsSharedPtr; 108*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< Gdiplus::GraphicsPath > GraphicsPathSharedPtr; 109*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< Gdiplus::Bitmap > BitmapSharedPtr; 110*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< Gdiplus::CachedBitmap > CachedBitmapSharedPtr; 111*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< Gdiplus::Font > FontSharedPtr; 112*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< Gdiplus::Brush > BrushSharedPtr; 113*b1cdbd2cSJim Jagielski typedef ::boost::shared_ptr< Gdiplus::TextureBrush > TextureBrushSharedPtr; 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski /** COM object RAII wrapper 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski This template wraps a Windows COM object, transparently 118*b1cdbd2cSJim Jagielski handling lifetime issues the C++ way (i.e. releasing the 119*b1cdbd2cSJim Jagielski reference when the object is destroyed) 120*b1cdbd2cSJim Jagielski */ 121*b1cdbd2cSJim Jagielski template< typename T > class COMReference 122*b1cdbd2cSJim Jagielski { 123*b1cdbd2cSJim Jagielski public: 124*b1cdbd2cSJim Jagielski typedef T Wrappee; 125*b1cdbd2cSJim Jagielski COMReference()126*b1cdbd2cSJim Jagielski COMReference() : 127*b1cdbd2cSJim Jagielski mp( NULL ) 128*b1cdbd2cSJim Jagielski { 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski /** Create from raw pointer 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski @attention This constructor assumes the interface is 134*b1cdbd2cSJim Jagielski already acquired (unless p is NULL), no additional AddRef 135*b1cdbd2cSJim Jagielski is called here. 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski This caters e.g. for all DirectX factory methods, which 138*b1cdbd2cSJim Jagielski return the created interfaces pre-acquired, into a raw 139*b1cdbd2cSJim Jagielski pointer. Simply pass the pointer to this class, but don't 140*b1cdbd2cSJim Jagielski call Release manually on it! 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski @example IDirectDrawSurface* pSurface; 143*b1cdbd2cSJim Jagielski pDD->CreateSurface(&aSurfaceDesc, &pSurface, NULL); 144*b1cdbd2cSJim Jagielski mpSurface = COMReference< IDirectDrawSurface >(pSurface); 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski */ COMReference(T * p)147*b1cdbd2cSJim Jagielski explicit COMReference( T* p ) : 148*b1cdbd2cSJim Jagielski mp( p ) 149*b1cdbd2cSJim Jagielski { 150*b1cdbd2cSJim Jagielski } 151*b1cdbd2cSJim Jagielski COMReference(const COMReference & rNew)152*b1cdbd2cSJim Jagielski COMReference( const COMReference& rNew ) : 153*b1cdbd2cSJim Jagielski mp( NULL ) 154*b1cdbd2cSJim Jagielski { 155*b1cdbd2cSJim Jagielski if( rNew.mp == NULL ) 156*b1cdbd2cSJim Jagielski return; 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski rNew.mp->AddRef(); // do that _before_ assigning the 159*b1cdbd2cSJim Jagielski // pointer. Just in case... 160*b1cdbd2cSJim Jagielski mp = rNew.mp; 161*b1cdbd2cSJim Jagielski } 162*b1cdbd2cSJim Jagielski operator =(const COMReference & rRHS)163*b1cdbd2cSJim Jagielski COMReference& operator=( const COMReference& rRHS ) 164*b1cdbd2cSJim Jagielski { 165*b1cdbd2cSJim Jagielski COMReference aTmp(rRHS); 166*b1cdbd2cSJim Jagielski ::std::swap( mp, aTmp.mp ); 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski return *this; 169*b1cdbd2cSJim Jagielski } 170*b1cdbd2cSJim Jagielski ~COMReference()171*b1cdbd2cSJim Jagielski ~COMReference() 172*b1cdbd2cSJim Jagielski { 173*b1cdbd2cSJim Jagielski reset(); 174*b1cdbd2cSJim Jagielski } 175*b1cdbd2cSJim Jagielski reset()176*b1cdbd2cSJim Jagielski int reset() 177*b1cdbd2cSJim Jagielski { 178*b1cdbd2cSJim Jagielski int refcount = 0; 179*b1cdbd2cSJim Jagielski if( mp ) 180*b1cdbd2cSJim Jagielski refcount = mp->Release(); 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski mp = NULL; 183*b1cdbd2cSJim Jagielski return refcount; 184*b1cdbd2cSJim Jagielski } 185*b1cdbd2cSJim Jagielski is() const186*b1cdbd2cSJim Jagielski bool is() const { return mp != NULL; } get() const187*b1cdbd2cSJim Jagielski T* get() const { return mp; } operator ->() const188*b1cdbd2cSJim Jagielski T* operator->() const { return mp; } operator *() const189*b1cdbd2cSJim Jagielski T& operator*() const { return *mp; } 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski private: 192*b1cdbd2cSJim Jagielski T* mp; 193*b1cdbd2cSJim Jagielski }; 194*b1cdbd2cSJim Jagielski 195*b1cdbd2cSJim Jagielski // get_pointer() enables boost::mem_fn to recognize COMReference get_pointer(COMReference<T> const & p)196*b1cdbd2cSJim Jagielski template<class T> inline T * get_pointer(COMReference<T> const& p) 197*b1cdbd2cSJim Jagielski { 198*b1cdbd2cSJim Jagielski return p.get(); 199*b1cdbd2cSJim Jagielski } 200*b1cdbd2cSJim Jagielski } 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski #if defined _MSC_VER 203*b1cdbd2cSJim Jagielski #pragma warning(pop) 204*b1cdbd2cSJim Jagielski #endif 205*b1cdbd2cSJim Jagielski 206*b1cdbd2cSJim Jagielski #undef DELETE 207*b1cdbd2cSJim Jagielski #undef PolyPolygon 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski #endif /* _DXCANVAS_WINSTUFF_HXX */ 210