226 lines
6.3 KiB
C
226 lines
6.3 KiB
C
|
/*
|
||
|
Enhanced metafile functions
|
||
|
Copyright 1998, Douglas Ridgway
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include "windows.h"
|
||
|
#include "winbase.h"
|
||
|
#include "winnt.h"
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* GetEnhMetaFile32A (GDI32.174)
|
||
|
*
|
||
|
*
|
||
|
*/
|
||
|
HENHMETAFILE32 GetEnhMetaFile32A(
|
||
|
LPCSTR lpszMetaFile /* filename of enhanced metafile */
|
||
|
)
|
||
|
{
|
||
|
HENHMETAFILE32 hmf = NULL;
|
||
|
ENHMETAHEADER h;
|
||
|
char *p;
|
||
|
DWORD read;
|
||
|
HFILE32 hf = CreateFile32A(lpszMetaFile, GENERIC_READ, 0, 0,
|
||
|
OPEN_EXISTING, 0, NULL);
|
||
|
if (!ReadFile(hf, &h, sizeof(ENHMETAHEADER), &read, NULL))
|
||
|
return NULL;
|
||
|
if (read!=sizeof(ENHMETAHEADER)) return NULL;
|
||
|
SetFilePointer(hf, 0, NULL, FILE_BEGIN);
|
||
|
/* hmf = CreateFileMapping32A( hf, NULL, NULL, NULL, NULL, "temp"); */
|
||
|
hmf = GlobalAlloc32(GHND, h.nBytes);
|
||
|
p = GlobalLock32(hmf);
|
||
|
if (!ReadFile(hf, p, h.nBytes, &read, NULL)) return NULL;
|
||
|
GlobalUnlock32(hmf);
|
||
|
return hmf;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* GetEnhMetaFileHeader32 (GDI32.178)
|
||
|
*
|
||
|
* If _buf_ is NULL, returns the size of buffer required.
|
||
|
* Otherwise, copy up to _bufsize_ bytes of enhanced metafile header into
|
||
|
* _buf.
|
||
|
*/
|
||
|
UINT32 GetEnhMetaFileHeader32(
|
||
|
HENHMETAFILE32 hmf, /* enhanced metafile */
|
||
|
UINT32 bufsize, /* size of buffer */
|
||
|
LPENHMETAHEADER buf /* buffer */
|
||
|
)
|
||
|
{
|
||
|
LPENHMETAHEADER p = GlobalLock32(hmf);
|
||
|
if (!buf) return sizeof(ENHMETAHEADER);
|
||
|
memmove(buf, p, MIN(sizeof(ENHMETAHEADER), bufsize));
|
||
|
return MIN(sizeof(ENHMETAHEADER), bufsize);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* GetEnhMetaFileDescription32A (GDI32.176)
|
||
|
*
|
||
|
* Copies the description string of an enhanced metafile into a buffer
|
||
|
* _buf_.
|
||
|
*
|
||
|
* FIXME
|
||
|
* doesn't work. description is wide, with substructure
|
||
|
*/
|
||
|
UINT32 GetEnhMetaFileDescription32A(
|
||
|
HENHMETAFILE32 hmf, /* enhanced metafile */
|
||
|
UINT32 size, /* size of buf */
|
||
|
LPCSTR buf /* buffer to receive description */
|
||
|
)
|
||
|
{
|
||
|
LPENHMETAHEADER p = GlobalLock32(hmf);
|
||
|
|
||
|
if (!buf || !size) return p->nDescription;
|
||
|
lstrcpynWtoA(buf, (void *)p+p->offDescription, size);
|
||
|
/* memmove(buf, (void *)p+p->offDescription, MIN(size,p->nDescription));*/
|
||
|
return MIN(size,p->nDescription);
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* PlayEnhMetaFileRecord32 (GDI32.264)
|
||
|
*
|
||
|
* Render a single enhanced metafile record in the device context hdc.
|
||
|
*
|
||
|
* RETURNS
|
||
|
* TRUE on success, FALSE on error.
|
||
|
* BUGS
|
||
|
* Unimplemented
|
||
|
*/
|
||
|
BOOL32 PlayEnhMetaFileRecord32(
|
||
|
HDC32 hdc,
|
||
|
/* device context in which to render EMF record */
|
||
|
LPHANDLETABLE32 lpHandletable,
|
||
|
/* array of handles to be used in rendering record */
|
||
|
const ENHMETARECORD *lpEnhMetaRecord, /* EMF record to render */
|
||
|
UINT32 nHandles /* size of handle array */
|
||
|
)
|
||
|
{
|
||
|
int type;
|
||
|
fprintf(stdout,
|
||
|
"PlayEnhMetaFileRecord(hdc = %08x, handletable = %p, record = %p, numHandles = %d\n",
|
||
|
hdc, lpHandletable, lpEnhMetaRecord, nHandles);
|
||
|
/* SetLastError(E_NOTIMPL); */
|
||
|
if (!lpEnhMetaRecord) return FALSE;
|
||
|
|
||
|
type = lpEnhMetaRecord->iType;
|
||
|
|
||
|
switch(type)
|
||
|
{
|
||
|
case EMR_HEADER:
|
||
|
printf("Header ok!\n");
|
||
|
return TRUE;
|
||
|
break;
|
||
|
case EMR_EOF:
|
||
|
printf("Eof ok!\n");
|
||
|
return TRUE;
|
||
|
break;
|
||
|
}
|
||
|
printf("I dunno %d\n", type);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*****************************************************************************
|
||
|
*
|
||
|
* EnumEnhMetaFile32 (GDI32.79)
|
||
|
*
|
||
|
* Walk an enhanced metafile, calling a user-specified function _EnhMetaFunc_
|
||
|
* for each
|
||
|
* record. Returns when either every record has been used or
|
||
|
* when _EnhMetaFunc_ returns FALSE.
|
||
|
*
|
||
|
*
|
||
|
* RETURNS
|
||
|
* TRUE if every record is used, FALSE if any invocation of _EnhMetaFunc_
|
||
|
* returns FALSE.
|
||
|
*
|
||
|
* BUGS
|
||
|
* Doesn't free objects, ignores rect.
|
||
|
*/
|
||
|
BOOL32 EnumEnhMetaFile32(
|
||
|
HDC32 hdc, /* device context to pass to _EnhMetaFunc_ */
|
||
|
HENHMETAFILE32 hmf, /* EMF to walk */
|
||
|
ENHMFENUMPROC32 callback, /* callback function */
|
||
|
LPVOID data, /* optional data for callback function */
|
||
|
const RECT32 *rect /* bounding rectangle for rendered metafile */
|
||
|
)
|
||
|
{
|
||
|
BOOL32 ret = TRUE;
|
||
|
LPENHMETARECORD p = GlobalLock32(hmf);
|
||
|
INT32 count = ((LPENHMETAHEADER) p)->nHandles;
|
||
|
HANDLETABLE32 *ht = (HANDLETABLE32 *)GlobalAlloc32(GPTR, sizeof(HANDLETABLE32)*count);
|
||
|
ht->objectHandle[0] = hmf;
|
||
|
while (ret) {
|
||
|
/* printf("EnumEnhMetaFile: type = %ld size = %ld\n", p->iType, p->nSize);*/
|
||
|
ret = (*callback)(hdc, ht, p, count, data);
|
||
|
if (p->iType == EMR_EOF) break;
|
||
|
p = (void *) p + p->nSize;
|
||
|
}
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**************************************************************************
|
||
|
* PlayEnhMetaFile32 (GDI32.263)
|
||
|
*
|
||
|
* Renders an enhanced metafile into a specified rectangle *lpRect
|
||
|
* in device context hdc.
|
||
|
*
|
||
|
* BUGS
|
||
|
* Almost entirely unimplemented
|
||
|
*
|
||
|
*/
|
||
|
BOOL32 PlayEnhMetaFile32(
|
||
|
HDC32 hdc, /* DC to render into */
|
||
|
HENHMETAFILE32 hmf, /* metafile to render */
|
||
|
const RECT32 *lpRect /* rectangle to place metafile inside */
|
||
|
)
|
||
|
{
|
||
|
LPENHMETARECORD p = GlobalLock32(hmf);
|
||
|
INT32 count = ((LPENHMETAHEADER) p)->nHandles;
|
||
|
HANDLETABLE32 *ht = (HANDLETABLE32 *)GlobalAlloc32(GPTR, sizeof(HANDLETABLE32)*count);
|
||
|
ht->objectHandle[0] = hmf;
|
||
|
while (1) {
|
||
|
PlayEnhMetaFileRecord32(hdc, ht, p, count);
|
||
|
if (p->iType == EMR_EOF) break;
|
||
|
p = (void *) p + p->nSize; /* casted so that arithmetic is in bytes */
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
need wide version as well
|
||
|
*/
|
||
|
HDC32 CreateEnhMetaFile32A(
|
||
|
HDC32 hdcRef, /* optional reference DC */
|
||
|
LPCSTR lpFilename, /* optional filename for disk metafiles */
|
||
|
const RECT32 *lpRect, /* optional bounding rectangle */
|
||
|
LPCSTR lpDescription /* optional description */
|
||
|
)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
HENHMETAFILE32 CloseEnhMetaFile32(
|
||
|
HDC32 hdc /* metafile DC */
|
||
|
)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* DeleteEnhMetaFile32 (GDI32.68)
|
||
|
*/
|
||
|
BOOL32 DeleteEnhMetaFile32(HENHMETAFILE32 hmf) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************
|
||
|
* CopyEnhMetaFileA (GDI32.21)
|
||
|
*/
|
||
|
|