Module: wine Branch: master Commit: a52167e76241cc6719255e1b4454a8bf0f17649c URL: https://gitlab.winehq.org/wine/wine/-/commit/a52167e76241cc6719255e1b4454a8b...
Author: Piotr Caban piotr@codeweavers.com Date: Fri May 5 20:35:14 2023 +0200
wineps: Move EnumFonts implementation to unixlib.
---
dlls/wineps.drv/builtin.c | 80 --------------------------------------------- dlls/wineps.drv/init.c | 1 - dlls/wineps.drv/printproc.c | 6 ---- dlls/wineps.drv/psdrv.h | 1 - dlls/wineps.drv/unixlib.c | 78 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 88 deletions(-)
diff --git a/dlls/wineps.drv/builtin.c b/dlls/wineps.drv/builtin.c index 5100539764d..f661aeaa591 100644 --- a/dlls/wineps.drv/builtin.c +++ b/dlls/wineps.drv/builtin.c @@ -374,83 +374,3 @@ BOOL CDECL PSDRV_GetCharWidth(PHYSDEV dev, UINT first, UINT count, const WCHAR *
return TRUE; } - - -/*********************************************************************** - * PSDRV_GetFontMetric - */ -static UINT PSDRV_GetFontMetric(HDC hdc, const AFM *afm, - NEWTEXTMETRICEXW *ntmx, ENUMLOGFONTEXW *elfx) -{ - /* ntmx->ntmTm is NEWTEXTMETRICW; compatible w/ TEXTMETRICW per Win32 doc */ - - TEXTMETRICW *tm = (TEXTMETRICW *)&(ntmx->ntmTm); - LOGFONTW *lf = &(elfx->elfLogFont); - PSFONT font; - - memset(ntmx, 0, sizeof(*ntmx)); - memset(elfx, 0, sizeof(*elfx)); - - ScaleFont(afm, -(LONG)(afm->WinMetrics.usUnitsPerEm), &font, tm); - - lf->lfHeight = tm->tmHeight; - lf->lfWidth = tm->tmAveCharWidth; - lf->lfWeight = tm->tmWeight; - lf->lfItalic = tm->tmItalic; - lf->lfCharSet = tm->tmCharSet; - - lf->lfPitchAndFamily = (afm->IsFixedPitch) ? FIXED_PITCH : VARIABLE_PITCH; - - lstrcpynW(lf->lfFaceName, afm->FamilyName, LF_FACESIZE); - - return DEVICE_FONTTYPE; -} - -/*********************************************************************** - * PSDRV_EnumFonts - */ -BOOL CDECL PSDRV_EnumFonts( PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc, LPARAM lp ) -{ - PSDRV_PDEVICE *physDev = get_psdrv_dev( dev ); - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pEnumFonts ); - ENUMLOGFONTEXW lf; - NEWTEXTMETRICEXW tm; - BOOL ret; - AFMLISTENTRY *afmle; - FONTFAMILY *family; - - ret = next->funcs->pEnumFonts( next, plf, proc, lp ); - if (!ret) return FALSE; - - if( plf && plf->lfFaceName[0] ) { - TRACE("lfFaceName = %s\n", debugstr_w(plf->lfFaceName)); - for(family = physDev->pi->Fonts; family; family = family->next) { - if(!wcsncmp(plf->lfFaceName, family->FamilyName, - wcslen(family->FamilyName))) - break; - } - if(family) { - for(afmle = family->afmlist; afmle; afmle = afmle->next) { - UINT fm; - - TRACE("Got '%s'\n", afmle->afm->FontName); - fm = PSDRV_GetFontMetric( dev->hdc, afmle->afm, &tm, &lf ); - if (!(ret = (*proc)( &lf.elfLogFont, (TEXTMETRICW *)&tm, fm, lp ))) - break; - } - } - } else { - - TRACE("lfFaceName = NULL\n"); - for(family = physDev->pi->Fonts; family; family = family->next) { - UINT fm; - - afmle = family->afmlist; - TRACE("Got '%s'\n", afmle->afm->FontName); - fm = PSDRV_GetFontMetric( dev->hdc, afmle->afm, &tm, &lf ); - if (!(ret = (*proc)( &lf.elfLogFont, (TEXTMETRICW *)&tm, fm, lp ))) - break; - } - } - return ret; -} diff --git a/dlls/wineps.drv/init.c b/dlls/wineps.drv/init.c index a33ec19e741..576021c6b1e 100644 --- a/dlls/wineps.drv/init.c +++ b/dlls/wineps.drv/init.c @@ -693,7 +693,6 @@ static struct gdi_dc_funcs psdrv_funcs = .pCreateCompatibleDC = PSDRV_CreateCompatibleDC, .pCreateDC = PSDRV_CreateDC, .pDeleteDC = PSDRV_DeleteDC, - .pEnumFonts = PSDRV_EnumFonts, .pGetCharWidth = PSDRV_GetCharWidth, .pGetTextExtentExPoint = PSDRV_GetTextExtentExPoint, .pGetTextMetrics = PSDRV_GetTextMetrics, diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index d7f9ab65369..bd4e79bb96f 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -155,11 +155,6 @@ static struct pp_data* get_handle_data(HANDLE pp) return ret; }
-static BOOL CDECL font_EnumFonts(PHYSDEV dev, LOGFONTW *lf, FONTENUMPROCW proc, LPARAM lp) -{ - return EnumFontFamiliesExW(dev->hdc, lf, proc, lp, 0); -} - static BOOL CDECL font_GetCharWidth(PHYSDEV dev, UINT first, UINT count, const WCHAR *chars, INT *buffer) { XFORM old, xform = { .eM11 = 1.0f }; @@ -204,7 +199,6 @@ static HFONT CDECL font_SelectFont(PHYSDEV dev, HFONT hfont, UINT *aa_flags)
static const struct gdi_dc_funcs font_funcs = { - .pEnumFonts = font_EnumFonts, .pGetCharWidth = font_GetCharWidth, .pGetTextExtentExPoint = font_GetTextExtentExPoint, .pGetTextMetrics = font_GetTextMetrics, diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index 038798df9eb..add30651043 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -429,7 +429,6 @@ extern BOOL CDECL PSDRV_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bo extern BOOL CDECL PSDRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom) DECLSPEC_HIDDEN; extern INT CDECL PSDRV_EndDoc( PHYSDEV dev ) DECLSPEC_HIDDEN; extern INT CDECL PSDRV_EndPage( PHYSDEV dev ) DECLSPEC_HIDDEN; -extern BOOL CDECL PSDRV_EnumFonts( PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc, LPARAM lp ) DECLSPEC_HIDDEN; extern INT CDECL PSDRV_ExtEscape( PHYSDEV dev, INT nEscape, INT cbInput, LPCVOID in_data, INT cbOutput, LPVOID out_data ) DECLSPEC_HIDDEN; extern BOOL CDECL PSDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, diff --git a/dlls/wineps.drv/unixlib.c b/dlls/wineps.drv/unixlib.c index 859d612320c..1dd9aafadb0 100644 --- a/dlls/wineps.drv/unixlib.c +++ b/dlls/wineps.drv/unixlib.c @@ -1056,6 +1056,83 @@ static HFONT CDECL select_font(PHYSDEV dev, HFONT hfont, UINT *aa_flags) return hfont; }
+static UINT get_font_metric(HDC hdc, const AFM *afm, + NEWTEXTMETRICEXW *ntmx, ENUMLOGFONTEXW *elfx) +{ + /* ntmx->ntmTm is NEWTEXTMETRICW; compatible w/ TEXTMETRICW per Win32 doc */ + TEXTMETRICW *tm = (TEXTMETRICW *)&(ntmx->ntmTm); + LOGFONTW *lf = &(elfx->elfLogFont); + PSFONT font; + + memset(ntmx, 0, sizeof(*ntmx)); + memset(elfx, 0, sizeof(*elfx)); + + scale_font(afm, -(LONG)afm->WinMetrics.usUnitsPerEm, &font, tm); + + lf->lfHeight = tm->tmHeight; + lf->lfWidth = tm->tmAveCharWidth; + lf->lfWeight = tm->tmWeight; + lf->lfItalic = tm->tmItalic; + lf->lfCharSet = tm->tmCharSet; + + lf->lfPitchAndFamily = afm->IsFixedPitch ? FIXED_PITCH : VARIABLE_PITCH; + + lstrcpynW(lf->lfFaceName, afm->FamilyName, LF_FACESIZE); + return DEVICE_FONTTYPE; +} + +static BOOL CDECL enum_fonts(PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc, LPARAM lp) +{ + PSDRV_PDEVICE *pdev = get_psdrv_dev(dev); + PHYSDEV next = GET_NEXT_PHYSDEV(dev, pEnumFonts); + ENUMLOGFONTEXW lf; + NEWTEXTMETRICEXW tm; + BOOL ret; + AFMLISTENTRY *afmle; + FONTFAMILY *family; + + ret = next->funcs->pEnumFonts(next, plf, proc, lp); + if (!ret) return FALSE; + + if (plf && plf->lfFaceName[0]) + { + TRACE("lfFaceName = %s\n", debugstr_w(plf->lfFaceName)); + for (family = pdev->pi->Fonts; family; family = family->next) + { + if (!wcsncmp(plf->lfFaceName, family->FamilyName, + wcslen(family->FamilyName))) + break; + } + if (family) + { + for (afmle = family->afmlist; afmle; afmle = afmle->next) + { + UINT fm; + + TRACE("Got '%s'\n", afmle->afm->FontName); + fm = get_font_metric(dev->hdc, afmle->afm, &tm, &lf); + if (!(ret = (*proc)(&lf.elfLogFont, (TEXTMETRICW *)&tm, fm, lp))) + break; + } + } + } + else + { + TRACE("lfFaceName = NULL\n"); + for (family = pdev->pi->Fonts; family; family = family->next) + { + UINT fm; + + afmle = family->afmlist; + TRACE("Got '%s'\n", afmle->afm->FontName); + fm = get_font_metric(dev->hdc, afmle->afm, &tm, &lf); + if (!(ret = (*proc)(&lf.elfLogFont, (TEXTMETRICW *)&tm, fm, lp))) + break; + } + } + return ret; +} + static NTSTATUS init_dc(void *arg) { struct init_dc_params *params = arg; @@ -1064,6 +1141,7 @@ static NTSTATUS init_dc(void *arg) params->funcs->pResetDC = reset_dc; params->funcs->pExtEscape = ext_escape; params->funcs->pSelectFont = select_font; + params->funcs->pEnumFonts = enum_fonts; return TRUE; }