Changed functions ah_hinter_load and ah_hinter_load_glyph so that
synthetic fonts render correctly. Previously, the first glyph rendered from such a font did not have the FontMatrix applied.
This commit is contained in:
parent
594f0c965d
commit
f8d841a746
|
@ -1010,14 +1010,15 @@
|
||||||
FT_UInt load_flags,
|
FT_UInt load_flags,
|
||||||
FT_UInt depth )
|
FT_UInt depth )
|
||||||
{
|
{
|
||||||
FT_Face face = hinter->face;
|
FT_Face face = hinter->face;
|
||||||
FT_GlyphSlot slot = face->glyph;
|
FT_GlyphSlot slot = face->glyph;
|
||||||
FT_Fixed x_scale = face->size->metrics.x_scale;
|
FT_Slot_Internal internal = slot->internal;
|
||||||
FT_Fixed y_scale = face->size->metrics.y_scale;
|
FT_Fixed x_scale = face->size->metrics.x_scale;
|
||||||
|
FT_Fixed y_scale = face->size->metrics.y_scale;
|
||||||
FT_Glyph_Metrics metrics; /* temporary metrics */
|
FT_Glyph_Metrics metrics; /* temporary metrics */
|
||||||
FT_Error error;
|
FT_Error error;
|
||||||
AH_Outline* outline = hinter->glyph;
|
AH_Outline* outline = hinter->glyph;
|
||||||
AH_Loader* gloader = hinter->loader;
|
AH_Loader* gloader = hinter->loader;
|
||||||
FT_Bool no_horz_hints =
|
FT_Bool no_horz_hints =
|
||||||
( load_flags & AH_HINT_NO_HORZ_EDGES ) != 0;
|
( load_flags & AH_HINT_NO_HORZ_EDGES ) != 0;
|
||||||
FT_Bool no_vert_hints =
|
FT_Bool no_vert_hints =
|
||||||
|
@ -1029,6 +1030,21 @@
|
||||||
if ( error )
|
if ( error )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
|
||||||
|
/* Set `hinter->transformed' after loading with FT_LOAD_NO_RECURSE. */
|
||||||
|
hinter->transformed = internal->glyph_transformed;
|
||||||
|
|
||||||
|
if ( hinter->transformed )
|
||||||
|
{
|
||||||
|
FT_Matrix imatrix;
|
||||||
|
|
||||||
|
imatrix = internal->glyph_matrix;
|
||||||
|
hinter->trans_delta = internal->glyph_delta;
|
||||||
|
hinter->trans_matrix = imatrix;
|
||||||
|
|
||||||
|
FT_Matrix_Invert( &imatrix );
|
||||||
|
FT_Vector_Transform( &hinter->trans_delta, &imatrix );
|
||||||
|
}
|
||||||
|
|
||||||
/* save current glyph metrics */
|
/* save current glyph metrics */
|
||||||
metrics = slot->metrics;
|
metrics = slot->metrics;
|
||||||
|
|
||||||
|
@ -1338,9 +1354,22 @@
|
||||||
error = ah_hinter_new_face_globals( hinter, face, 0 );
|
error = ah_hinter_new_face_globals( hinter, face, 0 );
|
||||||
if ( error )
|
if ( error )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
|
||||||
}
|
}
|
||||||
hinter->globals = FACE_GLOBALS( face );
|
hinter->globals = FACE_GLOBALS( face );
|
||||||
face_globals = FACE_GLOBALS( face );
|
face_globals = FACE_GLOBALS( face );
|
||||||
|
|
||||||
|
/* Immediately call ourself. Fixes weird problem whereby computation */
|
||||||
|
/* of global hints throws off the rendering of the first glyph shown */
|
||||||
|
/* in a synthetic font. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
error = ah_hinter_load_glyph( hinter, slot, size,
|
||||||
|
glyph_index, load_flags );
|
||||||
|
if ( error )
|
||||||
|
goto Exit;
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now, we must check the current character pixel size to see if we */
|
/* now, we must check the current character pixel size to see if we */
|
||||||
|
@ -1349,29 +1378,10 @@
|
||||||
face_globals->y_scale != y_scale )
|
face_globals->y_scale != y_scale )
|
||||||
ah_hinter_scale_globals( hinter, x_scale, y_scale );
|
ah_hinter_scale_globals( hinter, x_scale, y_scale );
|
||||||
|
|
||||||
load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_RECURSE;
|
|
||||||
|
|
||||||
ah_loader_rewind( hinter->loader );
|
ah_loader_rewind( hinter->loader );
|
||||||
|
|
||||||
{
|
load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_RECURSE;
|
||||||
FT_Slot_Internal internal = slot->internal;
|
|
||||||
|
|
||||||
|
|
||||||
hinter->transformed = internal->glyph_transformed;
|
|
||||||
if ( hinter->transformed )
|
|
||||||
{
|
|
||||||
FT_Matrix imatrix;
|
|
||||||
|
|
||||||
|
|
||||||
imatrix = internal->glyph_matrix;
|
|
||||||
hinter->trans_delta = internal->glyph_delta;
|
|
||||||
hinter->trans_matrix = imatrix;
|
|
||||||
|
|
||||||
FT_Matrix_Invert( &imatrix );
|
|
||||||
FT_Vector_Transform( &hinter->trans_delta, &imatrix );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
error = ah_hinter_load( hinter, glyph_index, load_flags, 0 );
|
error = ah_hinter_load( hinter, glyph_index, load_flags, 0 );
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
|
|
Loading…
Reference in New Issue