[PATCH 1/4] gdi32: Use POINT and SIZE to hold positions and extents.
Huw Davies
huw at codeweavers.com
Wed Jul 27 03:59:25 CDT 2016
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/gdi32/brush.c | 10 ++--
dlls/gdi32/clipping.c | 4 +-
dlls/gdi32/dc.c | 86 +++++++++++----------------
dlls/gdi32/font.c | 2 +-
dlls/gdi32/gdi_private.h | 18 ++----
dlls/gdi32/mapping.c | 152 +++++++++++++++++++++--------------------------
dlls/gdi32/painting.c | 51 ++++++++--------
dlls/gdi32/path.c | 3 +-
dlls/gdi32/tests/brush.c | 19 ++++++
9 files changed, 159 insertions(+), 186 deletions(-)
diff --git a/dlls/gdi32/brush.c b/dlls/gdi32/brush.c
index 4f0c17d..3c11243 100644
--- a/dlls/gdi32/brush.c
+++ b/dlls/gdi32/brush.c
@@ -394,12 +394,10 @@ BOOL WINAPI SetBrushOrgEx( HDC hdc, INT x, INT y, LPPOINT oldorg )
if (!dc) return FALSE;
if (oldorg)
- {
- oldorg->x = dc->brushOrgX;
- oldorg->y = dc->brushOrgY;
- }
- dc->brushOrgX = x;
- dc->brushOrgY = y;
+ *oldorg = dc->brush_org;
+
+ dc->brush_org.x = x;
+ dc->brush_org.y = y;
release_dc_ptr( dc );
return TRUE;
}
diff --git a/dlls/gdi32/clipping.c b/dlls/gdi32/clipping.c
index 0dc7896..4e965b9 100644
--- a/dlls/gdi32/clipping.c
+++ b/dlls/gdi32/clipping.c
@@ -233,8 +233,8 @@ INT nulldrv_OffsetClipRgn( PHYSDEV dev, INT x, INT y )
if (dc->hClipRgn)
{
- x = MulDiv( x, dc->vportExtX, dc->wndExtX );
- y = MulDiv( y, dc->vportExtY, dc->wndExtY );
+ x = MulDiv( x, dc->vport_ext.cx, dc->wnd_ext.cx );
+ y = MulDiv( y, dc->vport_ext.cy, dc->wnd_ext.cy );
if (dc->layout & LAYOUT_RTL) x = -x;
ret = OffsetRgn( dc->hClipRgn, x, y );
update_dc_clipping( dc );
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index 01572b8..f8bf3f8 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -76,14 +76,14 @@ static inline DC *get_dc_obj( HDC hdc )
*/
static void set_initial_dc_state( DC *dc )
{
- dc->wndOrgX = 0;
- dc->wndOrgY = 0;
- dc->wndExtX = 1;
- dc->wndExtY = 1;
- dc->vportOrgX = 0;
- dc->vportOrgY = 0;
- dc->vportExtX = 1;
- dc->vportExtY = 1;
+ dc->wnd_org.x = 0;
+ dc->wnd_org.y = 0;
+ dc->wnd_ext.cx = 1;
+ dc->wnd_ext.cy = 1;
+ dc->vport_org.x = 0;
+ dc->vport_org.y = 0;
+ dc->vport_ext.cx = 1;
+ dc->vport_ext.cy = 1;
dc->miterLimit = 10.0f; /* 10.0 is the default, from MSDN */
dc->layout = 0;
dc->font_code_page = CP_ACP;
@@ -96,8 +96,8 @@ static void set_initial_dc_state( DC *dc )
dc->dcBrushColor = RGB( 255, 255, 255 );
dc->dcPenColor = RGB( 0, 0, 0 );
dc->textColor = RGB( 0, 0, 0 );
- dc->brushOrgX = 0;
- dc->brushOrgY = 0;
+ dc->brush_org.x = 0;
+ dc->brush_org.y = 0;
dc->mapperFlags = 0;
dc->textAlign = TA_LEFT | TA_TOP | TA_NOUPDATECP;
dc->charExtra = 0;
@@ -105,8 +105,8 @@ static void set_initial_dc_state( DC *dc )
dc->breakRem = 0;
dc->MapMode = MM_TEXT;
dc->GraphicsMode = GM_COMPATIBLE;
- dc->CursPosX = 0;
- dc->CursPosY = 0;
+ dc->cur_pos.x = 0;
+ dc->cur_pos.y = 0;
dc->ArcDirection = AD_COUNTERCLOCKWISE;
dc->xformWorld2Wnd.eM11 = 1.0f;
dc->xformWorld2Wnd.eM12 = 0.0f;
@@ -311,16 +311,16 @@ static BOOL DC_InvertXform( const XFORM *xformSrc, XFORM *xformDest )
static void construct_window_to_viewport(DC *dc, XFORM *xform)
{
double scaleX, scaleY;
- scaleX = (double)dc->vportExtX / (double)dc->wndExtX;
- scaleY = (double)dc->vportExtY / (double)dc->wndExtY;
+ scaleX = (double)dc->vport_ext.cx / (double)dc->wnd_ext.cx;
+ scaleY = (double)dc->vport_ext.cy / (double)dc->wnd_ext.cy;
if (dc->layout & LAYOUT_RTL) scaleX = -scaleX;
xform->eM11 = scaleX;
xform->eM12 = 0.0;
xform->eM21 = 0.0;
xform->eM22 = scaleY;
- xform->eDx = (double)dc->vportOrgX - scaleX * (double)dc->wndOrgX;
- xform->eDy = (double)dc->vportOrgY - scaleY * (double)dc->wndOrgY;
+ xform->eDx = (double)dc->vport_org.x - scaleX * (double)dc->wnd_org.x;
+ xform->eDy = (double)dc->vport_org.y - scaleY * (double)dc->wnd_org.y;
if (dc->layout & LAYOUT_RTL) xform->eDx = dc->vis_rect.right - dc->vis_rect.left - 1 - xform->eDx;
}
@@ -383,8 +383,7 @@ INT nulldrv_SaveDC( PHYSDEV dev )
newdc->textColor = dc->textColor;
newdc->dcBrushColor = dc->dcBrushColor;
newdc->dcPenColor = dc->dcPenColor;
- newdc->brushOrgX = dc->brushOrgX;
- newdc->brushOrgY = dc->brushOrgY;
+ newdc->brush_org = dc->brush_org;
newdc->mapperFlags = dc->mapperFlags;
newdc->textAlign = dc->textAlign;
newdc->charExtra = dc->charExtra;
@@ -392,21 +391,16 @@ INT nulldrv_SaveDC( PHYSDEV dev )
newdc->breakRem = dc->breakRem;
newdc->MapMode = dc->MapMode;
newdc->GraphicsMode = dc->GraphicsMode;
- newdc->CursPosX = dc->CursPosX;
- newdc->CursPosY = dc->CursPosY;
+ newdc->cur_pos = dc->cur_pos;
newdc->ArcDirection = dc->ArcDirection;
newdc->xformWorld2Wnd = dc->xformWorld2Wnd;
newdc->xformWorld2Vport = dc->xformWorld2Vport;
newdc->xformVport2World = dc->xformVport2World;
newdc->vport2WorldValid = dc->vport2WorldValid;
- newdc->wndOrgX = dc->wndOrgX;
- newdc->wndOrgY = dc->wndOrgY;
- newdc->wndExtX = dc->wndExtX;
- newdc->wndExtY = dc->wndExtY;
- newdc->vportOrgX = dc->vportOrgX;
- newdc->vportOrgY = dc->vportOrgY;
- newdc->vportExtX = dc->vportExtX;
- newdc->vportExtY = dc->vportExtY;
+ newdc->wnd_org = dc->wnd_org;
+ newdc->wnd_ext = dc->wnd_ext;
+ newdc->vport_org = dc->vport_org;
+ newdc->vport_ext = dc->vport_ext;
newdc->virtual_res = dc->virtual_res;
newdc->virtual_size = dc->virtual_size;
@@ -466,8 +460,7 @@ BOOL nulldrv_RestoreDC( PHYSDEV dev, INT level )
dc->textColor = dcs->textColor;
dc->dcBrushColor = dcs->dcBrushColor;
dc->dcPenColor = dcs->dcPenColor;
- dc->brushOrgX = dcs->brushOrgX;
- dc->brushOrgY = dcs->brushOrgY;
+ dc->brush_org = dcs->brush_org;
dc->mapperFlags = dcs->mapperFlags;
dc->textAlign = dcs->textAlign;
dc->charExtra = dcs->charExtra;
@@ -475,21 +468,16 @@ BOOL nulldrv_RestoreDC( PHYSDEV dev, INT level )
dc->breakRem = dcs->breakRem;
dc->MapMode = dcs->MapMode;
dc->GraphicsMode = dcs->GraphicsMode;
- dc->CursPosX = dcs->CursPosX;
- dc->CursPosY = dcs->CursPosY;
+ dc->cur_pos = dcs->cur_pos;
dc->ArcDirection = dcs->ArcDirection;
dc->xformWorld2Wnd = dcs->xformWorld2Wnd;
dc->xformWorld2Vport = dcs->xformWorld2Vport;
dc->xformVport2World = dcs->xformVport2World;
dc->vport2WorldValid = dcs->vport2WorldValid;
- dc->wndOrgX = dcs->wndOrgX;
- dc->wndOrgY = dcs->wndOrgY;
- dc->wndExtX = dcs->wndExtX;
- dc->wndExtY = dcs->wndExtY;
- dc->vportOrgX = dcs->vportOrgX;
- dc->vportOrgY = dcs->vportOrgY;
- dc->vportExtX = dcs->vportExtX;
- dc->vportExtY = dcs->vportExtY;
+ dc->wnd_org = dcs->wnd_org;
+ dc->wnd_ext = dcs->wnd_ext;
+ dc->vport_org = dcs->vport_org;
+ dc->vport_ext = dcs->vport_ext;
dc->virtual_res = dcs->virtual_res;
dc->virtual_size = dcs->virtual_size;
@@ -1792,8 +1780,7 @@ BOOL WINAPI GetBrushOrgEx( HDC hdc, LPPOINT pt )
{
DC * dc = get_dc_ptr( hdc );
if (!dc) return FALSE;
- pt->x = dc->brushOrgX;
- pt->y = dc->brushOrgY;
+ *pt = dc->brush_org;
release_dc_ptr( dc );
return TRUE;
}
@@ -1806,8 +1793,7 @@ BOOL WINAPI GetCurrentPositionEx( HDC hdc, LPPOINT pt )
{
DC * dc = get_dc_ptr( hdc );
if (!dc) return FALSE;
- pt->x = dc->CursPosX;
- pt->y = dc->CursPosY;
+ *pt = dc->cur_pos;
release_dc_ptr( dc );
return TRUE;
}
@@ -1820,8 +1806,7 @@ BOOL WINAPI GetViewportExtEx( HDC hdc, LPSIZE size )
{
DC * dc = get_dc_ptr( hdc );
if (!dc) return FALSE;
- size->cx = dc->vportExtX;
- size->cy = dc->vportExtY;
+ *size = dc->vport_ext;
release_dc_ptr( dc );
return TRUE;
}
@@ -1834,8 +1819,7 @@ BOOL WINAPI GetViewportOrgEx( HDC hdc, LPPOINT pt )
{
DC * dc = get_dc_ptr( hdc );
if (!dc) return FALSE;
- pt->x = dc->vportOrgX;
- pt->y = dc->vportOrgY;
+ *pt = dc->vport_org;
release_dc_ptr( dc );
return TRUE;
}
@@ -1848,8 +1832,7 @@ BOOL WINAPI GetWindowExtEx( HDC hdc, LPSIZE size )
{
DC * dc = get_dc_ptr( hdc );
if (!dc) return FALSE;
- size->cx = dc->wndExtX;
- size->cy = dc->wndExtY;
+ *size = dc->wnd_ext;
release_dc_ptr( dc );
return TRUE;
}
@@ -1862,8 +1845,7 @@ BOOL WINAPI GetWindowOrgEx( HDC hdc, LPPOINT pt )
{
DC * dc = get_dc_ptr( hdc );
if (!dc) return FALSE;
- pt->x = dc->wndOrgX;
- pt->y = dc->wndOrgY;
+ *pt = dc->wnd_org;
release_dc_ptr( dc );
return TRUE;
}
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 700b5e2..cde53ec 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -1029,7 +1029,7 @@ BOOL WINAPI SetTextJustification( HDC hdc, INT extra, INT breaks )
ret = physdev->funcs->pSetTextJustification( physdev, extra, breaks );
if (ret)
{
- extra = abs((extra * dc->vportExtX + dc->wndExtX / 2) / dc->wndExtX);
+ extra = abs((extra * dc->vport_ext.cx + dc->wnd_ext.cx / 2) / dc->wnd_ext.cx);
if (!extra) breaks = 0;
if (breaks)
{
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 5524c2e..47cdf66 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -72,14 +72,10 @@ typedef struct tagDC
BOOL bounds_enabled:1; /* bounds tracking is enabled */
BOOL path_open:1; /* path is currently open (only for saved DCs) */
- INT wndOrgX; /* Window origin */
- INT wndOrgY;
- INT wndExtX; /* Window extent */
- INT wndExtY;
- INT vportOrgX; /* Viewport origin */
- INT vportOrgY;
- INT vportExtX; /* Viewport extent */
- INT vportExtY;
+ POINT wnd_org; /* Window origin */
+ SIZE wnd_ext; /* Window extent */
+ POINT vport_org; /* Viewport origin */
+ SIZE vport_ext; /* Viewport extent */
SIZE virtual_res; /* Initially HORZRES,VERTRES. Changed by SetVirtualResolution */
SIZE virtual_size; /* Initially HORZSIZE,VERTSIZE. Changed by SetVirtualResolution */
RECT vis_rect; /* visible rectangle in screen coords */
@@ -112,8 +108,7 @@ typedef struct tagDC
COLORREF textColor;
COLORREF dcBrushColor;
COLORREF dcPenColor;
- short brushOrgX;
- short brushOrgY;
+ POINT brush_org;
DWORD mapperFlags; /* Font mapper flags */
WORD textAlign; /* Text alignment from SetTextAlign() */
@@ -123,8 +118,7 @@ typedef struct tagDC
INT MapMode;
INT GraphicsMode; /* Graphics mode */
ABORTPROC pAbortProc; /* AbortProc for Printing */
- INT CursPosX; /* Current position */
- INT CursPosY;
+ POINT cur_pos; /* Current position */
INT ArcDirection;
XFORM xformWorld2Wnd; /* World-to-window transformation */
XFORM xformWorld2Vport; /* World-to-viewport transformation */
diff --git a/dlls/gdi32/mapping.c b/dlls/gdi32/mapping.c
index 5a1941b..496643e 100644
--- a/dlls/gdi32/mapping.c
+++ b/dlls/gdi32/mapping.c
@@ -62,20 +62,20 @@ static void MAPPING_FixIsotropic( DC * dc )
{
SIZE virtual_size = get_dc_virtual_size( dc );
SIZE virtual_res = get_dc_virtual_res( dc );
- double xdim = fabs((double)dc->vportExtX * virtual_size.cx / (virtual_res.cx * dc->wndExtX));
- double ydim = fabs((double)dc->vportExtY * virtual_size.cy / (virtual_res.cy * dc->wndExtY));
+ double xdim = fabs((double)dc->vport_ext.cx * virtual_size.cx / (virtual_res.cx * dc->wnd_ext.cx));
+ double ydim = fabs((double)dc->vport_ext.cy * virtual_size.cy / (virtual_res.cy * dc->wnd_ext.cy));
if (xdim > ydim)
{
- INT mincx = (dc->vportExtX >= 0) ? 1 : -1;
- dc->vportExtX = floor(dc->vportExtX * ydim / xdim + 0.5);
- if (!dc->vportExtX) dc->vportExtX = mincx;
+ INT mincx = (dc->vport_ext.cx >= 0) ? 1 : -1;
+ dc->vport_ext.cx = floor(dc->vport_ext.cx * ydim / xdim + 0.5);
+ if (!dc->vport_ext.cx) dc->vport_ext.cx = mincx;
}
else
{
- INT mincy = (dc->vportExtY >= 0) ? 1 : -1;
- dc->vportExtY = floor(dc->vportExtY * xdim / ydim + 0.5);
- if (!dc->vportExtY) dc->vportExtY = mincy;
+ INT mincy = (dc->vport_ext.cy >= 0) ? 1 : -1;
+ dc->vport_ext.cy = floor(dc->vport_ext.cy * xdim / ydim + 0.5);
+ if (!dc->vport_ext.cy) dc->vport_ext.cy = mincy;
}
}
@@ -89,12 +89,10 @@ BOOL nulldrv_OffsetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
DC *dc = get_nulldrv_dc( dev );
if (pt)
- {
- pt->x = dc->vportOrgX;
- pt->y = dc->vportOrgY;
- }
- dc->vportOrgX += x;
- dc->vportOrgY += y;
+ *pt = dc->vport_org;
+
+ dc->vport_org.x += x;
+ dc->vport_org.y += y;
DC_UpdateXforms( dc );
return TRUE;
}
@@ -104,12 +102,10 @@ BOOL nulldrv_OffsetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
DC *dc = get_nulldrv_dc( dev );
if (pt)
- {
- pt->x = dc->wndOrgX;
- pt->y = dc->wndOrgY;
- }
- dc->wndOrgX += x;
- dc->wndOrgY += y;
+ *pt = dc->wnd_org;
+
+ dc->wnd_org.x += x;
+ dc->wnd_org.y += y;
DC_UpdateXforms( dc );
return TRUE;
}
@@ -119,17 +115,15 @@ BOOL nulldrv_ScaleViewportExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_num,
DC *dc = get_nulldrv_dc( dev );
if (size)
- {
- size->cx = dc->vportExtX;
- size->cy = dc->vportExtY;
- }
+ *size = dc->vport_ext;
+
if (dc->MapMode != MM_ISOTROPIC && dc->MapMode != MM_ANISOTROPIC) return TRUE;
if (!x_num || !x_denom || !y_num || !y_denom) return FALSE;
- dc->vportExtX = (dc->vportExtX * x_num) / x_denom;
- dc->vportExtY = (dc->vportExtY * y_num) / y_denom;
- if (dc->vportExtX == 0) dc->vportExtX = 1;
- if (dc->vportExtY == 0) dc->vportExtY = 1;
+ dc->vport_ext.cx = (dc->vport_ext.cx * x_num) / x_denom;
+ dc->vport_ext.cy = (dc->vport_ext.cy * y_num) / y_denom;
+ if (dc->vport_ext.cx == 0) dc->vport_ext.cx = 1;
+ if (dc->vport_ext.cy == 0) dc->vport_ext.cy = 1;
if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
DC_UpdateXforms( dc );
return TRUE;
@@ -140,17 +134,15 @@ BOOL nulldrv_ScaleWindowExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_num, I
DC *dc = get_nulldrv_dc( dev );
if (size)
- {
- size->cx = dc->wndExtX;
- size->cy = dc->wndExtY;
- }
+ *size = dc->wnd_ext;
+
if (dc->MapMode != MM_ISOTROPIC && dc->MapMode != MM_ANISOTROPIC) return TRUE;
if (!x_num || !x_denom || !y_num || !y_denom) return FALSE;
- dc->wndExtX = (dc->wndExtX * x_num) / x_denom;
- dc->wndExtY = (dc->wndExtY * y_num) / y_denom;
- if (dc->wndExtX == 0) dc->wndExtX = 1;
- if (dc->wndExtY == 0) dc->wndExtY = 1;
+ dc->wnd_ext.cx = (dc->wnd_ext.cx * x_num) / x_denom;
+ dc->wnd_ext.cy = (dc->wnd_ext.cy * y_num) / y_denom;
+ if (dc->wnd_ext.cx == 0) dc->wnd_ext.cx = 1;
+ if (dc->wnd_ext.cy == 0) dc->wnd_ext.cy = 1;
if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
DC_UpdateXforms( dc );
return TRUE;
@@ -169,41 +161,41 @@ INT nulldrv_SetMapMode( PHYSDEV dev, INT mode )
switch (mode)
{
case MM_TEXT:
- dc->wndExtX = 1;
- dc->wndExtY = 1;
- dc->vportExtX = 1;
- dc->vportExtY = 1;
+ dc->wnd_ext.cx = 1;
+ dc->wnd_ext.cy = 1;
+ dc->vport_ext.cx = 1;
+ dc->vport_ext.cy = 1;
break;
case MM_LOMETRIC:
case MM_ISOTROPIC:
- dc->wndExtX = virtual_size.cx * 10;
- dc->wndExtY = virtual_size.cy * 10;
- dc->vportExtX = virtual_res.cx;
- dc->vportExtY = -virtual_res.cy;
+ dc->wnd_ext.cx = virtual_size.cx * 10;
+ dc->wnd_ext.cy = virtual_size.cy * 10;
+ dc->vport_ext.cx = virtual_res.cx;
+ dc->vport_ext.cy = -virtual_res.cy;
break;
case MM_HIMETRIC:
- dc->wndExtX = virtual_size.cx * 100;
- dc->wndExtY = virtual_size.cy * 100;
- dc->vportExtX = virtual_res.cx;
- dc->vportExtY = -virtual_res.cy;
+ dc->wnd_ext.cx = virtual_size.cx * 100;
+ dc->wnd_ext.cy = virtual_size.cy * 100;
+ dc->vport_ext.cx = virtual_res.cx;
+ dc->vport_ext.cy = -virtual_res.cy;
break;
case MM_LOENGLISH:
- dc->wndExtX = MulDiv(1000, virtual_size.cx, 254);
- dc->wndExtY = MulDiv(1000, virtual_size.cy, 254);
- dc->vportExtX = virtual_res.cx;
- dc->vportExtY = -virtual_res.cy;
+ dc->wnd_ext.cx = MulDiv(1000, virtual_size.cx, 254);
+ dc->wnd_ext.cy = MulDiv(1000, virtual_size.cy, 254);
+ dc->vport_ext.cx = virtual_res.cx;
+ dc->vport_ext.cy = -virtual_res.cy;
break;
case MM_HIENGLISH:
- dc->wndExtX = MulDiv(10000, virtual_size.cx, 254);
- dc->wndExtY = MulDiv(10000, virtual_size.cy, 254);
- dc->vportExtX = virtual_res.cx;
- dc->vportExtY = -virtual_res.cy;
+ dc->wnd_ext.cx = MulDiv(10000, virtual_size.cx, 254);
+ dc->wnd_ext.cy = MulDiv(10000, virtual_size.cy, 254);
+ dc->vport_ext.cx = virtual_res.cx;
+ dc->vport_ext.cy = -virtual_res.cy;
break;
case MM_TWIPS:
- dc->wndExtX = MulDiv(14400, virtual_size.cx, 254);
- dc->wndExtY = MulDiv(14400, virtual_size.cy, 254);
- dc->vportExtX = virtual_res.cx;
- dc->vportExtY = -virtual_res.cy;
+ dc->wnd_ext.cx = MulDiv(14400, virtual_size.cx, 254);
+ dc->wnd_ext.cy = MulDiv(14400, virtual_size.cy, 254);
+ dc->vport_ext.cx = virtual_res.cx;
+ dc->vport_ext.cy = -virtual_res.cy;
break;
case MM_ANISOTROPIC:
break;
@@ -221,14 +213,12 @@ BOOL nulldrv_SetViewportExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size )
DC *dc = get_nulldrv_dc( dev );
if (size)
- {
- size->cx = dc->vportExtX;
- size->cy = dc->vportExtY;
- }
+ *size = dc->vport_ext;
+
if (dc->MapMode != MM_ISOTROPIC && dc->MapMode != MM_ANISOTROPIC) return TRUE;
if (!cx || !cy) return FALSE;
- dc->vportExtX = cx;
- dc->vportExtY = cy;
+ dc->vport_ext.cx = cx;
+ dc->vport_ext.cy = cy;
if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
DC_UpdateXforms( dc );
return TRUE;
@@ -239,12 +229,10 @@ BOOL nulldrv_SetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
DC *dc = get_nulldrv_dc( dev );
if (pt)
- {
- pt->x = dc->vportOrgX;
- pt->y = dc->vportOrgY;
- }
- dc->vportOrgX = x;
- dc->vportOrgY = y;
+ *pt = dc->vport_org;
+
+ dc->vport_org.x = x;
+ dc->vport_org.y = y;
DC_UpdateXforms( dc );
return TRUE;
}
@@ -254,14 +242,12 @@ BOOL nulldrv_SetWindowExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size )
DC *dc = get_nulldrv_dc( dev );
if (size)
- {
- size->cx = dc->wndExtX;
- size->cy = dc->wndExtY;
- }
+ *size = dc->wnd_ext;
+
if (dc->MapMode != MM_ISOTROPIC && dc->MapMode != MM_ANISOTROPIC) return TRUE;
if (!cx || !cy) return FALSE;
- dc->wndExtX = cx;
- dc->wndExtY = cy;
+ dc->wnd_ext.cx = cx;
+ dc->wnd_ext.cy = cy;
/* The API docs say that you should call SetWindowExtEx before
SetViewportExtEx. This advice does not imply that Windows
doesn't ensure the isotropic mapping after SetWindowExtEx! */
@@ -275,12 +261,10 @@ BOOL nulldrv_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt )
DC *dc = get_nulldrv_dc( dev );
if (pt)
- {
- pt->x = dc->wndOrgX;
- pt->y = dc->wndOrgY;
- }
- dc->wndOrgX = x;
- dc->wndOrgY = y;
+ *pt = dc->wnd_org;
+
+ dc->wnd_org.x = x;
+ dc->wnd_org.y = y;
DC_UpdateXforms( dc );
return TRUE;
}
diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c
index 4d8c9f1..1ddaaf6 100644
--- a/dlls/gdi32/painting.c
+++ b/dlls/gdi32/painting.c
@@ -240,9 +240,10 @@ BOOL WINAPI LineTo( HDC hdc, INT x, INT y )
physdev = GET_DC_PHYSDEV( dc, pLineTo );
ret = physdev->funcs->pLineTo( physdev, x, y );
- if(ret) {
- dc->CursPosX = x;
- dc->CursPosY = y;
+ if(ret)
+ {
+ dc->cur_pos.x = x;
+ dc->cur_pos.y = y;
}
release_dc_ptr( dc );
return ret;
@@ -260,12 +261,11 @@ BOOL WINAPI MoveToEx( HDC hdc, INT x, INT y, LPPOINT pt )
if(!dc) return FALSE;
- if(pt) {
- pt->x = dc->CursPosX;
- pt->y = dc->CursPosY;
- }
- dc->CursPosX = x;
- dc->CursPosY = y;
+ if(pt)
+ *pt = dc->cur_pos;
+
+ dc->cur_pos.x = x;
+ dc->cur_pos.y = y;
physdev = GET_DC_PHYSDEV( dc, pMoveTo );
ret = physdev->funcs->pMoveTo( physdev, x, y );
@@ -318,11 +318,12 @@ BOOL WINAPI ArcTo( HDC hdc,
physdev = GET_DC_PHYSDEV( dc, pArcTo );
result = physdev->funcs->pArcTo( physdev, left, top, right, bottom, xstart, ystart, xend, yend );
- if (result) {
+ if (result)
+ {
angle = atan2(((yend-ycenter)/height),
((xend-xcenter)/width));
- dc->CursPosX = GDI_ROUND(xcenter+(cos(angle)*xradius));
- dc->CursPosY = GDI_ROUND(ycenter+(sin(angle)*yradius));
+ dc->cur_pos.x = GDI_ROUND( xcenter + (cos( angle ) * xradius) );
+ dc->cur_pos.y = GDI_ROUND( ycenter + (sin( angle ) * yradius) );
}
release_dc_ptr( dc );
return result;
@@ -627,10 +628,8 @@ BOOL WINAPI PolylineTo( HDC hdc, const POINT* pt, DWORD cCount )
ret = physdev->funcs->pPolylineTo( physdev, pt, cCount );
if (ret && cCount)
- {
- dc->CursPosX = pt[cCount-1].x;
- dc->CursPosY = pt[cCount-1].y;
- }
+ dc->cur_pos = pt[cCount - 1];
+
release_dc_ptr( dc );
return ret;
}
@@ -779,10 +778,9 @@ BOOL WINAPI PolyBezierTo( HDC hdc, const POINT* lppt, DWORD cPoints )
physdev = GET_DC_PHYSDEV( dc, pPolyBezierTo );
ret = physdev->funcs->pPolyBezierTo( physdev, lppt, cPoints );
- if(ret) {
- dc->CursPosX = lppt[cPoints-1].x;
- dc->CursPosY = lppt[cPoints-1].y;
- }
+ if(ret)
+ dc->cur_pos = lppt[cPoints - 1];
+
release_dc_ptr( dc );
return ret;
}
@@ -806,9 +804,10 @@ BOOL WINAPI AngleArc(HDC hdc, INT x, INT y, DWORD dwRadius, FLOAT eStartAngle, F
physdev = GET_DC_PHYSDEV( dc, pAngleArc );
result = physdev->funcs->pAngleArc( physdev, x, y, dwRadius, eStartAngle, eSweepAngle );
- if (result) {
- dc->CursPosX = GDI_ROUND( x + cos((eStartAngle+eSweepAngle)*M_PI/180) * dwRadius );
- dc->CursPosY = GDI_ROUND( y - sin((eStartAngle+eSweepAngle)*M_PI/180) * dwRadius );
+ if (result)
+ {
+ dc->cur_pos.x = GDI_ROUND( x + cos( (eStartAngle + eSweepAngle) * M_PI / 180 ) * dwRadius );
+ dc->cur_pos.y = GDI_ROUND( y - sin( (eStartAngle + eSweepAngle) * M_PI / 180 ) * dwRadius );
}
release_dc_ptr( dc );
return result;
@@ -830,10 +829,8 @@ BOOL WINAPI PolyDraw(HDC hdc, const POINT *lppt, const BYTE *lpbTypes,
physdev = GET_DC_PHYSDEV( dc, pPolyDraw );
result = physdev->funcs->pPolyDraw( physdev, lppt, lpbTypes, cCount );
if (result && cCount)
- {
- dc->CursPosX = lppt[cCount - 1].x;
- dc->CursPosY = lppt[cCount - 1].y;
- }
+ dc->cur_pos = lppt[cCount - 1];
+
release_dc_ptr( dc );
return result;
}
diff --git a/dlls/gdi32/path.c b/dlls/gdi32/path.c
index 558bcf7..2126dab 100644
--- a/dlls/gdi32/path.c
+++ b/dlls/gdi32/path.c
@@ -2016,8 +2016,7 @@ BOOL nulldrv_BeginPath( PHYSDEV dev )
}
physdev = get_path_physdev( find_dc_driver( dc, &path_driver ));
physdev->path = path;
- path->pos.x = dc->CursPosX;
- path->pos.y = dc->CursPosY;
+ path->pos = dc->cur_pos;
LPtoDP( dev->hdc, &path->pos, 1 );
if (dc->path) free_gdi_path( dc->path );
dc->path = NULL;
diff --git a/dlls/gdi32/tests/brush.c b/dlls/gdi32/tests/brush.c
index 9026a4a..1a10429 100644
--- a/dlls/gdi32/tests/brush.c
+++ b/dlls/gdi32/tests/brush.c
@@ -23,6 +23,7 @@
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
+#include "winuser.h"
#include "wine/test.h"
@@ -343,10 +344,28 @@ static void test_palette_brush(void)
DeleteObject( palette2 );
}
+static void test_brush_org( void )
+{
+ HDC hdc = GetDC( 0 );
+ POINT old, pt;
+
+ SetBrushOrgEx( hdc, 0, 0, &old );
+
+ SetBrushOrgEx( hdc, 1, 1, &pt );
+ ok( pt.x == 0 && pt.y == 0, "got %d,%d\n", pt.x, pt.y );
+ SetBrushOrgEx( hdc, 0x10000, -1, &pt );
+ ok( pt.x == 1 && pt.y == 1, "got %d,%d\n", pt.x, pt.y );
+ SetBrushOrgEx( hdc, old.x, old.y, &pt );
+ ok( pt.x == 0x10000 && pt.y == -1, "got %d,%d\n", pt.x, pt.y );
+
+ ReleaseDC( 0, hdc );
+}
+
START_TEST(brush)
{
test_solidbrush();
test_hatch_brush();
test_pattern_brush();
test_palette_brush();
+ test_brush_org();
}
--
2.7.4
More information about the wine-patches
mailing list