2009-05-08 13:28:41 +00:00
/*
* OpenClonk , http : //www.openclonk.org
*
2013-12-17 20:01:09 +00:00
* Copyright ( c ) 2001 - 2009 , RedWolf Design GmbH , http : //www.clonk.de/
2016-04-03 18:18:29 +00:00
* Copyright ( c ) 2009 - 2016 , The OpenClonk Team and contributors
2009-05-08 13:28:41 +00:00
*
2013-12-17 20:01:09 +00:00
* Distributed under the terms of the ISC license ; see accompanying file
* " COPYING " for details .
2009-05-08 13:28:41 +00:00
*
2013-12-17 20:01:09 +00:00
* " Clonk " is a registered trademark of Matthes Bender , used with permission .
* See accompanying file " TRADEMARK " for details .
2009-05-08 13:28:41 +00:00
*
2013-12-17 20:01:09 +00:00
* To redistribute this file separately , substitute the full license texts
* for the above references .
2009-05-08 13:28:41 +00:00
*/
2010-03-06 14:07:30 +00:00
/* A wrapper class to OpenGL and Direct3d */
2009-05-08 13:28:41 +00:00
# ifndef INC_STDDDRAW2
# define INC_STDDDRAW2
2016-04-03 18:07:56 +00:00
# include "graphics/C4Surface.h"
# include "lib/StdMeshMaterial.h"
2009-05-08 13:28:41 +00:00
2011-10-03 15:19:51 +00:00
// Global Draw access pointer
2013-01-09 00:09:31 +00:00
extern C4Draw * pDraw ;
2009-05-08 13:28:41 +00:00
2014-10-08 17:35:55 +00:00
inline void DwTo4UB ( DWORD dwClr , unsigned char ( & r ) [ 4 ] )
{
r [ 0 ] = ( unsigned char ) ( ( dwClr > > 16 ) & 0xff ) ;
r [ 1 ] = ( unsigned char ) ( ( dwClr > > 8 ) & 0xff ) ;
r [ 2 ] = ( unsigned char ) ( ( dwClr ) & 0xff ) ;
r [ 3 ] = ( unsigned char ) ( ( dwClr > > 24 ) & 0xff ) ;
}
2009-05-08 13:28:41 +00:00
// rotation info class
2011-09-30 20:15:51 +00:00
class C4BltTransform
2010-03-28 17:58:21 +00:00
{
public :
float mat [ 9 ] ; // transformation matrix
public :
2011-09-30 20:15:51 +00:00
C4BltTransform ( ) { } // default: don't init fields
2010-03-28 17:58:21 +00:00
void Set ( float fA , float fB , float fC , float fD , float fE , float fF , float fG , float fH , float fI )
{ mat [ 0 ] = fA ; mat [ 1 ] = fB ; mat [ 2 ] = fC ; mat [ 3 ] = fD ; mat [ 4 ] = fE ; mat [ 5 ] = fF ; mat [ 6 ] = fG ; mat [ 7 ] = fH ; mat [ 8 ] = fI ; }
2013-05-25 12:59:58 +00:00
void SetRotate ( float iAngle , float fOffX , float fOffY ) ; // set by angle and rotation offset
2011-09-30 20:15:51 +00:00
bool SetAsInv ( C4BltTransform & rOfTransform ) ;
2013-05-25 12:59:58 +00:00
void Rotate ( float Angle , float fOffX , float fOffY ) // rotate by angle around rotation offset
2010-03-28 17:58:21 +00:00
{
// multiply matrix as seen in SetRotate by own matrix
2013-05-25 12:59:58 +00:00
C4BltTransform rot ; rot . SetRotate ( Angle , fOffX , fOffY ) ;
2010-03-28 17:58:21 +00:00
( * this ) * = rot ;
}
void SetMoveScale ( float dx , float dy , float sx , float sy )
{
mat [ 0 ] = sx ; mat [ 1 ] = 0 ; mat [ 2 ] = dx ;
mat [ 3 ] = 0 ; mat [ 4 ] = sy ; mat [ 5 ] = dy ;
mat [ 6 ] = 0 ; mat [ 7 ] = 0 ; mat [ 8 ] = 1 ;
}
void MoveScale ( float dx , float dy , float sx , float sy )
{
// multiply matrix by movescale matrix
2011-09-30 20:15:51 +00:00
C4BltTransform move ; move . SetMoveScale ( dx , dy , sx , sy ) ;
2010-03-28 17:58:21 +00:00
( * this ) * = move ;
}
void ScaleAt ( float sx , float sy , float tx , float ty )
2009-05-08 13:28:41 +00:00
{
2010-03-28 17:58:21 +00:00
// scale and move back so tx and ty remain fixpoints
MoveScale ( - tx * ( sx - 1 ) , - ty * ( sy - 1 ) , sx , sy ) ;
}
2011-09-30 20:15:51 +00:00
C4BltTransform & operator * = ( const C4BltTransform & r )
2009-05-08 13:28:41 +00:00
{
2010-03-28 17:58:21 +00:00
// transform transformation
Set ( mat [ 0 ] * r . mat [ 0 ] + mat [ 3 ] * r . mat [ 1 ] + mat [ 6 ] * r . mat [ 2 ] ,
mat [ 1 ] * r . mat [ 0 ] + mat [ 4 ] * r . mat [ 1 ] + mat [ 7 ] * r . mat [ 2 ] ,
mat [ 2 ] * r . mat [ 0 ] + mat [ 5 ] * r . mat [ 1 ] + mat [ 8 ] * r . mat [ 2 ] ,
mat [ 0 ] * r . mat [ 3 ] + mat [ 3 ] * r . mat [ 4 ] + mat [ 6 ] * r . mat [ 5 ] ,
mat [ 1 ] * r . mat [ 3 ] + mat [ 4 ] * r . mat [ 4 ] + mat [ 7 ] * r . mat [ 5 ] ,
mat [ 2 ] * r . mat [ 3 ] + mat [ 5 ] * r . mat [ 4 ] + mat [ 8 ] * r . mat [ 5 ] ,
mat [ 0 ] * r . mat [ 6 ] + mat [ 3 ] * r . mat [ 7 ] + mat [ 6 ] * r . mat [ 8 ] ,
mat [ 1 ] * r . mat [ 6 ] + mat [ 4 ] * r . mat [ 7 ] + mat [ 7 ] * r . mat [ 8 ] ,
mat [ 2 ] * r . mat [ 6 ] + mat [ 5 ] * r . mat [ 7 ] + mat [ 8 ] * r . mat [ 8 ] ) ;
return * this ;
}
2011-09-18 13:54:22 +00:00
void TransformPoint ( float & rX , float & rY ) const ; // rotate point by angle
2010-03-28 17:58:21 +00:00
} ;
2009-05-08 13:28:41 +00:00
// pattern
2011-09-30 20:15:51 +00:00
class C4Pattern
2010-03-28 17:58:21 +00:00
{
private :
// pattern surface for new-style patterns
2011-10-03 14:06:41 +00:00
class C4Surface * sfcPattern32 ;
2010-03-28 17:58:21 +00:00
// Faster access
uint32_t * CachedPattern ; int Wdt ; int Hgt ;
// pattern zoom factor; 0 means no zoom
int Zoom ;
public :
2011-09-30 20:15:51 +00:00
C4Pattern & operator = ( const C4Pattern & ) ;
2011-10-03 14:06:41 +00:00
const C4Surface * getSurface ( ) const { return sfcPattern32 ; }
2010-03-28 17:58:21 +00:00
DWORD PatternClr ( unsigned int iX , unsigned int iY ) const ; // apply pattern to color
2011-10-03 14:06:41 +00:00
bool Set ( class C4Surface * sfcSource , int iZoom = 0 ) ; // set and enable pattern
2010-03-28 17:58:21 +00:00
void SetZoom ( int iZoom ) { Zoom = iZoom ; }
void Clear ( ) ; // clear pattern
2011-09-30 20:15:51 +00:00
C4Pattern ( ) ; // ctor
~ C4Pattern ( ) { Clear ( ) ; } // dtor
2010-03-28 17:58:21 +00:00
} ;
2009-05-08 13:28:41 +00:00
// blit position on screen
// This is the format required by GL_T2F_C4UB_V3F
2011-09-30 20:15:51 +00:00
struct C4BltVertex
2010-03-28 17:58:21 +00:00
{
2010-12-28 23:46:35 +00:00
float tx , ty ; // texture positions
unsigned char color [ 4 ] ; // color modulation
2009-05-08 13:28:41 +00:00
float ftx , fty , ftz ; // blit positions
2010-03-28 17:58:21 +00:00
} ;
2009-05-08 13:28:41 +00:00
2009-08-12 20:03:50 +00:00
// helper struct
2009-05-08 13:28:41 +00:00
struct ZoomData
2010-03-28 17:58:21 +00:00
{
2009-05-08 13:28:41 +00:00
float Zoom ;
2015-01-07 16:29:48 +00:00
float X , Y ;
2010-03-28 17:58:21 +00:00
} ;
2009-05-08 13:28:41 +00:00
2014-11-06 16:19:41 +00:00
class C4FoWRegion ;
2015-09-12 22:14:18 +00:00
// Shader combinations
static const int C4SSC_MOD2 = 1 ; // signed addition instead of multiplication for clrMod
static const int C4SSC_BASE = 2 ; // use a base texture instead of just a single color
static const int C4SSC_OVERLAY = 4 ; // use a colored overlay on top of base texture
static const int C4SSC_LIGHT = 8 ; // use dynamic+ambient lighting
static const int C4SSC_NORMAL = 16 ; // extract normals from normal map instead of (0,0,1)
2009-05-08 13:28:41 +00:00
// direct draw encapsulation
2011-10-03 14:34:08 +00:00
class C4Draw
2010-03-28 17:58:21 +00:00
{
public :
2015-09-11 00:45:42 +00:00
enum DrawOperation { OP_POINTS , OP_TRIANGLES } ;
2016-02-01 22:59:38 +00:00
static constexpr int COLOR_DEPTH = 32 ;
static constexpr int COLOR_DEPTH_BYTES = COLOR_DEPTH / 8 ;
2014-11-07 16:53:10 +00:00
C4Draw ( ) : MaxTexSize ( 0 ) { }
2011-10-03 14:34:08 +00:00
virtual ~ C4Draw ( ) { pDraw = NULL ; }
2010-03-28 17:58:21 +00:00
public :
2011-08-27 14:20:39 +00:00
C4AbstractApp * pApp ; // the application
2010-03-28 17:58:21 +00:00
bool Active ; // set if device is ready to render, etc.
2015-08-31 15:34:01 +00:00
float gamma [ C4MaxGammaRamps ] [ 3 ] ; // input gammas
float gammaOut [ 3 ] ; // combined gamma
2010-03-28 17:58:21 +00:00
int MaxTexSize ;
protected :
float fClipX1 , fClipY1 , fClipX2 , fClipY2 ; // clipper in unzoomed coordinates
float fStClipX1 , fStClipY1 , fStClipX2 , fStClipY2 ; // stored clipper in unzoomed coordinates
int32_t iClipX1 , iClipY1 , iClipX2 , iClipY2 ; // clipper in pixel coordinates
bool ClipAll ; // set if clipper clips everything away
bool PrimaryLocked ; // set if primary surface is locked (-> can't blit)
2011-10-03 14:06:41 +00:00
C4Surface * RenderTarget ; // current render target
2010-03-28 17:58:21 +00:00
bool BlitModulated ; // set if blits should be modulated with BlitModulateClr
DWORD BlitModulateClr ; // modulation color for blitting
DWORD dwBlitMode ; // extra flags for blit
2014-11-06 16:19:41 +00:00
const C4FoWRegion * pFoW ; // new-style FoW
2015-01-07 16:29:48 +00:00
float ZoomX ; float ZoomY ;
2010-03-28 17:58:21 +00:00
const StdMeshMatrix * MeshTransform ; // Transformation to apply to mesh before rendering
bool fUsePerspective ;
public :
float Zoom ;
// General
2016-02-01 22:59:38 +00:00
bool Init ( C4AbstractApp * pApp , unsigned int iXRes , unsigned int iYRes , unsigned int iMonitor ) ;
2010-03-28 17:58:21 +00:00
virtual void Clear ( ) ;
virtual void Default ( ) ;
2011-08-27 21:12:01 +00:00
virtual CStdGLCtx * CreateContext ( C4Window * , C4AbstractApp * ) { return NULL ; }
2010-03-28 17:58:21 +00:00
virtual bool OnResolutionChanged ( unsigned int iXRes , unsigned int iYRes ) = 0 ; // reinit clipper for new resolution
// Clipper
2010-04-26 23:32:45 +00:00
bool GetPrimaryClipper ( int & rX1 , int & rY1 , int & rX2 , int & rY2 ) ;
bool SetPrimaryClipper ( int iX1 , int iY1 , int iX2 , int iY2 ) ;
bool SubPrimaryClipper ( int iX1 , int iY1 , int iX2 , int iY2 ) ;
2014-11-23 21:26:09 +00:00
C4Rect GetClipRect ( ) const ;
2014-12-26 15:16:09 +00:00
C4Rect GetOutRect ( ) const ;
2010-03-28 17:58:21 +00:00
bool StorePrimaryClipper ( ) ;
bool RestorePrimaryClipper ( ) ;
bool NoPrimaryClipper ( ) ;
2011-10-03 14:07:07 +00:00
bool ApplyPrimaryClipper ( C4Surface * sfcSurface ) ;
bool DetachPrimaryClipper ( C4Surface * sfcSurface ) ;
2010-03-28 17:58:21 +00:00
virtual bool UpdateClipper ( ) = 0 ; // set current clipper to render target
// Surface
2011-10-03 14:07:07 +00:00
bool GetSurfaceSize ( C4Surface * sfcSurface , int & iWdt , int & iHgt ) ;
void Grayscale ( C4Surface * sfcSfc , int32_t iOffset = 0 ) ;
2010-03-28 17:58:21 +00:00
void LockingPrimary ( ) { PrimaryLocked = true ; }
void PrimaryUnlocked ( ) { PrimaryLocked = false ; }
2014-12-22 16:15:46 +00:00
virtual bool PrepareMaterial ( StdMeshMatManager & mat_manager , StdMeshMaterialLoader & loader , StdMeshMaterial & mat ) = 0 ; // Find best technique, fail if there is none
2011-10-03 14:07:07 +00:00
virtual bool PrepareRendering ( C4Surface * sfcToSurface ) = 0 ; // check if/make rendering possible to given surface
2015-09-12 22:14:18 +00:00
virtual bool PrepareSpriteShader ( C4Shader & shader , const char * name , int ssc , C4GroupSet * pGroups , const char * const * additionalDefines , const char * const * additionalSlices ) = 0 ; // create sprite shader
2010-03-28 17:58:21 +00:00
// Blit
2011-10-03 14:07:07 +00:00
virtual void BlitLandscape ( C4Surface * sfcSource , float fx , float fy ,
2014-11-02 16:10:08 +00:00
C4Surface * sfcTarget , float tx , float ty , float wdt , float hgt ) ;
2010-03-28 17:58:21 +00:00
void Blit8Fast ( CSurface8 * sfcSource , int fx , int fy ,
2011-10-03 14:07:07 +00:00
C4Surface * sfcTarget , int tx , int ty , int wdt , int hgt ) ;
bool Blit ( C4Surface * sfcSource , float fx , float fy , float fwdt , float fhgt ,
C4Surface * sfcTarget , float tx , float ty , float twdt , float thgt ,
2011-09-30 20:15:51 +00:00
bool fSrcColKey = false , const C4BltTransform * pTransform = NULL ) ;
2012-02-25 16:35:24 +00:00
bool BlitUnscaled ( C4Surface * sfcSource , float fx , float fy , float fwdt , float fhgt ,
C4Surface * sfcTarget , float tx , float ty , float twdt , float thgt ,
bool fSrcColKey = false , const C4BltTransform * pTransform = NULL ) ;
2011-10-03 14:07:07 +00:00
bool RenderMesh ( StdMeshInstance & instance , C4Surface * sfcTarget , float tx , float ty , float twdt , float thgt , DWORD dwPlayerColor , C4BltTransform * pTransform ) ; // Call PrepareMaterial with Mesh's material before
2011-09-30 20:15:51 +00:00
virtual void PerformMesh ( StdMeshInstance & instance , float tx , float ty , float twdt , float thgt , DWORD dwPlayerColor , C4BltTransform * pTransform ) = 0 ;
2011-10-03 14:07:07 +00:00
bool Blit8 ( C4Surface * sfcSource , int fx , int fy , int fwdt , int fhgt , // force 8bit-blit (inline)
C4Surface * sfcTarget , int tx , int ty , int twdt , int thgt ,
2011-09-30 20:15:51 +00:00
bool fSrcColKey = false , const C4BltTransform * pTransform = NULL ) ;
2013-05-25 12:18:20 +00:00
bool BlitSimple ( C4Surface * sfcSource , int fx , int fy , int fwdt , int fhgt ,
2011-10-03 14:07:07 +00:00
C4Surface * sfcTarget , int tx , int ty , int twdt , int thgt ,
2013-05-25 12:18:20 +00:00
bool fTransparency = true ) ;
2011-10-03 14:07:07 +00:00
bool BlitSurface ( C4Surface * sfcSurface , C4Surface * sfcTarget , int tx , int ty , bool fBlitBase ) ;
2015-09-12 22:14:18 +00:00
bool BlitSurfaceTile ( C4Surface * sfcSurface , C4Surface * sfcTarget , float iToX , float iToY , float iToWdt , float iToHgt , float iOffsetX , float iOffsetY , C4ShaderCall * shader_call ) ;
2010-03-28 17:58:21 +00:00
virtual void FillBG ( DWORD dwClr = 0 ) = 0 ;
// Text
enum { DEFAULT_MESSAGE_COLOR = 0xffffffff } ;
2011-10-03 14:07:07 +00:00
bool TextOut ( const char * szText , CStdFont & rFont , float fZoom , C4Surface * sfcDest , float iTx , float iTy , DWORD dwFCol = 0xffffffff , BYTE byForm = ALeft , bool fDoMarkup = true ) ;
bool StringOut ( const char * szText , CStdFont & rFont , float fZoom , C4Surface * sfcDest , float iTx , float iTy , DWORD dwFCol = 0xffffffff , BYTE byForm = ALeft , bool fDoMarkup = true ) ;
2010-03-28 17:58:21 +00:00
// Drawing
2015-09-12 22:14:18 +00:00
virtual void PerformMultiPix ( C4Surface * sfcTarget , const C4BltVertex * vertices , unsigned int n_vertices , C4ShaderCall * shader_call ) = 0 ;
virtual void PerformMultiLines ( C4Surface * sfcTarget , const C4BltVertex * vertices , unsigned int n_vertices , float width , C4ShaderCall * shader_call ) = 0 ;
virtual void PerformMultiTris ( C4Surface * sfcTarget , const C4BltVertex * vertices , unsigned int n_vertices , const C4BltTransform * pTransform , C4TexRef * pTex , C4TexRef * pOverlay , C4TexRef * pNormal , DWORD dwOverlayClrMod , C4ShaderCall * shader_call ) = 0 ; // blit the same texture many times
2014-11-04 16:24:55 +00:00
// Convenience drawing functions
2011-10-03 14:07:07 +00:00
void DrawBoxDw ( C4Surface * sfcDest , int iX1 , int iY1 , int iX2 , int iY2 , DWORD dwClr ) ; // calls DrawBoxFade
2015-09-12 22:14:18 +00:00
void DrawBoxFade ( C4Surface * sfcDest , float iX , float iY , float iWdt , float iHgt , DWORD dwClr1 , DWORD dwClr2 , DWORD dwClr3 , DWORD dwClr4 , C4ShaderCall * shader_call ) ; // calls DrawQuadDw
2011-10-03 14:07:07 +00:00
void DrawPatternedCircle ( C4Surface * sfcDest , int x , int y , int r , BYTE col , C4Pattern & Pattern , CStdPalette & rPal ) ;
void DrawFrameDw ( C4Surface * sfcDest , int x1 , int y1 , int x2 , int y2 , DWORD dwClr ) ;
2015-09-12 22:14:18 +00:00
void DrawQuadDw ( C4Surface * sfcTarget , float * ipVtx , DWORD dwClr1 , DWORD dwClr2 , DWORD dwClr3 , DWORD dwClr4 , C4ShaderCall * shader_call ) ;
2014-11-04 16:24:55 +00:00
void DrawPix ( C4Surface * sfcDest , float tx , float ty , DWORD dwCol ) ; // Consider using PerformMultiPix if you draw more than one pixel
void DrawLineDw ( C4Surface * sfcTarget , float x1 , float y1 , float x2 , float y2 , DWORD dwClr , float width = 1.0f ) ; // Consider using PerformMultiLines if you draw more than one line
2010-03-28 17:58:21 +00:00
// gamma
2015-08-31 15:34:01 +00:00
void SetGamma ( float r , float g , float b , int32_t iRampIndex ) ; // set gamma
void ResetGamma ( ) ; // reset gamma to default
DWORD ApplyGammaTo ( DWORD dwClr ) ; // apply gamma to given color
2010-03-28 17:58:21 +00:00
// blit states
void ActivateBlitModulation ( DWORD dwWithClr ) { BlitModulated = true ; BlitModulateClr = dwWithClr ; } // modulate following blits with a given color
void DeactivateBlitModulation ( ) { BlitModulated = false ; } // stop color modulation of blits
bool GetBlitModulation ( DWORD & rdwColor ) { rdwColor = BlitModulateClr ; return BlitModulated ; }
void SetBlitMode ( DWORD dwBlitMode ) { this - > dwBlitMode = dwBlitMode & C4GFXBLIT_ALL ; } // set blit mode extra flags (additive blits, mod2-modulation, etc.)
void ResetBlitMode ( ) { dwBlitMode = 0 ; }
2014-11-06 16:19:41 +00:00
void SetFoW ( const C4FoWRegion * fow ) { pFoW = fow ; }
const C4FoWRegion * GetFoW ( ) const { return pFoW ; }
2015-01-07 16:29:48 +00:00
void SetZoom ( float X , float Y , float Zoom ) ;
2010-03-28 17:58:21 +00:00
void SetZoom ( const ZoomData & zoom ) { SetZoom ( zoom . X , zoom . Y , zoom . Zoom ) ; }
void GetZoom ( ZoomData * r ) { r - > Zoom = Zoom ; r - > X = ZoomX ; r - > Y = ZoomY ; }
void ApplyZoom ( float & X , float & Y ) ;
void RemoveZoom ( float & X , float & Y ) ;
void SetMeshTransform ( const StdMeshMatrix * Transform ) { MeshTransform = Transform ; } // if non-NULL make sure to keep matrix valid
void SetPerspective ( bool fSet ) { fUsePerspective = fSet ; }
2009-05-08 13:28:41 +00:00
2010-03-28 17:58:21 +00:00
// device objects
virtual bool RestoreDeviceObjects ( ) = 0 ; // restore device dependant objects
virtual bool InvalidateDeviceObjects ( ) = 0 ; // free device dependant objects
virtual bool DeviceReady ( ) = 0 ; // return whether device exists
2009-05-08 13:28:41 +00:00
2010-03-28 17:58:21 +00:00
protected :
2011-10-03 14:07:07 +00:00
bool StringOut ( const char * szText , C4Surface * sfcDest , float iTx , float iTy , DWORD dwFCol , BYTE byForm , bool fDoMarkup , C4Markup & Markup , CStdFont * pFont , float fZoom ) ;
2010-03-28 17:58:21 +00:00
bool CreatePrimaryClipper ( unsigned int iXRes , unsigned int iYRes ) ;
2010-08-03 17:02:00 +00:00
virtual bool Error ( const char * szMsg ) ;
2009-05-08 13:28:41 +00:00
2011-10-03 14:06:41 +00:00
friend class C4Surface ;
2011-10-03 14:16:38 +00:00
friend class C4TexRef ;
2011-09-30 20:15:51 +00:00
friend class C4Pattern ;
2010-03-28 17:58:21 +00:00
} ;
2009-05-08 13:28:41 +00:00
2010-09-24 17:51:34 +00:00
struct ZoomDataStackItem : public ZoomData
{
2011-10-03 14:30:18 +00:00
ZoomDataStackItem ( float newzoom ) { pDraw - > GetZoom ( this ) ; pDraw - > SetZoom ( X , Y , newzoom ) ; }
2015-01-07 16:29:48 +00:00
ZoomDataStackItem ( float X , float Y , float newzoom ) { pDraw - > GetZoom ( this ) ; pDraw - > SetZoom ( X , Y , newzoom ) ; }
2011-10-03 14:30:18 +00:00
~ ZoomDataStackItem ( ) { pDraw - > SetZoom ( * this ) ; }
2010-09-24 17:51:34 +00:00
} ;
2009-05-08 13:28:41 +00:00
2016-02-01 22:59:38 +00:00
bool DDrawInit ( C4AbstractApp * pApp , unsigned int iXRes , unsigned int iYRes , unsigned int iMonitor ) ;
2009-05-08 13:28:41 +00:00
# endif // INC_STDDDRAW2