Commit 9428ee42c0100381a60c57544773ae58c4d1028c

Ewald Hew 2017-09-25T06:15:46

Prepare for Type 1 mode. Add some checks for Type 1 data passing through. * src/psaux/psfont.h (CF2_Font): Add `isT1' flag. * src/psaux/psfont.c (cf2_font_setup): Skip the variations and blend code which is not applicable for Type 1. * src/psaux/psft.c (cf2_decoder_parse_charstrings): Avoid accessing `decoder->cff' in Type 1 mode. Copy `is_t1' flag to `CF2_Font'.

diff --git a/ChangeLog b/ChangeLog
index a215fa4..1264e38 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,19 @@
 2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
+	[psaux] Prepare for Type 1 mode.
+
+	Add some checks for Type 1 data passing through.
+
+	* src/psaux/psfont.h (CF2_Font): Add `isT1' flag.
+	* src/psaux/psfont.c (cf2_font_setup): Skip the variations and blend
+	code which is not applicable for Type 1.
+
+	* src/psaux/psft.c (cf2_decoder_parse_charstrings): Avoid accessing
+	`decoder->cff' in Type 1 mode.
+	Copy `is_t1' flag to `CF2_Font'.
+
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
+
 	[psaux, cff] Use the new objects.
 
 	* include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Fix
diff --git a/src/psaux/psfont.c b/src/psaux/psfont.c
index bdcc356..093e66e 100644
--- a/src/psaux/psfont.c
+++ b/src/psaux/psfont.c
@@ -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         */
diff --git a/src/psaux/psfont.h b/src/psaux/psfont.h
index f88b131..fc86f80 100644
--- a/src/psaux/psfont.h
+++ b/src/psaux/psfont.h
@@ -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;
 
diff --git a/src/psaux/psft.c b/src/psaux/psft.c
index a05f1f2..34ac0b6 100644
--- a/src/psaux/psft.c
+++ b/src/psaux/psft.c
@@ -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 )