Author: jimtabor
Date: Sat Nov 25 23:21:22 2006
New Revision: 24825
URL:
http://svn.reactos.org/svn/reactos?rev=24825&view=rev
Log:
Example coding for Enhance Meta File and Meta DC implementation.
- Add printing.c
- Add a new CreateEnhMetaFileW
Added:
trunk/reactos/dll/win32/gdi32/objects/painting.c (with props)
Modified:
trunk/reactos/dll/win32/gdi32/objects/metafile.c
Modified: trunk/reactos/dll/win32/gdi32/objects/metafile.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/me…
==============================================================================
--- trunk/reactos/dll/win32/gdi32/objects/metafile.c (original)
+++ trunk/reactos/dll/win32/gdi32/objects/metafile.c Sat Nov 25 23:21:22 2006
@@ -131,6 +131,137 @@
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->emf.iType = 2;
+ }
+ else
+ EmfDC->emf.iType = 1;
+
+ return mDC;
+}
+#endif
/*
* @implemented
Added: trunk/reactos/dll/win32/gdi32/objects/painting.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/gdi32/objects/pa…
==============================================================================
--- trunk/reactos/dll/win32/gdi32/objects/painting.c (added)
+++ trunk/reactos/dll/win32/gdi32/objects/painting.c Sat Nov 25 23:21:22 2006
@@ -1,0 +1,185 @@
+#include "precomp.h"
+
+
+/*
+ * @unimplemented
+ */
+BOOL
+STDCALL
+NewArc(
+ HDC hDC,
+ int a1,
+ int a2,
+ int a3,
+ int a4,
+ int a5,
+ int a6,
+ int a7,
+ int a8
+ )
+{
+// Handle something other than a normal dc object.
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+// Call Wine (rewrite of) MFDRV_MetaParam8
+ return MFDRV_MetaParam8( hDC, META_ARC, a1, a2, a3, a4, a5, a6, a7, a8)
+ else
+ {
+ PDC_ATTR Dc_Attr;
+ PLDC pLDC;
+ GdiGetHandleUserData((HGDIOBJ) hDC, (PVOID) &Dc_Attr);
+ pLDC = Dc_Attr->pvLDC;
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE)
+ return FALSE;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+// Call Wine (rewrite of) EMFDRV_ArcChordPie
+ BOOL Ret = EMFDRV_ArcChordPie( hDC, a1, a2, a3, a4, a5, a6, a7, a8, EMR_ARC);
+ return Ret;
+ }
+ return FALSE;
+ }
+ }
+ return NtGdiArcInternal(GdiTypeArc, hDC, a1, a2, a3, a4, a5, a6, a7, a8);
+}
+
+
+/*
+ * @unimplemented
+ */
+BOOL
+STDCALL
+NewArcTo(
+ HDC hDC,
+ int a1,
+ int a2,
+ int a3,
+ int a4,
+ int a5,
+ int a6,
+ int a7,
+ int a8
+ )
+{
+// Handle something other than a normal dc object.
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+ return FALSE; //No meta support for ArcTo
+ else
+ {
+ PDC_ATTR Dc_Attr;
+ PLDC pLDC;
+ GdiGetHandleUserData((HGDIOBJ) hDC, (PVOID) &Dc_Attr);
+ pLDC = Dc_Attr->pvLDC;
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE)
+ return FALSE;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ BOOL Ret = EMFDRV_ArcChordPie( hDC, a1, a2, a3, a4, a5, a6, a7, a8, EMR_ARCTO);
+ return Ret;
+ }
+ return FALSE;
+ }
+ }
+ return NtGdiArcInternal(GdiTypeArcTo, hDC, a1, a2, a3, a4, a5, a6, a7, a8);
+}
+
+
+/*
+ * @unimplemented
+ */
+BOOL
+STDCALL
+Chord(
+ HDC hDC,
+ int a1,
+ int a2,
+ int a3,
+ int a4,
+ int a5,
+ int a6,
+ int a7,
+ int a8
+ )
+{
+// Handle something other than a normal dc object.
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+ return MFDRV_MetaParam8( hDC, META_CHORD, a1, a2, a3, a4, a5, a6, a7, a8)
+ else
+ {
+ PDC_ATTR Dc_Attr;
+ PLDC pLDC;
+ GdiGetHandleUserData((HGDIOBJ) hDC, (PVOID) &Dc_Attr);
+ pLDC = Dc_Attr->pvLDC;
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE)
+ return FALSE;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ BOOL Ret = EMFDRV_ArcChordPie( hDC, a1, a2, a3, a4, a5, a6, a7, a8, EMR_CHORD);
+ return Ret;
+ }
+ return FALSE;
+ }
+ }
+ return NtGdiArcInternal(GdiTypeChord, hDC, a1, a2, a3, a4, a5, a6, a7, a8);
+}
+
+
+/*
+ * @unimplemented
+ */
+BOOL
+STDCALL
+NewPie(
+ HDC hDC,
+ int a1,
+ int a2,
+ int a3,
+ int a4,
+ int a5,
+ int a6,
+ int a7,
+ int a8
+ )
+{
+// Handle something other than a normal dc object.
+ if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)
+ {
+ if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_METADC)
+ return MFDRV_MetaParam8( hDC, META_PIE, a1, a2, a3, a4, a5, a6, a7, a8)
+ else
+ {
+ PDC_ATTR Dc_Attr;
+ PLDC pLDC;
+ GdiGetHandleUserData((HGDIOBJ) hDC, (PVOID) &Dc_Attr);
+ pLDC = Dc_Attr->pvLDC;
+ if ( !pLDC )
+ {
+ SetLastError(ERROR_INVALID_HANDLE)
+ return FALSE;
+ }
+ if (pLDC->iType == LDC_EMFLDC)
+ {
+ BOOL Ret = EMFDRV_ArcChordPie( hDC, a1, a2, a3, a4, a5, a6, a7, a8, EMR_PIE);
+ return Ret;
+ }
+ return FALSE;
+ }
+ }
+ return NtGdiArcInternal(GdiTypePie, hDC, a1, a2, a3, a4, a5, a6, a7, a8);
+}
+
+
Propchange: trunk/reactos/dll/win32/gdi32/objects/painting.c
------------------------------------------------------------------------------
svn:eol-style = native