⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ttinterp.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 5 页
字号:
  static FT_Long  Current_Ppem( EXEC_OP )  {    return TT_MULFIX( CUR.tt_metrics.ppem, CURRENT_Ratio() );  }  /*************************************************************************/  /*                                                                       */  /* Functions related to the control value table (CVT).                   */  /*                                                                       */  /*************************************************************************/  FT_CALLBACK_DEF( FT_F26Dot6 )  Read_CVT( EXEC_OP_ FT_ULong  idx )  {    return CUR.cvt[idx];  }  FT_CALLBACK_DEF( FT_F26Dot6 )  Read_CVT_Stretched( EXEC_OP_ FT_ULong  idx )  {    return TT_MULFIX( CUR.cvt[idx], CURRENT_Ratio() );  }  FT_CALLBACK_DEF( void )  Write_CVT( EXEC_OP_ FT_ULong    idx,                      FT_F26Dot6  value )  {    CUR.cvt[idx] = value;  }  FT_CALLBACK_DEF( void )  Write_CVT_Stretched( EXEC_OP_ FT_ULong    idx,                                FT_F26Dot6  value )  {    CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );  }  FT_CALLBACK_DEF( void )  Move_CVT( EXEC_OP_ FT_ULong    idx,                     FT_F26Dot6  value )  {    CUR.cvt[idx] += value;  }  FT_CALLBACK_DEF( void )  Move_CVT_Stretched( EXEC_OP_ FT_ULong    idx,                               FT_F26Dot6  value )  {    CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    GetShortIns                                                        */  /*                                                                       */  /* <Description>                                                         */  /*    Returns a short integer taken from the instruction stream at       */  /*    address IP.                                                        */  /*                                                                       */  /* <Return>                                                              */  /*    Short read at code[IP].                                            */  /*                                                                       */  /* <Note>                                                                */  /*    This one could become a macro.                                     */  /*                                                                       */  static FT_Short  GetShortIns( EXEC_OP )  {    /* Reading a byte stream so there is no endianess (DaveP) */    CUR.IP += 2;    return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +                         CUR.code[CUR.IP - 1]      );  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    Ins_Goto_CodeRange                                                 */  /*                                                                       */  /* <Description>                                                         */  /*    Goes to a certain code range in the instruction stream.            */  /*                                                                       */  /* <Input>                                                               */  /*    aRange :: The index of the code range.                             */  /*                                                                       */  /*    aIP    :: The new IP address in the code range.                    */  /*                                                                       */  /* <Return>                                                              */  /*    SUCCESS or FAILURE.                                                */  /*                                                                       */  static FT_Bool  Ins_Goto_CodeRange( EXEC_OP_ FT_Int    aRange,                               FT_ULong  aIP )  {    TT_CodeRange*  range;    if ( aRange < 1 || aRange > 3 )    {      CUR.error = TT_Err_Bad_Argument;      return FAILURE;    }    range = &CUR.codeRangeTable[aRange - 1];    if ( range->base == NULL )     /* invalid coderange */    {      CUR.error = TT_Err_Invalid_CodeRange;      return FAILURE;    }    /* NOTE: Because the last instruction of a program may be a CALL */    /*       which will return to the first byte *after* the code    */    /*       range, we test for AIP <= Size, instead of AIP < Size.  */    if ( aIP > range->size )    {      CUR.error = TT_Err_Code_Overflow;      return FAILURE;    }    CUR.code     = range->base;    CUR.codeSize = range->size;    CUR.IP       = aIP;    CUR.curRange = aRange;    return SUCCESS;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    Direct_Move                                                        */  /*                                                                       */  /* <Description>                                                         */  /*    Moves a point by a given distance along the freedom vector.  The   */  /*    point will be `touched'.                                           */  /*                                                                       */  /* <Input>                                                               */  /*    point    :: The index of the point to move.                        */  /*                                                                       */  /*    distance :: The distance to apply.                                 */  /*                                                                       */  /* <InOut>                                                               */  /*    zone     :: The affected glyph zone.                               */  /*                                                                       */  static void  Direct_Move( EXEC_OP_ TT_GlyphZone  zone,                        FT_UShort     point,                        FT_F26Dot6    distance )  {    FT_F26Dot6  v;#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING    FT_ASSERT( !CUR.face->unpatented_hinting );#endif    v = CUR.GS.freeVector.x;    if ( v != 0 )    {      zone->cur[point].x += TT_MULDIV( distance,                                       v * 0x10000L,                                       CUR.F_dot_P );      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;    }    v = CUR.GS.freeVector.y;    if ( v != 0 )    {      zone->cur[point].y += TT_MULDIV( distance,                                       v * 0x10000L,                                       CUR.F_dot_P );      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;    }  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    Direct_Move_Orig                                                   */  /*                                                                       */  /* <Description>                                                         */  /*    Moves the *original* position of a point by a given distance along */  /*    the freedom vector.  Obviously, the point will not be `touched'.   */  /*                                                                       */  /* <Input>                                                               */  /*    point    :: The index of the point to move.                        */  /*                                                                       */  /*    distance :: The distance to apply.                                 */  /*                                                                       */  /* <InOut>                                                               */  /*    zone     :: The affected glyph zone.                               */  /*                                                                       */  static void  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,                             FT_UShort     point,                             FT_F26Dot6    distance )  {    FT_F26Dot6  v;#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING    FT_ASSERT( !CUR.face->unpatented_hinting );#endif    v = CUR.GS.freeVector.x;    if ( v != 0 )      zone->org[point].x += TT_MULDIV( distance,                                       v * 0x10000L,                                       CUR.F_dot_P );    v = CUR.GS.freeVector.y;    if ( v != 0 )      zone->org[point].y += TT_MULDIV( distance,                                       v * 0x10000L,                                       CUR.F_dot_P );  }  /*************************************************************************/  /*                                                                       */  /* Special versions of Direct_Move()                                     */  /*                                                                       */  /*   The following versions are used whenever both vectors are both      */  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */  /*                                                                       */  /*************************************************************************/  static void  Direct_Move_X( EXEC_OP_ TT_GlyphZone  zone,                          FT_UShort     point,                          FT_F26Dot6    distance )  {    FT_UNUSED_EXEC;    zone->cur[point].x += distance;    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;  }  static void  Direct_Move_Y( EXEC_OP_ TT_GlyphZone  zone,                          FT_UShort     point,                          FT_F26Dot6    distance )  {    FT_UNUSED_EXEC;    zone->cur[point].y += distance;    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;  }  /*************************************************************************/  /*                                                                       */  /* Special versions of Direct_Move_Orig()                                */  /*                                                                       */  /*   The following versions are used whenever both vectors are both      */  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */  /*                                                                       */  /*************************************************************************/  static void  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,                               FT_UShort     point,                               FT_F26Dot6    distance )  {    FT_UNUSED_EXEC;    zone->org[point].x += distance;  }  static void  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,                               FT_UShort     point,                               FT_F26Dot6    distance )  {    FT_UNUSED_EXEC;    zone->org[point].y += distance;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    Round_None                                                         */  /*                                                                       */  /* <Description>                                                         */  /*    Does not round, but adds engine compensation.                      */  /*                                                                       */  /* <Input>                                                               */  /*    distance     :: The distance (not) to round.                       */  /*                                                                       */  /*    compensation :: The engine compensation.                           */  /*                                                                       */  /* <Return>                                                              */  /*    The compensated distance.                                          */  /*                                                                       */  /* <Note>                                                                */  /*    The TrueType specification says very few about the relationship    */  /*    between rounding and engine compensation.  However, it seems from  */  /*    the description of super round that we should add the compensation */  /*    before rounding.                                                   */  /*                                                                       */  static FT_F26Dot6  Round_None( EXEC_OP_ FT_F26Dot6  distance,                       FT_F26Dot6  compensation )  {    FT_F26Dot6  val;    FT_UNUSED_EXEC;    if ( distance >= 0 )    {      val = distance + compensation;      if ( distance && val < 0 )        val = 0;    }    else {      val = distance 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -