freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] master 81b86c4 26/43: Extend Adobe interpreter (hstem, vstem


From: Werner LEMBERG
Subject: [freetype2] master 81b86c4 26/43: Extend Adobe interpreter (hstem, vstem, hstem3, vstem3).
Date: Mon, 25 Sep 2017 03:29:27 -0400 (EDT)

branch: master
commit 81b86c459c5324bf52babd9b31af28e5e65f10e1
Author: Ewald Hew <address@hidden>
Commit: Werner Lemberg <address@hidden>

    Extend Adobe interpreter (hstem, vstem, hstem3, vstem3).
    
    * src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdHSTEM,
    cf2_cmdVSTEM>: Add correction for left sidebearing in Type 1 mode.
    Allow adding hints mid-charstring.
    <cf2_escVSTEM3, cf2_escHSTEM3>: Translate into equivalent commands
    for three normal stem hints.  This requires some recalculation of
    stem positions.
    Correction for left sidebearing.
---
 ChangeLog           |  12 ++++++
 src/psaux/psintrp.c | 105 ++++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 97 insertions(+), 20 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ce036b1..588c134 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
 2017-09-25  Ewald Hew  <address@hidden>
 
+       Extend Adobe interpreter (hints).
+
+       * src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdHSTEM,
+       cf2_cmdVSTEM>: Add correction for left sidebearing in Type 1 mode.
+       Allow adding hints mid-charstring.
+       <cf2_escVSTEM3, cf2_escHSTEM3>: Translate into equivalent commands
+       for three normal stem hints.  This requires some recalculation of
+       stem positions.
+       Correction for left sidebearing.
+
+2017-09-25  Ewald Hew  <address@hidden>
+
        [psaux] Extend Adobe interpreter (hsbw, sbw).
 
        * src/psaux/psintrp.c (cf2_doStems): `hsbw' or `sbw' must be the
diff --git a/src/psaux/psintrp.c b/src/psaux/psintrp.c
index 53eca9c..4132931 100644
--- a/src/psaux/psintrp.c
+++ b/src/psaux/psintrp.c
@@ -754,12 +754,28 @@
       case cf2_cmdHSTEM:
         FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" ));
 
-        /* never add hints after the mask is computed */
-        if ( cf2_hintmask_isValid( &hintMask ) )
+        if ( !font->isT1 )
         {
-          FT_TRACE4(( "cf2_interpT2CharString:"
-                      " invalid horizontal hint mask\n" ));
-          break;
+          /* never add hints after the mask is computed */
+          /* except if in Type 1 mode (no hintmask op)  */
+          if ( cf2_hintmask_isValid( &hintMask ) )
+          {
+            FT_TRACE4(( "cf2_interpT2CharString:"
+                        " invalid horizontal hint mask\n" ));
+            break;
+          }
+        }
+        else
+        {
+          /* Do lsb correction */
+          CF2_F16Dot16  hint_pos;
+
+          FT_ASSERT( ( cf2_stack_count( opStack ) == 2 ) );
+
+          hint_pos = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                                decoder->builder.left_bearing->y );
+
+          cf2_stack_setReal( opStack, 0, hint_pos );
         }
 
         cf2_doStems( font,
@@ -778,12 +794,28 @@
       case cf2_cmdVSTEM:
         FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" ));
 
-        /* never add hints after the mask is computed */
-        if ( cf2_hintmask_isValid( &hintMask ) )
+        if ( !font->isT1 )
         {
-          FT_TRACE4(( "cf2_interpT2CharString:"
-                      " invalid vertical hint mask\n" ));
-          break;
+          /* never add hints after the mask is computed */
+          /* except if in Type 1 mode (no hintmask op)  */
+          if ( cf2_hintmask_isValid( &hintMask ) )
+          {
+            FT_TRACE4(( "cf2_interpT2CharString:"
+                        " invalid vertical hint mask\n" ));
+            break;
+          }
+        }
+        else
+        {
+          /* Do lsb correction */
+          CF2_F16Dot16  hint_pos;
+
+          FT_ASSERT( ( cf2_stack_count( opStack ) == 2 ) );
+
+          hint_pos = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                                decoder->builder.left_bearing->x );
+
+          cf2_stack_setReal( opStack, 0, hint_pos );
         }
 
         cf2_doStems( font,
@@ -1154,18 +1186,51 @@
                   break;
 
                 case cf2_escVSTEM3:
-                  if ( !font->isT1 )
-                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
-                  else
-                  {
-                  }
-                  break;
-
                 case cf2_escHSTEM3:
-                  if ( !font->isT1 )
-                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
-                  else
+                  /* Type 1:                     */ /* Type 2:                 
     */
+                  /* x0 dx0 x1 dx1 x2 dx2 vstem3 */ /* x dx {dxa dxb}* vstem   
     */
+                  /* y0 dy0 y1 dy1 y2 dy2 hstem3 */ /* y dy {dya dyb}* hstem   
     */
+                  /* relative to lsb point       */ /* relative to zero        
     */
                   {
+                    if ( !font->isT1 )
+                      FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                    else
+                    {
+                      CF2_F16Dot16  v0, v1, v2;
+                      CF2_F16Dot16  lsb;
+
+                      FT_TRACE4(( op2 == cf2_escVSTEM3 ? " vstem3\n"
+                                                       : " hstem3\n" ));
+
+                      FT_ASSERT( ( cf2_stack_count( opStack ) == 6 ) );
+
+                      lsb = ( op2 == cf2_escVSTEM3 ? 
decoder->builder.left_bearing->x
+                                                   : 
decoder->builder.left_bearing->y );
+
+                      v0 = cf2_stack_getReal( opStack, 0 );
+                      v1 = cf2_stack_getReal( opStack, 2 );
+                      v2 = cf2_stack_getReal( opStack, 4 );
+
+                      cf2_stack_setReal( opStack, 0,
+                                         ADD_INT32( v0,
+                                                    lsb ) );
+                      cf2_stack_setReal( opStack, 2,
+                                         SUB_INT32( SUB_INT32( v1, v0 ),
+                                                    cf2_stack_getReal( 
opStack, 1 ) ) );
+                      cf2_stack_setReal( opStack, 4,
+                                         SUB_INT32( SUB_INT32( v2, v1 ),
+                                                    cf2_stack_getReal( 
opStack, 3 ) ) );
+
+                      cf2_doStems( font,
+                                   opStack,
+                                   op2 == cf2_escVSTEM3 ? &vStemHintArray : 
&hStemHintArray,
+                                   width,
+                                   &haveWidth,
+                                   0 );
+
+                      if ( decoder->width_only )
+                        goto exit;
+                    }
                   }
                   break;
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]