Module: wine Branch: master Commit: ed8a3304c45ad7878cb514a3bfc101d0ee5ecd8e URL: http://source.winehq.org/git/wine.git/?a=commit;h=ed8a3304c45ad7878cb514a3bf...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Mon Jul 16 14:56:30 2012 +0900
gdiplus: Factor out units_to_pixels() helper.
---
dlls/gdiplus/font.c | 70 ++++------------------------------------ dlls/gdiplus/gdiplus.c | 26 +++++++++++++++ dlls/gdiplus/gdiplus_private.h | 1 + 3 files changed, 34 insertions(+), 63 deletions(-)
diff --git a/dlls/gdiplus/font.c b/dlls/gdiplus/font.c index f4b75ef..26cd49d 100644 --- a/dlls/gdiplus/font.c +++ b/dlls/gdiplus/font.c @@ -118,41 +118,8 @@ typedef struct
static GpStatus clone_font_family(const GpFontFamily *, GpFontFamily **);
-static const REAL mm_per_inch = 25.4; -static const REAL inch_per_point = 1.0/72.0; - static GpFontCollection installedFontCollection = {0};
-static LONG em_size_to_pixel(REAL em_size, Unit unit, LONG dpi) -{ - switch (unit) - { - default: - FIXME("Unhandled unit type: %d\n", unit); - return 0; - - case UnitPixel: - case UnitWorld: - /* FIXME: Figure out when World != Pixel */ - return em_size; - case UnitDisplay: - FIXME("Unknown behavior for UnitDisplay! Please report!\n"); - /* FIXME: Figure out how this works... - * MSDN says that if "DISPLAY" is a monitor, then pixel should be - * used. That's not what I got. Tests on Windows revealed no output, - * and the tests in tests/font crash windows */ - return 0; - case UnitPoint: - return em_size * dpi * inch_per_point; - case UnitInch: - return em_size * dpi; - case UnitDocument: - return em_size * dpi / 300.0; /* Per MSDN */ - case UnitMillimeter: - return em_size * dpi / mm_per_inch; - } -} - /******************************************************************************* * GdipCreateFont [GDIPLUS.@] * @@ -195,7 +162,7 @@ GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, stat = GdipGetFamilyName(fontFamily, lfw.lfFaceName, LANG_NEUTRAL); if (stat != Ok) return stat;
- lfw.lfHeight = -em_size_to_pixel(emSize, unit, fontFamily->dpi); + lfw.lfHeight = -units_to_pixels(emSize, unit, fontFamily->dpi); lfw.lfWeight = style & FontStyleBold ? FW_BOLD : FW_REGULAR; lfw.lfItalic = style & FontStyleItalic; lfw.lfUnderline = style & FontStyleUnderline; @@ -483,7 +450,7 @@ GpStatus WINGDIPAPI GdipGetLogFontA(GpFont *font, GpGraphics *graphics, void get_log_fontW(const GpFont *font, GpGraphics *graphics, LOGFONTW *lf) { /* FIXME: use graphics */ - lf->lfHeight = -em_size_to_pixel(font->emSize, font->unit, font->family->dpi); + lf->lfHeight = -units_to_pixels(font->emSize, font->unit, font->family->dpi); lf->lfWidth = 0; lf->lfEscapement = 0; lf->lfOrientation = 0; @@ -590,47 +557,24 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, GpStatus stat; INT style; UINT16 line_spacing, em_height; - REAL font_height, font_size; + REAL font_size;
if (!font || !height) return InvalidParameter;
TRACE("%p (%s), %f, %p\n", font, debugstr_w(font->family->FamilyName), dpi, height);
- font_size = get_font_size(font); + font_size = units_to_pixels(get_font_size(font), font->unit, dpi); style = get_font_style(font); stat = GdipGetLineSpacing(font->family, style, &line_spacing); if (stat != Ok) return stat; stat = GdipGetEmHeight(font->family, style, &em_height); if (stat != Ok) return stat;
- font_height = (REAL)line_spacing * font_size / (REAL)em_height; - - switch (font->unit) - { - case UnitPixel: - case UnitWorld: - *height = font_height; - break; - case UnitPoint: - *height = font_height * dpi * inch_per_point; - break; - case UnitInch: - *height = font_height * dpi; - break; - case UnitDocument: - *height = font_height * (dpi / 300.0); - break; - case UnitMillimeter: - *height = font_height * (dpi / mm_per_inch); - break; - default: - FIXME("Unhandled unit type: %d\n", font->unit); - return NotImplemented; - } + *height = (REAL)line_spacing * font_size / (REAL)em_height;
- TRACE("%s,%d(unit %d) => %f\n", - debugstr_w(font->family->FamilyName), font->otm.otmTextMetrics.tmHeight, font->unit, *height); + TRACE("%s,%d => %f\n", + debugstr_w(font->family->FamilyName), font->otm.otmTextMetrics.tmHeight, *height);
return Ok; } diff --git a/dlls/gdiplus/gdiplus.c b/dlls/gdiplus/gdiplus.c index 11ae2d8..d27924b 100644 --- a/dlls/gdiplus/gdiplus.c +++ b/dlls/gdiplus/gdiplus.c @@ -35,6 +35,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
+static const REAL mm_per_inch = 25.4; +static const REAL inch_per_point = 1.0/72.0; + static Status WINAPI NotificationHook(ULONG_PTR *token) { TRACE("%p\n", token); @@ -340,6 +343,29 @@ REAL convert_unit(REAL logpixels, GpUnit unit) } }
+/* converts a given unit to its value in pixels */ +REAL units_to_pixels(REAL units, GpUnit unit, REAL dpi) +{ + switch (unit) + { + case UnitPixel: + case UnitWorld: + case UnitDisplay: + return units; + case UnitPoint: + return units * dpi * inch_per_point; + case UnitInch: + return units * dpi; + case UnitDocument: + return units * dpi / 300.0; /* Per MSDN */ + case UnitMillimeter: + return units * dpi / mm_per_inch; + default: + FIXME("Unhandled unit type: %d\n", unit); + return 0; + } +} + /* Calculates Bezier points from cardinal spline points. */ void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1, REAL *y1, REAL *x2, REAL *y2) diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 03942c0..c1d19d2 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -49,6 +49,7 @@ extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2, extern REAL gdiplus_atan2(REAL dy, REAL dx) DECLSPEC_HIDDEN; extern GpStatus hresult_to_status(HRESULT res) DECLSPEC_HIDDEN; extern REAL convert_unit(REAL logpixels, GpUnit unit) DECLSPEC_HIDDEN; +extern REAL units_to_pixels(REAL units, GpUnit unit, REAL dpi) DECLSPEC_HIDDEN;
extern GpStatus graphics_from_image(GpImage *image, GpGraphics **graphics) DECLSPEC_HIDDEN;