Commit 35f5e651 authored by Alexandre Julliard's avatar Alexandre Julliard

gdi32: Move the font realization information out of freetype.c.

parent 6c94c0b0
...@@ -944,13 +944,30 @@ static DWORD CDECL font_GetFontData( PHYSDEV dev, DWORD table, DWORD offset, voi ...@@ -944,13 +944,30 @@ static DWORD CDECL font_GetFontData( PHYSDEV dev, DWORD table, DWORD offset, voi
static BOOL CDECL font_GetFontRealizationInfo( PHYSDEV dev, void *ptr ) static BOOL CDECL font_GetFontRealizationInfo( PHYSDEV dev, void *ptr )
{ {
struct font_physdev *physdev = get_font_dev( dev ); struct font_physdev *physdev = get_font_dev( dev );
struct font_realization_info *info = ptr;
if (!physdev->font) if (!physdev->font)
{ {
dev = GET_NEXT_PHYSDEV( dev, pGetFontRealizationInfo ); dev = GET_NEXT_PHYSDEV( dev, pGetFontRealizationInfo );
return dev->funcs->pGetFontRealizationInfo( dev, ptr ); return dev->funcs->pGetFontRealizationInfo( dev, ptr );
} }
return font_funcs->pGetFontRealizationInfo( physdev->font, ptr );
TRACE( "(%p, %p)\n", physdev->font, info);
info->flags = 1;
if (physdev->font->scalable) info->flags |= 2;
info->cache_num = physdev->font->cache_num;
info->instance_id = physdev->font->handle;
if (info->size == sizeof(*info))
{
info->unk = 0;
info->face_index = physdev->font->face_index;
info->simulations = 0;
if (physdev->font->fake_bold) info->simulations |= 0x1;
if (physdev->font->fake_italic) info->simulations |= 0x2;
}
return TRUE;
} }
......
...@@ -330,8 +330,6 @@ struct tagGdiFont { ...@@ -330,8 +330,6 @@ struct tagGdiFont {
/* the following members can be accessed without locking, they are never modified after creation */ /* the following members can be accessed without locking, they are never modified after creation */
FT_Face ft_face; FT_Face ft_face;
struct font_mapping *mapping; struct font_mapping *mapping;
BOOL fake_italic;
BOOL fake_bold;
BYTE underline; BYTE underline;
BYTE strikeout; BYTE strikeout;
INT orientation; INT orientation;
...@@ -3959,6 +3957,7 @@ static LONG load_VDMX(GdiFont*, LONG); ...@@ -3959,6 +3957,7 @@ static LONG load_VDMX(GdiFont*, LONG);
static FT_Face OpenFontFace(GdiFont *font, Face *face, LONG width, LONG height) static FT_Face OpenFontFace(GdiFont *font, Face *face, LONG width, LONG height)
{ {
struct gdi_font *gdi_font = font->gdi_font;
FT_Error err; FT_Error err;
FT_Face ft_face; FT_Face ft_face;
void *data_ptr; void *data_ptr;
...@@ -3993,6 +3992,8 @@ static FT_Face OpenFontFace(GdiFont *font, Face *face, LONG width, LONG height) ...@@ -3993,6 +3992,8 @@ static FT_Face OpenFontFace(GdiFont *font, Face *face, LONG width, LONG height)
/* set it here, as load_VDMX needs it */ /* set it here, as load_VDMX needs it */
font->ft_face = ft_face; font->ft_face = ft_face;
gdi_font->scalable = FT_IS_SCALABLE(ft_face);
gdi_font->face_index = face->face_index;
if(FT_IS_SCALABLE(ft_face)) { if(FT_IS_SCALABLE(ft_face)) {
FT_ULong len; FT_ULong len;
...@@ -4785,7 +4786,7 @@ static struct gdi_font * CDECL freetype_SelectFont( DC *dc, HFONT hfont, UINT *a ...@@ -4785,7 +4786,7 @@ static struct gdi_font * CDECL freetype_SelectFont( DC *dc, HFONT hfont, UINT *a
GetObjectW( hfont, sizeof(lf), &lf ); GetObjectW( hfont, sizeof(lf), &lf );
lf.lfWidth = abs(lf.lfWidth); lf.lfWidth = abs(lf.lfWidth);
can_use_bitmap = GetDeviceCaps(dc->hSelf, TEXTCAPS) & TC_RA_ABLE; can_use_bitmap = !!(GetDeviceCaps(dc->hSelf, TEXTCAPS) & TC_RA_ABLE);
TRACE("%s, h=%d, it=%d, weight=%d, PandF=%02x, charset=%d orient %d escapement %d\n", TRACE("%s, h=%d, it=%d, weight=%d, PandF=%02x, charset=%d orient %d escapement %d\n",
debugstr_w(lf.lfFaceName), lf.lfHeight, lf.lfItalic, debugstr_w(lf.lfFaceName), lf.lfHeight, lf.lfItalic,
...@@ -5085,8 +5086,8 @@ found: ...@@ -5085,8 +5086,8 @@ found:
} }
if(best) if(best)
face = best->scalable ? best : best_bitmap; face = best->scalable ? best : best_bitmap;
ret->fake_italic = (it && !(face->ntmFlags & NTM_ITALIC)); gdi_font->fake_italic = (it && !(face->ntmFlags & NTM_ITALIC));
ret->fake_bold = (bd && !(face->ntmFlags & NTM_BOLD)); gdi_font->fake_bold = (bd && !(face->ntmFlags & NTM_BOLD));
found_face: found_face:
height = lf.lfHeight; height = lf.lfHeight;
...@@ -5215,7 +5216,7 @@ done: ...@@ -5215,7 +5216,7 @@ done:
case GGO_GRAY4_BITMAP: case GGO_GRAY4_BITMAP:
case GGO_GRAY8_BITMAP: case GGO_GRAY8_BITMAP:
case WINE_GGO_GRAY16_BITMAP: case WINE_GGO_GRAY16_BITMAP:
if ((!antialias_fakes || (!ret->fake_bold && !ret->fake_italic)) && is_hinting_enabled()) if ((!antialias_fakes || (!gdi_font->fake_bold && !gdi_font->fake_italic)) && is_hinting_enabled())
{ {
WORD gasp_flags; WORD gasp_flags;
if (get_gasp_flags( ret, &gasp_flags ) && !(gasp_flags & GASP_DOGRAY)) if (get_gasp_flags( ret, &gasp_flags ) && !(gasp_flags & GASP_DOGRAY))
...@@ -5933,7 +5934,7 @@ static BOOL get_transform_matrices( GdiFont *font, BOOL vertical, const MAT2 *us ...@@ -5933,7 +5934,7 @@ static BOOL get_transform_matrices( GdiFont *font, BOOL vertical, const MAT2 *us
} }
/* Slant transform */ /* Slant transform */
if (font->fake_italic) if (gdi_font->fake_italic)
{ {
FT_Matrix slant_mat; FT_Matrix slant_mat;
slant_mat.xx = (1 << 16); slant_mat.xx = (1 << 16);
...@@ -6056,6 +6057,8 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font, ...@@ -6056,6 +6057,8 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font,
const FT_Glyph_Metrics *metrics, const FT_Glyph_Metrics *metrics,
const FT_Matrix *transMat, BOOL vertical_metrics) const FT_Matrix *transMat, BOOL vertical_metrics)
{ {
struct gdi_font *incoming_gdi_font = incoming_font->gdi_font;
struct gdi_font *gdi_font = font->gdi_font;
FT_Vector adv; FT_Vector adv;
FT_Fixed base_advance, em_scale = 0; FT_Fixed base_advance, em_scale = 0;
BOOL fixed_pitch_full = FALSE; BOOL fixed_pitch_full = FALSE;
...@@ -6072,7 +6075,7 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font, ...@@ -6072,7 +6075,7 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font,
they have double halfwidth character width. E.g. if the font is 19 ppem, they have double halfwidth character width. E.g. if the font is 19 ppem,
we return 20 (not 19) for fullwidth characters as we return 10 for we return 20 (not 19) for fullwidth characters as we return 10 for
halfwidth characters. */ halfwidth characters. */
if(FT_IS_SCALABLE(incoming_font->ft_face) && if(incoming_gdi_font->scalable &&
(incoming_font->potm || get_outline_text_metrics(incoming_font)) && (incoming_font->potm || get_outline_text_metrics(incoming_font)) &&
!(incoming_font->potm->otmTextMetrics.tmPitchAndFamily & TMPF_FIXED_PITCH)) { !(incoming_font->potm->otmTextMetrics.tmPitchAndFamily & TMPF_FIXED_PITCH)) {
UINT avg_advance; UINT avg_advance;
...@@ -6097,7 +6100,7 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font, ...@@ -6097,7 +6100,7 @@ static FT_Vector get_advance_metric(GdiFont *incoming_font, GdiFont *font,
} }
} }
if (font->fake_bold) { if (gdi_font->fake_bold) {
if (!transMat) if (!transMat)
adv.x += 1 << 6; adv.x += 1 << 6;
else { else {
...@@ -6845,7 +6848,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, ...@@ -6845,7 +6848,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
} }
metrics = ft_face->glyph->metrics; metrics = ft_face->glyph->metrics;
if(font->fake_bold) { if(gdi_font->fake_bold) {
if (!get_bold_glyph_outline(ft_face->glyph, font->ppem, &metrics) && metrics.width) if (!get_bold_glyph_outline(ft_face->glyph, font->ppem, &metrics) && metrics.width)
metrics.width += 1 << 6; metrics.width += 1 << 6;
} }
...@@ -6890,7 +6893,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, ...@@ -6890,7 +6893,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
switch (format) switch (format)
{ {
case GGO_BITMAP: case GGO_BITMAP:
needed = get_mono_glyph_bitmap( ft_face->glyph, bbox, font->fake_bold, needed = get_mono_glyph_bitmap( ft_face->glyph, bbox, gdi_font->fake_bold,
needsTransform, matrices, buflen, buf ); needsTransform, matrices, buflen, buf );
break; break;
...@@ -6898,7 +6901,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, ...@@ -6898,7 +6901,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
case GGO_GRAY4_BITMAP: case GGO_GRAY4_BITMAP:
case GGO_GRAY8_BITMAP: case GGO_GRAY8_BITMAP:
case WINE_GGO_GRAY16_BITMAP: case WINE_GGO_GRAY16_BITMAP:
needed = get_antialias_glyph_bitmap( ft_face->glyph, bbox, format, font->fake_bold, needed = get_antialias_glyph_bitmap( ft_face->glyph, bbox, format, gdi_font->fake_bold,
needsTransform, matrices, buflen, buf ); needsTransform, matrices, buflen, buf );
break; break;
...@@ -6906,7 +6909,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format, ...@@ -6906,7 +6909,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
case WINE_GGO_HBGR_BITMAP: case WINE_GGO_HBGR_BITMAP:
case WINE_GGO_VRGB_BITMAP: case WINE_GGO_VRGB_BITMAP:
case WINE_GGO_VBGR_BITMAP: case WINE_GGO_VBGR_BITMAP:
needed = get_subpixel_glyph_bitmap( ft_face->glyph, bbox, format, font->fake_bold, needed = get_subpixel_glyph_bitmap( ft_face->glyph, bbox, format, gdi_font->fake_bold,
needsTransform, matrices, &gm, buflen, buf ); needsTransform, matrices, &gm, buflen, buf );
break; break;
...@@ -7016,7 +7019,7 @@ static BOOL get_bitmap_text_metrics(GdiFont *font) ...@@ -7016,7 +7019,7 @@ static BOOL get_bitmap_text_metrics(GdiFont *font)
TM.tmCharSet = gdi_font->charset; TM.tmCharSet = gdi_font->charset;
} }
if(font->fake_bold) if(gdi_font->fake_bold)
TM.tmWeight = FW_BOLD; TM.tmWeight = FW_BOLD;
#undef TM #undef TM
...@@ -7050,9 +7053,9 @@ static void scale_font_metrics(const GdiFont *font, LPTEXTMETRICW ptm) ...@@ -7050,9 +7053,9 @@ static void scale_font_metrics(const GdiFont *font, LPTEXTMETRICW ptm)
SCALE_Y(ptm->tmExternalLeading); SCALE_Y(ptm->tmExternalLeading);
SCALE_X(ptm->tmOverhang); SCALE_X(ptm->tmOverhang);
if(font->fake_bold) if(gdi_font->fake_bold)
{ {
if(!FT_IS_SCALABLE(font->ft_face)) if(!gdi_font->scalable)
ptm->tmOverhang++; ptm->tmOverhang++;
ptm->tmAveCharWidth++; ptm->tmAveCharWidth++;
ptm->tmMaxCharWidth++; ptm->tmMaxCharWidth++;
...@@ -7273,7 +7276,7 @@ static BOOL get_outline_text_metrics(GdiFont *font) ...@@ -7273,7 +7276,7 @@ static BOOL get_outline_text_metrics(GdiFont *font)
} }
TM.tmMaxCharWidth = SCALE_X(ft_face->bbox.xMax - ft_face->bbox.xMin); TM.tmMaxCharWidth = SCALE_X(ft_face->bbox.xMax - ft_face->bbox.xMin);
TM.tmWeight = FW_REGULAR; TM.tmWeight = FW_REGULAR;
if (font->fake_bold) if (gdi_font->fake_bold)
TM.tmWeight = FW_BOLD; TM.tmWeight = FW_BOLD;
else else
{ {
...@@ -7322,7 +7325,7 @@ static BOOL get_outline_text_metrics(GdiFont *font) ...@@ -7322,7 +7325,7 @@ static BOOL get_outline_text_metrics(GdiFont *font)
TM.tmBreakChar = pOS2->usFirstCharIndex; TM.tmBreakChar = pOS2->usFirstCharIndex;
TM.tmDefaultChar = TM.tmBreakChar - 1; TM.tmDefaultChar = TM.tmBreakChar - 1;
} }
TM.tmItalic = font->fake_italic ? 255 : ((ft_face->style_flags & FT_STYLE_FLAG_ITALIC) ? 255 : 0); TM.tmItalic = gdi_font->fake_italic ? 255 : ((ft_face->style_flags & FT_STYLE_FLAG_ITALIC) ? 255 : 0);
TM.tmUnderlined = font->underline; TM.tmUnderlined = font->underline;
TM.tmStruckOut = font->strikeout; TM.tmStruckOut = font->strikeout;
...@@ -7403,9 +7406,9 @@ static BOOL get_outline_text_metrics(GdiFont *font) ...@@ -7403,9 +7406,9 @@ static BOOL get_outline_text_metrics(GdiFont *font)
font->potm->otmFiller = 0; font->potm->otmFiller = 0;
memcpy(&font->potm->otmPanoseNumber, pOS2->panose, PANOSE_COUNT); memcpy(&font->potm->otmPanoseNumber, pOS2->panose, PANOSE_COUNT);
font->potm->otmfsSelection = pOS2->fsSelection; font->potm->otmfsSelection = pOS2->fsSelection;
if (font->fake_italic) if (gdi_font->fake_italic)
font->potm->otmfsSelection |= 1; font->potm->otmfsSelection |= 1;
if (font->fake_bold) if (gdi_font->fake_bold)
font->potm->otmfsSelection |= 1 << 5; font->potm->otmfsSelection |= 1 << 5;
/* Only return valid bits that define embedding and subsetting restrictions */ /* Only return valid bits that define embedding and subsetting restrictions */
font->potm->otmfsType = pOS2->fsType & 0x30e; font->potm->otmfsType = pOS2->fsType & 0x30e;
...@@ -7508,7 +7511,7 @@ static UINT CDECL freetype_GetOutlineTextMetrics( struct gdi_font *gdi_font, UIN ...@@ -7508,7 +7511,7 @@ static UINT CDECL freetype_GetOutlineTextMetrics( struct gdi_font *gdi_font, UIN
TRACE("font=%p\n", font); TRACE("font=%p\n", font);
if (!FT_IS_SCALABLE( font->ft_face )) return 0; if (!gdi_font->scalable) return 0;
EnterCriticalSection( &freetype_cs ); EnterCriticalSection( &freetype_cs );
...@@ -7559,8 +7562,8 @@ static BOOL load_child_font(GdiFont *font, CHILD_FONT *child) ...@@ -7559,8 +7562,8 @@ static BOOL load_child_font(GdiFont *font, CHILD_FONT *child)
return FALSE; return FALSE;
} }
child->font->fake_italic = italic && !( child_face->ntmFlags & NTM_ITALIC ); child->font->gdi_font->fake_italic = italic && !( child_face->ntmFlags & NTM_ITALIC );
child->font->fake_bold = bold && !( child_face->ntmFlags & NTM_BOLD ); child->font->gdi_font->fake_bold = bold && !( child_face->ntmFlags & NTM_BOLD );
child->font->gdi_font->lf = gdi_font->lf; child->font->gdi_font->lf = gdi_font->lf;
child->font->gdi_font->matrix = gdi_font->matrix; child->font->gdi_font->matrix = gdi_font->matrix;
child->font->gdi_font->can_use_bitmap = gdi_font->can_use_bitmap; child->font->gdi_font->can_use_bitmap = gdi_font->can_use_bitmap;
...@@ -7651,7 +7654,7 @@ static BOOL CDECL freetype_GetCharWidthInfo( struct gdi_font *gdi_font, struct c ...@@ -7651,7 +7654,7 @@ static BOOL CDECL freetype_GetCharWidthInfo( struct gdi_font *gdi_font, struct c
TRACE("%p, %p\n", font, info); TRACE("%p, %p\n", font, info);
if (FT_IS_SCALABLE(font->ft_face) && if (gdi_font->scalable &&
(pHori = pFT_Get_Sfnt_Table(font->ft_face, ft_sfnt_hhea))) (pHori = pFT_Get_Sfnt_Table(font->ft_face, ft_sfnt_hhea)))
{ {
FT_Fixed em_scale; FT_Fixed em_scale;
...@@ -7867,34 +7870,6 @@ static BOOL CDECL freetype_FontIsLinked( struct gdi_font *font ) ...@@ -7867,34 +7870,6 @@ static BOOL CDECL freetype_FontIsLinked( struct gdi_font *font )
return ret; return ret;
} }
/*************************************************************
* freetype_GetFontRealizationInfo
*/
static BOOL CDECL freetype_GetFontRealizationInfo( struct gdi_font *gdi_font, struct font_realization_info *info )
{
GdiFont *font = get_font_ptr(gdi_font);
TRACE("(%p, %p)\n", font, info);
info->flags = 1;
if(FT_IS_SCALABLE(font->ft_face))
info->flags |= 2;
info->cache_num = gdi_font->cache_num;
info->instance_id = gdi_font->handle;
if (info->size == sizeof(*info))
{
info->unk = 0;
info->face_index = font->ft_face->face_index;
info->simulations = 0;
if (font->fake_bold)
info->simulations |= 0x1;
if (font->fake_italic)
info->simulations |= 0x2;
}
return TRUE;
}
/************************************************************************* /*************************************************************************
* freetype_GetFontFileData * freetype_GetFontFileData
*/ */
...@@ -8174,7 +8149,6 @@ static const struct font_backend_funcs font_funcs = ...@@ -8174,7 +8149,6 @@ static const struct font_backend_funcs font_funcs =
freetype_GetCharWidth, freetype_GetCharWidth,
freetype_GetCharWidthInfo, freetype_GetCharWidthInfo,
freetype_GetFontData, freetype_GetFontData,
freetype_GetFontRealizationInfo,
freetype_GetFontUnicodeRanges, freetype_GetFontUnicodeRanges,
freetype_GetGlyphIndices, freetype_GetGlyphIndices,
freetype_GetGlyphOutline, freetype_GetGlyphOutline,
......
...@@ -318,7 +318,11 @@ struct gdi_font ...@@ -318,7 +318,11 @@ struct gdi_font
FONTSIGNATURE fs; FONTSIGNATURE fs;
LOGFONTW lf; LOGFONTW lf;
FMAT2 matrix; FMAT2 matrix;
BOOL can_use_bitmap; UINT face_index;
BOOL can_use_bitmap : 1;
BOOL fake_italic : 1;
BOOL fake_bold : 1;
BOOL scalable : 1;
WCHAR *name; WCHAR *name;
struct font_fileinfo *fileinfo; struct font_fileinfo *fileinfo;
}; };
...@@ -332,7 +336,6 @@ struct font_backend_funcs ...@@ -332,7 +336,6 @@ struct font_backend_funcs
BOOL (CDECL *pGetCharWidth)( struct gdi_font *font, UINT first, UINT last, INT *buffer ); BOOL (CDECL *pGetCharWidth)( struct gdi_font *font, UINT first, UINT last, INT *buffer );
BOOL (CDECL *pGetCharWidthInfo)( struct gdi_font *font, struct char_width_info *info ); BOOL (CDECL *pGetCharWidthInfo)( struct gdi_font *font, struct char_width_info *info );
DWORD (CDECL *pGetFontData)( struct gdi_font *font, DWORD table, DWORD offset, void *buf, DWORD size ); DWORD (CDECL *pGetFontData)( struct gdi_font *font, DWORD table, DWORD offset, void *buf, DWORD size );
BOOL (CDECL *pGetFontRealizationInfo)( struct gdi_font *font, struct font_realization_info *info );
DWORD (CDECL *pGetFontUnicodeRanges)( struct gdi_font *font, GLYPHSET *glyphset ); DWORD (CDECL *pGetFontUnicodeRanges)( struct gdi_font *font, GLYPHSET *glyphset );
DWORD (CDECL *pGetGlyphIndices)( struct gdi_font *font, const WCHAR *str, INT count, WORD *gi, DWORD flags ); DWORD (CDECL *pGetGlyphIndices)( struct gdi_font *font, const WCHAR *str, INT count, WORD *gi, DWORD flags );
DWORD (CDECL *pGetGlyphOutline)( struct gdi_font *font, UINT glyph, UINT format, DWORD (CDECL *pGetGlyphOutline)( struct gdi_font *font, UINT glyph, UINT format,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment