gdi32: Store map mode in DC_ATTR.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-07-29 13:22:04 +01:00 committed by Alexandre Julliard
parent 7517fdf229
commit 43a605cc9b
7 changed files with 28 additions and 35 deletions

View File

@ -98,7 +98,7 @@ static void set_initial_dc_state( DC *dc )
dc->charExtra = 0; dc->charExtra = 0;
dc->breakExtra = 0; dc->breakExtra = 0;
dc->breakRem = 0; dc->breakRem = 0;
dc->MapMode = MM_TEXT; dc->attr->map_mode = MM_TEXT;
dc->attr->graphics_mode = GM_COMPATIBLE; dc->attr->graphics_mode = GM_COMPATIBLE;
dc->attr->cur_pos.x = 0; dc->attr->cur_pos.x = 0;
dc->attr->cur_pos.y = 0; dc->attr->cur_pos.y = 0;
@ -405,7 +405,6 @@ INT CDECL nulldrv_SaveDC( PHYSDEV dev )
newdc->charExtra = dc->charExtra; newdc->charExtra = dc->charExtra;
newdc->breakExtra = dc->breakExtra; newdc->breakExtra = dc->breakExtra;
newdc->breakRem = dc->breakRem; newdc->breakRem = dc->breakRem;
newdc->MapMode = dc->MapMode;
newdc->xformWorld2Wnd = dc->xformWorld2Wnd; newdc->xformWorld2Wnd = dc->xformWorld2Wnd;
newdc->xformWorld2Vport = dc->xformWorld2Vport; newdc->xformWorld2Vport = dc->xformWorld2Vport;
newdc->xformVport2World = dc->xformVport2World; newdc->xformVport2World = dc->xformVport2World;
@ -479,9 +478,9 @@ BOOL CDECL nulldrv_RestoreDC( PHYSDEV dev, INT level )
dc->charExtra = dcs->charExtra; dc->charExtra = dcs->charExtra;
dc->breakExtra = dcs->breakExtra; dc->breakExtra = dcs->breakExtra;
dc->breakRem = dcs->breakRem; dc->breakRem = dcs->breakRem;
dc->MapMode = dcs->MapMode; dc->attr->map_mode = dcs->attr->map_mode;
dc->attr->graphics_mode = dcs->attr->graphics_mode; dc->attr->graphics_mode = dcs->attr->graphics_mode;
dc->attr->cur_pos = dcs->attr->cur_pos; dc->attr->cur_pos = dcs->attr->cur_pos;
dc->attr->arc_direction = dcs->attr->arc_direction; dc->attr->arc_direction = dcs->attr->arc_direction;
dc->xformWorld2Wnd = dcs->xformWorld2Wnd; dc->xformWorld2Wnd = dcs->xformWorld2Wnd;
dc->xformWorld2Vport = dcs->xformWorld2Vport; dc->xformWorld2Vport = dcs->xformWorld2Vport;
@ -1392,22 +1391,6 @@ UINT WINAPI SetBoundsRect(HDC hdc, const RECT* rect, UINT flags)
} }
/***********************************************************************
* GetMapMode (GDI32.@)
*/
INT WINAPI GetMapMode( HDC hdc )
{
INT ret = 0;
DC * dc = get_dc_ptr( hdc );
if (dc)
{
ret = dc->MapMode;
release_dc_ptr( dc );
}
return ret;
}
/*********************************************************************** /***********************************************************************
* GetBrushOrgEx (GDI32.@) * GetBrushOrgEx (GDI32.@)
*/ */

View File

@ -799,7 +799,7 @@ static DWORD CDECL nulldrv_SetLayout( PHYSDEV dev, DWORD layout )
dc->attr->layout = layout; dc->attr->layout = layout;
if (layout != old_layout) if (layout != old_layout)
{ {
if (layout & LAYOUT_RTL) dc->MapMode = MM_ANISOTROPIC; if (layout & LAYOUT_RTL) dc->attr->map_mode = MM_ANISOTROPIC;
DC_UpdateXforms( dc ); DC_UpdateXforms( dc );
} }

View File

@ -5995,7 +5995,8 @@ BOOL WINAPI NtGdiExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *lpr
TRACE("%p, %d, %d, %08x, %s, %s, %d, %p)\n", hdc, x, y, flags, TRACE("%p, %d, %d, %08x, %s, %s, %d, %p)\n", hdc, x, y, flags,
wine_dbgstr_rect(lprect), debugstr_wn(str, count), count, lpDx); wine_dbgstr_rect(lprect), debugstr_wn(str, count), count, lpDx);
TRACE("align = %x bkmode = %x mapmode = %x\n", align, dc->attr->background_mode, dc->MapMode); TRACE("align = %x bkmode = %x mapmode = %x\n", align, dc->attr->background_mode,
dc->attr->map_mode);
if(align & TA_UPDATECP) if(align & TA_UPDATECP)
{ {

View File

@ -164,6 +164,15 @@ DWORD WINAPI GetLayout( HDC hdc )
return dc_attr ? dc_attr->layout : GDI_ERROR; return dc_attr ? dc_attr->layout : GDI_ERROR;
} }
/***********************************************************************
* GetMapMode (GDI32.@)
*/
INT WINAPI GetMapMode( HDC hdc )
{
DC_ATTR *dc_attr = get_dc_attr( hdc );
return dc_attr ? dc_attr->map_mode : 0;
}
/*********************************************************************** /***********************************************************************
* GetPolyFillMode (GDI32.@) * GetPolyFillMode (GDI32.@)
*/ */

View File

@ -117,14 +117,14 @@ BOOL CDECL nulldrv_ScaleViewportExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT
if (size) if (size)
*size = dc->vport_ext; *size = dc->vport_ext;
if (dc->MapMode != MM_ISOTROPIC && dc->MapMode != MM_ANISOTROPIC) return TRUE; if (dc->attr->map_mode != MM_ISOTROPIC && dc->attr->map_mode != MM_ANISOTROPIC) return TRUE;
if (!x_num || !x_denom || !y_num || !y_denom) return FALSE; if (!x_num || !x_denom || !y_num || !y_denom) return FALSE;
dc->vport_ext.cx = (dc->vport_ext.cx * x_num) / x_denom; dc->vport_ext.cx = (dc->vport_ext.cx * x_num) / x_denom;
dc->vport_ext.cy = (dc->vport_ext.cy * y_num) / y_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.cx == 0) dc->vport_ext.cx = 1;
if (dc->vport_ext.cy == 0) dc->vport_ext.cy = 1; if (dc->vport_ext.cy == 0) dc->vport_ext.cy = 1;
if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); if (dc->attr->map_mode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
DC_UpdateXforms( dc ); DC_UpdateXforms( dc );
return TRUE; return TRUE;
} }
@ -136,14 +136,14 @@ BOOL CDECL nulldrv_ScaleWindowExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_
if (size) if (size)
*size = dc->wnd_ext; *size = dc->wnd_ext;
if (dc->MapMode != MM_ISOTROPIC && dc->MapMode != MM_ANISOTROPIC) return TRUE; if (dc->attr->map_mode != MM_ISOTROPIC && dc->attr->map_mode != MM_ANISOTROPIC) return TRUE;
if (!x_num || !x_denom || !y_num || !y_denom) return FALSE; if (!x_num || !x_denom || !y_num || !y_denom) return FALSE;
dc->wnd_ext.cx = (dc->wnd_ext.cx * x_num) / x_denom; dc->wnd_ext.cx = (dc->wnd_ext.cx * x_num) / x_denom;
dc->wnd_ext.cy = (dc->wnd_ext.cy * y_num) / y_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.cx == 0) dc->wnd_ext.cx = 1;
if (dc->wnd_ext.cy == 0) dc->wnd_ext.cy = 1; if (dc->wnd_ext.cy == 0) dc->wnd_ext.cy = 1;
if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); if (dc->attr->map_mode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
DC_UpdateXforms( dc ); DC_UpdateXforms( dc );
return TRUE; return TRUE;
} }
@ -151,10 +151,10 @@ BOOL CDECL nulldrv_ScaleWindowExtEx( PHYSDEV dev, INT x_num, INT x_denom, INT y_
INT CDECL nulldrv_SetMapMode( PHYSDEV dev, INT mode ) INT CDECL nulldrv_SetMapMode( PHYSDEV dev, INT mode )
{ {
DC *dc = get_nulldrv_dc( dev ); DC *dc = get_nulldrv_dc( dev );
INT ret = dc->MapMode; INT ret = dc->attr->map_mode;
SIZE virtual_size, virtual_res; SIZE virtual_size, virtual_res;
if (mode == dc->MapMode && (mode == MM_ISOTROPIC || mode == MM_ANISOTROPIC)) return ret; if (mode == dc->attr->map_mode && (mode == MM_ISOTROPIC || mode == MM_ANISOTROPIC)) return ret;
virtual_size = get_dc_virtual_size( dc ); virtual_size = get_dc_virtual_size( dc );
virtual_res = get_dc_virtual_res( dc ); virtual_res = get_dc_virtual_res( dc );
@ -203,7 +203,7 @@ INT CDECL nulldrv_SetMapMode( PHYSDEV dev, INT mode )
return 0; return 0;
} }
/* RTL layout is always MM_ANISOTROPIC */ /* RTL layout is always MM_ANISOTROPIC */
if (!(dc->attr->layout & LAYOUT_RTL)) dc->MapMode = mode; if (!(dc->attr->layout & LAYOUT_RTL)) dc->attr->map_mode = mode;
DC_UpdateXforms( dc ); DC_UpdateXforms( dc );
return ret; return ret;
} }
@ -215,11 +215,11 @@ BOOL CDECL nulldrv_SetViewportExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size )
if (size) if (size)
*size = dc->vport_ext; *size = dc->vport_ext;
if (dc->MapMode != MM_ISOTROPIC && dc->MapMode != MM_ANISOTROPIC) return TRUE; if (dc->attr->map_mode != MM_ISOTROPIC && dc->attr->map_mode != MM_ANISOTROPIC) return TRUE;
if (!cx || !cy) return FALSE; if (!cx || !cy) return FALSE;
dc->vport_ext.cx = cx; dc->vport_ext.cx = cx;
dc->vport_ext.cy = cy; dc->vport_ext.cy = cy;
if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); if (dc->attr->map_mode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
DC_UpdateXforms( dc ); DC_UpdateXforms( dc );
return TRUE; return TRUE;
} }
@ -244,14 +244,14 @@ BOOL CDECL nulldrv_SetWindowExtEx( PHYSDEV dev, INT cx, INT cy, SIZE *size )
if (size) if (size)
*size = dc->wnd_ext; *size = dc->wnd_ext;
if (dc->MapMode != MM_ISOTROPIC && dc->MapMode != MM_ANISOTROPIC) return TRUE; if (dc->attr->map_mode != MM_ISOTROPIC && dc->attr->map_mode != MM_ANISOTROPIC) return TRUE;
if (!cx || !cy) return FALSE; if (!cx || !cy) return FALSE;
dc->wnd_ext.cx = cx; dc->wnd_ext.cx = cx;
dc->wnd_ext.cy = cy; dc->wnd_ext.cy = cy;
/* The API docs say that you should call SetWindowExtEx before /* The API docs say that you should call SetWindowExtEx before
SetViewportExtEx. This advice does not imply that Windows SetViewportExtEx. This advice does not imply that Windows
doesn't ensure the isotropic mapping after SetWindowExtEx! */ doesn't ensure the isotropic mapping after SetWindowExtEx! */
if (dc->MapMode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc ); if (dc->attr->map_mode == MM_ISOTROPIC) MAPPING_FixIsotropic( dc );
DC_UpdateXforms( dc ); DC_UpdateXforms( dc );
return TRUE; return TRUE;
} }

View File

@ -124,7 +124,6 @@ typedef struct tagDC
INT charExtra; /* Spacing from SetTextCharacterExtra() */ INT charExtra; /* Spacing from SetTextCharacterExtra() */
INT breakExtra; /* breakTotalExtra / breakCount */ INT breakExtra; /* breakTotalExtra / breakCount */
INT breakRem; /* breakTotalExtra % breakCount */ INT breakRem; /* breakTotalExtra % breakCount */
INT MapMode;
ABORTPROC pAbortProc; /* AbortProc for Printing */ ABORTPROC pAbortProc; /* AbortProc for Printing */
XFORM xformWorld2Wnd; /* World-to-window transformation */ XFORM xformWorld2Wnd; /* World-to-window transformation */
XFORM xformWorld2Vport; /* World-to-viewport transformation */ XFORM xformWorld2Vport; /* World-to-viewport transformation */

View File

@ -111,6 +111,7 @@ typedef struct DC_ATTR
WORD rop_mode; WORD rop_mode;
WORD rel_abs_mode; WORD rel_abs_mode;
WORD stretch_blt_mode; WORD stretch_blt_mode;
INT map_mode;
void *emf; void *emf;
} DC_ATTR; } DC_ATTR;