blob: 34c170070cf819d1e4db3ce676f953f448396833 [file] [log] [blame]
/*
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)
*/