Andrew Eikum : user32: Use font default height if GetTextExtentPoint returns empty rectangle.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 16 09:43:47 CST 2015


Module: wine
Branch: master
Commit: c465209cc1578cf39074b4a8574f7444a0a03891
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c465209cc1578cf39074b4a8574f7444a0a03891

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Fri Nov 13 14:52:10 2015 -0600

user32: Use font default height if GetTextExtentPoint returns empty rectangle.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/tests/text.c | 48 +++++++++++++++++++++++-------------------------
 dlls/user32/text.c       |  9 +++++++--
 2 files changed, 30 insertions(+), 27 deletions(-)

diff --git a/dlls/user32/tests/text.c b/dlls/user32/tests/text.c
index 06705a7..df8d3ee 100644
--- a/dlls/user32/tests/text.c
+++ b/dlls/user32/tests/text.c
@@ -604,15 +604,13 @@ static void strfmt( const char *str, char *strout)
 
 
 #define TABTEST( tabval, tabcount, string, _exp) \
-{ int i,x_act, x_exp; char strdisp[64];\
+{ int i; char strdisp[64];\
     for(i=0;i<8;i++) tabs[i]=(i+1)*(tabval); \
     extent = GetTabbedTextExtentA( hdc, string, strlen( string), (tabcount), tabs); \
     strfmt( string, strdisp); \
  /*   trace( "Extent is %08lx\n", extent); */\
-    x_act = LOWORD( extent); \
-    x_exp = (_exp); \
-    ok( x_act == x_exp, "Test case \"%s\". Text extent is %d, expected %d tab %d tabcount %d\n", \
-        strdisp, x_act, x_exp, tabval, tabcount); \
+    ok( extent == _exp, "Test case \"%s\". Text extent is 0x%x, expected 0x%x tab %d tabcount %d\n", \
+        strdisp, extent, _exp, tabval, tabcount); \
 } \
 
 
@@ -649,16 +647,16 @@ static void test_TabbedText(void)
         tab =  (cx *4 + t);
         /* test the special case tabcount =1 and the general array (80 of tabs */
         for( tabcount = 1; tabcount <= 8; tabcount +=7) { 
-            TABTEST( align * tab, tabcount, "\t", tab)
-            TABTEST( align * tab, tabcount, "xxx\t", tab)
-            TABTEST( align * tab, tabcount, "\tx", tab+cx)
-            TABTEST( align * tab, tabcount, "\t\t", tab*2)
-            TABTEST( align * tab, tabcount, "\tx\t", tab*2)
-            TABTEST( align * tab, tabcount, "x\tx", tab+cx)
-            TABTEST( align * tab, tabcount, "xx\tx", tab+cx)
-            TABTEST( align * tab, tabcount, "xxx\tx", tab+cx)
-            TABTEST( align * tab, tabcount, "xxxx\tx", t>0 ? tab + cx : 2*tab+cx)
-            TABTEST( align * tab, tabcount, "xxxxx\tx", 2*tab+cx)
+            TABTEST( align * tab, tabcount, "\t", MAKELONG(tab, cy))
+            TABTEST( align * tab, tabcount, "xxx\t", MAKELONG(tab, cy))
+            TABTEST( align * tab, tabcount, "\tx", MAKELONG(tab+cx, cy))
+            TABTEST( align * tab, tabcount, "\t\t", MAKELONG(tab*2, cy))
+            TABTEST( align * tab, tabcount, "\tx\t", MAKELONG(tab*2, cy))
+            TABTEST( align * tab, tabcount, "x\tx", MAKELONG(tab+cx, cy))
+            TABTEST( align * tab, tabcount, "xx\tx", MAKELONG(tab+cx, cy))
+            TABTEST( align * tab, tabcount, "xxx\tx", MAKELONG(tab+cx, cy))
+            TABTEST( align * tab, tabcount, "xxxx\tx", MAKELONG(t>0 ? tab + cx : 2*tab+cx, cy))
+            TABTEST( align * tab, tabcount, "xxxxx\tx", MAKELONG(2*tab+cx, cy))
         }
     }
     align=-1;
@@ -667,16 +665,16 @@ static void test_TabbedText(void)
         tab =  (cx *4 + t);
         /* test the special case tabcount =1 and the general array (8) of tabs */
         for( tabcount = 1; tabcount <= 8; tabcount +=7) { 
-            TABTEST( align * tab, tabcount, "\t", tab)
-            TABTEST( align * tab, tabcount, "xxx\t", tab)
-            TABTEST( align * tab, tabcount, "\tx", tab)
-            TABTEST( align * tab, tabcount, "\t\t", tab*2)
-            TABTEST( align * tab, tabcount, "\tx\t", tab*2)
-            TABTEST( align * tab, tabcount, "x\tx", tab)
-            TABTEST( align * tab, tabcount, "xx\tx", tab)
-            TABTEST( align * tab, tabcount, "xxx\tx", 4 * cx >= tab ? 2*tab :tab)
-            TABTEST( align * tab, tabcount, "xxxx\tx", 2*tab)
-            TABTEST( align * tab, tabcount, "xxxxx\tx", 2*tab)
+            TABTEST( align * tab, tabcount, "\t", MAKELONG(tab, cy))
+            TABTEST( align * tab, tabcount, "xxx\t", MAKELONG(tab, cy))
+            TABTEST( align * tab, tabcount, "\tx", MAKELONG(tab, cy))
+            TABTEST( align * tab, tabcount, "\t\t", MAKELONG(tab*2, cy))
+            TABTEST( align * tab, tabcount, "\tx\t", MAKELONG(tab*2, cy))
+            TABTEST( align * tab, tabcount, "x\tx", MAKELONG(tab, cy))
+            TABTEST( align * tab, tabcount, "xx\tx", MAKELONG(tab, cy))
+            TABTEST( align * tab, tabcount, "xxx\tx", MAKELONG(4 * cx >= tab ? 2*tab :tab, cy))
+            TABTEST( align * tab, tabcount, "xxxx\tx", MAKELONG(2*tab, cy))
+            TABTEST( align * tab, tabcount, "xxxxx\tx", MAKELONG(2*tab, cy))
         }
     }
 
diff --git a/dlls/user32/text.c b/dlls/user32/text.c
index 642da57..7b0302e 100644
--- a/dlls/user32/text.c
+++ b/dlls/user32/text.c
@@ -1316,12 +1316,15 @@ static LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr,
     SIZE extent;
     int i, j;
     int start = x;
+    TEXTMETRICW tm;
 
     if (!lpstr || count == 0) return 0;
 
     if (!lpTabPos)
         cTabStops=0;
 
+    GetTextMetricsW( hdc, &tm );
+
     if (cTabStops == 1)
     {
         defWidth = *lpTabPos;
@@ -1329,8 +1332,6 @@ static LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr,
     }
     else
     {
-        TEXTMETRICW tm;
-        GetTextMetricsW( hdc, &tm );
         defWidth = 8 * tm.tmAveCharWidth;
     }
 
@@ -1398,6 +1399,10 @@ static LONG TEXT_TabbedTextOut( HDC hdc, INT x, INT y, LPCWSTR lpstr,
         count -= j;
         lpstr += j;
     }
+
+    if(!extent.cy)
+        extent.cy = tm.tmHeight;
+
     return MAKELONG(x - start, extent.cy);
 }
 




More information about the wine-cvs mailing list