Module: wine Branch: master Commit: b1ccff1a9c7bd3028821ae1745de83ef111daa28 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b1ccff1a9c7bd3028821ae1745...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Apr 10 16:04:39 2012 +0200
gdi32: Add helper functions for manipulating bounds rectangles.
---
dlls/gdi32/bitblt.c | 3 +- dlls/gdi32/dc.c | 52 +++++++++++++++++---------------------------- dlls/gdi32/font.c | 16 +++++++------- dlls/gdi32/gdi_private.h | 18 +++++++++++++++- 4 files changed, 46 insertions(+), 43 deletions(-)
diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c index 71b8e8f..a97231c 100644 --- a/dlls/gdi32/bitblt.c +++ b/dlls/gdi32/bitblt.c @@ -408,8 +408,7 @@ BOOL nulldrv_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, ULONG nvert, LPtoDP( dev->hdc, pts, nvert );
/* compute bounding rect of all the rectangles/triangles */ - dst.visrect.left = dst.visrect.top = INT_MAX; - dst.visrect.right = dst.visrect.bottom = INT_MIN; + reset_bounds( &dst.visrect ); for (i = 0; i < ngrad * (mode == GRADIENT_FILL_TRIANGLE ? 3 : 2); i++) { ULONG v = ((ULONG *)grad_array)[i]; diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 478100d..c256f26 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -114,6 +114,8 @@ DC *alloc_dc_ptr( WORD magic ) dc->xformVport2World = dc->xformWorld2Wnd; dc->vport2WorldValid = TRUE;
+ reset_bounds( &dc->bounds ); + if (!(dc->hSelf = alloc_gdi_handle( &dc->header, magic, &dc_funcs ))) { HeapFree( GetProcessHeap(), 0, dc ); @@ -1316,21 +1318,23 @@ UINT WINAPI GetBoundsRect(HDC hdc, LPRECT rect, UINT flags)
if (rect) { - *rect = dc->BoundsRect; - ret = is_rect_empty( rect ) ? DCB_RESET : DCB_SET; - rect->left = max( rect->left, 0 ); - rect->top = max( rect->top, 0 ); - rect->right = min( rect->right, dc->vis_rect.right - dc->vis_rect.left ); - rect->bottom = min( rect->bottom, dc->vis_rect.bottom - dc->vis_rect.top ); + if (is_rect_empty( &dc->bounds )) + { + rect->left = rect->top = rect->right = rect->bottom = 0; + ret = DCB_RESET; + } + else + { + *rect = dc->bounds; + rect->left = max( rect->left, 0 ); + rect->top = max( rect->top, 0 ); + rect->right = min( rect->right, dc->vis_rect.right - dc->vis_rect.left ); + rect->bottom = min( rect->bottom, dc->vis_rect.bottom - dc->vis_rect.top ); + ret = DCB_SET; + } DPtoLP( hdc, (POINT *)rect, 2 ); } - if (flags & DCB_RESET) - { - dc->BoundsRect.left = 0; - dc->BoundsRect.top = 0; - dc->BoundsRect.right = 0; - dc->BoundsRect.bottom = 0; - } + if (flags & DCB_RESET) reset_bounds( &dc->bounds ); release_dc_ptr( dc ); return ret; } @@ -1348,32 +1352,16 @@ UINT WINAPI SetBoundsRect(HDC hdc, const RECT* rect, UINT flags) if (!(dc = get_dc_ptr( hdc ))) return 0;
ret = (dc->bounds_enabled ? DCB_ENABLE : DCB_DISABLE) | - (is_rect_empty( &dc->BoundsRect ) ? DCB_RESET : DCB_SET); + (is_rect_empty( &dc->bounds ) ? DCB_RESET : DCB_SET);
- if (flags & DCB_RESET) - { - dc->BoundsRect.left = 0; - dc->BoundsRect.top = 0; - dc->BoundsRect.right = 0; - dc->BoundsRect.bottom = 0; - } + if (flags & DCB_RESET) reset_bounds( &dc->bounds );
if ((flags & DCB_ACCUMULATE) && rect) { RECT rc = *rect;
LPtoDP( hdc, (POINT *)&rc, 2 ); - if (!is_rect_empty( &rc )) - { - if (!is_rect_empty( &dc->BoundsRect)) - { - dc->BoundsRect.left = min( dc->BoundsRect.left, rc.left ); - dc->BoundsRect.top = min( dc->BoundsRect.top, rc.top ); - dc->BoundsRect.right = max( dc->BoundsRect.right, rc.right ); - dc->BoundsRect.bottom = max( dc->BoundsRect.bottom, rc.bottom ); - } - else dc->BoundsRect = rc; - } + add_bounds_rect( &dc->bounds, &rc ); }
if (flags & DCB_ENABLE) dc->bounds_enabled = TRUE; diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index f5c44d8..d9c16a4 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -1761,20 +1761,20 @@ static RECT get_total_extents( HDC hdc, INT x, INT y, UINT flags, UINT aa_flags, LPCWSTR str, UINT count, const INT *dx ) { int i; - RECT rect; + RECT rect, bounds;
- rect.left = rect.top = INT_MAX; - rect.right = rect.bottom = INT_MIN; + reset_bounds( &bounds ); for (i = 0; i < count; i++) { GLYPHMETRICS metrics;
if (get_glyph_bitmap( hdc, (UINT)str[i], aa_flags, &metrics, NULL )) continue;
- rect.left = min( rect.left, x + metrics.gmptGlyphOrigin.x ); - rect.top = min( rect.top, y - metrics.gmptGlyphOrigin.y ); - rect.right = max( rect.right, x + metrics.gmptGlyphOrigin.x + (int)metrics.gmBlackBoxX ); - rect.bottom = max( rect.bottom, y - metrics.gmptGlyphOrigin.y + (int)metrics.gmBlackBoxY ); + rect.left = x + metrics.gmptGlyphOrigin.x; + rect.top = y - metrics.gmptGlyphOrigin.y; + rect.right = rect.left + metrics.gmBlackBoxX; + rect.bottom = rect.top + metrics.gmBlackBoxY; + add_bounds_rect( &bounds, &rect );
if (dx) { @@ -1791,7 +1791,7 @@ static RECT get_total_extents( HDC hdc, INT x, INT y, UINT flags, UINT aa_flags, y += metrics.gmCellIncY; } } - return rect; + return bounds; }
/* helper for nulldrv_ExtTextOut */ diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 5728a53..20b522d 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -21,6 +21,7 @@ #ifndef __WINE_GDI_PRIVATE_H #define __WINE_GDI_PRIVATE_H
+#include <limits.h> #include <math.h> #include <stdlib.h> #include <stdarg.h> @@ -149,7 +150,7 @@ typedef struct tagDC XFORM xformWorld2Vport; /* World-to-viewport transformation */ XFORM xformVport2World; /* Inverse of the above transformation */ BOOL vport2WorldValid; /* Is xformVport2World valid? */ - RECT BoundsRect; /* Current bounding rect */ + RECT bounds; /* Current bounding rect */ } DC;
/* Certain functions will do no further processing if the driver returns this. @@ -457,6 +458,21 @@ static inline void get_bounding_rect( RECT *rect, int x, int y, int width, int h } }
+static inline void reset_bounds( RECT *bounds ) +{ + bounds->left = bounds->top = INT_MAX; + bounds->right = bounds->bottom = INT_MIN; +} + +static inline void add_bounds_rect( RECT *bounds, const RECT *rect ) +{ + if (is_rect_empty( rect )) return; + bounds->left = min( bounds->left, rect->left ); + bounds->top = min( bounds->top, rect->top ); + bounds->right = max( bounds->right, rect->right ); + bounds->bottom = max( bounds->bottom, rect->bottom ); +} + static inline int get_bitmap_stride( int width, int bpp ) { return ((width * bpp + 15) >> 3) & ~1;