[Win32SS] Support Clipboard Metafile
[reactos.git] / win32ss / gdi / gdi32 / objects / enhmfile.c
index bf8a94a..a7d168d 100644 (file)
@@ -38,27 +38,89 @@ IsValidEnhMetaRecordOffExt(
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
-HENHMETAFILE
+HANDLE
 WINAPI
-GdiConvertEnhMetaFile(HENHMETAFILE hmf)
+GdiConvertEnhMetaFile(HENHMETAFILE hemf)
 {
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
+    HANDLE hmo = NULL;
+    BYTE * Buffer = NULL;
+    UINT nSize;
+
+    nSize = GetEnhMetaFileBits( hemf, 0, NULL );
+    if (nSize == 0)
+        goto Exit;
+
+    // allocate buffer
+    Buffer = (BYTE *)LocalAlloc(LPTR, nSize);
+    if (Buffer == NULL)
+        goto Exit;
+
+    nSize = GetEnhMetaFileBits( hemf, nSize, Buffer );
+    if (nSize == 0)
+        goto Exit;
+
+    hmo = NtGdiCreateServerMetaFile( GDITAG_TYPE_EMF, nSize, Buffer, 0, 0, 0 );
+
+Exit:
+    // clean up
+    if (Buffer)
+        LocalFree(Buffer);
+    return hmo;
 }
 
 /*
- * @unimplemented
+ * @implemented
  */
 HENHMETAFILE
 WINAPI
-GdiCreateLocalEnhMetaFile(HENHMETAFILE hmo)
+GdiCreateLocalEnhMetaFile(HANDLE hmo)
 {
-    UNIMPLEMENTED;
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return 0;
+    HENHMETAFILE hEMF;
+    BYTE *       Buffer = NULL;
+    UINT         nSize;
+    DWORD        iType, mm, xExt, yExt;
+
+    nSize = NtGdiGetServerMetaFileBits( hmo, 0, NULL, NULL, NULL, NULL, NULL);
+    if (nSize == 0)
+        goto Exit;
+
+    // allocate buffer
+    Buffer = (BYTE *)LocalAlloc(LPTR, nSize);
+    if (Buffer == NULL)
+        goto Exit;
+
+    // store to buffer
+    nSize = NtGdiGetServerMetaFileBits( hmo, nSize, Buffer, &iType, &mm, &xExt, &yExt);
+    if (nSize == 0)
+        goto Exit;
+
+    if ( iType == GDITAG_TYPE_MFP ) // handle conversion to EMF
+    {
+        METAFILEPICT Info;
+
+        Info.hMF  = NULL;
+        Info.mm   = mm;
+        Info.xExt = xExt;
+        Info.yExt = yExt;
+
+        hEMF = SetWinMetaFileBits( nSize, Buffer, NULL, &Info ); // Translate from old style to new style.
+        if (hEMF == NULL)
+            goto Exit;
+    }
+    else
+    {
+        hEMF = SetEnhMetaFileBits(nSize, Buffer);
+        if (hEMF == NULL)
+            goto Exit;
+    }
+
+Exit:
+    // clean up
+    if (Buffer)
+        LocalFree(Buffer);
+    return hEMF;
 }
 
 /*