Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

319 lines
13 KiB

/******************************Module*Header*******************************\
* Module Name: mf16.h *
*
* Definitions needed for 3.x Metafile functions *
*
* Created: 01-Jul-1991 *
* Author: John Colleran (johnc) *
*
* Copyright (c) 1991-1999 Microsoft Corporation
\**************************************************************************/
// Windows 3.x structures
#pragma pack(2)
#define SIZEOF_METARECORDHEADER (sizeof(DWORD)+sizeof(WORD))
typedef struct _RECT16 {
SHORT left;
SHORT top;
SHORT right;
SHORT bottom;
} RECT16;
typedef RECT16 UNALIGNED *PRECT16;
typedef struct _BITMAP16 {
SHORT bmType;
SHORT bmWidth;
SHORT bmHeight;
SHORT bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
LPBYTE bmBits;
} BITMAP16;
typedef BITMAP16 UNALIGNED *PBITMAP16;
typedef struct _LOGBRUSH16 {
WORD lbStyle;
COLORREF lbColor;
SHORT lbHatch;
} LOGBRUSH16;
typedef LOGBRUSH16 UNALIGNED *PLOGBRUSH16;
typedef struct tagLOGFONT16
{
SHORT lfHeight;
SHORT lfWidth;
SHORT lfEscapement;
SHORT lfOrientation;
SHORT lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
BYTE lfFaceName[LF_FACESIZE];
} LOGFONT16;
typedef LOGFONT16 UNALIGNED *PLOGFONT16;
typedef struct _LOGPEN16 {
WORD lopnStyle;
POINTS lopnWidth;
COLORREF lopnColor;
} LOGPEN16;
typedef LOGPEN16 UNALIGNED *PLOGPEN16;
#pragma pack()
// Macros for converting 32 bit objects to 16 bit equivalents
#define INT32FROMINT16(lp32, lp16, c) \
{ \
UINT ii; \
\
for(ii=0; ii<(c); ii++) \
((LPINT)(lp32))[ii] = ((PSHORT)(lp16))[ii]; \
}
#define BITMAP32FROMBITMAP16(lpBitmap, lpBitmap16) \
{ \
(lpBitmap)->bmType = (LONG)(lpBitmap16)->bmType; \
(lpBitmap)->bmWidth = (LONG)(lpBitmap16)->bmWidth; \
(lpBitmap)->bmHeight = (LONG)(lpBitmap16)->bmHeight; \
(lpBitmap)->bmWidthBytes = (LONG)(lpBitmap16)->bmWidthBytes;\
(lpBitmap)->bmPlanes = (WORD)(lpBitmap16)->bmPlanes; \
(lpBitmap)->bmBitsPixel = (WORD)(lpBitmap16)->bmBitsPixel; \
(lpBitmap)->bmBits = (lpBitmap16)->bmBits; \
}
#define LOGBRUSH32FROMLOGBRUSH16(lpLogBrush, lpLogBrush16) \
{ \
(lpLogBrush)->lbStyle = (UINT) (lpLogBrush16)->lbStyle; \
(lpLogBrush)->lbColor = (lpLogBrush16)->lbColor; \
(lpLogBrush)->lbHatch = (LONG) (lpLogBrush16)->lbHatch; \
}
#define LOGFONT32FROMLOGFONT16(lpLogFont, lpLogFont16) \
{ \
ASSERTGDI((sizeof(LOGFONTA) == (sizeof(LOGFONT16)+sizeof(WORD)*5)), \
"MF16.h: LOGFONT(32) and LOGFONT(16) changed!"); \
(lpLogFont)->lfHeight = (LONG) (lpLogFont16)->lfHeight; \
(lpLogFont)->lfWidth = (LONG) (lpLogFont16)->lfWidth; \
(lpLogFont)->lfEscapement = (LONG) (lpLogFont16)->lfEscapement; \
(lpLogFont)->lfOrientation = (LONG) (lpLogFont16)->lfOrientation; \
(lpLogFont)->lfWeight = (LONG) (lpLogFont16)->lfWeight; \
/* [ntbug #129231 - Access97 occurs an application error.] \
Access 97 does not padded rest of facename arrary if the length of \
face name is less than LF_FACESIZE. Win9x only access until null, \
so that they are safe, we also did same. */ \
(lpLogFont)->lfItalic = (lpLogFont16)->lfItalic; \
(lpLogFont)->lfUnderline = (lpLogFont16)->lfUnderline; \
(lpLogFont)->lfStrikeOut = (lpLogFont16)->lfStrikeOut; \
(lpLogFont)->lfCharSet = (lpLogFont16)->lfCharSet; \
(lpLogFont)->lfOutPrecision = (lpLogFont16)->lfOutPrecision; \
(lpLogFont)->lfClipPrecision = (lpLogFont16)->lfClipPrecision; \
(lpLogFont)->lfQuality = (lpLogFont16)->lfQuality; \
(lpLogFont)->lfPitchAndFamily = (lpLogFont16)->lfPitchAndFamily; \
strncpy((lpLogFont)->lfFaceName,(lpLogFont16)->lfFaceName,LF_FACESIZE);\
}
#define LOGPEN32FROMLOGPEN16(pLogPen, pLogPen16) \
{ \
(pLogPen)->lopnStyle = (pLogPen16)->lopnStyle; \
(pLogPen)->lopnWidth.x = (pLogPen16)->lopnWidth.x; \
(pLogPen)->lopnWidth.y = (pLogPen16)->lopnWidth.y; \
(pLogPen)->lopnColor = (pLogPen16)->lopnColor; \
}
// Macros for convert 16 bit objects to 32 bit equivalents
#define BITMAP16FROMBITMAP32(pBitmap16,pBitmap) \
{ \
(pBitmap16)->bmType = (SHORT)(pBitmap)->bmType; \
(pBitmap16)->bmWidth = (SHORT)(pBitmap)->bmWidth; \
(pBitmap16)->bmHeight = (SHORT)(pBitmap)->bmHeight; \
(pBitmap16)->bmWidthBytes= (SHORT)(pBitmap)->bmWidthBytes; \
(pBitmap16)->bmPlanes = (BYTE)(pBitmap)->bmPlanes; \
(pBitmap16)->bmBitsPixel = (BYTE)(pBitmap)->bmBitsPixel; \
(pBitmap16)->bmBits = (pBitmap)->bmBits; \
}
#define LOGBRUSH16FROMLOGBRUSH32(pLogBrush16,pLogBrush) \
{ \
(pLogBrush16)->lbStyle = (WORD)(pLogBrush)->lbStyle; \
ASSERTGDI((pLogBrush16)->lbStyle == BS_SOLID \
|| (pLogBrush16)->lbStyle == BS_HATCHED \
|| (pLogBrush16)->lbStyle == BS_HOLLOW, \
"LOGBRUSH16FROMLOGBRUSH32: unexpected lbStyle"); \
(pLogBrush16)->lbColor = (pLogBrush)->lbColor; \
(pLogBrush16)->lbHatch = (SHORT)(pLogBrush)->lbHatch; \
}
#define LOGPEN16FROMLOGPEN32(pLogPen16,pLogPen) \
{ \
(pLogPen16)->lopnStyle = (WORD)(pLogPen)->lopnStyle; \
(pLogPen16)->lopnWidth.x = (SHORT)(pLogPen)->lopnWidth.x; \
(pLogPen16)->lopnWidth.y = (SHORT)(pLogPen)->lopnWidth.y; \
(pLogPen16)->lopnColor = (pLogPen)->lopnColor; \
}
#define LOGFONT16FROMLOGFONT32(pLogFont16,pLogFont) \
{ \
ASSERTGDI((sizeof(LOGFONTA) == (sizeof(LOGFONT16)+sizeof(WORD)*5)), \
"MF16.h: LOGFONT(32) and LOGFONT(16) changed!"); \
(pLogFont16)->lfHeight = (SHORT)(pLogFont)->lfHeight; \
(pLogFont16)->lfWidth = (SHORT)(pLogFont)->lfWidth; \
(pLogFont16)->lfEscapement = (SHORT)(pLogFont)->lfEscapement; \
(pLogFont16)->lfOrientation = (SHORT)(pLogFont)->lfOrientation; \
(pLogFont16)->lfWeight = (SHORT)(pLogFont)->lfWeight; \
RtlCopyMemory((PVOID)&(pLogFont16)->lfItalic, \
(CONST VOID *)&(pLogFont)->lfItalic, \
sizeof(LOGFONTA)-sizeof(LONG)*5); \
}
/*** MetaFile Internal Constants and Macros ***/
#define METAVERSION300 0x0300
#define METAVERSION100 0x0100
// Metafile constants not in Windows.h
#define MEMORYMETAFILE 1
#define DISKMETAFILE 2
#define METAFILEFAILURE 1 // Flags denoting metafile is aborted
#define MF16_BUFSIZE_INIT (16*1024) // Metafile memory buffer size
#define MF16_BUFSIZE_INC (16*1024) // Metafile buffer increment size
#define ID_METADC16 0x444D // "MD"
#define MF16_IDENTIFIER 0x3631464D // "MF16"
#define MF3216_INCLUDE_WIN32MF 0x0001
// Constants for MFCOMMENT Escape
#define MFCOMMENT_IDENTIFIER 0x43464D57
#define MFCOMMENT_ENHANCED_METAFILE 1
// pmf16AllocMF16 flags
#define ALLOCMF16_TRANSFER_BUFFER 0x1
// METAFILE16 flags
#define MF16_DISKFILE 0x0001 // Disk or memory metafile.
// *** MetaFile Internal TypeDefs ***
typedef struct _METAFILE16 {
DWORD ident;
METAHEADER metaHeader;
HANDLE hFile;
HANDLE hFileMap;
HANDLE hMem;
DWORD iMem;
HANDLE hMetaFileRecord;
DWORD fl;
WCHAR wszFullPathName[MAX_PATH+1];
} METAFILE16,* PMETAFILE16;
#define MIN_OBJ_TYPE OBJ_PEN
#define MAX_OBJ_TYPE OBJ_ENHMETAFILE
typedef struct _MFRECORDER16 {
HANDLE hMem; // handle to the data (or buffer)
HANDLE hFile; // handle to the disk file
DWORD cbBuffer; // current size of hMem
DWORD ibBuffer; // current position in buffer
METAHEADER metaHeader;
WORD recFlags;
HANDLE hObjectTable;
HANDLE recCurObjects[MAX_OBJ_TYPE];// Current Selected Object
UINT iPalVer; // index of palette metafile synced to
WCHAR wszFullPathName[MAX_PATH+1];
} MFRECORDER16, * PMFRECORDER16;
typedef struct _OBJECTTABLE {
HANDLE CurHandle;
BOOL fPreDeleted;
} OBJECTTABLE, * POBJECTTABLE;
#pragma pack(2)
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 UNALIGNED *PSCAN;
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;
RECT16 rcBounding;
SCAN aScans[1];
} WIN3REGION;
typedef WIN3REGION UNALIGNED *PWIN3REGION;
typedef struct _META_ESCAPE_ENHANCED_METAFILE {
DWORD rdSize; // Size of the record in words
WORD rdFunction; // META_ESCAPE
WORD wEscape; // MFCOMMENT
WORD wCount; // Size of the following data + emf in bytes
DWORD ident; // MFCOMMENT_IDENTIFIER
DWORD iComment; // MFCOMMENT_ENHANCED_METAFILE
DWORD nVersion; // Enhanced metafile version 0x10000
WORD wChecksum; // Checksum - used by 1st record only
DWORD fFlags; // Compression etc - used by 1st record only
DWORD nCommentRecords; // Number of records making up the emf
DWORD cbCurrent; // Size of emf data in this record in bytes
DWORD cbRemainder; // Size of remainder in following records
DWORD cbEnhMetaFile; // Size of enhanced metafile in bytes
// The enhanced metafile data follows here
} META_ESCAPE_ENHANCED_METAFILE;
typedef META_ESCAPE_ENHANCED_METAFILE UNALIGNED *PMETA_ESCAPE_ENHANCED_METAFILE;
#pragma pack()
// Macro to check that it is a meta_escape embedded enhanced metafile record.
#define IS_META_ESCAPE_ENHANCED_METAFILE(pmfeEnhMF) \
((pmfeEnhMF)->rdFunction == META_ESCAPE \
&& (pmfeEnhMF)->rdSize > sizeof(META_ESCAPE_ENHANCED_METAFILE) / 2 \
&& (pmfeEnhMF)->wEscape == MFCOMMENT \
&& (pmfeEnhMF)->ident == MFCOMMENT_IDENTIFIER \
&& (pmfeEnhMF)->iComment == MFCOMMENT_ENHANCED_METAFILE)
// Internal Function Declarations
PMETARECORD GetEvent(PMETAFILE16 pmf,PMETARECORD pmr);
DWORD GetObject16AndType(HANDLE hObj, LPVOID lpObjectBuf);
BOOL IsValidMetaHeader16(PMETAHEADER pMetaHeader);
WORD RecordObject(HDC hdc, HANDLE hObject);
BOOL RecordParms(HDC hDC, DWORD magic, DWORD cw, CONST WORD *lpParm);
UINT ConvertEmfToWmf(PVOID pht, PBYTE pMeta32, UINT cbMeta16, PBYTE pMeta16, INT mm, HDC hdc, UINT f);
PMETAFILE16 pmf16AllocMF16(DWORD fl, DWORD cb, CONST UNALIGNED DWORD *pb, LPCWSTR pwszFilename);
VOID vFreeMF16(PMETAFILE16 pmf16);
BOOL bMetaGetDIBInfo(HDC hdc, HBITMAP hbm,
PBITMAPINFOHEADER pBmih, PDWORD pcbBmi, PDWORD pcbBits,
DWORD iUsage, LONG cScans, BOOL bMeta16);
BOOL APIENTRY IsValidEnhMetaRecord(PVOID pht, PVOID pmr);
BOOL APIENTRY IsValidEnhMetaRecordOffExt(PVOID pht, PVOID pmr, DWORD Off, DWORD Ext);
#define hmf16Create(pmf16) hCreateClientObjLink((PVOID)pmf16,LO_METAFILE16_TYPE)
#define bDeleteHmf16(hmf) bDeleteClientObjLink((HANDLE)hmf)
#define GET_PMF16(hmf) ((PMETAFILE16)pvClientObjGet((HANDLE)hmf,LO_METAFILE16_TYPE))