[psaux] Add missing objects. (2/2)
Synthesize a SubFont object for Type 1 fonts. This is used in the interpreter to access Private dict data, which are stored in different places for Type 1 and CFF. This allows the same data to be used in either mode. * src/psaux/psobjs.c (t1_make_subfont): New procedure to copy required values to a dummy CFF_SubFont object. This is similar to cff_make_private_dict. * src/psaux/psobjs.h: Add the new declaration. * include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Ditto. Add this to the PSAux Service for future use with CID fonts. * src/type1/t1gload.c: Add the call.
This commit is contained in:
parent
b55214c820
commit
f92a449f6f
|
@ -1290,6 +1290,10 @@ FT_BEGIN_HEADER
|
|||
FT_Bool is_t1,
|
||||
PS_Decoder* ps_decoder );
|
||||
|
||||
void
|
||||
(*t1_make_subfont)( T1_Face face,
|
||||
CFF_SubFont subfont );
|
||||
|
||||
|
||||
T1_CMap_Classes t1_cmap_classes;
|
||||
|
||||
|
|
|
@ -154,6 +154,7 @@
|
|||
t1_decrypt,
|
||||
cff_random,
|
||||
ps_decoder_init,
|
||||
t1_make_subfont,
|
||||
|
||||
(const T1_CMap_ClassesRec*) &t1_cmap_classes,
|
||||
|
||||
|
|
|
@ -2327,6 +2327,91 @@
|
|||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
|
||||
FT_LOCAL_DEF( void )
|
||||
t1_make_subfont( T1_Face face,
|
||||
CFF_SubFont subfont )
|
||||
{
|
||||
PS_Private priv = &face->type1.private_dict;
|
||||
CFF_Private cpriv = &subfont->private_dict;
|
||||
FT_UInt n, count;
|
||||
|
||||
FT_ZERO( subfont );
|
||||
FT_ZERO( cpriv );
|
||||
|
||||
count = cpriv->num_blue_values = priv->num_blue_values;
|
||||
for ( n = 0; n < count; n++ )
|
||||
cpriv->blue_values[n] = (FT_Pos)priv->blue_values[n];
|
||||
|
||||
count = cpriv->num_other_blues = priv->num_other_blues;
|
||||
for ( n = 0; n < count; n++ )
|
||||
cpriv->other_blues[n] = (FT_Pos)priv->other_blues[n];
|
||||
|
||||
count = cpriv->num_family_blues = priv->num_family_blues;
|
||||
for ( n = 0; n < count; n++ )
|
||||
cpriv->family_blues[n] = (FT_Pos)priv->family_blues[n];
|
||||
|
||||
count = cpriv->num_family_other_blues = priv->num_family_other_blues;
|
||||
for ( n = 0; n < count; n++ )
|
||||
cpriv->family_other_blues[n] = (FT_Pos)priv->family_other_blues[n];
|
||||
|
||||
cpriv->blue_scale = priv->blue_scale;
|
||||
cpriv->blue_shift = (FT_Pos)priv->blue_shift;
|
||||
cpriv->blue_fuzz = (FT_Pos)priv->blue_fuzz;
|
||||
|
||||
cpriv->standard_width = (FT_Pos)priv->standard_width[0];
|
||||
cpriv->standard_height = (FT_Pos)priv->standard_height[0];
|
||||
|
||||
count = cpriv->num_snap_widths = priv->num_snap_widths;
|
||||
for ( n = 0; n < count; n++ )
|
||||
cpriv->snap_widths[n] = (FT_Pos)priv->snap_widths[n];
|
||||
|
||||
count = cpriv->num_snap_heights = priv->num_snap_heights;
|
||||
for ( n = 0; n < count; n++ )
|
||||
cpriv->snap_heights[n] = (FT_Pos)priv->snap_heights[n];
|
||||
|
||||
cpriv->force_bold = priv->force_bold;
|
||||
cpriv->lenIV = priv->lenIV;
|
||||
cpriv->language_group = priv->language_group;
|
||||
cpriv->expansion_factor = priv->expansion_factor;
|
||||
|
||||
cpriv->subfont = subfont;
|
||||
|
||||
|
||||
/* Initialize the random number generator. */
|
||||
if ( face->root.internal->random_seed != -1 )
|
||||
{
|
||||
/* . If we have a face-specific seed, use it. */
|
||||
/* If non-zero, update it to a positive value. */
|
||||
subfont->random = (FT_UInt32)face->root.internal->random_seed;
|
||||
if ( face->root.internal->random_seed )
|
||||
{
|
||||
do
|
||||
{
|
||||
face->root.internal->random_seed =
|
||||
(FT_Int32)((PSAux_Service)face->psaux)->cff_random(
|
||||
(FT_UInt32)face->root.internal->random_seed );
|
||||
|
||||
} while ( face->root.internal->random_seed < 0 );
|
||||
}
|
||||
}
|
||||
if ( !subfont->random )
|
||||
{
|
||||
FT_UInt32 seed;
|
||||
|
||||
/* compute random seed from some memory addresses */
|
||||
seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^
|
||||
(FT_Offset)(char*)&face ^
|
||||
(FT_Offset)(char*)&subfont );
|
||||
seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
|
||||
if ( seed == 0 )
|
||||
seed = 0x7384;
|
||||
|
||||
subfont->random = seed;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
FT_LOCAL_DEF( void )
|
||||
t1_decrypt( FT_Byte* buffer,
|
||||
FT_Offset length,
|
||||
|
|
|
@ -284,6 +284,10 @@ FT_BEGIN_HEADER
|
|||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
FT_LOCAL( void )
|
||||
t1_make_subfont( T1_Face face,
|
||||
CFF_SubFont subfont );
|
||||
|
||||
FT_LOCAL( void )
|
||||
t1_decrypt( FT_Byte* buffer,
|
||||
FT_Offset length,
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include FT_INTERNAL_STREAM_H
|
||||
#include FT_OUTLINE_H
|
||||
#include FT_INTERNAL_POSTSCRIPT_AUX_H
|
||||
#include FT_INTERNAL_CFF_TYPES_H
|
||||
#include FT_TYPE1_DRIVER_H
|
||||
|
||||
#include "t1errors.h"
|
||||
|
@ -104,8 +105,14 @@
|
|||
(FT_UInt)char_string->length );
|
||||
else
|
||||
{
|
||||
CFF_SubFontRec subfont;
|
||||
|
||||
|
||||
psaux->ps_decoder_init( decoder, TRUE, &psdecoder );
|
||||
|
||||
psaux->t1_make_subfont( face, &subfont );
|
||||
psdecoder.current_subfont = &subfont;
|
||||
|
||||
error = decoder_funcs->parse_charstrings( &psdecoder,
|
||||
(FT_Byte*)char_string->pointer,
|
||||
(FT_ULong)char_string->length );
|
||||
|
|
Loading…
Reference in New Issue