[psaux] Prepare for Type 1 mode

Add some checks for Type 1 data passing through.

* src/psaux/psfont.h: Add isT1 flag to CF2_Font.
* src/psaux/psfont.c: Skip the variations and blend code which is not
applicable for Type 1.

* src/psaux/psft.c: Avoid accessing decoder->cff in Type 1 mode.
Copy is_t1 flag to CF2_Font.
This commit is contained in:
Ewald Hew 2017-07-20 15:57:09 +08:00
parent f5b20fa4bf
commit 6682b5ef54
3 changed files with 45 additions and 36 deletions

View File

@ -260,8 +260,6 @@
CF2_UInt lenNormalizedV = 0;
FT_Fixed* normalizedV = NULL;
FT_Service_CFFLoad cffload = (FT_Service_CFFLoad)font->cffload;
/* clear previous error */
font->error = FT_Err_Ok;
@ -274,46 +272,50 @@
needExtraSetup = TRUE;
}
/* check for variation vectors */
vstore = cf2_getVStore( decoder );
hasVariations = ( vstore->dataCount != 0 );
if ( hasVariations )
if ( !font->isT1 )
{
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
/* check whether Private DICT in this subfont needs to be reparsed */
font->error = cf2_getNormalizedVector( decoder,
&lenNormalizedV,
&normalizedV );
if ( font->error )
return;
FT_Service_CFFLoad cffload = (FT_Service_CFFLoad)font->cffload;
/* check for variation vectors */
vstore = cf2_getVStore( decoder );
hasVariations = ( vstore->dataCount != 0 );
if ( cffload->blend_check_vector( &subFont->blend,
subFont->private_dict.vsindex,
lenNormalizedV,
normalizedV ) )
if ( hasVariations )
{
/* blend has changed, reparse */
cffload->load_private_dict( decoder->cff,
subFont,
lenNormalizedV,
normalizedV );
needExtraSetup = TRUE;
}
#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
/* check whether Private DICT in this subfont needs to be reparsed */
font->error = cf2_getNormalizedVector( decoder,
&lenNormalizedV,
&normalizedV );
if ( font->error )
return;
if ( cffload->blend_check_vector( &subFont->blend,
subFont->private_dict.vsindex,
lenNormalizedV,
normalizedV ) )
{
/* blend has changed, reparse */
cffload->load_private_dict( decoder->cff,
subFont,
lenNormalizedV,
normalizedV );
needExtraSetup = TRUE;
}
#endif
/* copy from subfont */
font->blend.font = subFont->blend.font;
/* copy from subfont */
font->blend.font = subFont->blend.font;
/* clear state of charstring blend */
font->blend.usedBV = FALSE;
/* clear state of charstring blend */
font->blend.usedBV = FALSE;
/* initialize value for charstring */
font->vsindex = subFont->private_dict.vsindex;
/* initialize value for charstring */
font->vsindex = subFont->private_dict.vsindex;
/* store vector inputs for blends in charstring */
font->lenNDV = lenNormalizedV;
font->NDV = normalizedV;
/* store vector inputs for blends in charstring */
font->lenNDV = lenNormalizedV;
font->NDV = normalizedV;
}
}
/* if ppem has changed, we need to recompute some cached data */

View File

@ -65,6 +65,7 @@ FT_BEGIN_HEADER
FT_Memory memory;
FT_Error error; /* shared error for this instance */
FT_Bool isT1;
FT_Bool isCFF2;
CF2_RenderingFlags renderingFlags;

View File

@ -309,8 +309,11 @@
FT_Error error = FT_Err_Ok;
CF2_Font font;
FT_Bool is_t1 = decoder->builder.is_t1;
FT_ASSERT( decoder && decoder->cff );
FT_ASSERT( decoder &&
( is_t1 || decoder->cff ) );
memory = decoder->builder.memory;
@ -330,7 +333,9 @@
font = (CF2_Font)decoder->cff->cf2_instance.data;
font->memory = memory;
font->cffload = (FT_Service_CFFLoad)decoder->cff->cffload;
if ( !is_t1 )
font->cffload = (FT_Service_CFFLoad)decoder->cff->cffload;
/* initialize a client outline, to be shared by each glyph rendered */
cf2_outline_init( &font->outline, font->memory, &font->error );
@ -381,6 +386,7 @@
/* copy isCFF2 boolean from TT_Face to CF2_Font */
font->isCFF2 = builder->face->is_cff2;
font->isT1 = is_t1;
font->renderingFlags = 0;
if ( hinted )