Module: wine Branch: master Commit: e536a128f7e14f755d6a24395a54ab925aec4616 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e536a128f7e14f755d6a24395a...
Author: Dmitry Timoshkov dmitry@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); }