ref: 9eefed125a11c763dc5a7fe584b7bb7c71f88d89
parent: 5c0d3a4dcaf04d5c16bb5803556a89b3505cc8bc
author: Graham Asher <[email protected]>
date: Fri Aug 23 06:08:38 EDT 2002
Simplified the incremental loading system for CFF fonts and fixed a problem with the handling of the deprecated version of the Type 2 endchar command, that emulates Type 1 'seac'. This version now works with the GhostScript-to-FreeType bridge currently under development.
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -570,16 +570,13 @@
/* For incremental fonts get the character data using the */
/* callback function. */
if ( face->root.internal->incremental_interface )
- {
- FT_Data data;
- FT_Error error = face->root.internal->incremental_interface->funcs->get_glyph_data(
- face->root.internal->incremental_interface->object,
- glyph_index, &data );
-
-
+ {
+ FT_Data data;
+ FT_Error error = face->root.internal->incremental_interface->funcs->get_glyph_data(
+ face->root.internal->incremental_interface->object,
+ glyph_index, &data );
*pointer = (FT_Byte*)data.pointer;
- *length = data.length;
-
+ *length = data.length;
return error;
}
else
@@ -586,9 +583,7 @@
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
{
- CFF_Font cff = (CFF_Font)(face->extra.data);
-
-
+ CFF_Font cff = (CFF_Font)(face->extra.data);
return cff_index_access_element( &cff->charstrings_index, glyph_index,
pointer, length );
}
@@ -608,12 +603,10 @@
/* For incremental fonts get the character data using the */
/* callback function. */
if ( face->root.internal->incremental_interface )
- {
- FT_Data data;
-
-
- data.pointer = *pointer;
- data.length = length;
+ {
+ FT_Data data;
+ data.pointer = *pointer;
+ data.length = length;
face->root.internal->incremental_interface->funcs->free_glyph_data(
face->root.internal->incremental_interface->object,&data );
}
@@ -621,9 +614,7 @@
#endif /* FT_CONFIG_OPTION_INCREMENTAL */
{
- CFF_Font cff = (CFF_Font)(face->extra.data);
-
-
+ CFF_Font cff = (CFF_Font)(face->extra.data);
cff_index_forget_element( &cff->charstrings_index, pointer );
}
}
@@ -640,14 +631,26 @@
FT_Int bchar_index, achar_index, n_base_points;
FT_Outline* base = decoder->builder.base;
TT_Face face = decoder->builder.face;
- CFF_Font cff = (CFF_Font)(face->extra.data);
FT_Vector left_bearing, advance;
FT_Byte* charstring;
FT_ULong charstring_len;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+ /* Incremental fonts don't necessarily have valid charsets. */
+ /* They use the character code, not the glyph index, in this case. */
+ if ( face->root.internal->incremental_interface )
+ {
+ bchar_index = bchar;
+ achar_index = achar;
+ }
+ else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+ {
+ CFF_Font cff = (CFF_Font)(face->extra.data);
- bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
- achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+ bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
+ achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+ }
if ( bchar_index < 0 || achar_index < 0 )
{
@@ -699,7 +702,8 @@
&charstring, &charstring_len );
if ( !error )
{
- error = cff_decoder_parse_charstrings( decoder, charstring, charstring_len );
+ error = cff_decoder_parse_charstrings( decoder, charstring,
+ charstring_len );
if ( error )
goto Exit;
@@ -2312,7 +2316,7 @@
#ifdef FT_CONFIG_OPTION_INCREMENTAL
- /* Control data and length may not be available for incremental */
+ /* Control data and length may not be available for incremental */
/* fonts. */
if ( face->root.internal->incremental_interface )
{
@@ -2326,13 +2330,11 @@
/* See how charstring loads at cff_index_access_element() in */
/* cffload.c. */
{
- CFF_IndexRec csindex = cff->charstrings_index;
-
-
- glyph->root.control_data =
- csindex.bytes + csindex.offsets[glyph_index] - 1;
- glyph->root.control_len =
- charstring_len;
+ CFF_IndexRec csindex = cff->charstrings_index;
+ glyph->root.control_data =
+ csindex.bytes + csindex.offsets[glyph_index] - 1;
+ glyph->root.control_len =
+ charstring_len;
}
}
--- a/src/cff/cffload.c
+++ b/src/cff/cffload.c
@@ -2027,8 +2027,7 @@
FT_LOCAL_DEF( FT_Error )
cff_font_load( FT_Stream stream,
FT_Int face_index,
- CFF_Font font,
- CFF_Face face )
+ CFF_Font font )
{
static const FT_Frame_Field cff_header_fields[] =
{
@@ -2048,11 +2047,6 @@
FT_ULong base_offset;
CFF_FontRecDict dict;
-#ifndef FT_CONFIG_OPTION_INCREMENTAL
- FT_UNUSED( face );
-#endif
-
-
FT_ZERO( font );
font->stream = stream;
@@ -2164,26 +2158,20 @@
else
font->num_subfonts = 0;
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
- /* Incremental fonts don't need character recipes. */
- if ( !face->root.internal->incremental_interface )
-#endif
+ /* read the charstrings index now */
+ if ( dict->charstrings_offset == 0 )
{
- /* read the charstrings index now */
- if ( dict->charstrings_offset == 0 )
- {
- FT_ERROR(( "cff_font_load: no charstrings offset!\n" ));
- error = CFF_Err_Unknown_File_Format;
- goto Exit;
- }
+ FT_ERROR(( "cff_font_load: no charstrings offset!\n" ));
+ error = CFF_Err_Unknown_File_Format;
+ goto Exit;
+ }
- if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
- goto Exit;
+ if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
+ goto Exit;
- error = cff_new_index( &font->charstrings_index, stream, 0 );
- if ( error )
- goto Exit;
- }
+ error = cff_new_index( &font->charstrings_index, stream, 0 );
+ if ( error )
+ goto Exit;
/* explicit the global subrs */
font->num_global_subrs = font->global_subrs_index.count;
@@ -2199,7 +2187,7 @@
if ( font->num_glyphs > 0 )
{
error = cff_charset_load( &font->charset, font->num_glyphs, stream,
- base_offset, dict->charset_offset );
+ base_offset, dict->charset_offset );
if ( error )
goto Exit;
--- a/src/cff/cffload.h
+++ b/src/cff/cffload.h
@@ -55,8 +55,7 @@
FT_LOCAL( FT_Error )
cff_font_load( FT_Stream stream,
FT_Int face_index,
- CFF_Font font,
- CFF_Face face );
+ CFF_Font font );
FT_LOCAL( void )
cff_font_done( CFF_Font font );
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -342,7 +342,7 @@
goto Exit;
face->extra.data = cff;
- error = cff_font_load( stream, face_index, cff, face );
+ error = cff_font_load( stream, face_index, cff );
if ( error )
goto Exit;