Allow `type1' module to use the Adobe engine.

Add the callback and some conditionals to switch between the two
engines.

* include/freetype/internal/psaux.h (T1_Decoder_FuncsRec): Change
function declarations.
* src/psaux/psauxmod.c (T1_Decoder_FuncsRec): Register the
callbacks.

* src/psaux/psobjs.c (ps_builder_add_point): Add conditionals for
number conversion.

* src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add code
to choose which renderer to use.

* src/cid/cidgload.c (cid_load_glyph): Update call.
* src/base/ftobjs.c, src/psaux/psobjs.c, src/type1/t1gload.c: Update
includes.
This commit is contained in:
Ewald Hew 2017-09-25 06:40:32 +02:00 committed by Werner Lemberg
parent 97704b158e
commit 7e185dcd79
6 changed files with 81 additions and 14 deletions

View File

@ -1,3 +1,25 @@
2017-09-25 Ewald Hew <ewaldhew@gmail.com>
Allow `type1' module to use the Adobe engine.
Add the callback and some conditionals to switch between the two
engines.
* include/freetype/internal/psaux.h (T1_Decoder_FuncsRec): Change
function declarations.
* src/psaux/psauxmod.c (T1_Decoder_FuncsRec): Register the
callbacks.
* src/psaux/psobjs.c (ps_builder_add_point): Add conditionals for
number conversion.
* src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add code
to choose which renderer to use.
* src/cid/cidgload.c (cid_load_glyph): Update call.
* src/base/ftobjs.c, src/psaux/psobjs.c, src/type1/t1gload.c: Update
includes.
2017-09-25 Ewald Hew <ewaldhew@gmail.com> 2017-09-25 Ewald Hew <ewaldhew@gmail.com>
[type1] Add Adobe engine configuration. [type1] Add Adobe engine configuration.

View File

@ -872,9 +872,15 @@ FT_BEGIN_HEADER
(*done)( T1_Decoder decoder ); (*done)( T1_Decoder decoder );
FT_Error FT_Error
(*parse_charstrings)( T1_Decoder decoder, (*parse_charstrings_old)( T1_Decoder decoder,
FT_Byte* base, FT_Byte* base,
FT_UInt len ); FT_UInt len );
FT_Error
(*parse_charstrings)( PS_Decoder* decoder,
FT_Byte* charstring_base,
FT_ULong charstring_len );
} T1_Decoder_FuncsRec; } T1_Decoder_FuncsRec;

View File

@ -169,7 +169,7 @@
if ( decoder->lenIV >= 0 ) if ( decoder->lenIV >= 0 )
psaux->t1_decrypt( charstring, glyph_length, 4330 ); psaux->t1_decrypt( charstring, glyph_length, 4330 );
error = decoder->funcs.parse_charstrings( error = decoder->funcs.parse_charstrings_old(
decoder, charstring + cs_offset, decoder, charstring + cs_offset,
glyph_length - cs_offset ); glyph_length - cs_offset );
} }

View File

@ -90,7 +90,8 @@
{ {
t1_decoder_init, /* init */ t1_decoder_init, /* init */
t1_decoder_done, /* done */ t1_decoder_done, /* done */
t1_decoder_parse_charstrings /* parse_charstrings */ t1_decoder_parse_charstrings, /* parse_charstrings_old */
cf2_decoder_parse_charstrings /* parse_charstrings */
}; };

View File

@ -20,6 +20,8 @@
#include FT_INTERNAL_POSTSCRIPT_AUX_H #include FT_INTERNAL_POSTSCRIPT_AUX_H
#include FT_INTERNAL_DEBUG_H #include FT_INTERNAL_DEBUG_H
#include FT_INTERNAL_CALC_H #include FT_INTERNAL_CALC_H
#include FT_CFF_DRIVER_H
#include FT_TYPE1_DRIVER_H
#include "psobjs.h" #include "psobjs.h"
#include "psconv.h" #include "psconv.h"
@ -2160,25 +2162,24 @@
FT_Vector* point = outline->points + outline->n_points; FT_Vector* point = outline->points + outline->n_points;
FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points;
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face );
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE ) if ( !builder->is_t1 &&
driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
{ {
point->x = x >> 16; point->x = x >> 16;
point->y = y >> 16; point->y = y >> 16;
} }
else else
#endif #endif
#ifdef T1_CONFIG_OPTION_OLD_ENGINE if ( builder->is_t1 &&
if ( builder->is_t1 ) driver->hinting_engine == FT_T1_HINTING_FREETYPE )
{ {
point->x = FIXED_TO_INT( x ); point->x = FIXED_TO_INT( x );
point->y = FIXED_TO_INT( y ); point->y = FIXED_TO_INT( y );
} }
else else
#endif
{ {
/* cf2_decoder_parse_charstrings uses 16.16 coordinates */ /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
point->x = x >> 10; point->x = x >> 10;

View File

@ -23,6 +23,7 @@
#include FT_INTERNAL_STREAM_H #include FT_INTERNAL_STREAM_H
#include FT_OUTLINE_H #include FT_OUTLINE_H
#include FT_INTERNAL_POSTSCRIPT_AUX_H #include FT_INTERNAL_POSTSCRIPT_AUX_H
#include FT_TYPE1_DRIVER_H
#include "t1errors.h" #include "t1errors.h"
@ -63,11 +64,16 @@
T1_Font type1 = &face->type1; T1_Font type1 = &face->type1;
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
PSAux_Service psaux = (PSAux_Service)face->psaux;
const T1_Decoder_Funcs decoder_funcs = psaux->t1_decoder_funcs;
PS_Decoder psdecoder;
#ifdef FT_CONFIG_OPTION_INCREMENTAL #ifdef FT_CONFIG_OPTION_INCREMENTAL
FT_Incremental_InterfaceRec *inc = FT_Incremental_InterfaceRec *inc =
face->root.internal->incremental_interface; face->root.internal->incremental_interface;
#endif #endif
PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face );
decoder->font_matrix = type1->font_matrix; decoder->font_matrix = type1->font_matrix;
decoder->font_offset = type1->font_offset; decoder->font_offset = type1->font_offset;
@ -90,9 +96,40 @@
} }
if ( !error ) if ( !error )
error = decoder->funcs.parse_charstrings( {
decoder, (FT_Byte*)char_string->pointer, /* choose which renderer to use */
(FT_UInt)char_string->length ); if ( driver->hinting_engine == FT_T1_HINTING_FREETYPE )
error = decoder_funcs->parse_charstrings_old( decoder,
(FT_Byte*)char_string->pointer,
(FT_UInt)char_string->length );
else
{
psaux->ps_decoder_init( decoder, TRUE, &psdecoder );
error = decoder_funcs->parse_charstrings( &psdecoder,
(FT_Byte*)char_string->pointer,
(FT_ULong)char_string->length );
#if 0 /* TODO(ewaldhew) */
/* Adobe's engine uses 16.16 numbers everywhere; */
/* as a consequence, glyphs larger than 2000ppem get rejected */
if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
{
/* this time, we retry unhinted and scale up the glyph later on */
/* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
/* 0x400 for both `x_scale' and `y_scale' in this case) */
hinting = FALSE;
force_scaling = TRUE;
glyph->hint = hinting;
error = decoder_funcs->parse_charstrings( &psdecoder,
(FT_Byte*)char_string->pointer,
(FT_ULong)char_string->length );
}
#endif
}
}
#ifdef FT_CONFIG_OPTION_INCREMENTAL #ifdef FT_CONFIG_OPTION_INCREMENTAL