Evan Stade : gdiplus: Handle empty layout rectangle in
GdipMeasureString.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Aug 16 05:38:37 CDT 2007
Module: wine
Branch: master
Commit: 44e983925aff41f670be43202055422cdf2aebd7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=44e983925aff41f670be43202055422cdf2aebd7
Author: Evan Stade <estade at gmail.com>
Date: Wed Aug 15 16:22:09 2007 -0700
gdiplus: Handle empty layout rectangle in GdipMeasureString.
---
dlls/gdiplus/graphics.c | 16 +++++++++++++---
1 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 754da27..bbad12d 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -18,6 +18,7 @@
#include <stdarg.h>
#include <math.h>
+#include <limits.h>
#include "windef.h"
#include "winbase.h"
@@ -1716,6 +1717,10 @@ GpStatus WINGDIPAPI GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix
return Ok;
}
+/* Find the smallest rectangle that bounds the text when it is printed in rect
+ * according to the format options listed in format. If rect has 0 width and
+ * height, then just find the smallest rectangle that bounds the text when it's
+ * printed at location (rect->X, rect-Y). */
GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font,
GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, RectF *bounds,
@@ -1723,7 +1728,8 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
{
HFONT oldfont;
WCHAR* stringdup;
- INT sum = 0, height = 0, fit, fitcpy, max_width = 0, i, j, lret, nwidth;
+ INT sum = 0, height = 0, fit, fitcpy, max_width = 0, i, j, lret, nwidth,
+ nheight;
SIZE size;
if(!graphics || !string || !font || !rect)
@@ -1744,6 +1750,10 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw));
nwidth = roundr(rect->Width);
+ nheight = roundr(rect->Height);
+
+ if((nwidth == 0) && (nheight == 0))
+ nwidth = nheight = INT_MAX;
for(i = 0, j = 0; i < length; i++){
if(!isprintW(string[i]) && (string[i] != '\n'))
@@ -1796,7 +1806,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
height += size.cy;
max_width = max(max_width, size.cx);
- if(height > roundr(rect->Height))
+ if(height > nheight)
break;
/* Stop if this was a linewrap (but not if it was a linebreak). */
@@ -1807,7 +1817,7 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics,
bounds->X = rect->X;
bounds->Y = rect->Y;
bounds->Width = (REAL)max_width;
- bounds->Height = min((REAL)height, rect->Height);
+ bounds->Height = (REAL) min(height, nheight);
DeleteObject(SelectObject(graphics->hdc, oldfont));
More information about the wine-cvs
mailing list