Author: spouliot
Date: 2007-03-14 14:20:57 -0500 (Wed, 14 Mar 2007)
New Revision: 74294

Modified:
   trunk/libgdiplus/src/ChangeLog
   trunk/libgdiplus/src/metafile.c
Log:
metafile.c: Fix DPI (purfect ;-) and improve bounds calculations.

Modified: trunk/libgdiplus/src/ChangeLog
===================================================================
--- trunk/libgdiplus/src/ChangeLog      2007-03-14 19:19:13 UTC (rev 74293)
+++ trunk/libgdiplus/src/ChangeLog      2007-03-14 19:20:57 UTC (rev 74294)
@@ -1,8 +1,9 @@
-2007-03-14  Sebastien Pouliot  <[EMAIL PROTECTED]>
+2007-03-14  Sebastien Pouliot  <[EMAIL PROTECTED]> 
 
        * image.c: Return InvalidParameter when loading an unknown file format
        from a stream. System.Drawing will throw the "correct" exception from 
        this error code.
+       * metafile.c: Fix DPI (purfect ;-) and improve bounds calculations.
 
 2007-03-13  Sebastien Pouliot  <[EMAIL PROTECTED]>
 

Modified: trunk/libgdiplus/src/metafile.c
===================================================================
--- trunk/libgdiplus/src/metafile.c     2007-03-14 19:19:13 UTC (rev 74293)
+++ trunk/libgdiplus/src/metafile.c     2007-03-14 19:20:57 UTC (rev 74294)
@@ -1019,29 +1019,29 @@
                if (gdip_read_emf_data (pointer, (void*)(&header->EmfHeader) + 
sizeof (DWORD), size, useFile) != size)
                        return InvalidParameter;
 #if FALSE
-g_warning ("EMF HEADER iType %d, nSize %d, Bounds L %d, T %d, R %d, B %d, 
Frame L %d, T %d, R %d, B %d, signature %d, version %d,  bytes %d, records %d, 
handles %d, reserved %d, description %d, %d, palentries %d, device %d, %d, 
millimeters %d, %d", 
-       header->EmfHeader.iType, header->EmfHeader.nSize, 
-       header->EmfHeader.rclBounds.left, header->EmfHeader.rclBounds.top, 
header->EmfHeader.rclBounds.right, header->EmfHeader.rclBounds.bottom,
-       header->EmfHeader.rclFrame.left, header->EmfHeader.rclFrame.top, 
header->EmfHeader.rclFrame.right, header->EmfHeader.rclFrame.bottom,
-       header->EmfHeader.dSignature, header->EmfHeader.nVersion, 
header->EmfHeader.nBytes, header->EmfHeader.nRecords, 
header->EmfHeader.nHandles,
-       header->EmfHeader.sReserved, header->EmfHeader.nDescription, 
header->EmfHeader.offDescription, header->EmfHeader.nPalEntries,
-       header->EmfHeader.szlDevice.cx, header->EmfHeader.szlDevice.cy, 
header->EmfHeader.szlMillimeters.cx, header->EmfHeader.szlMillimeters.cy);
+g_warning ("EMF HEADER iType %d, nSize %d, Bounds L %d, T %d, R %d, B %d, 
Frame L %d, T %d, R %d, B %d, signature %X, version %d, bytes %d, records %d, 
handles %d, reserved %d, description %d, %d, palentries %d, device %d, %d, 
millimeters %d, %d", 
+       emf->iType, emf->nSize, 
+       emf->rclBounds.left, emf->rclBounds.top, emf->rclBounds.right, 
emf->rclBounds.bottom,
+       emf->rclFrame.left, emf->rclFrame.top, emf->rclFrame.right, 
emf->rclFrame.bottom,
+       emf->dSignature, emf->nVersion, emf->nBytes, emf->nRecords, 
emf->nHandles,
+       emf->sReserved, emf->nDescription, emf->offDescription, 
emf->nPalEntries,
+       emf->szlDevice.cx, emf->szlDevice.cy, emf->szlMillimeters.cx, 
emf->szlMillimeters.cy);
 #endif
                /* sanity check */
                if ((emf->iType != 1) || (emf->dSignature != 0x464D4520) || 
(emf->sReserved != 0))
                        return InvalidParameter;
 
                header->Type = METAFILETYPE_EMF;
-               header->X = emf->rclBounds.left;
-               header->Y = emf->rclBounds.top;
-               /* FIXME: inclusive-inclusive, MS gets 2 to 5 pixels larger 
than the header */
-               header->Width = emf->rclBounds.right - emf->rclBounds.left + 1;
-               header->Height = emf->rclBounds.bottom - emf->rclBounds.top + 1;
-               header->DpiX = header->Width / ((emf->rclBounds.right - 
emf->rclBounds.left + 1) / (float)METAFILE_DIMENSION_FACTOR);
-               header->DpiY = header->Height / ((emf->rclBounds.bottom - 
emf->rclBounds.top + 1) / (float)METAFILE_DIMENSION_FACTOR);
+               /* FIXME: inclusive-inclusive, MS gets 1 to 5 pixels larger 
than the header */
+               header->X = 0;
+               header->Y = 0;
+               header->Width = emf->szlDevice.cx + 1;
+               header->Height = emf->szlDevice.cy + 1;
+               header->DpiX = MM_PER_INCH / ((float)emf->szlMillimeters.cx / 
emf->szlDevice.cx);
+               header->DpiY = MM_PER_INCH / ((float)emf->szlMillimeters.cy / 
emf->szlDevice.cy);
                header->Size = emf->nBytes;
                header->Version = emf->nVersion;
-               /* FIXME: we do not match MS results here*/
+               /* FIXME: we need to check for the EmfHeader record but some 
files still returns invalid values */
                header->EmfPlusFlags = 0;
                header->EmfPlusHeaderSize = 0;
                header->LogicalDpiX = 0;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to