1 /* 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 6 * PROGRAMMERS: ... 7 */ 8 9 /* INCLUDES ******************************************************************/ 10 11 #include <win32k.h> 12 13 #define NDEBUG 14 #include <debug.h> 15 16 17 // Internal Use Only 18 typedef struct _METATYPEOBJ 19 { 20 BASEOBJECT BaseObject; 21 DWORD iType; 22 DWORD mm; 23 DWORD xExt; 24 DWORD yExt; 25 ULONG cjData; 26 PBYTE pjData[4]; 27 } METATYPEOBJ, *PMETATYPEOBJ; 28 29 30 /* System Service Calls ******************************************************/ 31 32 /* 33 * @implemented 34 */ 35 HDC 36 APIENTRY 37 NtGdiCreateMetafileDC(IN HDC hdc) 38 { 39 //if (hdc) 40 /* Call the internal function to create an alternative info DC */ 41 return GreCreateCompatibleDC(hdc, TRUE); 42 // No HDC call NtUser. 43 //return UserGetDesktopDC(DCTYPE_INFO, TRUE, FALSE); 44 } 45 46 /* 47 * @implemented 48 */ 49 HANDLE 50 APIENTRY 51 NtGdiCreateServerMetaFile( 52 IN DWORD iType, 53 IN ULONG cjData, 54 IN PBYTE pjData, 55 IN DWORD mm, 56 IN DWORD xExt, 57 IN DWORD yExt 58 ) 59 { 60 BOOL Pass = TRUE; 61 PMETATYPEOBJ pmto; 62 63 if ( ( iType == GDITAG_TYPE_EMF || iType == GDITAG_TYPE_MFP ) && 64 cjData && 65 pjData ) 66 { 67 pmto = (PMETATYPEOBJ)GDIOBJ_AllocObjWithHandle(GDILoObjType_LO_META_TYPE, sizeof(METATYPEOBJ) + cjData); 68 if ( pmto ) 69 { 70 pmto->iType = iType; 71 pmto->mm = mm; 72 pmto->xExt = xExt; 73 pmto->yExt = yExt; 74 pmto->cjData = cjData; 75 76 _SEH2_TRY 77 { 78 ProbeForRead( pjData, cjData, 1 ); 79 RtlCopyMemory( pmto->pjData, pjData, cjData) ; 80 } 81 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 82 { 83 Pass = FALSE; 84 } 85 _SEH2_END; 86 87 if (Pass) 88 { 89 GDIOBJ_vSetObjectOwner(&pmto->BaseObject, GDI_OBJ_HMGR_PUBLIC); 90 GDIOBJ_vUnlockObject(&pmto->BaseObject); 91 return pmto->BaseObject.hHmgr; 92 } 93 else 94 { 95 GDIOBJ_vDeleteObject(&pmto->BaseObject); 96 } 97 } 98 } 99 return NULL; 100 } 101 102 /* 103 * @implemented 104 */ 105 ULONG 106 APIENTRY 107 NtGdiGetServerMetaFileBits( 108 IN HANDLE hmo, 109 IN ULONG cjData, 110 OUT OPTIONAL PBYTE pjData, 111 OUT PDWORD piType, 112 OUT PDWORD pmm, 113 OUT PDWORD pxExt, 114 OUT PDWORD pyExt 115 ) 116 { 117 ULONG cjRet = 0; 118 PMETATYPEOBJ pmto; 119 120 pmto = (PMETATYPEOBJ) GDIOBJ_LockObject( hmo, GDIObjType_META_TYPE); 121 122 if (!pmto) 123 return 0; 124 125 if ( pmto->iType == GDITAG_TYPE_EMF || pmto->iType == GDITAG_TYPE_MFP ) 126 { 127 cjRet = pmto->cjData; 128 129 if ( cjData ) 130 { 131 if (cjData == pmto->cjData) 132 { 133 _SEH2_TRY 134 { 135 ProbeForWrite( piType, sizeof(DWORD), 1); 136 *piType = pmto->iType; 137 138 ProbeForWrite( pmm, sizeof(DWORD), 1); 139 *pmm = pmto->mm; 140 141 ProbeForWrite( pxExt, sizeof(DWORD), 1); 142 *pxExt = pmto->xExt; 143 144 ProbeForWrite( pyExt, sizeof(DWORD), 1); 145 *pyExt = pmto->yExt; 146 147 ProbeForWrite( pjData, cjData, 1 ); 148 RtlCopyMemory( pjData, pmto->pjData, cjData) ; 149 } 150 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 151 { 152 cjRet = 0; 153 } 154 _SEH2_END; 155 } 156 else 157 { 158 cjRet = 0; 159 } 160 } 161 } 162 163 GDIOBJ_vUnlockObject(&pmto->BaseObject); 164 return cjRet; 165 } 166 167 /* 168 * @unimplemented 169 */ 170 LONG 171 APIENTRY 172 NtGdiConvertMetafileRect(IN HDC hDC, 173 IN OUT PRECTL pRect) 174 { 175 UNIMPLEMENTED; 176 return 0; 177 } 178 179 /* EOF */ 180