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:
Tom Kacvinsky 2000-12-21 01:25:13 +00:00
parent 594f0c965d
commit f8d841a746
1 changed files with 36 additions and 26 deletions

View File

@ -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,28 +1378,9 @@
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 );