diff --git a/reactos/dll/win32/gdi32/gdi32.rbuild b/reactos/dll/win32/gdi32/gdi32.rbuild
index ba4081065df..9cbb7255350 100644
--- a/reactos/dll/win32/gdi32/gdi32.rbuild
+++ b/reactos/dll/win32/gdi32/gdi32.rbuild
@@ -31,6 +31,7 @@
bitmap.c
brush.c
dc.c
+ enhmfile.c
font.c
linedda.c
metafile.c
diff --git a/reactos/dll/win32/gdi32/objects/enhmfile.c b/reactos/dll/win32/gdi32/objects/enhmfile.c
new file mode 100644
index 00000000000..faac004ec0f
--- /dev/null
+++ b/reactos/dll/win32/gdi32/objects/enhmfile.c
@@ -0,0 +1,352 @@
+#include "precomp.h"
+
+/*
+ * @unimplemented
+ */
+HENHMETAFILE
+STDCALL
+CloseEnhMetaFile(
+ HDC hdc)
+{
+ return NtGdiCloseEnhMetaFile(hdc);
+}
+
+
+#if 0 // Remove once new EnhMetaFile support is implemented.
+
+HDC WINAPI CreateEnhMetaFileW(
+ HDC hDC, /* [in] optional reference DC */
+ LPCWSTR filename, /* [in] optional filename for disk metafiles */
+ const RECT* rect, /* [in] optional bounding rectangle */
+ LPCWSTR description /* [in] optional description */
+ )
+{
+ HDC mDC;
+ PDC_ATTR Dc_Attr;
+ PLDC pLDC;
+ HANDLE hFile;
+ PENHMETAFILE EmfDC;
+ DWORD size = 0, length = 0;
+
+ mDC = NtGdiCreateMetafileDC( hDC ); // Basically changes the handle from 1xxxx to 46xxxx.
+ // If hDC == NULL, works just like createdc in win32k.
+
+ if ( !GdiGetHandleUserData((HGDIOBJ) mDC, (PVOID) &Dc_Attr))
+ {
+ SetLastError (ERROR_INVALID_PARAMETER);
+ return NULL; // need to delete the handle?
+ }
+
+ pLDC = LocalAlloc(LMEM_ZEROINIT, sizeof(LDC));
+
+ Dc_Attr->pvLDC = pLDC;
+ pLDC->hDC = mDC;
+ pLDC->iType = LDC_EMFDC
+
+
+ if (description)
+ { /* App name\0Title\0\0 */
+ length = lstrlenW(description);
+ length += lstrlenW(description + length + 1);
+ length += 3;
+ length *= 2;
+ }
+
+ size = sizeof(ENHMETAFILE) + (length + 3) / 4 * 4;
+
+ //Allocate ENHMETAFILE structure
+ EmfDC = LocalAlloc(LMEM_ZEROINIT, sizeof(ENHMETAFILE));
+ pLDC->pvEmfDC = EmfDC;
+
+ EmfDC->handles_size = HANDLE_LIST_INC;
+ EmfDC->cur_handles = 1;
+
+ EmfDC->horzres = GetDeviceCaps(mDC, HORZRES);
+ EmfDC->vertres = GetDeviceCaps(mDC, VERTRES);
+ EmfDC->logpixelsx = GetDeviceCaps(mDC, LOGPIXELSX);
+ EmfDC->logpixelsy = GetDeviceCaps(mDC, LOGPIXELSY);
+ EmfDC->horzsize = GetDeviceCaps(mDC, HORZSIZE);
+ EmfDC->vertsize = GetDeviceCaps(mDC, VERTSIZE);
+ EmfDC->bitspixel = GetDeviceCaps(mDC, BITSPIXEL);
+ EmfDC->textcaps = GetDeviceCaps(mDC, TEXTCAPS);
+ EmfDC->rastercaps = GetDeviceCaps(mDC, RASTERCAPS);
+ EmfDC->technology = GetDeviceCaps(mDC, TECHNOLOGY);
+ EmfDC->planes = GetDeviceCaps(mDC, PLANES);
+
+ EmfDC->emf = LocalAlloc(LMEM_ZEROINIT, size);
+
+ EmfDC->emf->iType = EMR_HEADER;
+ EmfDC->emf->nSize = size;
+
+ EmfDC->emf->rclBounds.left = EmfDC->emf->rclBounds.top = 0;
+ EmfDC->emf->rclBounds.right = EmfDC->emf->rclBounds.bottom = -1;
+
+ if(rect)
+ {
+ EmfDC->emf->rclFrame.left = rect->left;
+ EmfDC->emf->rclFrame.top = rect->top;
+ EmfDC->emf->rclFrame.right = rect->right;
+ EmfDC->emf->rclFrame.bottom = rect->bottom;
+ }
+ else
+ { /* Set this to {0,0 - -1,-1} and update it at the end */
+ EmfDC->emf->rclFrame.left = EmfDC->emf->rclFrame.top = 0;
+ EmfDC->emf->rclFrame.right = EmfDC->emf->rclFrame.bottom = -1;
+ }
+
+ EmfDC->emf->dSignature = ENHMETA_SIGNATURE;
+ EmfDC->emf->nVersion = 0x10000;
+ EmfDC->emf->nBytes = pLDC->pvEmfDC->nSize;
+ EmfDC->emf->nRecords = 1;
+ EmfDC->emf->nHandles = 1;
+
+ EmfDC->emf->sReserved = 0; /* According to docs, this is reserved and must be 0 */
+ EmfDC->emf->nDescription = length / 2;
+
+ EmfDC->emf->offDescription = length ? sizeof(ENHMETAHEADER) : 0;
+
+ EmfDC->emf->nPalEntries = 0; /* I guess this should start at 0 */
+
+ /* Size in pixels */
+ EmfDC->emf->szlDevice.cx = EmfDC->horzres;
+ EmfDC->emf->szlDevice.cy = EmfDC->vertres;
+
+ /* Size in millimeters */
+ EmfDC->emf->szlMillimeters.cx = EmfDC->horzsize;
+ EmfDC->emf->szlMillimeters.cy = EmfDC->vertsize;
+
+ /* Size in micrometers */
+ EmfDC->emf->szlMicrometers.cx = EmfDC->horzsize * 1000;
+ EmfDC->emf->szlMicrometers.cy = EmfDC->vertsize * 1000;
+
+ RtlCopyMemory((char *)EmfDC->emf + sizeof(ENHMETAHEADER), description, length);
+
+ if (filename) /* disk based metafile */
+ {
+ if ((hFile = CreateFileW(filename, GENERIC_WRITE | GENERIC_READ, 0,
+ NULL, CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE)
+ {
+ EMFDRV_DeleteDC( EmfDC );
+ return NULL;
+ }
+ if (!WriteFile( hFile, (LPSTR)EmfDC->emf, size, NULL, NULL ))
+ {
+ EMFDRV_DeleteDC( EmfDC );
+ return NULL;
+ }
+ EmfDC.hFile = hFile;
+ EmfDC.iType = METAFILE_DISK;
+ }
+ else
+ EmfDC.iType = METAFILE_MEMORY;
+
+ return mDC;
+}
+#endif
+
+/*
+ * @implemented
+ */
+HENHMETAFILE
+STDCALL
+CopyEnhMetaFileW(
+ HENHMETAFILE hemfSrc,
+ LPCWSTR lpszFile
+ )
+{
+ return NtGdiCopyEnhMetaFile ( hemfSrc, lpszFile );
+}
+
+
+/*
+ * @implemented
+ */
+HENHMETAFILE
+STDCALL
+CopyEnhMetaFileA(
+ HENHMETAFILE hemfSrc,
+ LPCSTR lpszFile
+ )
+{
+ NTSTATUS Status;
+ LPWSTR lpszFileW;
+ HENHMETAFILE rc = 0;
+
+ Status = HEAP_strdupA2W ( &lpszFileW, lpszFile );
+ if (!NT_SUCCESS (Status))
+ SetLastError (RtlNtStatusToDosError(Status));
+ else
+ {
+ rc = NtGdiCopyEnhMetaFile ( hemfSrc, lpszFileW );
+
+ HEAP_free ( lpszFileW );
+ }
+ return rc;
+}
+
+
+/*
+ * @implemented
+ */
+HDC
+STDCALL
+CreateEnhMetaFileW(
+ HDC hdcRef,
+ LPCWSTR lpFileName,
+ CONST RECT *lpRect,
+ LPCWSTR lpDescription
+ )
+{
+ return NtGdiCreateEnhMetaFile ( hdcRef, lpFileName, (CONST LPRECT)lpRect, lpDescription );
+}
+
+
+/*
+ * @implemented
+ */
+HDC
+STDCALL
+CreateEnhMetaFileA(
+ HDC hdcRef,
+ LPCSTR lpFileName,
+ CONST RECT *lpRect,
+ LPCSTR lpDescription
+ )
+{
+ NTSTATUS Status;
+ LPWSTR lpFileNameW, lpDescriptionW;
+ HDC rc = 0;
+
+ lpFileNameW = NULL;
+ if (lpFileName != NULL)
+ {
+ Status = HEAP_strdupA2W ( &lpFileNameW, lpFileName );
+ if (!NT_SUCCESS (Status))
+ SetLastError (RtlNtStatusToDosError(Status));
+
+ return rc;
+ }
+
+ lpDescriptionW = NULL;
+ if (lpDescription != NULL)
+ {
+ Status = HEAP_strdupA2W ( &lpDescriptionW, lpDescription );
+ if (!NT_SUCCESS (Status))
+ SetLastError (RtlNtStatusToDosError(Status));
+
+ return rc;
+ }
+
+ rc = NtGdiCreateEnhMetaFile (hdcRef, lpFileNameW, (CONST LPRECT)lpRect, lpDescriptionW );
+
+ if (lpDescriptionW != NULL)
+ HEAP_free ( lpDescriptionW );
+
+ if (lpFileNameW != NULL)
+ HEAP_free ( lpFileNameW );
+
+ return rc;
+}
+
+/*
+ * @implemented
+ */
+HENHMETAFILE
+STDCALL
+GetEnhMetaFileW(
+ LPCWSTR lpszMetaFile
+ )
+{
+ return NtGdiGetEnhMetaFile ( lpszMetaFile );
+}
+
+
+/*
+ * @implemented
+ */
+HENHMETAFILE
+STDCALL
+GetEnhMetaFileA(
+ LPCSTR lpszMetaFile
+ )
+{
+ NTSTATUS Status;
+ LPWSTR lpszMetaFileW;
+ HENHMETAFILE rc = 0;
+
+ Status = HEAP_strdupA2W ( &lpszMetaFileW, lpszMetaFile );
+ if (!NT_SUCCESS (Status))
+ SetLastError (RtlNtStatusToDosError(Status));
+ else
+ {
+ rc = NtGdiGetEnhMetaFile ( lpszMetaFileW );
+
+ HEAP_free ( lpszMetaFileW );
+ }
+
+ return rc;
+}
+
+
+/*
+ * @implemented
+ */
+UINT
+STDCALL
+GetEnhMetaFileDescriptionW(
+ HENHMETAFILE hemf,
+ UINT cchBuffer,
+ LPWSTR lpszDescription
+ )
+{
+ return NtGdiGetEnhMetaFileDescription ( hemf, cchBuffer, lpszDescription );
+}
+
+
+/*
+ * @implemented
+ */
+UINT
+STDCALL
+GetEnhMetaFileDescriptionA(
+ HENHMETAFILE hemf,
+ UINT cchBuffer,
+ LPSTR lpszDescription
+ )
+{
+ NTSTATUS Status;
+ LPWSTR lpszDescriptionW;
+ UINT rc;
+
+ if ( lpszDescription && cchBuffer )
+ {
+ lpszDescriptionW = (LPWSTR)HEAP_alloc ( cchBuffer*sizeof(WCHAR) );
+ if ( !lpszDescriptionW )
+ {
+ SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY));
+ return 0;
+ }
+ }
+ else
+ lpszDescriptionW = NULL;
+
+ rc = NtGdiGetEnhMetaFileDescription ( hemf, cchBuffer, lpszDescriptionW );
+
+ if ( lpszDescription && cchBuffer )
+ {
+ Status = RtlUnicodeToMultiByteN ( lpszDescription,
+ cchBuffer,
+ NULL,
+ lpszDescriptionW,
+ cchBuffer );
+ HEAP_free ( lpszDescriptionW );
+ if ( !NT_SUCCESS(Status) )
+ {
+ SetLastError (RtlNtStatusToDosError(Status));
+ return 0;
+ }
+ }
+
+ return rc;
+}
+
diff --git a/reactos/dll/win32/gdi32/objects/metafile.c b/reactos/dll/win32/gdi32/objects/metafile.c
index 356f633ad83..0495fbdc1df 100644
--- a/reactos/dll/win32/gdi32/objects/metafile.c
+++ b/reactos/dll/win32/gdi32/objects/metafile.c
@@ -1,15 +1,5 @@
#include "precomp.h"
-/*
- * @unimplemented
- */
-HENHMETAFILE
-STDCALL
-CloseEnhMetaFile(
- HDC hdc)
-{
- return NtGdiCloseEnhMetaFile(hdc);
-}
/*
* @implemented
@@ -21,7 +11,7 @@ CopyMetaFileW(
LPCWSTR lpszFile
)
{
- return NtGdiCopyMetaFile (hmfSrc, lpszFile);
+ return NULL;
}
@@ -44,8 +34,8 @@ CopyMetaFileA(
SetLastError (RtlNtStatusToDosError(Status));
else
{
- rc = NtGdiCopyMetaFile ( hmfSrc, lpszFileW );
+ rc = NULL;
HEAP_free ( lpszFileW );
}
@@ -62,7 +52,7 @@ CreateMetaFileW(
LPCWSTR lpszFile
)
{
- return NtGdiCreateMetaFile ( lpszFile );
+ return NULL;
}
@@ -84,7 +74,7 @@ CreateMetaFileA(
SetLastError (RtlNtStatusToDosError(Status));
else
{
- rc = NtGdiCreateMetaFile ( lpszFileW );
+ rc = NULL;
HEAP_free ( lpszFileW );
}
@@ -101,7 +91,7 @@ GetMetaFileW(
LPCWSTR lpszMetaFile
)
{
- return NtGdiGetMetaFile ( lpszMetaFile );
+ return NULL;
}
@@ -123,7 +113,7 @@ GetMetaFileA(
SetLastError (RtlNtStatusToDosError(Status));
else
{
- rc = NtGdiGetMetaFile ( lpszMetaFileW );
+ rc = NULL;
HEAP_free ( lpszMetaFileW );
}
@@ -131,341 +121,4 @@ GetMetaFileA(
return rc;
}
-#if 0
-
-HDC WINAPI CreateEnhMetaFileW(
- HDC hDC, /* [in] optional reference DC */
- LPCWSTR filename, /* [in] optional filename for disk metafiles */
- const RECT* rect, /* [in] optional bounding rectangle */
- LPCWSTR description /* [in] optional description */
- )
-{
- HDC mDC;
- PDC_ATTR Dc_Attr;
- PLDC pLDC;
- HANDLE hFile;
- PENHMETAFILE EmfDC;
- DWORD size = 0, length = 0;
-
- mDC = NtGdiCreateMetafileDC( hDC ); // Basically changes the handle from 1xxxx to 46xxxx.
- // If hDC == NULL, works just like createdc in win32k.
-
- if ( !GdiGetHandleUserData((HGDIOBJ) mDC, (PVOID) &Dc_Attr))
- {
- SetLastError (ERROR_INVALID_PARAMETER);
- return NULL; // need to delete the handle?
- }
-
- pLDC = LocalAlloc(LMEM_ZEROINIT, sizeof(LDC));
-
- Dc_Attr->pvLDC = pLDC;
- pLDC->hDC = mDC;
- pLDC->iType = LDC_EMFDC
-
-
- if (description)
- { /* App name\0Title\0\0 */
- length = lstrlenW(description);
- length += lstrlenW(description + length + 1);
- length += 3;
- length *= 2;
- }
-
- size = sizeof(ENHMETAFILE) + (length + 3) / 4 * 4;
-
- //Allocate ENHMETAFILE structure
- EmfDC = LocalAlloc(LMEM_ZEROINIT, sizeof(ENHMETAFILE));
- pLDC->pvEmfDC = EmfDC;
-
- EmfDC->handles_size = HANDLE_LIST_INC;
- EmfDC->cur_handles = 1;
-
- EmfDC->horzres = GetDeviceCaps(mDC, HORZRES);
- EmfDC->vertres = GetDeviceCaps(mDC, VERTRES);
- EmfDC->logpixelsx = GetDeviceCaps(mDC, LOGPIXELSX);
- EmfDC->logpixelsy = GetDeviceCaps(mDC, LOGPIXELSY);
- EmfDC->horzsize = GetDeviceCaps(mDC, HORZSIZE);
- EmfDC->vertsize = GetDeviceCaps(mDC, VERTSIZE);
- EmfDC->bitspixel = GetDeviceCaps(mDC, BITSPIXEL);
- EmfDC->textcaps = GetDeviceCaps(mDC, TEXTCAPS);
- EmfDC->rastercaps = GetDeviceCaps(mDC, RASTERCAPS);
- EmfDC->technology = GetDeviceCaps(mDC, TECHNOLOGY);
- EmfDC->planes = GetDeviceCaps(mDC, PLANES);
-
- EmfDC->emf = LocalAlloc(LMEM_ZEROINIT, size);
-
- EmfDC->emf->iType = EMR_HEADER;
- EmfDC->emf->nSize = size;
-
- EmfDC->emf->rclBounds.left = EmfDC->emf->rclBounds.top = 0;
- EmfDC->emf->rclBounds.right = EmfDC->emf->rclBounds.bottom = -1;
-
- if(rect)
- {
- EmfDC->emf->rclFrame.left = rect->left;
- EmfDC->emf->rclFrame.top = rect->top;
- EmfDC->emf->rclFrame.right = rect->right;
- EmfDC->emf->rclFrame.bottom = rect->bottom;
- }
- else
- { /* Set this to {0,0 - -1,-1} and update it at the end */
- EmfDC->emf->rclFrame.left = EmfDC->emf->rclFrame.top = 0;
- EmfDC->emf->rclFrame.right = EmfDC->emf->rclFrame.bottom = -1;
- }
-
- EmfDC->emf->dSignature = ENHMETA_SIGNATURE;
- EmfDC->emf->nVersion = 0x10000;
- EmfDC->emf->nBytes = pLDC->pvEmfDC->nSize;
- EmfDC->emf->nRecords = 1;
- EmfDC->emf->nHandles = 1;
-
- EmfDC->emf->sReserved = 0; /* According to docs, this is reserved and must be 0 */
- EmfDC->emf->nDescription = length / 2;
-
- EmfDC->emf->offDescription = length ? sizeof(ENHMETAHEADER) : 0;
-
- EmfDC->emf->nPalEntries = 0; /* I guess this should start at 0 */
-
- /* Size in pixels */
- EmfDC->emf->szlDevice.cx = EmfDC->horzres;
- EmfDC->emf->szlDevice.cy = EmfDC->vertres;
-
- /* Size in millimeters */
- EmfDC->emf->szlMillimeters.cx = EmfDC->horzsize;
- EmfDC->emf->szlMillimeters.cy = EmfDC->vertsize;
-
- /* Size in micrometers */
- EmfDC->emf->szlMicrometers.cx = EmfDC->horzsize * 1000;
- EmfDC->emf->szlMicrometers.cy = EmfDC->vertsize * 1000;
-
- RtlCopyMemory((char *)EmfDC->emf + sizeof(ENHMETAHEADER), description, length);
-
- if (filename) /* disk based metafile */
- {
- if ((hFile = CreateFileW(filename, GENERIC_WRITE | GENERIC_READ, 0,
- NULL, CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE)
- {
- EMFDRV_DeleteDC( EmfDC );
- return NULL;
- }
- if (!WriteFile( hFile, (LPSTR)EmfDC->emf, size, NULL, NULL ))
- {
- EMFDRV_DeleteDC( EmfDC );
- return NULL;
- }
- EmfDC.hFile = hFile;
- EmfDC.iType = METAFILE_DISK;
- }
- else
- EmfDC.iType = METAFILE_MEMORY;
-
- return mDC;
-}
-#endif
-
-/*
- * @implemented
- */
-HENHMETAFILE
-STDCALL
-CopyEnhMetaFileW(
- HENHMETAFILE hemfSrc,
- LPCWSTR lpszFile
- )
-{
- return NtGdiCopyEnhMetaFile ( hemfSrc, lpszFile );
-}
-
-
-/*
- * @implemented
- */
-HENHMETAFILE
-STDCALL
-CopyEnhMetaFileA(
- HENHMETAFILE hemfSrc,
- LPCSTR lpszFile
- )
-{
- NTSTATUS Status;
- LPWSTR lpszFileW;
- HENHMETAFILE rc = 0;
-
- Status = HEAP_strdupA2W ( &lpszFileW, lpszFile );
- if (!NT_SUCCESS (Status))
- SetLastError (RtlNtStatusToDosError(Status));
- else
- {
- rc = NtGdiCopyEnhMetaFile ( hemfSrc, lpszFileW );
-
- HEAP_free ( lpszFileW );
- }
- return rc;
-}
-
-
-/*
- * @implemented
- */
-HDC
-STDCALL
-CreateEnhMetaFileW(
- HDC hdcRef,
- LPCWSTR lpFileName,
- CONST RECT *lpRect,
- LPCWSTR lpDescription
- )
-{
- return NtGdiCreateEnhMetaFile ( hdcRef, lpFileName, (CONST LPRECT)lpRect, lpDescription );
-}
-
-
-/*
- * @implemented
- */
-HDC
-STDCALL
-CreateEnhMetaFileA(
- HDC hdcRef,
- LPCSTR lpFileName,
- CONST RECT *lpRect,
- LPCSTR lpDescription
- )
-{
- NTSTATUS Status;
- LPWSTR lpFileNameW, lpDescriptionW;
- HDC rc = 0;
-
- lpFileNameW = NULL;
- if (lpFileName != NULL)
- {
- Status = HEAP_strdupA2W ( &lpFileNameW, lpFileName );
- if (!NT_SUCCESS (Status))
- SetLastError (RtlNtStatusToDosError(Status));
-
- return rc;
- }
-
- lpDescriptionW = NULL;
- if (lpDescription != NULL)
- {
- Status = HEAP_strdupA2W ( &lpDescriptionW, lpDescription );
- if (!NT_SUCCESS (Status))
- SetLastError (RtlNtStatusToDosError(Status));
-
- return rc;
- }
-
- rc = NtGdiCreateEnhMetaFile (hdcRef, lpFileNameW, (CONST LPRECT)lpRect, lpDescriptionW );
-
- if (lpDescriptionW != NULL)
- HEAP_free ( lpDescriptionW );
-
- if (lpFileNameW != NULL)
- HEAP_free ( lpFileNameW );
-
- return rc;
-}
-
-/*
- * @implemented
- */
-HENHMETAFILE
-STDCALL
-GetEnhMetaFileW(
- LPCWSTR lpszMetaFile
- )
-{
- return NtGdiGetEnhMetaFile ( lpszMetaFile );
-}
-
-
-/*
- * @implemented
- */
-HENHMETAFILE
-STDCALL
-GetEnhMetaFileA(
- LPCSTR lpszMetaFile
- )
-{
- NTSTATUS Status;
- LPWSTR lpszMetaFileW;
- HENHMETAFILE rc = 0;
-
- Status = HEAP_strdupA2W ( &lpszMetaFileW, lpszMetaFile );
- if (!NT_SUCCESS (Status))
- SetLastError (RtlNtStatusToDosError(Status));
- else
- {
- rc = NtGdiGetEnhMetaFile ( lpszMetaFileW );
-
- HEAP_free ( lpszMetaFileW );
- }
-
- return rc;
-}
-
-
-/*
- * @implemented
- */
-UINT
-STDCALL
-GetEnhMetaFileDescriptionW(
- HENHMETAFILE hemf,
- UINT cchBuffer,
- LPWSTR lpszDescription
- )
-{
- return NtGdiGetEnhMetaFileDescription ( hemf, cchBuffer, lpszDescription );
-}
-
-
-/*
- * @implemented
- */
-UINT
-STDCALL
-GetEnhMetaFileDescriptionA(
- HENHMETAFILE hemf,
- UINT cchBuffer,
- LPSTR lpszDescription
- )
-{
- NTSTATUS Status;
- LPWSTR lpszDescriptionW;
- UINT rc;
-
- if ( lpszDescription && cchBuffer )
- {
- lpszDescriptionW = (LPWSTR)HEAP_alloc ( cchBuffer*sizeof(WCHAR) );
- if ( !lpszDescriptionW )
- {
- SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY));
- return 0;
- }
- }
- else
- lpszDescriptionW = NULL;
-
- rc = NtGdiGetEnhMetaFileDescription ( hemf, cchBuffer, lpszDescriptionW );
-
- if ( lpszDescription && cchBuffer )
- {
- Status = RtlUnicodeToMultiByteN ( lpszDescription,
- cchBuffer,
- NULL,
- lpszDescriptionW,
- cchBuffer );
- HEAP_free ( lpszDescriptionW );
- if ( !NT_SUCCESS(Status) )
- {
- SetLastError (RtlNtStatusToDosError(Status));
- return 0;
- }
- }
-
- return rc;
-}