2 * PROJECT: ReactOS Win32k Subsystem
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: win32ss/gdi/ntgdi/metafile.c
5 * PURPOSE: Metafile Implementations, Metafile Clipboard Data Xfers
9 /* INCLUDES ******************************************************************/
16 // Need to move this to NtGdiTyp.h
17 #define GDITAG_TYPE_EMF 'XEFM' // EnhMetaFile
18 #define GDITAG_TYPE_MFP '_PFM' // MetaFile Picture
21 typedef struct _METATYPEOBJ
23 BASEOBJECT BaseObject
;
30 } METATYPEOBJ
, *PMETATYPEOBJ
;
34 // Plug Me in Somewhere? Clipboard cleanup?
38 METATYPEOBJ__vCleanup(PVOID ObjectBody
)
40 PMETATYPEOBJ pmto
= (PMETATYPEOBJ
)ObjectBody
;
41 GDIOBJ_hInsertObject(&pmto
->BaseObject
, GDI_OBJ_HMGR_POWNED
);
42 GDIOBJ_vDeleteObject(&pmto
->BaseObject
);
45 /* System Service Calls ******************************************************/
52 NtGdiCreateMetafileDC(IN HDC hdc
)
55 /* Call the internal function to create an alternative info DC */
56 return GreCreateCompatibleDC(hdc
, TRUE
);
57 // No HDC call NtUser.
58 //return UserGetDesktopDC(DCTYPE_INFO, TRUE, FALSE);
66 NtGdiCreateServerMetaFile(
78 if ( ( iType
== GDITAG_TYPE_EMF
|| iType
== GDITAG_TYPE_MFP
) &&
82 pmto
= (PMETATYPEOBJ
)GDIOBJ_AllocObjWithHandle(GDIObjType_META_TYPE
, sizeof(METATYPEOBJ
) + cjData
);
89 pmto
->cjData
= cjData
;
93 ProbeForRead( pjData
, cjData
, 1 );
94 RtlCopyMemory( pmto
->pjData
, pjData
, cjData
) ;
96 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
104 GDIOBJ_vSetObjectOwner(&pmto
->BaseObject
, GDI_OBJ_HMGR_PUBLIC
);
105 GDIOBJ_vDereferenceObject ((POBJ
)pmto
);
106 return pmto
->BaseObject
.hHmgr
;
110 GDIOBJ_vDeleteObject(&pmto
->BaseObject
);
122 NtGdiGetServerMetaFileBits(
125 OUT OPTIONAL PBYTE pjData
,
135 pmto
= (PMETATYPEOBJ
) GDIOBJ_ShareLockObj ((HGDIOBJ
) hmo
, GDIObjType_META_TYPE
);
140 if ( pmto
->iType
== GDITAG_TYPE_EMF
|| pmto
->iType
== GDITAG_TYPE_MFP
)
142 cjRet
= pmto
->cjData
;
146 if (cjData
== pmto
->cjData
)
150 ProbeForWrite( piType
, sizeof(DWORD
), 1);
151 *piType
= pmto
->iType
;
153 ProbeForWrite( pmm
, sizeof(DWORD
), 1);
156 ProbeForWrite( pxExt
, sizeof(DWORD
), 1);
159 ProbeForWrite( pyExt
, sizeof(DWORD
), 1);
162 ProbeForWrite( pjData
, cjData
, 1 );
163 RtlCopyMemory( pjData
, pmto
->pjData
, cjData
) ;
165 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
178 GDIOBJ_vDereferenceObject ((POBJ
)pmto
);
187 NtGdiConvertMetafileRect(IN HDC hDC
,