From 06c9a818e8dd658439a79ac1f5ec35b5fffe9a75 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Sun, 8 Aug 2010 15:24:45 -0500 Subject: [PATCH 1/5] gdiplus: Don't require an HDC for the convert_unit function. This is needed so we can have HDC-less graphics objects. --- dlls/gdiplus/gdiplus.c | 10 +++++----- dlls/gdiplus/gdiplus_private.h | 2 +- dlls/gdiplus/graphics.c | 12 +++++++++--- dlls/gdiplus/image.c | 23 +++++++++++++---------- 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/dlls/gdiplus/gdiplus.c b/dlls/gdiplus/gdiplus.c index 383f536..9bb9fab 100644 --- a/dlls/gdiplus/gdiplus.c +++ b/dlls/gdiplus/gdiplus.c @@ -314,18 +314,18 @@ GpStatus hresult_to_status(HRESULT res) } /* converts a given unit to its value in pixels */ -REAL convert_unit(HDC hdc, GpUnit unit) +REAL convert_unit(REAL logpixels, GpUnit unit) { switch(unit) { case UnitInch: - return (REAL) GetDeviceCaps(hdc, LOGPIXELSX); + return logpixels; case UnitPoint: - return ((REAL)GetDeviceCaps(hdc, LOGPIXELSX)) / 72.0; + return logpixels / 72.0; case UnitDocument: - return ((REAL)GetDeviceCaps(hdc, LOGPIXELSX)) / 300.0; + return logpixels / 300.0; case UnitMillimeter: - return ((REAL)GetDeviceCaps(hdc, LOGPIXELSX)) / 25.4; + return logpixels / 25.4; case UnitWorld: ERR("cannot convert UnitWorld\n"); return 0.0; diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index eafed7c..908a1b7 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -47,7 +47,7 @@ extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2, REAL startAngle, REAL sweepAngle); extern REAL gdiplus_atan2(REAL dy, REAL dx); extern GpStatus hresult_to_status(HRESULT res); -extern REAL convert_unit(HDC hdc, GpUnit unit); +extern REAL convert_unit(REAL logpixels, GpUnit unit); extern void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1, REAL *y1, REAL *x2, REAL *y2); diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index ada2c58..094ed61 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -84,6 +84,12 @@ 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 INT prepare_dc(GpGraphics *graphics, GpPen *pen) { HPEN gdipen; @@ -108,7 +114,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->hdc, + width *= pen->width * convert_unit(graphics_res(graphics), pen->unit == UnitWorld ? graphics->unit : pen->unit); } @@ -156,7 +162,7 @@ static void transform_and_round_points(GpGraphics *graphics, POINT *pti, GpMatrix *matrix; int i; - unitscale = convert_unit(graphics->hdc, graphics->unit); + unitscale = convert_unit(graphics_res(graphics), graphics->unit); /* apply page scale */ if(graphics->unit != UnitDisplay) @@ -4602,7 +4608,7 @@ GpStatus WINGDIPAPI GdipTransformPoints(GpGraphics *graphics, GpCoordinateSpace stat = GdipCreateMatrix(&matrix); if (stat == Ok) { - unitscale = convert_unit(graphics->hdc, graphics->unit); + unitscale = convert_unit(graphics_res(graphics), graphics->unit); if(graphics->unit != UnitDisplay) unitscale *= graphics->scale; diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index d72ae8d..57c9f83 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -2008,14 +2008,15 @@ GpStatus WINGDIPAPI GdipGetImageDimension(GpImage *image, REAL *width, if(image->type == ImageTypeMetafile){ HDC hdc = GetDC(0); + REAL res = (REAL)GetDeviceCaps(hdc, LOGPIXELSX); - *height = convert_unit(hdc, ((GpMetafile*)image)->unit) * + ReleaseDC(0, hdc); + + *height = convert_unit(res, ((GpMetafile*)image)->unit) * ((GpMetafile*)image)->bounds.Height; - *width = convert_unit(hdc, ((GpMetafile*)image)->unit) * + *width = convert_unit(res, ((GpMetafile*)image)->unit) * ((GpMetafile*)image)->bounds.Width; - - ReleaseDC(0, hdc); } else if(image->type == ImageTypeBitmap){ @@ -2072,11 +2073,12 @@ GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height) if(image->type == ImageTypeMetafile){ HDC hdc = GetDC(0); - - *height = roundr(convert_unit(hdc, ((GpMetafile*)image)->unit) * - ((GpMetafile*)image)->bounds.Height); + REAL res = (REAL)GetDeviceCaps(hdc, LOGPIXELSX); ReleaseDC(0, hdc); + + *height = roundr(convert_unit(res, ((GpMetafile*)image)->unit) * + ((GpMetafile*)image)->bounds.Height); } else if(image->type == ImageTypeBitmap) *height = ((GpBitmap*)image)->height; @@ -2178,11 +2180,12 @@ GpStatus WINGDIPAPI GdipGetImageWidth(GpImage *image, UINT *width) if(image->type == ImageTypeMetafile){ HDC hdc = GetDC(0); - - *width = roundr(convert_unit(hdc, ((GpMetafile*)image)->unit) * - ((GpMetafile*)image)->bounds.Width); + REAL res = (REAL)GetDeviceCaps(hdc, LOGPIXELSX); ReleaseDC(0, hdc); + + *width = roundr(convert_unit(res, ((GpMetafile*)image)->unit) * + ((GpMetafile*)image)->bounds.Width); } else if(image->type == ImageTypeBitmap) *width = ((GpBitmap*)image)->width; -- 1.7.0.4