/*++ BUILD Version: 0001 * * WOW v1.0 * * Copyright (c) 1991, Microsoft Corporation * * GDI16.H * * History: * Created 01-Jul-1991 by John Colleran (johnc) * * Warning!!! * The same code is used to play 16 bit metafiles in WOW (16 bit code) * and GDI (32 bit code) * --*/ #ifdef WOW #define WIN16 #define UINT WORD #define HUGE_T huge #else #define WIN32 #include "port1632.h" #include "firewall.h" #ifdef FIREWALLS #define DEBUG #endif #endif #define GDIENTRY FAR PASCAL #define INTERNAL NEAR PASCAL // If this is 32 bit code append a 16 to all the exported APIs #ifdef WIN32 HANDLE FAR PASCAL GetMetaFile16(LPSTR); BOOL FAR PASCAL PlayMetaFile16(HDC, HANDLE); void FAR PASCAL PlayMetaFileRecord16(HDC, LPHANDLETABLE, LPMETARECORD, WORD); #define GetMetaFile GetMetaFile16 #define DeleteMetaFile DeleteMetaFile16 #define PlayMetaFile PlayMetaFile16 #define PlayMetaFileRecord PlayMetaFileRecord16 #define IsValidMetaFile IsValidMetaFile16 #define AnimatePalettePriv AnimatePalette #define DeleteObjectPriv DeleteObject #define ResizePalettePriv ResizePalette #define SetPaletteEntriesPriv SetPaletteEntries #define GetViewportExt(hdc) GetViewportExt32(hdc) #define GetWindowExt(hdc) GetWindowExt32(hdc) #define SetViewportExt(h,x,y) SetViewportExt32(h,x,y) #define SetWindowExt(h,x,y) SetWindowExt32(h,x,y) LPINT ConvertInts( signed short * pWord, UINT cWords ); DWORD GetViewportExt32(HDC hdc); DWORD GetWindowExt32(HDC hdc); DWORD SetViewportExt32(HDC hdc, UINT x, UINT y); DWORD SetWindowExt32(HDC hdc, UINT x, UINT y); #define CONVERTPTS(p,c) (LPPOINT)CONVERTINTS((signed short *)p,(c)*2) #define CONVERTINTS(p,c) ConvertInts((signed short *)p,c) #define FREECONVERT(p) LocalFree(p) #define PlayIntoAMetafile(a,b) 0 #define DEFIFWIN16(a) 0 #pragma pack(2) typedef struct { WORD mtType; WORD mtHeaderSize; WORD mtVersion; WORD mtSize; WORD mtSize2; WORD mtNoObjects; DWORD mtMaxRecord; WORD mtNoParameters; } METAHEADER16; #define METAHEADER METAHEADER16 typedef struct tagLOGFONT16 { int lfHeight; int lfWidth; int lfEscapement; int lfOrientation; int lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; BYTE lfFaceName[LF_FACESIZE]; } LOGFONT16; typedef LOGFONT16 FAR *LPLOGFONT16; #pragma pack() #define LOGFONT32FROM16( plf32, plf16 ) \ { plf32->lfHeight = plf16->lfHeight; \ plf32->lfWidth = plf16->lfWidth; \ plf32->lfEscapement = plf16->lfEscapement; \ plf32->lfOrientation = plf16->lfOrientation; \ plf32->lfWeight = plf16->lfWeight; \ plf32->lfItalic = plf16->lfItalic; \ plf32->lfUnderline = plf16->lfUnderline; \ plf32->lfStrikeOut = plf16->lfStrikeOut; \ plf32->lfCharSet = plf16->lfCharSet; \ plf32->lfOutPrecision = plf16->lfOutPrecision; \ plf32->lfClipPrecision = plf16->lfClipPrecision; \ plf32->lfQuality = plf16->lfQuality; \ plf32->lfPitchAndFamily = plf16->lfPitchAndFamily; \ memcpy( &plf32->lfItalic, &plf16->lfItalic, LF_FACESIZE); \ } #define ISDCVALID(hdc) TRUE #define ISMETADC(hdc) FALSE #else #define CONVERTPTS(p,c) (LPPOINT)(p) #define CONVERTINTS(p,c) (p) #define FREECONVERT(p) #define DEFIFWIN16(a) a #define LOGFONT32FROM16( plf32, plf16 ) {plf32 = plf16;} #define ISDCVALID(hdc) IsDCValid(hdc) #define ISMETADC(hdc) IsMetaDC(hdc) typedef struct _RGNDATAHEADER { DWORD dwSize; DWORD iType; DWORD nCount; } RGNDATAHEADER, *PRGNDATAHEADER; typedef struct _RGNDATA { RGNDATAHEADER rdh; char Buffer[1]; } RGNDATA,FAR *LPRGNDATA; typedef struct _RECTL { LONG xLeft; LONG yTop; LONG xRight; LONG yBottom; } RECTL,FAR *LPRECTL; #endif /*** MetaFile Internal Constants and Macros ***/ #define METAVERSION 0x0300 #define METAVERSION100 0x0100 /* Metafile constants not in Windows.h */ #define META_RESETDC 0x0149 #define META_STARTDOC 0x0150 #define META_STARTPAGE 0x0051 #define META_ENDPAGE 0x0052 #define META_ENDDOC 0x0053 #define META_ABORTDOC 0x0054 #define META_EXTFLOODFILL 0x0548 #define MAXFILECHUNK ((unsigned)63*1024) #define METAFILEFAILURE 1 #define METAEXITCODE 0 /* arbitrary value */ #define MEMORYMETAFILE 1 #define DISKMETAFILE 2 #define DATASIZE 100 #define HEADERSIZE (sizeof(METAHEADER)/sizeof(WORD)) #define RECHDRSIZE (sizeof(WORD) + sizeof(DWORD)) #define LMHtoP(handle) (*((char * *)(handle))) #define ID_METADC 0x444D // "MD" #define METADCBIT 0x1 // Set if DC is a MetaFile DC #define MAKEMETADC(h) (h|METADCBIT) #define HANDLEFROMMETADC(h) (((UINT)h) & (~METADCBIT)) #define HMFFROMNPMF(h) (LocalHandle((WORD)h)|METADCBIT) #define NPFROMMETADC(h) (LMHtoP((h&(~METADCBIT)))) //!!!!!! assert this #define MAXOBJECTSIZE sizeof(LOGFONT) /*** MetaFile Internal TypeDefs ***/ typedef BYTE near *NPBYTE; typedef BYTE HUGE_T *HPBYTE; typedef WORD HUGE_T *HPWORD; typedef HANDLE HMETAFILE; typedef struct _METADATA { /* md */ METAHEADER dataHeader; WORD metaDataStuff[DATASIZE]; } METADATA; typedef METADATA *NPMETADATA; typedef METADATA FAR *LPMETADATA; typedef struct _METAFILE { /* mf */ METAHEADER MetaFileHeader; UINT MetaFileNumber; DWORD MetaFilePosition; OFSTRUCT MetaFileBuffer; HANDLE MetaFileRecordHandle; } METAFILE; typedef METAFILE *NPMETAFILE; typedef METAFILE FAR *LPMETAFILE; typedef METAFILE HUGE_T *HPMETAFILE; typedef struct _METACACHE { HANDLE hCache; HANDLE hMF; WORD wCacheSize; WORD wCachePos; } METACACHE; typedef struct _ILOBJHEAD { WORD ident; WORD nextinchain; int ilObjType; long ilObjCount; HANDLE ilObjMetaList; } ILOBJHEAD; typedef struct _METARECORDER { ILOBJHEAD metaDCHeader; METAHEADER recordHeader; DWORD recFilePosition; OFSTRUCT recFileBuffer; DWORD sizeBuffer; WORD recFileNumber; WORD recFlags; HANDLE hMetaData; HANDLE hObjectTable; HANDLE recCurObjects[6]; // Current Selected Object } METARECORDER; typedef METARECORDER *NPMETARECORDER; typedef METARECORDER FAR *LPMETARECORDER; typedef METARECORD HUGE_T *HPMETARECORD; typedef struct _OBJECTTABLE { DWORD objectIndex; HANDLE objectCurHandle; } OBJECTTABLE; typedef OBJECTTABLE *NPOBJECTTABLE; typedef OBJECTTABLE FAR *LPOBJECTTABLE; typedef struct _OBJMETALIST { WORD omlCount; HANDLE omlMetaDC[1]; } OBJMETALIST; typedef struct _WIN2OBJHEAD { WORD nextinchain; int w2ObjType; long w2ObjCount; } WIN2OBJHEAD; typedef WIN2OBJHEAD *NPWIN2OBJHEAD; typedef WIN2OBJHEAD FAR *LPWIN2OBJHEAD; typedef struct _SCAN { WORD scnPntCnt; // Scan point count WORD scnPntTop; // Top of scan WORD scnPntBottom; // Bottom of scan WORD scnPntsX[2]; // Start of points in scan WORD scnPtCntToo; // Point count-- to allow UP travel } SCAN; typedef SCAN *NPSCAN; typedef SCAN FAR *LPSCAN; typedef struct _WIN3REGION { WORD nextInChain; // Not used should be zero WORD ObjType; // Must always be 6 (Windows OBJ_RGN) DWORD ObjCount; // Not used WORD cbRegion; // size of following region struct WORD cScans; WORD maxScan; RECT rcBounding; SCAN aScans[1]; } WIN3REGION; typedef WIN3REGION *NPWIN3REGION; typedef WIN3REGION FAR *LPWIN3REGION; typedef struct _EXTTEXTDATA { int xPos; int yPos; WORD cch; RECT rcClip; LPSTR lpString; LPWORD lpWidths; }EXTTEXTDATA; typedef EXTTEXTDATA *NPEXTTEXTDATA; typedef EXTTEXTDATA FAR *LPEXTTEXTDATA; // These are from wingdi.h #define OBJ_PEN 1 #define OBJ_BRUSH 2 #define OBJ_DC 3 #define OBJ_METADC 4 #define OBJ_PALETTE 5 #define OBJ_FONT 6 #define OBJ_BITMAP 7 #define OBJ_RGN 8 #define OBJ_METAFILE 9 #define OBJ_MEMDC 10 #define MIN_OBJ OBJ_PEN #define MAX_OBJ OBJ_MEMDC // These Function have no DC; so these function allow you to call them directly #ifdef WIN16 HANDLE GDIENTRY GetCurrentObject(HDC hdc, WORD wObjType); DWORD GDIENTRY GetRegionData(HRGN, DWORD, LPRGNDATA); void GDIENTRY AnimatePalettePriv(HPALETTE, WORD, WORD, LPPALETTEENTRY); BOOL GDIENTRY DeleteObjectPriv(HANDLE); BOOL GDIENTRY ResizePalettePriv(HPALETTE, WORD); WORD GDIENTRY SetPaletteEntriesPriv(HPALETTE,WORD,WORD,LPPALETTEENTRY); #endif // WIN16 BOOL GDIENTRY GdiFlush(VOID); DWORD GDIENTRY GetObjectType(HANDLE h); BOOL GDIENTRY IsValidMetaFile(HANDLE hMetaData); // Internal Function Declarations VOID INTERNAL AddToHandleTable(LPHANDLETABLE lpHandleTable, HANDLE hObject, WORD noObjs); HANDLE INTERNAL AllocBuffer(LPWORD iBufferSize); DWORD INTERNAL BigRead(UINT fileNumber, LPSTR lpRecord, DWORD dwSizeRec); VOID INTERNAL CallMetaFunction(HDC, FARPROC, WORD, LPWORD ); BOOL INTERNAL GDIsSelectPalette(HDC hdc, HPALETTE pal, BOOL f); LPMETARECORD INTERNAL GetEvent(LPMETAFILE pmf,HPMETARECORD pmr,BOOL bFree); int INTERNAL GetObjectAndType(HANDLE hObj, LPSTR lpObjectBuf); HANDLE INTERNAL GetPMetaFile(HDC hdc); BOOL INTERNAL InitializeGdi(VOID); BOOL INTERNAL IsDIBBlackAndWhite(LPBITMAPINFOHEADER lpDIBInfo); BOOL INTERNAL IsDCValid(HDC hdc); BOOL INTERNAL IsMetaDC(HDC hdc); BOOL INTERNAL IsObjectStock(HANDLE hObj); BOOL INTERNAL LPtoSP(HDC,LPPOINT,int); BOOL INTERNAL PlayIntoAMetafile(LPMETARECORD lpMR, HDC hdcDest); int INTERNAL RecordObject(HANDLE hMF, WORD magic, WORD count, LPWORD lpParm); BOOL INTERNAL RecordParms(HANDLE hDC, WORD magic, DWORD count, LPWORD lpParm); BOOL INTERNAL RecordOther(HANDLE hMF, WORD magic, WORD count, LPWORD lpParm); BOOL INTERNAL Valid( HANDLE hnd, int l, int h); /**************************************************************************** debugging support ****************************************************************************/ // Put a wrapper around 16 bit memory Allocation to help track down bugs #ifdef DEBUG #ifndef WIN32 PSTR INTERNAL _LocalLock(HANDLE h ); BOOL INTERNAL _LocalUnlock(HANDLE h ); HANDLE INTERNAL _LocalAlloc(WORD w, WORD w2); LPSTR INTERNAL _GlobalLock(HANDLE h ); BOOL INTERNAL _GlobalUnlock(HANDLE h ); HANDLE INTERNAL _GlobalAlloc(WORD w, DWORD dw ); #define LocalLock(h) _LocalLock(h) #define GlobalLock(h) _GlobalLock(h) #define LocalUnlock(h) _LocalUnlock(h) #define GlobalUnlock(h) _GlobalUnlock(h) #define LocalAlloc(w, w2 ) _LocalAlloc(w, w2) #define GlobalAlloc(w, dw ) _GlobalAlloc(w, dw) #endif #endif #ifdef DEBUG extern void dDbgOut(int iLevel, LPSTR lpszFormat, ...); extern void dDbgAssert(LPSTR exp, LPSTR file, int line); #ifdef WIN32 #define dprintf #define GdiLogFunc(str) #define GdiLogFunc2(str) #define GdiLogFunc3(str) #define ASSERTGDIW(exp,str,w) ASSERTGDI(exp,str) #else #define dprintf dDbgOut #define GdiLogFunc(str) {dDbgOut(3, str );} #define GdiLogFunc2(str) {dDbgOut(6, str );} #define GdiLogFunc3(str) {dDbgOut(7, str );} #define ASSERTGDI(exp,str) \ {((exp) ? (void)0 : dDbgAssert(str, __FILE__, __LINE__));} #define ASSERTGDIW(exp,str,w) \ { char buf[256]; \ ((exp) ? 0 : \ ( wsprintf(buf, (LPSTR)str, (WORD)w), \ dDbgAssert(buf, __FILE__, __LINE__),0)); \ } \ #endif //WIN32 #else // !DEBUG #ifdef i386 #define dprintf /##/ #else #define dprintf #endif #define GdiLogFunc(str) #define GdiLogFunc2(str) #define GdiLogFunc3(str) #define ASSERTGDI(exp,str) #define ASSERTGDIW(exp, str, w) #endif // else DEBUG