diff options
Diffstat (limited to 'extras/freetype2/src/cid/cidobjs.c')
-rw-r--r-- | extras/freetype2/src/cid/cidobjs.c | 164 |
1 files changed, 95 insertions, 69 deletions
diff --git a/extras/freetype2/src/cid/cidobjs.c b/extras/freetype2/src/cid/cidobjs.c index ac5f16e4a..356d01805 100644 --- a/extras/freetype2/src/cid/cidobjs.c +++ b/extras/freetype2/src/cid/cidobjs.c @@ -4,7 +4,7 @@ /* */ /* CID objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002 by */ +/* Copyright 1996-2001, 2002, 2003, 2004 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -19,9 +19,11 @@ #include <ft2build.h> #include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_STREAM_H + #include "cidgload.h" #include "cidload.h" -#include FT_INTERNAL_POSTSCRIPT_NAMES_H + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H #include FT_INTERNAL_POSTSCRIPT_AUX_H #include FT_INTERNAL_POSTSCRIPT_HINTS_H @@ -197,12 +199,12 @@ if ( face->subrs ) { FT_Int n; - + for ( n = 0; n < cid->num_dicts; n++ ) { CID_Subrs subr = face->subrs + n; - + if ( subr->code ) { @@ -232,6 +234,9 @@ face->root.family_name = 0; face->root.style_name = 0; + + FT_FREE( face->binary_data ); + FT_FREE( face->cid_stream ); } } @@ -266,27 +271,19 @@ FT_Int num_params, FT_Parameter* params ) { - FT_Error error; - PSNames_Service psnames; - PSAux_Service psaux; - PSHinter_Service pshinter; + FT_Error error; + FT_Service_PsCMaps psnames; + PSAux_Service psaux; + PSHinter_Service pshinter; FT_UNUSED( num_params ); FT_UNUSED( params ); - FT_UNUSED( face_index ); FT_UNUSED( stream ); face->root.num_faces = 1; - psnames = (PSNames_Service)face->psnames; - if ( !psnames ) - { - psnames = (PSNames_Service)FT_Get_Module_Interface( - FT_FACE_LIBRARY( face ), "psnames" ); - - face->psnames = psnames; - } + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); psaux = (PSAux_Service)face->psaux; if ( !psaux ) @@ -310,7 +307,7 @@ if ( FT_STREAM_SEEK( 0 ) ) goto Exit; - error = cid_face_open( face ); + error = cid_face_open( face, face_index ); if ( error ) goto Exit; @@ -326,77 +323,106 @@ goto Exit; } - /* Now, load the font program into the face object */ + /* now load the font program into the face object */ + + /* initialize the face object fields */ + + /* set up root face fields */ { - /* Init the face object fields */ - /* Now set up root face fields */ - { - FT_Face root = (FT_Face)&face->root; + FT_Face root = (FT_Face)&face->root; + CID_FaceInfo cid = &face->cid; + PS_FontInfo info = &cid->font_info; - root->num_glyphs = face->cid.cid_count; - root->num_charmaps = 0; + root->num_glyphs = cid->cid_count; + root->num_charmaps = 0; - root->face_index = face_index; - root->face_flags = FT_FACE_FLAG_SCALABLE; + root->face_index = face_index; + root->face_flags = FT_FACE_FLAG_SCALABLE; - root->face_flags |= FT_FACE_FLAG_HORIZONTAL; + root->face_flags |= FT_FACE_FLAG_HORIZONTAL; - if ( face->cid.font_info.is_fixed_pitch ) - root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; + if ( info->is_fixed_pitch ) + root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; - /* XXX: TODO: add kerning with .afm support */ + /* XXX: TODO: add kerning with .afm support */ - /* get style name -- be careful, some broken fonts only */ - /* have a /FontName dictionary entry! */ - root->family_name = face->cid.font_info.family_name; - if ( root->family_name ) - { - char* full = face->cid.font_info.full_name; - char* family = root->family_name; + /* get style name -- be careful, some broken fonts only */ + /* have a /FontName dictionary entry! */ + root->family_name = info->family_name; + /* assume "Regular" style if we don't know better */ + root->style_name = (char *)"Regular"; + if ( root->family_name ) + { + char* full = info->full_name; + char* family = root->family_name; - while ( *family && *full == *family ) - { - family++; - full++; - } - root->style_name = ( *full == ' ' ) ? full + 1 - : (char *)"Regular"; - } - else + if ( full ) { - /* do we have a `/FontName'? */ - if ( face->cid.cid_font_name ) + while ( *full ) { - root->family_name = face->cid.cid_font_name; - root->style_name = (char *)"Regular"; + if ( *full == *family ) + { + family++; + full++; + } + else + { + if ( *full == ' ' || *full == '-' ) + full++; + else if ( *family == ' ' || *family == '-' ) + family++; + else + { + if ( !*family ) + root->style_name = full; + break; + } + } } } + } + else + { + /* do we have a `/FontName'? */ + if ( cid->cid_font_name ) + root->family_name = cid->cid_font_name; + } + + /* compute style flags */ + root->style_flags = 0; + if ( info->italic_angle ) + root->style_flags |= FT_STYLE_FLAG_ITALIC; + if ( info->weight ) + { + if ( !ft_strcmp( info->weight, "Bold" ) || + !ft_strcmp( info->weight, "Black" ) ) + root->style_flags |= FT_STYLE_FLAG_BOLD; + } - /* no embedded bitmap support */ - root->num_fixed_sizes = 0; - root->available_sizes = 0; + /* no embedded bitmap support */ + root->num_fixed_sizes = 0; + root->available_sizes = 0; - root->bbox.xMin = face->cid.font_bbox.xMin >> 16; - root->bbox.yMin = face->cid.font_bbox.yMin >> 16; - root->bbox.xMax = ( face->cid.font_bbox.xMax + 0xFFFFU ) >> 16; - root->bbox.yMax = ( face->cid.font_bbox.yMax + 0xFFFFU ) >> 16; + root->bbox.xMin = cid->font_bbox.xMin >> 16; + root->bbox.yMin = cid->font_bbox.yMin >> 16; + root->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFFU ) >> 16; + root->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFFU ) >> 16; - if ( !root->units_per_EM ) - root->units_per_EM = 1000; + if ( !root->units_per_EM ) + root->units_per_EM = 1000; - root->ascender = (FT_Short)( root->bbox.yMax ); - root->descender = (FT_Short)( root->bbox.yMin ); - root->height = (FT_Short)( - ( ( root->ascender + root->descender ) * 12 ) / 10 ); + root->ascender = (FT_Short)( root->bbox.yMax ); + root->descender = (FT_Short)( root->bbox.yMin ); + root->height = (FT_Short)( + ( ( root->ascender - root->descender ) * 12 ) / 10 ); - root->underline_position = face->cid.font_info.underline_position; - root->underline_thickness = face->cid.font_info.underline_thickness; + root->underline_position = (FT_Short)info->underline_position; + root->underline_thickness = (FT_Short)info->underline_thickness; - root->internal->max_points = 0; - root->internal->max_contours = 0; - } + root->internal->max_points = 0; + root->internal->max_contours = 0; } Exit: |