Alexandre Julliard : gdi32: Reimplement LPtoDP16/ DPtoLP16 on top of the 32-bit functions.

Alexandre Julliard julliard at winehq.org
Tue Nov 17 09:28:18 CST 2009


Module: wine
Branch: master
Commit: 250237e1c1d1e7a16678de7ba8107c0431807971
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=250237e1c1d1e7a16678de7ba8107c0431807971

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Nov 17 12:19:36 2009 +0100

gdi32: Reimplement LPtoDP16/DPtoLP16 on top of the 32-bit functions.

---

 dlls/gdi32/gdi16.c |   56 +++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 40 insertions(+), 16 deletions(-)

diff --git a/dlls/gdi32/gdi16.c b/dlls/gdi32/gdi16.c
index 62c9ac6..c8d0536 100644
--- a/dlls/gdi32/gdi16.c
+++ b/dlls/gdi32/gdi16.c
@@ -3564,17 +3564,29 @@ VOID WINAPI SetMagicColors16(HDC16 hDC, COLORREF color, UINT16 index)
  */
 BOOL16 WINAPI DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count )
 {
-    DC * dc = get_dc_ptr( HDC_32(hdc) );
-    if (!dc) return FALSE;
+    POINT points32[8], *pt32 = points32;
+    int i;
+    BOOL ret;
 
-    while (count--)
+    if (count > 8)
     {
-        points->x = MulDiv( points->x - dc->vportOrgX, dc->wndExtX, dc->vportExtX ) + dc->wndOrgX;
-        points->y = MulDiv( points->y - dc->vportOrgY, dc->wndExtY, dc->vportExtY ) + dc->wndOrgY;
-        points++;
+        if (!(pt32 = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*pt32) ))) return FALSE;
     }
-    release_dc_ptr( dc );
-    return TRUE;
+    for (i = 0; i < count; i++)
+    {
+        pt32[i].x = points[i].x;
+        pt32[i].y = points[i].y;
+    }
+    if ((ret = DPtoLP( HDC_32(hdc), pt32, count )))
+    {
+        for (i = 0; i < count; i++)
+        {
+            points[i].x = pt32[i].x;
+            points[i].y = pt32[i].y;
+        }
+    }
+    if (pt32 != points32) HeapFree( GetProcessHeap(), 0, pt32 );
+    return ret;
 }
 
 
@@ -3583,17 +3595,29 @@ BOOL16 WINAPI DPtoLP16( HDC16 hdc, LPPOINT16 points, INT16 count )
  */
 BOOL16 WINAPI LPtoDP16( HDC16 hdc, LPPOINT16 points, INT16 count )
 {
-    DC * dc = get_dc_ptr( HDC_32(hdc) );
-    if (!dc) return FALSE;
+    POINT points32[8], *pt32 = points32;
+    int i;
+    BOOL ret;
 
-    while (count--)
+    if (count > 8)
     {
-        points->x = MulDiv( points->x - dc->wndOrgX, dc->vportExtX, dc->wndExtX ) + dc->vportOrgX;
-        points->y = MulDiv( points->y - dc->wndOrgY, dc->vportExtY, dc->wndExtY ) + dc->vportOrgY;
-        points++;
+        if (!(pt32 = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*pt32) ))) return FALSE;
     }
-    release_dc_ptr( dc );
-    return TRUE;
+    for (i = 0; i < count; i++)
+    {
+        pt32[i].x = points[i].x;
+        pt32[i].y = points[i].y;
+    }
+    if ((ret = LPtoDP( HDC_32(hdc), pt32, count )))
+    {
+        for (i = 0; i < count; i++)
+        {
+            points[i].x = pt32[i].x;
+            points[i].y = pt32[i].y;
+        }
+    }
+    if (pt32 != points32) HeapFree( GetProcessHeap(), 0, pt32 );
+    return ret;
 }
 
 




More information about the wine-cvs mailing list