From b7392f5c2eafce35df94f115af8f7655e0ce4c02 Mon Sep 17 00:00:00 2001 From: Hidenori Takeshima Date: Fri, 18 Aug 2000 23:44:58 +0000 Subject: [PATCH] Separate GetTextMetrics and implement it for SBCS/Unicode/cp932. --- graphics/x11drv/codepage.c | 131 +++++++++++++++++++++++++++++++++++++ graphics/x11drv/xfont.c | 65 +----------------- include/x11font.h | 1 + 3 files changed, 135 insertions(+), 62 deletions(-) diff --git a/graphics/x11drv/codepage.c b/graphics/x11drv/codepage.c index c0ccf77b4e9..1e1b1d1cb3a 100644 --- a/graphics/x11drv/codepage.c +++ b/graphics/x11drv/codepage.c @@ -8,6 +8,8 @@ #include "ts_xlib.h" +#include + #include "windef.h" #include "winnls.h" #include "heap.h" @@ -259,6 +261,60 @@ static void X11DRV_TextExtents_normal( fontObject* pfo, XChar2b* pstr, int count *pwidth = info.width; } +static void X11DRV_GetTextMetricsA_normal( fontObject* pfo, LPTEXTMETRICA pTM ) +{ + LPIFONTINFO16 pdf = &pfo->fi->df; + + if( ! pfo->lpX11Trans ) { + pTM->tmAscent = pfo->fs->ascent; + pTM->tmDescent = pfo->fs->descent; + } else { + pTM->tmAscent = pfo->lpX11Trans->ascent; + pTM->tmDescent = pfo->lpX11Trans->descent; + } + + pTM->tmAscent *= pfo->rescale; + pTM->tmDescent *= pfo->rescale; + + pTM->tmHeight = pTM->tmAscent + pTM->tmDescent; + + pTM->tmAveCharWidth = pfo->foAvgCharWidth * pfo->rescale; + pTM->tmMaxCharWidth = pfo->foMaxCharWidth * pfo->rescale; + + pTM->tmInternalLeading = pfo->foInternalLeading * pfo->rescale; + pTM->tmExternalLeading = pdf->dfExternalLeading * pfo->rescale; + + pTM->tmStruckOut = (pfo->fo_flags & FO_SYNTH_STRIKEOUT ) + ? 1 : pdf->dfStrikeOut; + pTM->tmUnderlined = (pfo->fo_flags & FO_SYNTH_UNDERLINE ) + ? 1 : pdf->dfUnderline; + + pTM->tmOverhang = 0; + if( pfo->fo_flags & FO_SYNTH_ITALIC ) + { + pTM->tmOverhang += pTM->tmHeight/3; + pTM->tmItalic = 1; + } else + pTM->tmItalic = pdf->dfItalic; + + pTM->tmWeight = pdf->dfWeight; + if( pfo->fo_flags & FO_SYNTH_BOLD ) + { + pTM->tmOverhang++; + pTM->tmWeight += 100; + } + + pTM->tmFirstChar = pdf->dfFirstChar; + pTM->tmLastChar = pdf->dfLastChar; + pTM->tmDefaultChar = pdf->dfDefaultChar; + pTM->tmBreakChar = pdf->dfBreakChar; + + pTM->tmCharSet = pdf->dfCharSet; + pTM->tmPitchAndFamily = pdf->dfPitchAndFamily; + + pTM->tmDigitizedAspectX = pdf->dfHorizRes; + pTM->tmDigitizedAspectY = pdf->dfVertRes; +} @@ -367,6 +423,75 @@ void X11DRV_TextExtents_cp932( fontObject* pfo, XChar2b* pstr, int count, *pwidth = width; } +static void X11DRV_GetTextMetricsA_cp932( fontObject* pfo, LPTEXTMETRICA pTM ) +{ + fontObject* pfo_ansi = XFONT_GetFontObject( pfo->prefobjs[0] ); + LPIFONTINFO16 pdf = &pfo->fi->df; + LPIFONTINFO16 pdf_ansi; + + pdf_ansi = ( pfo_ansi != NULL ) ? (&pfo_ansi->fi->df) : pdf; + + if( ! pfo->lpX11Trans ) { + pTM->tmAscent = pfo->fs->ascent; + pTM->tmDescent = pfo->fs->descent; + } else { + pTM->tmAscent = pfo->lpX11Trans->ascent; + pTM->tmDescent = pfo->lpX11Trans->descent; + } + + pTM->tmAscent *= pfo->rescale; + pTM->tmDescent *= pfo->rescale; + + pTM->tmHeight = pTM->tmAscent + pTM->tmDescent; + + if ( pfo_ansi != NULL ) + { + pTM->tmAveCharWidth = floor((pfo_ansi->foAvgCharWidth * 2.0 + pfo->foAvgCharWidth) / 3.0 * pfo->rescale + 0.5); + pTM->tmMaxCharWidth = __max(pfo_ansi->foMaxCharWidth, pfo->foMaxCharWidth) * pfo->rescale; + } + else + { + pTM->tmAveCharWidth = floor((pfo->foAvgCharWidth * pfo->rescale + 1.0) / 2.0); + pTM->tmMaxCharWidth = pfo->foMaxCharWidth * pfo->rescale; + } + + pTM->tmInternalLeading = pfo->foInternalLeading * pfo->rescale; + pTM->tmExternalLeading = pdf->dfExternalLeading * pfo->rescale; + + pTM->tmStruckOut = (pfo->fo_flags & FO_SYNTH_STRIKEOUT ) + ? 1 : pdf->dfStrikeOut; + pTM->tmUnderlined = (pfo->fo_flags & FO_SYNTH_UNDERLINE ) + ? 1 : pdf->dfUnderline; + + pTM->tmOverhang = 0; + if( pfo->fo_flags & FO_SYNTH_ITALIC ) + { + pTM->tmOverhang += pTM->tmHeight/3; + pTM->tmItalic = 1; + } else + pTM->tmItalic = pdf->dfItalic; + + pTM->tmWeight = pdf->dfWeight; + if( pfo->fo_flags & FO_SYNTH_BOLD ) + { + pTM->tmOverhang++; + pTM->tmWeight += 100; + } + + pTM->tmFirstChar = pdf_ansi->dfFirstChar; + pTM->tmLastChar = pdf_ansi->dfLastChar; + pTM->tmDefaultChar = pdf_ansi->dfDefaultChar; + pTM->tmBreakChar = pdf_ansi->dfBreakChar; + + pTM->tmCharSet = pdf->dfCharSet; + pTM->tmPitchAndFamily = pdf->dfPitchAndFamily; + + pTM->tmDigitizedAspectX = pdf->dfHorizRes; + pTM->tmDigitizedAspectY = pdf->dfVertRes; +} + + + const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] = @@ -378,6 +503,7 @@ const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] = X11DRV_TextWidth_normal, X11DRV_DrawText_normal, X11DRV_TextExtents_normal, + X11DRV_GetTextMetricsA_normal, }, { /* UNICODE */ X11DRV_enum_subfont_charset_normal, @@ -386,6 +512,7 @@ const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] = X11DRV_TextWidth_normal, X11DRV_DrawText_normal, X11DRV_TextExtents_normal, + X11DRV_GetTextMetricsA_normal, }, { /* CP932 */ X11DRV_enum_subfont_charset_cp932, @@ -394,6 +521,7 @@ const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] = X11DRV_TextWidth_cp932, X11DRV_DrawText_cp932, X11DRV_TextExtents_cp932, + X11DRV_GetTextMetricsA_cp932, }, { /* CP936 */ X11DRV_enum_subfont_charset_cp936, @@ -402,6 +530,7 @@ const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] = X11DRV_TextWidth_normal, /* FIXME */ X11DRV_DrawText_normal, /* FIXME */ X11DRV_TextExtents_normal, /* FIXME */ + X11DRV_GetTextMetricsA_normal, /* FIXME */ }, { /* CP949 */ X11DRV_enum_subfont_charset_cp949, @@ -410,6 +539,7 @@ const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] = X11DRV_TextWidth_normal, /* FIXME */ X11DRV_DrawText_normal, /* FIXME */ X11DRV_TextExtents_normal, /* FIXME */ + X11DRV_GetTextMetricsA_normal, /* FIXME */ }, { /* CP950 */ X11DRV_enum_subfont_charset_cp950, @@ -418,5 +548,6 @@ const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT] = X11DRV_TextWidth_normal, /* FIXME */ X11DRV_DrawText_normal, /* FIXME */ X11DRV_TextExtents_normal, /* FIXME */ + X11DRV_GetTextMetricsA_normal, /* FIXME */ }, }; diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c index 8be71ba1523..8c4050e6abd 100644 --- a/graphics/x11drv/xfont.c +++ b/graphics/x11drv/xfont.c @@ -991,7 +991,8 @@ static INT XFONT_GetAvgCharWidth( LPIFONTINFO16 pFI, const XFontStruct* x_fs, if( x_fs->per_char ) { int width = 0, chars = 0, j; - if( IS_LATIN_CHARSET(pFI->dfCharSet)) + if( IS_LATIN_CHARSET(pFI->dfCharSet) || + pFI->dfCharSet == DEFAULT_CHARSET ) { /* FIXME - should use a weighted average */ for( j = 0; j < 26; j++ ) @@ -1076,66 +1077,6 @@ static void XFONT_SetFontMetric(fontInfo* fi, const fontResource* fr, XFontStruc fi->df.dfFace = fr->lfFaceName; } -/*********************************************************************** - * XFONT_GetTextMetrics - * - * GetTextMetrics() back end. - */ -static void XFONT_GetTextMetrics( const fontObject* pfo, const LPTEXTMETRICA pTM ) -{ - LPIFONTINFO16 pdf = &pfo->fi->df; - - if( ! pfo->lpX11Trans ) { - pTM->tmAscent = pfo->fs->ascent; - pTM->tmDescent = pfo->fs->descent; - } else { - pTM->tmAscent = pfo->lpX11Trans->ascent; - pTM->tmDescent = pfo->lpX11Trans->descent; - } - - pTM->tmAscent *= pfo->rescale; - pTM->tmDescent *= pfo->rescale; - - pTM->tmHeight = pTM->tmAscent + pTM->tmDescent; - - pTM->tmAveCharWidth = pfo->foAvgCharWidth * pfo->rescale; - pTM->tmMaxCharWidth = pfo->foMaxCharWidth * pfo->rescale; - - pTM->tmInternalLeading = pfo->foInternalLeading * pfo->rescale; - pTM->tmExternalLeading = pdf->dfExternalLeading * pfo->rescale; - - pTM->tmStruckOut = (pfo->fo_flags & FO_SYNTH_STRIKEOUT ) - ? 1 : pdf->dfStrikeOut; - pTM->tmUnderlined = (pfo->fo_flags & FO_SYNTH_UNDERLINE ) - ? 1 : pdf->dfUnderline; - - pTM->tmOverhang = 0; - if( pfo->fo_flags & FO_SYNTH_ITALIC ) - { - pTM->tmOverhang += pTM->tmHeight/3; - pTM->tmItalic = 1; - } else - pTM->tmItalic = pdf->dfItalic; - - pTM->tmWeight = pdf->dfWeight; - if( pfo->fo_flags & FO_SYNTH_BOLD ) - { - pTM->tmOverhang++; - pTM->tmWeight += 100; - } - - pTM->tmFirstChar = pdf->dfFirstChar; - pTM->tmLastChar = pdf->dfLastChar; - pTM->tmDefaultChar = pdf->dfDefaultChar; - pTM->tmBreakChar = pdf->dfBreakChar; - - pTM->tmCharSet = pdf->dfCharSet; - pTM->tmPitchAndFamily = pdf->dfPitchAndFamily; - - pTM->tmDigitizedAspectX = pdf->dfHorizRes; - pTM->tmDigitizedAspectY = pdf->dfVertRes; -} - /*********************************************************************** * XFONT_GetFontMetric * @@ -3103,7 +3044,7 @@ BOOL X11DRV_GetTextMetrics(DC *dc, TEXTMETRICA *metrics) if( CHECK_PFONT(physDev->font) ) { fontObject* pfo = __PFONT(physDev->font); - XFONT_GetTextMetrics( pfo, metrics ); + X11DRV_cptable[pfo->fi->cptable].pGetTextMetricsA( pfo, metrics ); return TRUE; } diff --git a/include/x11font.h b/include/x11font.h index 0bb67e7e7c7..0155a05bcb6 100644 --- a/include/x11font.h +++ b/include/x11font.h @@ -242,6 +242,7 @@ typedef struct tagX11DRV_CP void (*pTextExtents)( fontObject* pfo, XChar2b* pstr, int count, int* pdir, int* pascent, int* pdescent, int* pwidth ); + void (*pGetTextMetricsA)( fontObject* pfo, LPTEXTMETRICA pTM ); } X11DRV_CP; extern const X11DRV_CP X11DRV_cptable[X11DRV_CPTABLE_COUNT];