gdiplus: Add helper for translating GpFont to HFONT.
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index c0b10e7..380c22d 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -58,6 +58,8 @@
extern void free_installed_fonts(void);
+extern void get_font_hfont(GpGraphics *graphics, GDIPCONST GpFont *font, HFONT *hfont);
+
extern BOOL lengthen_path(GpPath *path, INT len);
extern GpStatus trace_path(GpGraphics *graphics, GpPath *path);
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index cecc880..f26561a 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -1654,6 +1654,45 @@
return stat;
}
+void get_font_hfont(GpGraphics *graphics, GDIPCONST GpFont *font, HFONT *hfont)
+{
+ HDC hdc = CreateCompatibleDC(0);
+ GpPointF pt[3];
+ REAL angle, rel_width, rel_height;
+ LOGFONTW lfw;
+ HFONT unscaled_font;
+ TEXTMETRICW textmet;
+
+ pt[0].X = 0.0;
+ pt[0].Y = 0.0;
+ pt[1].X = 1.0;
+ pt[1].Y = 0.0;
+ pt[2].X = 0.0;
+ pt[2].Y = 1.0;
+ if (graphics)
+ GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, pt, 3);
+ angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X));
+ rel_width = sqrt((pt[1].Y-pt[0].Y)*(pt[1].Y-pt[0].Y)+
+ (pt[1].X-pt[0].X)*(pt[1].X-pt[0].X));
+ rel_height = sqrt((pt[2].Y-pt[0].Y)*(pt[2].Y-pt[0].Y)+
+ (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X));
+
+ unscaled_font = CreateFontIndirectW(&font->lfw);
+
+ SelectObject(hdc, unscaled_font);
+ GetTextMetricsW(hdc, &textmet);
+
+ lfw = font->lfw;
+ lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height);
+ lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width);
+ lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0);
+
+ *hfont = CreateFontIndirectW(&lfw);
+
+ DeleteDC(hdc);
+ DeleteObject(unscaled_font);
+}
+
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
{
TRACE("(%p, %p)\n", hdc, graphics);
@@ -4581,8 +4620,6 @@
{
HRGN rgn = NULL;
HFONT gdifont;
- LOGFONTW lfw;
- TEXTMETRICW textmet;
GpPointF pt[3], rectcpy[4];
POINT corners[4];
REAL angle, rel_width, rel_height;
@@ -4660,19 +4697,8 @@
SelectClipRgn(graphics->hdc, rgn);
}
- /* Use gdi to find the font, then perform transformations on it (height,
- * width, angle). */
- SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw));
- GetTextMetricsW(graphics->hdc, &textmet);
- lfw = font->lfw;
-
- lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height);
- lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width);
-
- lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0);
-
- gdifont = CreateFontIndirectW(&lfw);
- DeleteObject(SelectObject(graphics->hdc, gdifont));
+ get_font_hfont(graphics, font, &gdifont);
+ SelectObject(graphics->hdc, gdifont);
if (!format || format->align == StringAlignmentNear)
{
@@ -5594,11 +5620,8 @@
{
static const INT unsupported_flags = ~(DriverStringOptionsRealizedAdvance);
INT save_state;
- GpPointF pt[4];
- REAL angle, rel_width, rel_height;
- LOGFONTW lfw;
- HFONT unscaled_font, hfont;
- TEXTMETRICW textmet;
+ GpPointF pt;
+ HFONT hfont;
if (flags & unsupported_flags)
FIXME("Ignoring flags %x\n", flags & unsupported_flags);
@@ -5610,37 +5633,15 @@
SetBkMode(graphics->hdc, TRANSPARENT);
SetTextColor(graphics->hdc, brush->lb.lbColor);
- pt[0].X = 0.0;
- pt[0].Y = 0.0;
- pt[1].X = 1.0;
- pt[1].Y = 0.0;
- pt[2].X = 0.0;
- pt[2].Y = 1.0;
- pt[3] = positions[0];
- GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, pt, 4);
- angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X));
- rel_width = sqrt((pt[1].Y-pt[0].Y)*(pt[1].Y-pt[0].Y)+
- (pt[1].X-pt[0].X)*(pt[1].X-pt[0].X));
- rel_height = sqrt((pt[2].Y-pt[0].Y)*(pt[2].Y-pt[0].Y)+
- (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X));
+ pt = positions[0];
+ GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, &pt, 1);
- unscaled_font = CreateFontIndirectW(&font->lfw);
-
- SelectObject(graphics->hdc, unscaled_font);
- GetTextMetricsW(graphics->hdc, &textmet);
-
- lfw = font->lfw;
- lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height);
- lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width);
- lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0);
-
- hfont = CreateFontIndirectW(&lfw);
+ get_font_hfont(graphics, font, &hfont);
SelectObject(graphics->hdc, hfont);
- DeleteObject(unscaled_font);
SetTextAlign(graphics->hdc, TA_BASELINE|TA_LEFT);
- ExtTextOutW(graphics->hdc, roundr(pt[3].X), roundr(pt[3].Y), ETO_GLYPH_INDEX, NULL, text, length, NULL);
+ ExtTextOutW(graphics->hdc, roundr(pt.X), roundr(pt.Y), ETO_GLYPH_INDEX, NULL, text, length, NULL);
RestoreDC(graphics->hdc, save_state);