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

📄 cffparse.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
        matrix->yy = FT_DivFix( matrix->yy, temp );        offset->x  = FT_DivFix( offset->x,  temp );        offset->y  = FT_DivFix( offset->y,  temp );      }      /* note that the offsets must be expressed in integer font units */      offset->x >>= 16;      offset->y >>= 16;      error = CFF_Err_Ok;    }    return error;  }  static FT_Error  cff_parse_font_bbox( CFF_Parser  parser )  {    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;    FT_BBox*         bbox = &dict->font_bbox;    FT_Byte**        data = parser->stack;    FT_Error         error;    error = CFF_Err_Stack_Underflow;    if ( parser->top >= parser->stack + 4 )    {      bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );      bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );      bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );      bbox->yMax = FT_RoundFix( cff_parse_fixed( data   ) );      error = CFF_Err_Ok;    }    return error;  }  static FT_Error  cff_parse_private_dict( CFF_Parser  parser )  {    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;    FT_Byte**        data = parser->stack;    FT_Error         error;    error = CFF_Err_Stack_Underflow;    if ( parser->top >= parser->stack + 2 )    {      dict->private_size   = cff_parse_num( data++ );      dict->private_offset = cff_parse_num( data   );      error = CFF_Err_Ok;    }    return error;  }  static FT_Error  cff_parse_cid_ros( CFF_Parser  parser )  {    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;    FT_Byte**        data = parser->stack;    FT_Error         error;    error = CFF_Err_Stack_Underflow;    if ( parser->top >= parser->stack + 3 )    {      dict->cid_registry   = (FT_UInt)cff_parse_num ( data++ );      dict->cid_ordering   = (FT_UInt)cff_parse_num ( data++ );      dict->cid_supplement = (FT_ULong)cff_parse_num( data );      error = CFF_Err_Ok;    }    return error;  }#define CFF_FIELD_NUM( code, name ) \          CFF_FIELD( code, name, cff_kind_num )#define CFF_FIELD_FIXED( code, name ) \          CFF_FIELD( code, name, cff_kind_fixed )#define CFF_FIELD_FIXED_1000( code, name ) \          CFF_FIELD( code, name, cff_kind_fixed_thousand )#define CFF_FIELD_STRING( code, name ) \          CFF_FIELD( code, name, cff_kind_string )#define CFF_FIELD_BOOL( code, name ) \          CFF_FIELD( code, name, cff_kind_bool )#define CFF_FIELD_DELTA( code, name, max ) \          CFF_FIELD( code, name, cff_kind_delta )#define CFF_FIELD_CALLBACK( code, name ) \          {                              \            cff_kind_callback,           \            code | CFFCODE,              \            0, 0,                        \            cff_parse_ ## name,          \            0, 0                         \          },#undef  CFF_FIELD#define CFF_FIELD( code, name, kind ) \          {                          \            kind,                    \            code | CFFCODE,          \            FT_FIELD_OFFSET( name ), \            FT_FIELD_SIZE( name ),   \            0, 0, 0                  \          },#undef  CFF_FIELD_DELTA#define CFF_FIELD_DELTA( code, name, max ) \        {                                  \          cff_kind_delta,                  \          code | CFFCODE,                  \          FT_FIELD_OFFSET( name ),         \          FT_FIELD_SIZE_DELTA( name ),     \          0,                               \          max,                             \          FT_FIELD_OFFSET( num_ ## name )  \        },#define CFFCODE_TOPDICT  0x1000#define CFFCODE_PRIVATE  0x2000  static const CFF_Field_Handler  cff_field_handlers[] =  {#include "cfftoken.h"    { 0, 0, 0, 0, 0, 0, 0 }  };  FT_LOCAL_DEF( FT_Error )  cff_parser_run( CFF_Parser  parser,                  FT_Byte*    start,                  FT_Byte*    limit )  {    FT_Byte*  p     = start;    FT_Error  error = CFF_Err_Ok;    parser->top    = parser->stack;    parser->start  = start;    parser->limit  = limit;    parser->cursor = start;    while ( p < limit )    {      FT_UInt  v = *p;      if ( v >= 27 && v != 31 )      {        /* it's a number; we will push its position on the stack */        if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )          goto Stack_Overflow;        *parser->top ++ = p;        /* now, skip it */        if ( v == 30 )        {          /* skip real number */          p++;          for (;;)          {            if ( p >= limit )              goto Syntax_Error;            v = p[0] >> 4;            if ( v == 15 )              break;            v = p[0] & 0xF;            if ( v == 15 )              break;            p++;          }        }        else if ( v == 28 )          p += 2;        else if ( v == 29 )          p += 4;        else if ( v > 246 )          p += 1;      }      else      {        /* This is not a number, hence it's an operator.  Compute its code */        /* and look for it in our current list.                            */        FT_UInt                   code;        FT_UInt                   num_args = (FT_UInt)                                             ( parser->top - parser->stack );        const CFF_Field_Handler*  field;        *parser->top = p;        code = v;        if ( v == 12 )        {          /* two byte operator */          p++;          if ( p >= limit )            goto Syntax_Error;          code = 0x100 | p[0];        }        code = code | parser->object_code;        for ( field = cff_field_handlers; field->kind; field++ )        {          if ( field->code == (FT_Int)code )          {            /* we found our field's handler; read it */            FT_Long   val;            FT_Byte*  q = (FT_Byte*)parser->object + field->offset;            /* check that we have enough arguments -- except for */            /* delta encoded arrays, which can be empty          */            if ( field->kind != cff_kind_delta && num_args < 1 )              goto Stack_Underflow;            switch ( field->kind )            {            case cff_kind_bool:            case cff_kind_string:            case cff_kind_num:              val = cff_parse_num( parser->stack );              goto Store_Number;            case cff_kind_fixed:              val = cff_parse_fixed( parser->stack );              goto Store_Number;            case cff_kind_fixed_thousand:              val = cff_parse_fixed_thousand( parser->stack );            Store_Number:              switch ( field->size )              {              case (8 / FT_CHAR_BIT):                *(FT_Byte*)q = (FT_Byte)val;                break;              case (16 / FT_CHAR_BIT):                *(FT_Short*)q = (FT_Short)val;                break;              case (32 / FT_CHAR_BIT):                *(FT_Int32*)q = (FT_Int)val;                break;              default:  /* for 64-bit systems */                *(FT_Long*)q = val;              }              break;            case cff_kind_delta:              {                FT_Byte*   qcount = (FT_Byte*)parser->object +                                      field->count_offset;                FT_Byte**  data = parser->stack;                if ( num_args > field->array_max )                  num_args = field->array_max;                /* store count */                *qcount = (FT_Byte)num_args;                val = 0;                while ( num_args > 0 )                {                  val += cff_parse_num( data++ );                  switch ( field->size )                  {                  case (8 / FT_CHAR_BIT):                    *(FT_Byte*)q = (FT_Byte)val;                    break;                  case (16 / FT_CHAR_BIT):                    *(FT_Short*)q = (FT_Short)val;                    break;                  case (32 / FT_CHAR_BIT):                    *(FT_Int32*)q = (FT_Int)val;                    break;                  default:  /* for 64-bit systems */                    *(FT_Long*)q = val;                  }                  q += field->size;                  num_args--;                }              }              break;            default:  /* callback */              error = field->reader( parser );              if ( error )                goto Exit;            }            goto Found;          }        }        /* this is an unknown operator, or it is unsupported; */        /* we will ignore it for now.                         */      Found:        /* clear stack */        parser->top = parser->stack;      }      p++;    }  Exit:    return error;  Stack_Overflow:    error = CFF_Err_Invalid_Argument;    goto Exit;  Stack_Underflow:    error = CFF_Err_Invalid_Argument;    goto Exit;  Syntax_Error:    error = CFF_Err_Invalid_Argument;    goto Exit;  }/* END */

⌨️ 快捷键说明

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