From ca07de0ed5f6da42db9eda8df90721aaa4d51edb Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 5 Aug 2021 11:26:13 +0200 Subject: [PATCH] gdi32: Store char_extra in DC_ATTR. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/gdi32/dc.c | 5 ++--- dlls/gdi32/font.c | 28 ++++++++-------------------- dlls/gdi32/gdidc.c | 9 +++++++++ dlls/gdi32/ntgdi_private.h | 1 - include/ntgdi.h | 1 + 5 files changed, 20 insertions(+), 24 deletions(-) diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index be3c2e741c4..5f2f129532c 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -95,7 +95,7 @@ static void set_initial_dc_state( DC *dc ) dc->attr->brush_org.y = 0; dc->mapperFlags = 0; dc->attr->text_align = TA_LEFT | TA_TOP | TA_NOUPDATECP; - dc->charExtra = 0; + dc->attr->char_extra = 0; dc->breakExtra = 0; dc->breakRem = 0; dc->attr->map_mode = MM_TEXT; @@ -413,7 +413,7 @@ BOOL CDECL nulldrv_RestoreDC( PHYSDEV dev, INT level ) dc->attr->brush_org = dcs->attr->brush_org; dc->mapperFlags = dcs->mapperFlags; dc->attr->text_align = dcs->attr->text_align; - dc->charExtra = dcs->charExtra; + dc->attr->char_extra = dcs->attr->char_extra; dc->breakExtra = dcs->breakExtra; dc->breakRem = dcs->breakRem; dc->attr->map_mode = dcs->attr->map_mode; @@ -545,7 +545,6 @@ INT WINAPI NtGdiSaveDC( HDC hdc ) newdc->hBitmap = dc->hBitmap; newdc->hPalette = dc->hPalette; newdc->mapperFlags = dc->mapperFlags; - newdc->charExtra = dc->charExtra; newdc->breakExtra = dc->breakExtra; newdc->breakRem = dc->breakRem; newdc->xformWorld2Wnd = dc->xformWorld2Wnd; diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 039976dbc16..2590a30c10b 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -4735,20 +4735,6 @@ INT WINAPI EnumFontsW( HDC hDC, LPCWSTR lpName, FONTENUMPROCW efproc, } -/*********************************************************************** - * GetTextCharacterExtra (GDI32.@) - */ -INT WINAPI GetTextCharacterExtra( HDC hdc ) -{ - INT ret; - DC *dc = get_dc_ptr( hdc ); - if (!dc) return 0x80000000; - ret = dc->charExtra; - release_dc_ptr( dc ); - return ret; -} - - /*********************************************************************** * SetTextCharacterExtra (GDI32.@) */ @@ -4763,8 +4749,8 @@ INT WINAPI SetTextCharacterExtra( HDC hdc, INT extra ) extra = physdev->funcs->pSetTextCharacterExtra( physdev, extra ); if (extra != 0x80000000) { - ret = dc->charExtra; - dc->charExtra = extra; + ret = dc->attr->char_extra; + dc->attr->char_extra = extra; } release_dc_ptr( dc ); } @@ -4943,14 +4929,15 @@ BOOL WINAPI GetTextExtentExPointI( HDC hdc, const WORD *indices, INT count, INT { for (i = 0; i < count; i++) { - unsigned int dx = abs( INTERNAL_XDSTOWS( dc, pos[i] )) + (i + 1) * dc->charExtra; + unsigned int dx = abs( INTERNAL_XDSTOWS( dc, pos[i] )) + + (i + 1) * dc->attr->char_extra; if (nfit && dx > (unsigned int)max_ext) break; if (dxs) dxs[i] = dx; } if (nfit) *nfit = i; } - size->cx = abs( INTERNAL_XDSTOWS( dc, size->cx )) + count * dc->charExtra; + size->cx = abs( INTERNAL_XDSTOWS( dc, size->cx )) + count * dc->attr->char_extra; size->cy = abs( INTERNAL_YDSTOWS( dc, size->cy )); } @@ -5080,14 +5067,15 @@ BOOL WINAPI GetTextExtentExPointW( HDC hdc, LPCWSTR str, INT count, INT max_ext, { for (i = 0; i < count; i++) { - unsigned int dx = abs( INTERNAL_XDSTOWS( dc, pos[i] )) + (i + 1) * dc->charExtra; + unsigned int dx = abs( INTERNAL_XDSTOWS( dc, pos[i] )) + + (i + 1) * dc->attr->char_extra; if (nfit && dx > (unsigned int)max_ext) break; if (dxs) dxs[i] = dx; } if (nfit) *nfit = i; } - size->cx = abs( INTERNAL_XDSTOWS( dc, size->cx )) + count * dc->charExtra; + size->cx = abs( INTERNAL_XDSTOWS( dc, size->cx )) + count * dc->attr->char_extra; size->cy = abs( INTERNAL_YDSTOWS( dc, size->cy )); } diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c index adef8f45aeb..0c2d794a576 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -305,6 +305,15 @@ INT WINAPI SetMapMode( HDC hdc, INT mode ) return NtGdiGetAndSetDCDword( hdc, NtGdiSetMapMode, mode, &ret ) ? ret : 0; } +/*********************************************************************** + * GetTextCharacterExtra (GDI32.@) + */ +INT WINAPI GetTextCharacterExtra( HDC hdc ) +{ + DC_ATTR *dc_attr = get_dc_attr( hdc ); + return dc_attr ? dc_attr->char_extra : 0x80000000; +} + /*********************************************************************** * GetPolyFillMode (GDI32.@) */ diff --git a/dlls/gdi32/ntgdi_private.h b/dlls/gdi32/ntgdi_private.h index 7270a158942..bf100ea4248 100644 --- a/dlls/gdi32/ntgdi_private.h +++ b/dlls/gdi32/ntgdi_private.h @@ -111,7 +111,6 @@ typedef struct tagDC UINT font_code_page; DWORD mapperFlags; /* Font mapper flags */ - INT charExtra; /* Spacing from SetTextCharacterExtra() */ INT breakExtra; /* breakTotalExtra / breakCount */ INT breakRem; /* breakTotalExtra % breakCount */ ABORTPROC pAbortProc; /* AbortProc for Printing */ diff --git a/include/ntgdi.h b/include/ntgdi.h index 8eb5562db80..7c183caf99f 100644 --- a/include/ntgdi.h +++ b/include/ntgdi.h @@ -125,6 +125,7 @@ typedef struct DC_ATTR WORD rel_abs_mode; WORD stretch_blt_mode; INT map_mode; + INT char_extra; RECT vis_rect; /* visible rectangle in screen coords */ FLOAT miter_limit; POINT brush_org; /* brush origin */