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:
parent
97704b158e
commit
7e185dcd79
22
ChangeLog
22
ChangeLog
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue