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; |
} |