Vincent Povirk : gdiplus: Implement GdipGetImage*Resolution.

Alexandre Julliard julliard at winehq.org
Mon Dec 28 09:16:11 CST 2009


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Sat Dec 26 20:46:55 2009 -0500

gdiplus: Implement GdipGetImage*Resolution.

---

 dlls/gdiplus/gdiplus_private.h |    1 +
 dlls/gdiplus/graphics.c        |    2 ++
 dlls/gdiplus/image.c           |   39 +++++++++++++++++++++++++++++----------
 dlls/gdiplus/tests/image.c     |   24 ++++++++++++------------
 4 files changed, 44 insertions(+), 22 deletions(-)

diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 7ce4bd5..9d05e0d 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -219,6 +219,7 @@ struct GpImage{
     UINT palette_count;
     UINT palette_size;
     ARGB *palette_entries;
+    REAL xres, yres;
 };
 
 struct GpMetafile{
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index f7a8eaf..563e43a 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -1262,6 +1262,8 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete,
     (*metafile)->image.palette_count = 0;
     (*metafile)->image.palette_size = 0;
     (*metafile)->image.palette_entries = NULL;
+    (*metafile)->image.xres = (REAL)placeable->Inch;
+    (*metafile)->image.yres = (REAL)placeable->Inch;
     (*metafile)->bounds.X = ((REAL) placeable->BoundingBox.Left) / ((REAL) placeable->Inch);
     (*metafile)->bounds.Y = ((REAL) placeable->BoundingBox.Top) / ((REAL) placeable->Inch);
     (*metafile)->bounds.Width = ((REAL) (placeable->BoundingBox.Right
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index e37d028..763c17c 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -1172,6 +1172,20 @@ static void generate_halftone_palette(ARGB *entries, UINT count)
     }
 }
 
+static GpStatus get_screen_resolution(REAL *xres, REAL *yres)
+{
+    HDC screendc = GetDC(0);
+
+    if (!screendc) return GenericError;
+
+    *xres = (REAL)GetDeviceCaps(screendc, LOGPIXELSX);
+    *yres = (REAL)GetDeviceCaps(screendc, LOGPIXELSY);
+
+    ReleaseDC(0, screendc);
+
+    return Ok;
+}
+
 GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     PixelFormat format, BYTE* scan0, GpBitmap** bitmap)
 {
@@ -1181,6 +1195,8 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     HDC hdc;
     BYTE *bits;
     int i;
+    REAL xres, yres;
+    GpStatus stat;
 
     TRACE("%d %d %d %d %p %p\n", width, height, stride, format, scan0, bitmap);
 
@@ -1194,6 +1210,9 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     if(scan0 && !stride)
         return InvalidParameter;
 
+    stat = get_screen_resolution(&xres, &yres);
+    if (stat != Ok) return stat;
+
     row_size = (width * PIXELFORMATBPP(format)+7) / 8;
     dib_stride = (row_size + 3) & ~3;
 
@@ -1243,6 +1262,8 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     (*bitmap)->image.palette_count = 0;
     (*bitmap)->image.palette_size = 0;
     (*bitmap)->image.palette_entries = NULL;
+    (*bitmap)->image.xres = xres;
+    (*bitmap)->image.yres = yres;
     (*bitmap)->width = width;
     (*bitmap)->height = height;
     (*bitmap)->format = format;
@@ -1522,15 +1543,14 @@ GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height)
 
 GpStatus WINGDIPAPI GdipGetImageHorizontalResolution(GpImage *image, REAL *res)
 {
-    static int calls;
-
     if(!image || !res)
         return InvalidParameter;
 
-    if(!(calls++))
-        FIXME("not implemented\n");
+    *res = image->xres;
 
-    return NotImplemented;
+    TRACE("(%p) <-- %0.2f\n", image, *res);
+
+    return Ok;
 }
 
 GpStatus WINGDIPAPI GdipGetImagePaletteSize(GpImage *image, INT *size)
@@ -1590,15 +1610,14 @@ GpStatus WINGDIPAPI GdipGetImageType(GpImage *image, ImageType *type)
 
 GpStatus WINGDIPAPI GdipGetImageVerticalResolution(GpImage *image, REAL *res)
 {
-    static int calls;
-
     if(!image || !res)
         return InvalidParameter;
 
-    if(!(calls++))
-        FIXME("not implemented\n");
+    *res = image->yres;
 
-    return NotImplemented;
+    TRACE("(%p) <-- %0.2f\n", image, *res);
+
+    return Ok;
 }
 
 GpStatus WINGDIPAPI GdipGetImageWidth(GpImage *image, UINT *width)
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index 4721a58..913ba1f 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -843,11 +843,11 @@ static void test_loadwmf(void)
     todo_wine expectf(320.0, bounds.Height);
 
     stat = GdipGetImageHorizontalResolution(img, &res);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
     todo_wine expectf(1440.0, res);
 
     stat = GdipGetImageVerticalResolution(img, &res);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
     todo_wine expectf(1440.0, res);
 
     GdipDisposeImage(img);
@@ -879,12 +879,12 @@ static void test_createfromwmf(void)
     todo_wine expectf(320.0, bounds.Height);
 
     stat = GdipGetImageHorizontalResolution(img, &res);
-    todo_wine expect(Ok, stat);
-    todo_wine expectf(1440.0, res);
+    expect(Ok, stat);
+    expectf(1440.0, res);
 
     stat = GdipGetImageVerticalResolution(img, &res);
-    todo_wine expect(Ok, stat);
-    todo_wine expectf(1440.0, res);
+    expect(Ok, stat);
+    expectf(1440.0, res);
 
     GdipDisposeImage(img);
 }
@@ -929,23 +929,23 @@ static void test_resolution(void)
     ReleaseDC(0, screendc);
 
     stat = GdipGetImageHorizontalResolution((GpImage*)bitmap, &res);
-    todo_wine expect(Ok, stat);
-    todo_wine expectf((REAL)screenxres, res);
+    expect(Ok, stat);
+    expectf((REAL)screenxres, res);
 
     stat = GdipGetImageVerticalResolution((GpImage*)bitmap, &res);
-    todo_wine expect(Ok, stat);
-    todo_wine expectf((REAL)screenyres, res);
+    expect(Ok, stat);
+    expectf((REAL)screenyres, res);
 
     /* test changing the resolution */
     stat = GdipBitmapSetResolution(bitmap, screenxres*2.0, screenyres*3.0);
     todo_wine expect(Ok, stat);
 
     stat = GdipGetImageHorizontalResolution((GpImage*)bitmap, &res);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
     todo_wine expectf(screenxres*2.0, res);
 
     stat = GdipGetImageVerticalResolution((GpImage*)bitmap, &res);
-    todo_wine expect(Ok, stat);
+    expect(Ok, stat);
     todo_wine expectf(screenyres*3.0, res);
 
     stat = GdipDisposeImage((GpImage*)bitmap);




More information about the wine-cvs mailing list