Dmitry Timoshkov : gdiplus: Store device resolution in the graphics object.

Alexandre Julliard julliard at winehq.org
Thu Jul 26 15:34:57 CDT 2012


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

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Tue Jul 24 17:18:48 2012 +0900

gdiplus: Store device resolution in the graphics object.

---

 dlls/gdiplus/gdiplus_private.h |    1 +
 dlls/gdiplus/graphics.c        |   50 +++++++++++++++++++--------------------
 dlls/gdiplus/image.c           |    4 +++
 dlls/gdiplus/tests/image.c     |   31 ++++++++++++++++++++++++
 4 files changed, 60 insertions(+), 26 deletions(-)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 5d1c685..0c7e055 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -156,6 +156,7 @@ struct GpGraphics{
     TextRenderingHint texthint;
     GpUnit unit;    /* page unit */
     REAL scale;     /* page scale */
+    REAL xres, yres;
     GpMatrix * worldtrans; /* world transform */
     BOOL busy;      /* hdc handle obtained by GdipGetDC */
     GpRegion *clip;
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 5dcd30a..5ad2f56 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -84,12 +84,6 @@ static BYTE convert_path_point_type(BYTE type)
     return ret;
 }
 
-static REAL graphics_res(GpGraphics *graphics)
-{
-    if (graphics->image) return graphics->image->xres;
-    else return (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSX);
-}
-
 static COLORREF get_gdi_brush_color(const GpBrush *brush)
 {
     ARGB argb;
@@ -260,7 +254,7 @@ static INT prepare_dc(GpGraphics *graphics, GpPen *pen)
         width = sqrt((pt[1].X - pt[0].X) * (pt[1].X - pt[0].X) +
                      (pt[1].Y - pt[0].Y) * (pt[1].Y - pt[0].Y)) / sqrt(2.0);
 
-        width *= pen->width * convert_unit(graphics_res(graphics),
+        width *= pen->width * convert_unit(graphics->xres,
                               pen->unit == UnitWorld ? graphics->unit : pen->unit);
     }
 
@@ -313,18 +307,22 @@ static GpStatus get_graphics_transform(GpGraphics *graphics, GpCoordinateSpace d
 static void transform_and_round_points(GpGraphics *graphics, POINT *pti,
     GpPointF *ptf, INT count)
 {
-    REAL unitscale;
+    REAL scale_x, scale_y;
     GpMatrix *matrix;
     int i;
 
-    unitscale = convert_unit(graphics_res(graphics), graphics->unit);
+    scale_x = convert_unit(graphics->xres, graphics->unit);
+    scale_y = convert_unit(graphics->yres, graphics->unit);
 
     /* apply page scale */
     if(graphics->unit != UnitDisplay)
-        unitscale *= graphics->scale;
+    {
+        scale_x *= graphics->scale;
+        scale_y *= graphics->scale;
+    }
 
     GdipCloneMatrix(graphics->worldtrans, &matrix);
-    GdipScaleMatrix(matrix, unitscale, unitscale, MatrixOrderAppend);
+    GdipScaleMatrix(matrix, scale_x, scale_y, MatrixOrderAppend);
     GdipTransformMatrixPoints(matrix, ptf, count);
     GdipDeleteMatrix(matrix);
 
@@ -2200,6 +2198,8 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra
     (*graphics)->compmode = CompositingModeSourceOver;
     (*graphics)->unit = UnitDisplay;
     (*graphics)->scale = 1.0;
+    (*graphics)->xres = GetDeviceCaps(hdc, LOGPIXELSX);
+    (*graphics)->yres = GetDeviceCaps(hdc, LOGPIXELSY);
     (*graphics)->busy = FALSE;
     (*graphics)->textcontrast = 4;
     list_init(&(*graphics)->containers);
@@ -2239,6 +2239,8 @@ GpStatus graphics_from_image(GpImage *image, GpGraphics **graphics)
     (*graphics)->compmode = CompositingModeSourceOver;
     (*graphics)->unit = UnitDisplay;
     (*graphics)->scale = 1.0;
+    (*graphics)->xres = image->xres;
+    (*graphics)->yres = image->yres;
     (*graphics)->busy = FALSE;
     (*graphics)->textcontrast = 4;
     list_init(&(*graphics)->containers);
@@ -5792,11 +5794,7 @@ GpStatus WINGDIPAPI GdipGetDpiX(GpGraphics *graphics, REAL* dpi)
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image)
-        *dpi = graphics->image->xres;
-    else
-        *dpi = (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSX);
-
+    *dpi = graphics->xres;
     return Ok;
 }
 
@@ -5810,11 +5808,7 @@ GpStatus WINGDIPAPI GdipGetDpiY(GpGraphics *graphics, REAL* dpi)
     if(graphics->busy)
         return ObjectBusy;
 
-    if (graphics->image)
-        *dpi = graphics->image->yres;
-    else
-        *dpi = (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSY);
-
+    *dpi = graphics->yres;
     return Ok;
 }
 
@@ -5999,14 +5993,18 @@ static GpStatus get_graphics_transform(GpGraphics *graphics, GpCoordinateSpace d
         GpCoordinateSpace src_space, GpMatrix **matrix)
 {
     GpStatus stat = GdipCreateMatrix(matrix);
-    REAL unitscale;
+    REAL scale_x, scale_y;
 
     if (dst_space != src_space && stat == Ok)
     {
-        unitscale = convert_unit(graphics_res(graphics), graphics->unit);
+        scale_x = convert_unit(graphics->xres, graphics->unit);
+        scale_y = convert_unit(graphics->yres, graphics->unit);
 
         if(graphics->unit != UnitDisplay)
-            unitscale *= graphics->scale;
+        {
+            scale_x *= graphics->scale;
+            scale_y *= graphics->scale;
+        }
 
         /* transform from src_space to CoordinateSpacePage */
         switch (src_space)
@@ -6017,7 +6015,7 @@ static GpStatus get_graphics_transform(GpGraphics *graphics, GpCoordinateSpace d
         case CoordinateSpacePage:
             break;
         case CoordinateSpaceDevice:
-            GdipScaleMatrix(*matrix, 1.0/unitscale, 1.0/unitscale, MatrixOrderAppend);
+            GdipScaleMatrix(*matrix, 1.0/scale_x, 1.0/scale_y, MatrixOrderAppend);
             break;
         }
 
@@ -6040,7 +6038,7 @@ static GpStatus get_graphics_transform(GpGraphics *graphics, GpCoordinateSpace d
         case CoordinateSpacePage:
             break;
         case CoordinateSpaceDevice:
-            GdipScaleMatrix(*matrix, unitscale, unitscale, MatrixOrderAppend);
+            GdipScaleMatrix(*matrix, scale_x, scale_y, MatrixOrderAppend);
             break;
         }
     }
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 9972f40..f415a45 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -2305,7 +2305,11 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image,
         stat = GdipCreateFromHDC(hdc, graphics);
 
         if (stat == Ok)
+        {
             (*graphics)->image = image;
+            (*graphics)->xres = image->xres;
+            (*graphics)->yres = image->yres;
+        }
     }
     else if (image->type == ImageTypeMetafile)
         stat = METAFILE_GetGraphicsContext((GpMetafile*)image, graphics);
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 3d17f3d..0595cc2 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -1517,6 +1517,7 @@ static void test_resolution(void)
 {
     GpStatus stat;
     GpBitmap *bitmap;
+    GpGraphics *graphics;
     REAL res=-1.0;
     HDC screendc;
     int screenxres, screenyres;
@@ -1560,6 +1561,15 @@ static void test_resolution(void)
     expect(Ok, stat);
     expectf((REAL)screenyres, res);
 
+    stat = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
+    expect(Ok, stat);
+    stat = GdipGetDpiX(graphics, &res);
+    expect(Ok, stat);
+    expectf((REAL)screenxres, res);
+    stat = GdipGetDpiY(graphics, &res);
+    expect(Ok, stat);
+    expectf((REAL)screenyres, res);
+
     /* test changing the resolution */
     stat = GdipBitmapSetResolution(bitmap, screenxres*2.0, screenyres*3.0);
     expect(Ok, stat);
@@ -1572,6 +1582,27 @@ static void test_resolution(void)
     expect(Ok, stat);
     expectf(screenyres*3.0, res);
 
+    stat = GdipGetDpiX(graphics, &res);
+    expect(Ok, stat);
+    expectf((REAL)screenxres, res);
+    stat = GdipGetDpiY(graphics, &res);
+    expect(Ok, stat);
+    expectf((REAL)screenyres, res);
+
+    stat = GdipDeleteGraphics(graphics);
+    expect(Ok, stat);
+
+    stat = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics);
+    expect(Ok, stat);
+    stat = GdipGetDpiX(graphics, &res);
+    expect(Ok, stat);
+    expectf(screenxres*2.0, res);
+    stat = GdipGetDpiY(graphics, &res);
+    expect(Ok, stat);
+    expectf(screenyres*3.0, res);
+    stat = GdipDeleteGraphics(graphics);
+    expect(Ok, stat);
+
     stat = GdipDisposeImage((GpImage*)bitmap);
     expect(Ok, stat);
 }




More information about the wine-cvs mailing list