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
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))
|