2000-06-16 08:49:56 +02:00
|
|
|
/***************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* cidobjs.c */
|
|
|
|
/* */
|
|
|
|
/* CID objects manager (body). */
|
|
|
|
/* */
|
|
|
|
/* Copyright 1996-2000 by */
|
|
|
|
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
|
|
|
/* */
|
|
|
|
/* This file is part of the FreeType project, and may only be used, */
|
|
|
|
/* modified, and distributed under the terms of the FreeType project */
|
|
|
|
/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
|
|
|
|
/* this file you indicate that you have read the license and */
|
|
|
|
/* understand and accept it fully. */
|
|
|
|
/* */
|
|
|
|
/***************************************************************************/
|
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
|
|
|
|
#include <freetype/internal/ftdebug.h>
|
|
|
|
#include <freetype/internal/ftstream.h>
|
|
|
|
|
|
|
|
#include <cidgload.h>
|
|
|
|
#include <cidload.h>
|
|
|
|
#include <freetype/internal/psnames.h>
|
|
|
|
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
|
|
|
|
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
|
|
|
|
/* messages during execution. */
|
|
|
|
/* */
|
|
|
|
#undef FT_COMPONENT
|
|
|
|
#define FT_COMPONENT trace_cidobjs
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* FACE FUNCTIONS */
|
|
|
|
/* */
|
|
|
|
/*************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* CID_Done_Face */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Finalizes a given face object. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
|
|
|
/* face :: A pointer to the face object to destroy. */
|
|
|
|
/* */
|
2000-06-01 05:27:48 +02:00
|
|
|
LOCAL_FUNC
|
2000-06-16 08:49:56 +02:00
|
|
|
void CID_Done_Face( CID_Face face )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
|
|
|
FT_Memory memory;
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
|
|
|
|
if ( face )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
2000-06-16 08:49:56 +02:00
|
|
|
CID_Info* cid = &face->cid;
|
|
|
|
T1_FontInfo* info = &cid->font_info;
|
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
|
|
|
|
memory = face->root.memory;
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
/* release FontInfo strings */
|
|
|
|
FREE( info->version );
|
|
|
|
FREE( info->notice );
|
|
|
|
FREE( info->full_name );
|
|
|
|
FREE( info->family_name );
|
|
|
|
FREE( info->weight );
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
/* release font dictionaries */
|
|
|
|
FREE( cid->font_dicts );
|
|
|
|
cid->num_dicts = 0;
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
/* release other strings */
|
|
|
|
FREE( cid->cid_font_name );
|
|
|
|
FREE( cid->registry );
|
|
|
|
FREE( cid->ordering );
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
face->root.family_name = 0;
|
|
|
|
face->root.style_name = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* CID_Init_Face */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Initializes a given CID face object. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
|
|
|
/* stream :: The source font stream. */
|
|
|
|
/* */
|
|
|
|
/* face_index :: The index of the font face in the resource. */
|
|
|
|
/* */
|
|
|
|
/* num_params :: Number of additional generic parameters. Ignored. */
|
|
|
|
/* */
|
|
|
|
/* params :: Additional generic parameters. Ignored. */
|
|
|
|
/* */
|
|
|
|
/* <InOut> */
|
|
|
|
/* face :: The newly built face object. */
|
|
|
|
/* */
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
/* FreeType error code. 0 means success. */
|
2000-06-16 08:49:56 +02:00
|
|
|
/* */
|
2000-06-01 05:27:48 +02:00
|
|
|
LOCAL_FUNC
|
2000-06-16 21:34:52 +02:00
|
|
|
FT_Error CID_Init_Face( FT_Stream stream,
|
2000-06-16 08:49:56 +02:00
|
|
|
CID_Face face,
|
2000-06-16 21:34:52 +02:00
|
|
|
FT_Int face_index,
|
|
|
|
FT_Int num_params,
|
2000-06-16 08:49:56 +02:00
|
|
|
FT_Parameter* params )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
FT_Error error;
|
2000-06-01 05:27:48 +02:00
|
|
|
PSNames_Interface* psnames;
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
UNUSED( num_params );
|
|
|
|
UNUSED( params );
|
|
|
|
UNUSED( face_index );
|
|
|
|
UNUSED( stream );
|
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
|
|
|
|
face->root.num_faces = 1;
|
|
|
|
|
|
|
|
psnames = (PSNames_Interface*)face->psnames;
|
2000-06-16 08:49:56 +02:00
|
|
|
if ( !psnames )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
2000-06-25 08:47:11 +02:00
|
|
|
psnames = (PSNames_Interface*)FT_Get_Module_Interface(
|
|
|
|
FT_FACE_LIBRARY( face ), "psnames" );
|
2000-06-23 07:02:13 +02:00
|
|
|
|
|
|
|
face->psnames = psnames;
|
2000-06-01 05:27:48 +02:00
|
|
|
}
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
/* open the tokenizer; this will also check the font format */
|
|
|
|
if ( FILE_Seek( 0 ) )
|
2000-06-01 05:27:48 +02:00
|
|
|
goto Exit;
|
2000-06-16 08:49:56 +02:00
|
|
|
|
A complete revision of FreeType 2's GNU makefiles (of the library):
Tons of unnecessary stuff have been removed; only the essential rules
have been retained.
The source files now depend on all header files in include/freetype,
include/freetype/config, and include/freetype/internal. This is not
optimal, I know, and I'll try to improve this, but it is better than
before (namely no dependencies on `internal').
FTDEBUG_SRC has been added (similar to FTSYS_SRC) -- I don't know
exactly whether this is really useful, but it doesn't harm.
There is now more documentation in the makefiles itself.
io-frames.html: Use of <th>, <code>, and <var> for better tagging.
Reactivating of FT_DEBUG_LEVEL_xxx macros.
Added a lot of #include directives to make `multi' builds possible -- note
that currently the modules cid, t1, and t1z have clashing structures and
functions which means that you can only use one of these three modules for a
multi build.
Added some missing function declarations to (local) header files.
Renamed some T1_Open_Face() to CID_Open_Face() in the cid module -- a lot
of other functions should be renamed also...
Replaced many FT_xxx stuff with T1_xxx in t1z driver -- this isn't finished
yet...
Fixed FT_Free() to allow a NULL pointer without an assertion (this has
always been a valid assumption in FreeType, at least in FT 1.x).
A lot of other, minor fixes (mostly documentation).
2000-06-11 05:46:57 +02:00
|
|
|
error = CID_Open_Face( face );
|
2000-06-16 08:49:56 +02:00
|
|
|
if ( error )
|
|
|
|
goto Exit;
|
2000-06-01 05:27:48 +02:00
|
|
|
|
|
|
|
/* if we just wanted to check the format, leave successfully now */
|
2000-06-16 08:49:56 +02:00
|
|
|
if ( face_index < 0 )
|
2000-06-01 05:27:48 +02:00
|
|
|
goto Exit;
|
|
|
|
|
|
|
|
/* check the face index */
|
|
|
|
if ( face_index != 0 )
|
|
|
|
{
|
2000-06-16 08:49:56 +02:00
|
|
|
FT_ERROR(( "CID_Init_Face: invalid face index\n" ));
|
2000-06-01 05:27:48 +02:00
|
|
|
error = T1_Err_Invalid_Argument;
|
|
|
|
goto Exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Now, load the font program into the face object */
|
|
|
|
{
|
|
|
|
/* Init the face object fields */
|
|
|
|
/* Now set up root face fields */
|
|
|
|
{
|
|
|
|
FT_Face root = (FT_Face)&face->root;
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
root->num_glyphs = face->cid.cid_count;
|
|
|
|
root->num_charmaps = 0;
|
|
|
|
|
|
|
|
root->face_index = face_index;
|
|
|
|
root->face_flags = FT_FACE_FLAG_SCALABLE;
|
|
|
|
|
|
|
|
root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
|
|
|
|
|
|
|
|
if ( face->cid.font_info.is_fixed_pitch )
|
|
|
|
root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
|
|
|
|
|
2000-07-01 00:24:36 +02:00
|
|
|
/* XXX: TODO: add kerning with .afm support */
|
2000-06-01 05:27:48 +02:00
|
|
|
|
2000-07-01 00:24:36 +02:00
|
|
|
/* get style name -- be careful, some broken fonts only */
|
|
|
|
/* have a /FontName dictionary entry! */
|
2000-06-01 05:27:48 +02:00
|
|
|
root->family_name = face->cid.font_info.family_name;
|
2000-06-16 08:49:56 +02:00
|
|
|
if ( root->family_name )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
|
|
|
char* full = face->cid.font_info.full_name;
|
|
|
|
char* family = root->family_name;
|
|
|
|
|
|
|
|
while ( *family && *full == *family )
|
|
|
|
{
|
|
|
|
family++;
|
|
|
|
full++;
|
|
|
|
}
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
root->style_name = ( *full == ' ' ) ? full + 1
|
|
|
|
: "Regular";
|
2000-06-01 05:27:48 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2000-06-16 08:49:56 +02:00
|
|
|
/* do we have a `/FontName'? */
|
|
|
|
if ( face->cid.cid_font_name )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
|
|
|
root->family_name = face->cid.cid_font_name;
|
|
|
|
root->style_name = "Regular";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* no embedded bitmap support */
|
|
|
|
root->num_fixed_sizes = 0;
|
|
|
|
root->available_sizes = 0;
|
|
|
|
|
|
|
|
root->bbox = face->cid.font_bbox;
|
|
|
|
root->units_per_EM = 1000;
|
|
|
|
root->ascender = (FT_Short)face->cid.font_bbox.yMax;
|
|
|
|
root->descender = -(FT_Short)face->cid.font_bbox.yMin;
|
2000-06-16 08:49:56 +02:00
|
|
|
root->height = ( ( root->ascender + root->descender ) * 12 )
|
|
|
|
/ 10;
|
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
|
|
|
|
#if 0
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
/* now compute the maximum advance width */
|
|
|
|
|
|
|
|
root->max_advance_width = face->type1.private_dict.standard_width[0];
|
|
|
|
|
|
|
|
/* compute max advance width for proportional fonts */
|
2000-06-16 08:49:56 +02:00
|
|
|
if ( !face->type1.font_info.is_fixed_pitch )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
2000-06-16 21:34:52 +02:00
|
|
|
FT_Int max_advance;
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
|
2000-06-28 01:20:35 +02:00
|
|
|
error = CID_Compute_Max_Advance( face, &max_advance );
|
2000-06-01 05:27:48 +02:00
|
|
|
|
|
|
|
/* in case of error, keep the standard width */
|
2000-06-16 08:49:56 +02:00
|
|
|
if ( !error )
|
2000-06-01 05:27:48 +02:00
|
|
|
root->max_advance_width = max_advance;
|
|
|
|
else
|
|
|
|
error = 0; /* clear error */
|
|
|
|
}
|
|
|
|
|
|
|
|
root->max_advance_height = root->height;
|
2000-06-16 08:49:56 +02:00
|
|
|
|
|
|
|
#endif /* 0 */
|
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
root->underline_position = face->cid.font_info.underline_position;
|
|
|
|
root->underline_thickness = face->cid.font_info.underline_thickness;
|
|
|
|
|
|
|
|
root->max_points = 0;
|
|
|
|
root->max_contours = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
/* charmap support - synthetize unicode charmap when possible */
|
|
|
|
{
|
|
|
|
FT_Face root = &face->root;
|
|
|
|
FT_CharMap charmap = face->charmaprecs;
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
|
2000-07-01 00:24:36 +02:00
|
|
|
/* synthesize a Unicode charmap if there is support in the `psnames' */
|
2000-06-16 08:49:56 +02:00
|
|
|
/* module */
|
|
|
|
if ( face->psnames )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
|
|
|
PSNames_Interface* psnames = (PSNames_Interface*)face->psnames;
|
2000-06-16 08:49:56 +02:00
|
|
|
|
|
|
|
|
|
|
|
if ( psnames->unicode_value )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
2000-06-16 08:49:56 +02:00
|
|
|
error = psnames->build_unicodes(
|
|
|
|
root->memory,
|
|
|
|
face->type1.num_glyphs,
|
|
|
|
(const char**)face->type1.glyph_names,
|
|
|
|
&face->unicode_map );
|
|
|
|
if ( !error )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
|
|
|
root->charmap = charmap;
|
|
|
|
charmap->face = (FT_Face)face;
|
|
|
|
charmap->encoding = ft_encoding_unicode;
|
|
|
|
charmap->platform_id = 3;
|
|
|
|
charmap->encoding_id = 1;
|
|
|
|
charmap++;
|
|
|
|
}
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
/* simply clear the error in case of failure (which really */
|
|
|
|
/* means that out of memory or no unicode glyph names) */
|
2000-06-01 05:27:48 +02:00
|
|
|
error = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* now, support either the standard, expert, or custom encodings */
|
|
|
|
charmap->face = (FT_Face)face;
|
2000-06-16 08:49:56 +02:00
|
|
|
charmap->platform_id = 7; /* a new platform id for Adobe fonts? */
|
2000-06-01 05:27:48 +02:00
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
switch ( face->type1.encoding_type )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
2000-06-16 08:49:56 +02:00
|
|
|
case t1_encoding_standard:
|
|
|
|
charmap->encoding = ft_encoding_adobe_standard;
|
|
|
|
charmap->encoding_id = 0;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case t1_encoding_expert:
|
|
|
|
charmap->encoding = ft_encoding_adobe_expert;
|
|
|
|
charmap->encoding_id = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
charmap->encoding = ft_encoding_adobe_custom;
|
|
|
|
charmap->encoding_id = 2;
|
|
|
|
break;
|
2000-06-01 05:27:48 +02:00
|
|
|
}
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
root->charmaps = face->charmaps;
|
2000-06-01 05:27:48 +02:00
|
|
|
root->num_charmaps = charmap - face->charmaprecs + 1;
|
2000-06-16 08:49:56 +02:00
|
|
|
face->charmaps[0] = &face->charmaprecs[0];
|
|
|
|
face->charmaps[1] = &face->charmaprecs[1];
|
2000-06-01 05:27:48 +02:00
|
|
|
}
|
2000-06-16 08:49:56 +02:00
|
|
|
|
|
|
|
#endif /* 0 */
|
|
|
|
|
2000-06-01 05:27:48 +02:00
|
|
|
Exit:
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* CID_Init_Driver */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Initializes a given CID driver object. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
|
|
|
/* driver :: A handle to the target driver object. */
|
|
|
|
/* */
|
|
|
|
/* <Return> */
|
2000-06-25 08:47:11 +02:00
|
|
|
/* FreeType error code. 0 means success. */
|
2000-06-16 08:49:56 +02:00
|
|
|
/* */
|
2000-06-01 05:27:48 +02:00
|
|
|
LOCAL_FUNC
|
2000-06-28 01:20:35 +02:00
|
|
|
FT_Error CID_Init_Driver( CID_Driver driver )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
2000-06-16 08:49:56 +02:00
|
|
|
UNUSED( driver );
|
|
|
|
|
2000-06-25 08:47:11 +02:00
|
|
|
return T1_Err_Ok;
|
2000-06-01 05:27:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-06-16 08:49:56 +02:00
|
|
|
/*************************************************************************/
|
|
|
|
/* */
|
|
|
|
/* <Function> */
|
|
|
|
/* CID_Done_Driver */
|
|
|
|
/* */
|
|
|
|
/* <Description> */
|
|
|
|
/* Finalizes a given CID driver. */
|
|
|
|
/* */
|
|
|
|
/* <Input> */
|
|
|
|
/* driver :: A handle to the target CID driver. */
|
|
|
|
/* */
|
2000-06-01 05:27:48 +02:00
|
|
|
LOCAL_DEF
|
2000-06-28 01:20:35 +02:00
|
|
|
void CID_Done_Driver( CID_Driver driver )
|
2000-06-01 05:27:48 +02:00
|
|
|
{
|
2000-06-16 08:49:56 +02:00
|
|
|
UNUSED( driver );
|
2000-06-01 05:27:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* END */
|