| Index: src/cff/cffobjs.c
|
| diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c
|
| index cd386762dc4090ff7c392621fc165d9540bd618b..6ad0e508974bf8c408dc1291c7006f1e4539f952 100644
|
| --- a/src/cff/cffobjs.c
|
| +++ b/src/cff/cffobjs.c
|
| @@ -4,7 +4,7 @@
|
| /* */
|
| /* OpenType objects manager (body). */
|
| /* */
|
| -/* Copyright 1996-2011 by */
|
| +/* Copyright 1996-2012 by */
|
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
| /* */
|
| /* This file is part of the FreeType project, and may only be used, */
|
| @@ -403,7 +403,7 @@
|
| FT_Int32 idx = 0;
|
| FT_Int32 length = strlen( name ) + 1;
|
| FT_Bool continue_search = 1;
|
| -
|
| +
|
|
|
| while ( continue_search )
|
| {
|
| @@ -494,13 +494,19 @@
|
| sfnt = (SFNT_Service)FT_Get_Module_Interface(
|
| library, "sfnt" );
|
| if ( !sfnt )
|
| - goto Bad_Format;
|
| + {
|
| + FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
|
| + error = CFF_Err_Missing_Module;
|
| + goto Exit;
|
| + }
|
|
|
| FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
|
|
|
| pshinter = (PSHinter_Service)FT_Get_Module_Interface(
|
| library, "pshinter" );
|
|
|
| + FT_TRACE2(( "CFF driver\n" ));
|
| +
|
| /* create input stream from resource */
|
| if ( FT_STREAM_SEEK( 0 ) )
|
| goto Exit;
|
| @@ -511,8 +517,9 @@
|
| {
|
| if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */
|
| {
|
| - FT_TRACE2(( "[not a valid OpenType/CFF font]\n" ));
|
| - goto Bad_Format;
|
| + FT_TRACE2(( " not an OpenType/CFF font\n" ));
|
| + error = CFF_Err_Unknown_File_Format;
|
| + goto Exit;
|
| }
|
|
|
| /* if we are performing a simple font format check, exit immediately */
|
| @@ -604,10 +611,29 @@
|
| " cannot open CFF & CEF fonts\n"
|
| " "
|
| " without the `PSNames' module\n" ));
|
| - goto Bad_Format;
|
| + error = CFF_Err_Missing_Module;
|
| + goto Exit;
|
| }
|
|
|
| - if ( !dict->units_per_em )
|
| +#ifdef FT_DEBUG_LEVEL_TRACE
|
| + {
|
| + FT_UInt idx;
|
| + FT_String* s;
|
| +
|
| +
|
| + FT_TRACE4(( "SIDs\n" ));
|
| +
|
| + /* dump string index, including default strings for convenience */
|
| + for ( idx = 0; idx < cff->num_strings + 390; idx++ )
|
| + {
|
| + s = cff_index_get_sid_string( cff, idx );
|
| + if ( s )
|
| + FT_TRACE4((" %5d %s\n", idx, s ));
|
| + }
|
| + }
|
| +#endif /* FT_DEBUG_LEVEL_TRACE */
|
| +
|
| + if ( !dict->has_font_matrix )
|
| dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;
|
|
|
| /* Normalize the font matrix so that `matrix->xx' is 1; the */
|
| @@ -652,26 +678,32 @@
|
| FT_Fixed temp;
|
|
|
|
|
| - if ( sub->units_per_em )
|
| + if ( sub->has_font_matrix )
|
| {
|
| FT_Long scaling;
|
|
|
|
|
| - if ( top->units_per_em > 1 && sub->units_per_em > 1 )
|
| - scaling = FT_MIN( top->units_per_em, sub->units_per_em );
|
| - else
|
| - scaling = 1;
|
| -
|
| - FT_Matrix_Multiply_Scaled( &top->font_matrix,
|
| - &sub->font_matrix,
|
| - scaling );
|
| - FT_Vector_Transform_Scaled( &sub->font_offset,
|
| - &top->font_matrix,
|
| - scaling );
|
| -
|
| - sub->units_per_em = FT_MulDiv( sub->units_per_em,
|
| - top->units_per_em,
|
| - scaling );
|
| + /* if we have a top-level matrix, */
|
| + /* concatenate the subfont matrix */
|
| +
|
| + if ( top->has_font_matrix )
|
| + {
|
| + if ( top->units_per_em > 1 && sub->units_per_em > 1 )
|
| + scaling = FT_MIN( top->units_per_em, sub->units_per_em );
|
| + else
|
| + scaling = 1;
|
| +
|
| + FT_Matrix_Multiply_Scaled( &top->font_matrix,
|
| + &sub->font_matrix,
|
| + scaling );
|
| + FT_Vector_Transform_Scaled( &sub->font_offset,
|
| + &top->font_matrix,
|
| + scaling );
|
| +
|
| + sub->units_per_em = FT_MulDiv( sub->units_per_em,
|
| + top->units_per_em,
|
| + scaling );
|
| + }
|
| }
|
| else
|
| {
|
| @@ -690,16 +722,6 @@
|
| {
|
| *upm = FT_DivFix( *upm, temp );
|
|
|
| - /* if *upm is larger than 100*1000 we divide by 1000 -- */
|
| - /* this can happen if e.g. there is no top-font FontMatrix */
|
| - /* and the subfont FontMatrix already contains the complete */
|
| - /* scaling for the subfont (see section 5.11 of the PLRM) */
|
| -
|
| - /* 100 is a heuristic value */
|
| -
|
| - if ( *upm > 100L * 1000L )
|
| - *upm = ( *upm + 500 ) / 1000;
|
| -
|
| matrix->xx = FT_DivFix( matrix->xx, temp );
|
| matrix->yx = FT_DivFix( matrix->yx, temp );
|
| matrix->xy = FT_DivFix( matrix->xy, temp );
|
| @@ -758,7 +780,7 @@
|
| char* family_name = NULL;
|
|
|
|
|
| - remove_subset_prefix( cffface->family_name );
|
| + remove_subset_prefix( cffface->family_name );
|
|
|
| if ( dict->family_name )
|
| {
|
| @@ -805,7 +827,7 @@
|
| style_name = cff_strcpy( memory, fullp );
|
|
|
| /* remove the style part from the family name (if present) */
|
| - remove_style( cffface->family_name, style_name );
|
| + remove_style( cffface->family_name, style_name );
|
| }
|
| break;
|
| }
|
| @@ -833,22 +855,22 @@
|
| /* */
|
| /* Compute face flags. */
|
| /* */
|
| - flags = (FT_UInt32)( FT_FACE_FLAG_SCALABLE | /* scalable outlines */
|
| - FT_FACE_FLAG_HORIZONTAL | /* horizontal data */
|
| - FT_FACE_FLAG_HINTER ); /* has native hinter */
|
| + flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */
|
| + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */
|
| + FT_FACE_FLAG_HINTER; /* has native hinter */
|
|
|
| if ( sfnt_format )
|
| - flags |= (FT_UInt32)FT_FACE_FLAG_SFNT;
|
| + flags |= FT_FACE_FLAG_SFNT;
|
|
|
| /* fixed width font? */
|
| if ( dict->is_fixed_pitch )
|
| - flags |= (FT_UInt32)FT_FACE_FLAG_FIXED_WIDTH;
|
| + flags |= FT_FACE_FLAG_FIXED_WIDTH;
|
|
|
| /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */
|
| #if 0
|
| /* kerning available? */
|
| if ( face->kern_pairs )
|
| - flags |= (FT_UInt32)FT_FACE_FLAG_KERNING;
|
| + flags |= FT_FACE_FLAG_KERNING;
|
| #endif
|
|
|
| cffface->face_flags = flags;
|
| @@ -1000,10 +1022,6 @@
|
|
|
| Exit:
|
| return error;
|
| -
|
| - Bad_Format:
|
| - error = CFF_Err_Unknown_File_Format;
|
| - goto Exit;
|
| }
|
|
|
|
|
|
|