From b2879fc68998bb1f80952213b1a7aa8e58a04e09 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Sat, 26 Dec 2009 20:46:55 -0500 Subject: [PATCH 6/7] 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 6d778a4..f7eb6ff 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -217,6 +217,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 2d4a890..78440b2 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 9858f33..b9ef1a6 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 98f599c..4dec404 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -837,11 +837,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); @@ -873,12 +873,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); } @@ -923,23 +923,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); -- 1.6.3.3