[Win32SS] Support Clipboard Metafile

Major fix ups and plugging in missing code changes. Handle code is from
another project currently being developed for ReactOS.
See CORE-12143
This commit is contained in:
jimtabor 2019-05-31 21:44:17 -05:00
parent 07fa6fc38c
commit da264743e1
7 changed files with 173 additions and 77 deletions

View file

@ -115,7 +115,9 @@ ASSERT_LOCK_ORDER(
(objt) == GDIObjType_BRUSH_TYPE)
#define ASSERT_EXCLUSIVE_OBJECT_TYPE(objt) \
ASSERT((objt) == GDIObjType_DC_TYPE || \
(objt) == GDIObjType_RGN_TYPE)
(objt) == GDIObjType_RGN_TYPE || \
(objt) == GDIObjType_UMPD_TYPE || \
(objt) == GDIObjType_META_TYPE)
#define ASSERT_TRYLOCK_OBJECT_TYPE(objt) \
ASSERT((objt) == GDIObjType_DRVOBJ_TYPE)
#else
@ -177,7 +179,7 @@ apfnCleanup[] =
NULL, /* 12 GDIObjType_UNUSED4_TYPE */
NULL, /* 13 GDIObjType_SPACE_TYPE, unused */
NULL, /* 14 GDIObjType_UNUSED5_TYPE */
NULL, /* 15 GDIObjType_META_TYPE, unused */
GDIOBJ_vCleanup, /* 15 GDIObjType_META_TYPE */
NULL, /* 16 GDIObjType_EFSTATE_TYPE, unused */
NULL, /* 17 GDIObjType_BMFD_TYPE, unused */
NULL, /* 18 GDIObjType_VTFD_TYPE, unused */

View file

@ -13,11 +13,8 @@
#define NDEBUG
#include <debug.h>
// Need to move this to NtGdiTyp.h
#define GDITAG_TYPE_EMF 'XEFM' // EnhMetaFile
#define GDITAG_TYPE_MFP '_PFM' // MetaFile Picture
// Internal Use
// Internal Use Only
typedef struct _METATYPEOBJ
{
BASEOBJECT BaseObject;
@ -30,18 +27,6 @@ typedef struct _METATYPEOBJ
} METATYPEOBJ, *PMETATYPEOBJ;
//
// Plug Me in Somewhere? Clipboard cleanup?
//
VOID
FASTCALL
METATYPEOBJ__vCleanup(PVOID ObjectBody)
{
PMETATYPEOBJ pmto = (PMETATYPEOBJ)ObjectBody;
GDIOBJ_hInsertObject(&pmto->BaseObject, GDI_OBJ_HMGR_POWNED);
GDIOBJ_vDeleteObject(&pmto->BaseObject);
}
/* System Service Calls ******************************************************/
/*
@ -79,7 +64,7 @@ NtGdiCreateServerMetaFile(
cjData &&
pjData )
{
pmto = (PMETATYPEOBJ)GDIOBJ_AllocObjWithHandle(GDIObjType_META_TYPE, sizeof(METATYPEOBJ) + cjData);
pmto = (PMETATYPEOBJ)GDIOBJ_AllocObjWithHandle(GDILoObjType_LO_META_TYPE, sizeof(METATYPEOBJ) + cjData);
if ( pmto )
{
pmto->iType = iType;
@ -90,8 +75,8 @@ NtGdiCreateServerMetaFile(
_SEH2_TRY
{
ProbeForRead( pjData, cjData, 1 );
RtlCopyMemory( pmto->pjData, pjData, cjData) ;
ProbeForRead( pjData, cjData, 1 );
RtlCopyMemory( pmto->pjData, pjData, cjData) ;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
@ -102,7 +87,7 @@ NtGdiCreateServerMetaFile(
if (Pass)
{
GDIOBJ_vSetObjectOwner(&pmto->BaseObject, GDI_OBJ_HMGR_PUBLIC);
GDIOBJ_vDereferenceObject ((POBJ)pmto);
GDIOBJ_vUnlockObject(&pmto->BaseObject);
return pmto->BaseObject.hHmgr;
}
else
@ -132,7 +117,7 @@ NtGdiGetServerMetaFileBits(
ULONG cjRet = 0;
PMETATYPEOBJ pmto;
pmto = (PMETATYPEOBJ) GDIOBJ_ShareLockObj ((HGDIOBJ) hmo, GDIObjType_META_TYPE);
pmto = (PMETATYPEOBJ) GDIOBJ_LockObject( hmo, GDIObjType_META_TYPE);
if (!pmto)
return 0;
@ -175,7 +160,7 @@ NtGdiGetServerMetaFileBits(
}
}
GDIOBJ_vDereferenceObject ((POBJ)pmto);
GDIOBJ_vUnlockObject(&pmto->BaseObject);
return cjRet;
}