summaryrefslogtreecommitdiff
path: root/extras/freetype2/src/cid/cidobjs.c
diff options
context:
space:
mode:
Diffstat (limited to 'extras/freetype2/src/cid/cidobjs.c')
-rw-r--r--extras/freetype2/src/cid/cidobjs.c164
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: