PostScript driver font scaling rationalization
Ian Pilcher
ian.pilcher at home.com
Fri Aug 10 15:01:41 CDT 2001
EnumFonts and SelectObject were using completely separate font scaling
code; this fixes that. I'm still not sure, however, of the size to
which EnumFonts should scale fonts, so I just used the font's intrinsic
em square (1000 for PostScript fonts, usually 2048 for TrueType fonts).
Modified files:
dlls/wineps: font.c
Log message:
Ian Pilcher <ian.pilcher at home.com>
WINEPS: Make EnumFonts and SelectObject use common font scaling
--
========================================================================
Ian Pilcher ian.pilcher at home.com
========================================================================
-------------- next part --------------
diff -urN ../wine-20010810cvs/dlls/wineps/font.c ./dlls/wineps/font.c
--- ../wine-20010810cvs/dlls/wineps/font.c Fri Aug 10 14:03:22 2001
+++ ./dlls/wineps/font.c Fri Aug 10 14:18:13 2001
@@ -23,34 +23,29 @@
{
return (f > 0) ? (f + 0.5) : (f - 0.5);
}
-
-static void ScaleFont(DC *dc, LOGFONTW *lf, PSDRV_PDEVICE *physDev)
+
+static VOID ScaleFont(const AFM *afm, LONG lfHeight, PSFONT *font,
+ TEXTMETRICW *tm)
{
- PSFONT *font = &(physDev->font);
- const WINMETRICS *wm = &(font->afm->WinMetrics);
- TEXTMETRICW *tm = &(font->tm);
- LONG lfHeight_ds;
+ const WINMETRICS *wm = &(afm->WinMetrics);
USHORT usUnitsPerEm, usWinAscent, usWinDescent;
SHORT sAscender, sDescender, sLineGap, sTypoAscender;
SHORT sTypoDescender, sTypoLineGap, sAvgCharWidth;
- TRACE("'%s' %li\n", font->afm->FontName, lf->lfHeight);
+ TRACE("'%s' %li\n", afm->FontName, lfHeight);
- lfHeight_ds = INTERNAL_YWSTODS(dc, lf->lfHeight); /* world->viewport */
-
- if (lfHeight_ds < 0) /* match em height */
+ if (lfHeight < 0) /* match em height */
{
- font->scale = - ((float)lfHeight_ds / (float)(wm->usUnitsPerEm));
+ font->scale = - ((float)lfHeight / (float)(wm->usUnitsPerEm));
}
else /* match cell height */
{
- font->scale = (float)lfHeight_ds /
+ font->scale = (float)lfHeight /
(float)(wm->usWinAscent + wm->usWinDescent);
}
- physDev->font.size = (INT)round(font->scale * (float)wm->usUnitsPerEm);
- physDev->font.escapement = lf->lfEscapement;
- physDev->font.set = FALSE;
+ font->size = (INT)round(font->scale * (float)wm->usUnitsPerEm);
+ font->set = FALSE;
usUnitsPerEm = (USHORT)round((float)(wm->usUnitsPerEm) * font->scale);
sAscender = (SHORT)round((float)(wm->sAscender) * font->scale);
@@ -75,38 +70,26 @@
(LONG)(sAscender - sDescender + sLineGap) - tm->tmHeight;
if (tm->tmExternalLeading < 0)
tm->tmExternalLeading = 0;
-
- /*
- * Character widths are stored as PostScript metrics, which assume an
- * em square size of 1000.
- */
-
+
tm->tmAveCharWidth = (LONG)sAvgCharWidth;
-
- tm->tmMaxCharWidth = (LONG)round(
- (font->afm->FontBBox.urx - font->afm->FontBBox.llx) *
- font->scale * (float)(wm->usUnitsPerEm) / 1000.0);
-
- tm->tmWeight = font->afm->Weight;
- tm->tmItalic = (font->afm->ItalicAngle != 0.0);
+
+ tm->tmWeight = afm->Weight;
+ tm->tmItalic = (afm->ItalicAngle != 0.0);
tm->tmUnderlined = 0;
tm->tmStruckOut = 0;
- tm->tmFirstChar = (WCHAR)(font->afm->Metrics[0].UV);
- tm->tmLastChar =
- (WCHAR)(font->afm->Metrics[font->afm->NumofMetrics - 1].UV);
+ tm->tmFirstChar = (WCHAR)(afm->Metrics[0].UV);
+ tm->tmLastChar = (WCHAR)(afm->Metrics[afm->NumofMetrics - 1].UV);
tm->tmDefaultChar = 0x001f; /* Win2K does this - FIXME? */
tm->tmBreakChar = tm->tmFirstChar; /* should be 'space' */
- /* Assume that a font with an em square size of 1000 is a PostScript font */
+ tm->tmPitchAndFamily = TMPF_DEVICE | TMPF_VECTOR;
+ if (!afm->IsFixedPitch)
+ tm->tmPitchAndFamily |= TMPF_FIXED_PITCH; /* yes, it's backwards */
+ if (wm->usUnitsPerEm != 1000)
+ tm->tmPitchAndFamily |= TMPF_TRUETYPE;
- tm->tmPitchAndFamily = (font->afm->IsFixedPitch ? 0 : TMPF_FIXED_PITCH) |
- ((wm->usUnitsPerEm == 1000) ? TMPF_DEVICE : TMPF_TRUETYPE) |
- TMPF_VECTOR; /* TMPF_VECTOR always set per Win32 API doc */
-
tm->tmCharSet = ANSI_CHARSET; /* FIXME */
tm->tmOverhang = 0;
- tm->tmDigitizedAspectX = physDev->logPixelsY;
- tm->tmDigitizedAspectY = physDev->logPixelsX;
/*
* This is kludgy. font->scale is used in several places in the driver
@@ -116,14 +99,15 @@
*/
font->scale *= (float)wm->usUnitsPerEm / 1000.0;
+
+ tm->tmMaxCharWidth = (LONG)round(
+ (afm->FontBBox.urx - afm->FontBBox.llx) * font->scale);
- TRACE("Selected PS font '%s' size %d weight %ld.\n",
- physDev->font.afm->FontName, physDev->font.size,
- physDev->font.tm.tmWeight );
- TRACE("H = %ld As = %ld Des = %ld IL = %ld EL = %ld\n",
- physDev->font.tm.tmHeight, physDev->font.tm.tmAscent,
- physDev->font.tm.tmDescent, physDev->font.tm.tmInternalLeading,
- physDev->font.tm.tmExternalLeading);
+ TRACE("Selected PS font '%s' size %d weight %ld.\n", afm->FontName,
+ font->size, tm->tmWeight );
+ TRACE("H = %ld As = %ld Des = %ld IL = %ld EL = %ld\n", tm->tmHeight,
+ tm->tmAscent, tm->tmDescent, tm->tmInternalLeading,
+ tm->tmExternalLeading);
}
/***********************************************************************
@@ -248,7 +232,15 @@
TRACE("Got font '%s'\n", afmle->afm->FontName);
physDev->font.afm = afmle->afm;
- ScaleFont(dc, &lf, physDev);
+ ScaleFont(physDev->font.afm, INTERNAL_YWSTODS(dc, lf.lfHeight),
+ &(physDev->font), &(physDev->font.tm));
+
+ physDev->font.escapement = lf.lfEscapement;
+
+ /* Does anyone know if these are supposed to be reversed like this? */
+
+ physDev->font.tm.tmDigitizedAspectX = physDev->logPixelsY;
+ physDev->font.tm.tmDigitizedAspectY = physDev->logPixelsX;
return prevfont;
}
@@ -374,48 +366,32 @@
/***********************************************************************
* PSDRV_GetFontMetric
*/
-static UINT PSDRV_GetFontMetric(HDC hdc, const AFM *pafm,
- NEWTEXTMETRICEXW *pTM, ENUMLOGFONTEXW *pLF, INT16 size)
-
+static UINT PSDRV_GetFontMetric(HDC hdc, const AFM *afm,
+ NEWTEXTMETRICEXW *ntmx, ENUMLOGFONTEXW *elfx)
{
- float scale = size / (pafm->FullAscender - pafm->Descender);
-
- memset( pLF, 0, sizeof(*pLF) );
- memset( pTM, 0, sizeof(*pTM) );
-
-#define plf ((LPLOGFONTW)pLF)
-#define ptm ((LPNEWTEXTMETRICW)pTM)
- plf->lfHeight = ptm->tmHeight = size;
- plf->lfWidth = ptm->tmAveCharWidth = pafm->CharWidths[120] * scale;
- plf->lfWeight = ptm->tmWeight = pafm->Weight;
- plf->lfItalic = ptm->tmItalic = pafm->ItalicAngle != 0.0;
- plf->lfUnderline = ptm->tmUnderlined = 0;
- plf->lfStrikeOut = ptm->tmStruckOut = 0;
- plf->lfCharSet = ptm->tmCharSet = ANSI_CHARSET;
-
- /* convert pitch values */
-
- ptm->tmPitchAndFamily = pafm->IsFixedPitch ? 0 : TMPF_FIXED_PITCH;
- ptm->tmPitchAndFamily |= TMPF_DEVICE;
- plf->lfPitchAndFamily = 0;
-
- MultiByteToWideChar(CP_ACP, 0, pafm->FamilyName, -1,
- plf->lfFaceName, LF_FACESIZE);
-#undef plf
-
- ptm->tmAscent = pafm->FullAscender * scale;
- ptm->tmDescent = -pafm->Descender * scale;
- ptm->tmInternalLeading = (pafm->FullAscender - pafm->Ascender) * scale;
- ptm->tmMaxCharWidth = pafm->CharWidths[77] * scale;
- /* FIXME: X and Y are swapped here, is this on purpose? */
- ptm->tmDigitizedAspectX = GetDeviceCaps( hdc, LOGPIXELSY );
- ptm->tmDigitizedAspectY = GetDeviceCaps( hdc, LOGPIXELSX );
-
- *(INT*)&ptm->tmFirstChar = 32;
+ /* ntmx->ntmTm is NEWTEXTMETRICW; compatible w/ TEXTMETRICW per Win32 doc */
- /* return font type */
+ 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;
+
+ MultiByteToWideChar(CP_ACP, 0, afm->FamilyName, -1, lf->lfFaceName,
+ LF_FACESIZE);
+
return DEVICE_FONTTYPE;
-#undef ptm
}
/***********************************************************************
@@ -451,7 +427,7 @@
for(afmle = family->afmlist; afmle; afmle = afmle->next) {
TRACE("Got '%s'\n", afmle->afm->FontName);
if( (b = (*proc)( &lf, &tm,
- PSDRV_GetFontMetric( hdc, afmle->afm, &tm, &lf, 200 ),
+ PSDRV_GetFontMetric( hdc, afmle->afm, &tm, &lf ),
lp )) )
bRet = b;
else break;
@@ -464,7 +440,7 @@
afmle = family->afmlist;
TRACE("Got '%s'\n", afmle->afm->FontName);
if( (b = (*proc)( &lf, &tm,
- PSDRV_GetFontMetric( hdc, afmle->afm, &tm, &lf, 200 ),
+ PSDRV_GetFontMetric( hdc, afmle->afm, &tm, &lf ),
lp )) )
bRet = b;
else break;
More information about the wine-patches
mailing list