Alexandre Julliard : gdi32: Add more helpers for converting font sizes to logical coordinates.
Alexandre Julliard
julliard at winehq.org
Wed Sep 11 16:01:45 CDT 2013
Module: wine
Branch: master
Commit: 08e82d4686f58c9a270c53c5dd35cb74d3bec311
URL: http://source.winehq.org/git/wine.git/?a=commit;h=08e82d4686f58c9a270c53c5dd35cb74d3bec311
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Sep 11 18:31:01 2013 +0200
gdi32: Add more helpers for converting font sizes to logical coordinates.
---
dlls/gdi32/font.c | 119 ++++++++++++++++++++++++----------------------------
1 files changed, 55 insertions(+), 64 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 9e516be..68b2713 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -69,6 +69,18 @@ static inline INT INTERNAL_YDSTOWS(DC *dc, INT height)
return GDI_ROUND(floatHeight);
}
+/* scale width and height but don't mirror them */
+
+static inline INT width_to_LP( DC *dc, INT width )
+{
+ return GDI_ROUND( (double)width * fabs( dc->xformVport2World.eM11 ));
+}
+
+static inline INT height_to_LP( DC *dc, INT height )
+{
+ return GDI_ROUND( (double)height * fabs( dc->xformVport2World.eM22 ));
+}
+
static inline INT INTERNAL_XWSTODS(DC *dc, INT width)
{
POINT pt[2];
@@ -1372,26 +1384,17 @@ BOOL WINAPI GetTextMetricsW( HDC hdc, TEXTMETRICW *metrics )
metrics->tmDigitizedAspectX = GetDeviceCaps(hdc, LOGPIXELSX);
metrics->tmDigitizedAspectY = GetDeviceCaps(hdc, LOGPIXELSY);
-
-#define WDPTOLP(x) ((x<0)? \
- (-abs(INTERNAL_XDSTOWS(dc, (x)))): \
- (abs(INTERNAL_XDSTOWS(dc, (x)))))
-#define HDPTOLP(y) ((y<0)? \
- (-abs(INTERNAL_YDSTOWS(dc, (y)))): \
- (abs(INTERNAL_YDSTOWS(dc, (y)))))
-
- metrics->tmHeight = HDPTOLP(metrics->tmHeight);
- metrics->tmAscent = HDPTOLP(metrics->tmAscent);
- metrics->tmDescent = HDPTOLP(metrics->tmDescent);
- metrics->tmInternalLeading = HDPTOLP(metrics->tmInternalLeading);
- metrics->tmExternalLeading = HDPTOLP(metrics->tmExternalLeading);
- metrics->tmAveCharWidth = WDPTOLP(metrics->tmAveCharWidth);
- metrics->tmMaxCharWidth = WDPTOLP(metrics->tmMaxCharWidth);
- metrics->tmOverhang = WDPTOLP(metrics->tmOverhang);
+ metrics->tmHeight = height_to_LP( dc, metrics->tmHeight );
+ metrics->tmAscent = height_to_LP( dc, metrics->tmAscent );
+ metrics->tmDescent = height_to_LP( dc, metrics->tmDescent );
+ metrics->tmInternalLeading = height_to_LP( dc, metrics->tmInternalLeading );
+ metrics->tmExternalLeading = height_to_LP( dc, metrics->tmExternalLeading );
+ metrics->tmAveCharWidth = width_to_LP( dc, metrics->tmAveCharWidth );
+ metrics->tmMaxCharWidth = width_to_LP( dc, metrics->tmMaxCharWidth );
+ metrics->tmOverhang = width_to_LP( dc, metrics->tmOverhang );
ret = TRUE;
-#undef WDPTOLP
-#undef HDPTOLP
- TRACE("text metrics:\n"
+
+ TRACE("text metrics:\n"
" Weight = %03i\t FirstChar = %i\t AveCharWidth = %i\n"
" Italic = % 3i\t LastChar = %i\t\t MaxCharWidth = %i\n"
" UnderLined = %01i\t DefaultChar = %i\t Overhang = %i\n"
@@ -1622,46 +1625,38 @@ UINT WINAPI GetOutlineTextMetricsW(
{
output->otmTextMetrics.tmDigitizedAspectX = GetDeviceCaps(hdc, LOGPIXELSX);
output->otmTextMetrics.tmDigitizedAspectY = GetDeviceCaps(hdc, LOGPIXELSY);
-
-#define WDPTOLP(x) ((x<0)? \
- (-abs(INTERNAL_XDSTOWS(dc, (x)))): \
- (abs(INTERNAL_XDSTOWS(dc, (x)))))
-#define HDPTOLP(y) ((y<0)? \
- (-abs(INTERNAL_YDSTOWS(dc, (y)))): \
- (abs(INTERNAL_YDSTOWS(dc, (y)))))
-
- output->otmTextMetrics.tmHeight = HDPTOLP(output->otmTextMetrics.tmHeight);
- output->otmTextMetrics.tmAscent = HDPTOLP(output->otmTextMetrics.tmAscent);
- output->otmTextMetrics.tmDescent = HDPTOLP(output->otmTextMetrics.tmDescent);
- output->otmTextMetrics.tmInternalLeading = HDPTOLP(output->otmTextMetrics.tmInternalLeading);
- output->otmTextMetrics.tmExternalLeading = HDPTOLP(output->otmTextMetrics.tmExternalLeading);
- output->otmTextMetrics.tmAveCharWidth = WDPTOLP(output->otmTextMetrics.tmAveCharWidth);
- output->otmTextMetrics.tmMaxCharWidth = WDPTOLP(output->otmTextMetrics.tmMaxCharWidth);
- output->otmTextMetrics.tmOverhang = WDPTOLP(output->otmTextMetrics.tmOverhang);
- output->otmAscent = HDPTOLP(output->otmAscent);
- output->otmDescent = HDPTOLP(output->otmDescent);
- output->otmLineGap = abs(INTERNAL_YDSTOWS(dc,output->otmLineGap));
- output->otmsCapEmHeight = abs(INTERNAL_YDSTOWS(dc,output->otmsCapEmHeight));
- output->otmsXHeight = abs(INTERNAL_YDSTOWS(dc,output->otmsXHeight));
- output->otmrcFontBox.top = HDPTOLP(output->otmrcFontBox.top);
- output->otmrcFontBox.bottom = HDPTOLP(output->otmrcFontBox.bottom);
- output->otmrcFontBox.left = WDPTOLP(output->otmrcFontBox.left);
- output->otmrcFontBox.right = WDPTOLP(output->otmrcFontBox.right);
- output->otmMacAscent = HDPTOLP(output->otmMacAscent);
- output->otmMacDescent = HDPTOLP(output->otmMacDescent);
- output->otmMacLineGap = abs(INTERNAL_YDSTOWS(dc,output->otmMacLineGap));
- output->otmptSubscriptSize.x = WDPTOLP(output->otmptSubscriptSize.x);
- output->otmptSubscriptSize.y = HDPTOLP(output->otmptSubscriptSize.y);
- output->otmptSubscriptOffset.x = WDPTOLP(output->otmptSubscriptOffset.x);
- output->otmptSubscriptOffset.y = HDPTOLP(output->otmptSubscriptOffset.y);
- output->otmptSuperscriptSize.x = WDPTOLP(output->otmptSuperscriptSize.x);
- output->otmptSuperscriptSize.y = HDPTOLP(output->otmptSuperscriptSize.y);
- output->otmptSuperscriptOffset.x = WDPTOLP(output->otmptSuperscriptOffset.x);
- output->otmptSuperscriptOffset.y = HDPTOLP(output->otmptSuperscriptOffset.y);
- output->otmsStrikeoutSize = abs(INTERNAL_YDSTOWS(dc,output->otmsStrikeoutSize));
- output->otmsStrikeoutPosition = HDPTOLP(output->otmsStrikeoutPosition);
- output->otmsUnderscoreSize = HDPTOLP(output->otmsUnderscoreSize);
- output->otmsUnderscorePosition = HDPTOLP(output->otmsUnderscorePosition);
+ output->otmTextMetrics.tmHeight = height_to_LP( dc, output->otmTextMetrics.tmHeight );
+ output->otmTextMetrics.tmAscent = height_to_LP( dc, output->otmTextMetrics.tmAscent );
+ output->otmTextMetrics.tmDescent = height_to_LP( dc, output->otmTextMetrics.tmDescent );
+ output->otmTextMetrics.tmInternalLeading = height_to_LP( dc, output->otmTextMetrics.tmInternalLeading );
+ output->otmTextMetrics.tmExternalLeading = height_to_LP( dc, output->otmTextMetrics.tmExternalLeading );
+ output->otmTextMetrics.tmAveCharWidth = width_to_LP( dc, output->otmTextMetrics.tmAveCharWidth );
+ output->otmTextMetrics.tmMaxCharWidth = width_to_LP( dc, output->otmTextMetrics.tmMaxCharWidth );
+ output->otmTextMetrics.tmOverhang = width_to_LP( dc, output->otmTextMetrics.tmOverhang );
+ output->otmAscent = height_to_LP( dc, output->otmAscent);
+ output->otmDescent = height_to_LP( dc, output->otmDescent);
+ output->otmLineGap = abs(INTERNAL_YDSTOWS(dc,output->otmLineGap));
+ output->otmsCapEmHeight = abs(INTERNAL_YDSTOWS(dc,output->otmsCapEmHeight));
+ output->otmsXHeight = abs(INTERNAL_YDSTOWS(dc,output->otmsXHeight));
+ output->otmrcFontBox.top = height_to_LP( dc, output->otmrcFontBox.top);
+ output->otmrcFontBox.bottom = height_to_LP( dc, output->otmrcFontBox.bottom);
+ output->otmrcFontBox.left = width_to_LP( dc, output->otmrcFontBox.left);
+ output->otmrcFontBox.right = width_to_LP( dc, output->otmrcFontBox.right);
+ output->otmMacAscent = height_to_LP( dc, output->otmMacAscent);
+ output->otmMacDescent = height_to_LP( dc, output->otmMacDescent);
+ output->otmMacLineGap = abs(INTERNAL_YDSTOWS(dc,output->otmMacLineGap));
+ output->otmptSubscriptSize.x = width_to_LP( dc, output->otmptSubscriptSize.x);
+ output->otmptSubscriptSize.y = height_to_LP( dc, output->otmptSubscriptSize.y);
+ output->otmptSubscriptOffset.x = width_to_LP( dc, output->otmptSubscriptOffset.x);
+ output->otmptSubscriptOffset.y = height_to_LP( dc, output->otmptSubscriptOffset.y);
+ output->otmptSuperscriptSize.x = width_to_LP( dc, output->otmptSuperscriptSize.x);
+ output->otmptSuperscriptSize.y = height_to_LP( dc, output->otmptSuperscriptSize.y);
+ output->otmptSuperscriptOffset.x = width_to_LP( dc, output->otmptSuperscriptOffset.x);
+ output->otmptSuperscriptOffset.y = height_to_LP( dc, output->otmptSuperscriptOffset.y);
+ output->otmsStrikeoutSize = abs(INTERNAL_YDSTOWS(dc,output->otmsStrikeoutSize));
+ output->otmsStrikeoutPosition = height_to_LP( dc, output->otmsStrikeoutPosition);
+ output->otmsUnderscoreSize = height_to_LP( dc, output->otmsUnderscoreSize);
+ output->otmsUnderscorePosition = height_to_LP( dc, output->otmsUnderscorePosition);
#undef WDPTOLP
#undef HDPTOLP
if(output != lpOTM)
@@ -1748,13 +1743,9 @@ BOOL WINAPI GetCharWidth32W( HDC hdc, UINT firstChar, UINT lastChar,
if (ret)
{
-#define WDPTOLP(x) ((x<0)? \
- (-abs(INTERNAL_XDSTOWS(dc, (x)))): \
- (abs(INTERNAL_XDSTOWS(dc, (x)))))
/* convert device units to logical */
for( i = firstChar; i <= lastChar; i++, buffer++ )
- *buffer = WDPTOLP(*buffer);
-#undef WDPTOLP
+ *buffer = width_to_LP( dc, *buffer );
}
release_dc_ptr( dc );
return ret;
More information about the wine-cvs
mailing list