[GDI32] Support Clipboard Metafile

Metafile patch from Katayama Hirofumi MZ. See CORE-12143.
This commit is contained in:
jimtabor 2019-05-30 16:33:23 -05:00
parent 2d3b72a070
commit e229b3eea7

View file

@ -1,3 +1,10 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: win32ss/gdi/gdi32/objects/metafile.c
* PURPOSE: metafile and enhanced metafile support
* PROGRAMMERS: Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include <precomp.h> #include <precomp.h>
#include <debug.h> #include <debug.h>
@ -86,26 +93,137 @@ GdiIsMetaPrintDC(HDC hDC)
#endif #endif
} }
// NOTE: I wanna use GdiCreateLocalMetaFilePict and GdiConvertMetaFilePict
// functions for clipboard data conversion. --- katahiromz
/* /*
* @unimplemented * @implemented
*/ */
METAFILEPICT * HGLOBAL
WINAPI WINAPI
GdiCreateLocalMetaFilePict(HENHMETAFILE hmo) GdiCreateLocalMetaFilePict(HENHMETAFILE hEMF)
{ {
UNIMPLEMENTED; HGLOBAL hMetaFilePict;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); METAFILEPICT * pInfo;
return 0; HMETAFILE hMF = NULL;
BYTE * Buffer = NULL;
HDC hDC = NULL;
UINT nSize;
// NOTE: On Win32, there is no difference between the local heap and
// the global heap. GlobalAlloc and LocalAlloc have same effect.
// allocate for METAFILEPICT
hMetaFilePict = GlobalAlloc(GHND | GMEM_SHARE, sizeof(METAFILEPICT));
pInfo = (METAFILEPICT *)GlobalLock(hMetaFilePict);
if (pInfo == NULL)
goto Exit;
// create DC
hDC = CreateCompatibleDC(NULL);
if (hDC == NULL)
goto Exit;
// get size of dest buffer
nSize = GetWinMetaFileBits(hEMF, 0, NULL, MM_ANISOTROPIC, hDC);
if (nSize == 0)
goto Exit;
// allocate buffer
Buffer = (BYTE *)LocalAlloc(LPTR, nSize);
if (Buffer == NULL)
goto Exit;
// store to buffer
nSize = GetWinMetaFileBits(hEMF, nSize, Buffer, MM_ANISOTROPIC, hDC);
if (nSize == 0)
goto Exit;
// create metafile from buffer
hMF = SetMetaFileBitsEx(nSize, Buffer);
if (hMF == NULL)
goto Exit;
// no suggested size is supplied
pInfo->mm = MM_ANISOTROPIC;
pInfo->xExt = 0;
pInfo->yExt = 0;
// set metafile handle
pInfo->hMF = hMF;
Exit:
// clean up
if (Buffer)
LocalFree(Buffer);
if (hDC)
DeleteDC(hDC);
if (pInfo)
GlobalUnlock(hMetaFilePict);
if (hMF == NULL)
{
// failure
GlobalFree(hMetaFilePict);
hMetaFilePict = NULL;
}
return hMetaFilePict; // success if non-NULL
} }
/* /*
* @unimplemented * @implemented
*/ */
HANDLE HENHMETAFILE
WINAPI WINAPI
GdiConvertMetaFilePict(HGLOBAL hMem) GdiConvertMetaFilePict(HGLOBAL hMetaFilePict)
{ {
UNIMPLEMENTED; HMETAFILE hMF;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); UINT nSize;
return 0; HENHMETAFILE hEMF = NULL;
BYTE * Buffer = NULL;
HDC hDC = NULL;
METAFILEPICT * pInfo = NULL;
// get METAFILEPICT pointer
pInfo = (METAFILEPICT *)GlobalLock(hMetaFilePict);
if (pInfo == NULL)
goto Exit;
// get metafile handle
hMF = pInfo->hMF;
// Missing test for GDILoObjType_LO_METADC16_TYPE (hMF)
// get size of buffer
nSize = GetMetaFileBitsEx(hMF, 0, NULL);
if (nSize == 0)
goto Exit;
// allocate buffer
Buffer = (BYTE *)LocalAlloc(LPTR, nSize);
if (Buffer == NULL)
goto Exit;
// store to buffer
nSize = GetMetaFileBitsEx(hMF, nSize, Buffer);
if (nSize == 0)
goto Exit;
// create DC
hDC = CreateCompatibleDC(NULL);
if (hDC == NULL)
goto Exit;
// create enhanced metafile from buffer
hEMF = SetWinMetaFileBits(nSize, Buffer, hDC, pInfo);
Exit:
// clean up
if (pInfo)
GlobalUnlock(hMetaFilePict);
if (hDC)
DeleteDC(hDC);
if (Buffer)
LocalFree(Buffer);
return hEMF; // success if non-NULL
} }