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

📄 t42parse.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 3 页
字号:
    for (;;)    {      /* The format is simple:                   */      /*   `/glyphname' + index [+ def]          */      T1_Skip_Spaces( parser );      cur = parser->root.cursor;      if ( cur >= limit )        break;      /* We stop when we find an `end' keyword or '>' */      if ( *cur   == 'e'          &&           cur + 3 < limit        &&           cur[1] == 'n'          &&           cur[2] == 'd'          &&           t42_is_space( cur[3] ) )        break;      if ( *cur == '>' )        break;      T1_Skip_PS_Token( parser );      if ( parser->root.error )        return;      if ( *cur == '/' )      {        FT_PtrDist  len;        if ( cur + 1 >= limit )        {          FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" ));          error = T42_Err_Invalid_File_Format;          goto Fail;        }        cur++;                              /* skip `/' */        len = parser->root.cursor - cur;        error = T1_Add_Table( name_table, n, cur, len + 1 );        if ( error )          goto Fail;        /* add a trailing zero to the name table */        name_table->elements[n][len] = '\0';        /* record index of /.notdef */        if ( *cur == '.'                                              &&             ft_strcmp( ".notdef",                        (const char*)(name_table->elements[n]) ) == 0 )        {          notdef_index = n;          notdef_found = 1;        }        T1_Skip_Spaces( parser );        cur = parser->root.cursor;        (void)T1_ToInt( parser );        if ( parser->root.cursor >= limit )        {          FT_ERROR(( "t42_parse_charstrings: out of bounds!\n" ));          error = T42_Err_Invalid_File_Format;          goto Fail;        }        len = parser->root.cursor - cur;        error = T1_Add_Table( code_table, n, cur, len + 1 );        if ( error )          goto Fail;        code_table->elements[n][len] = '\0';        n++;        if ( n >= loader->num_glyphs )          break;      }    }    loader->num_glyphs = n;    if ( !notdef_found )    {      FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph!\n" ));      error = T42_Err_Invalid_File_Format;      goto Fail;    }    /* if /.notdef does not occupy index 0, do our magic. */    if ( ft_strcmp( (const char*)".notdef",                    (const char*)name_table->elements[0] ) )    {      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */      /* name and code entries to swap_table.  Then place notdef_index   */      /* name and code entries into swap_table.  Then swap name and code */      /* entries at indices notdef_index and 0 using values stored in    */      /* swap_table.                                                     */      /* Index 0 name */      error = T1_Add_Table( swap_table, 0,                            name_table->elements[0],                            name_table->lengths [0] );      if ( error )        goto Fail;      /* Index 0 code */      error = T1_Add_Table( swap_table, 1,                            code_table->elements[0],                            code_table->lengths [0] );      if ( error )        goto Fail;      /* Index notdef_index name */      error = T1_Add_Table( swap_table, 2,                            name_table->elements[notdef_index],                            name_table->lengths [notdef_index] );      if ( error )        goto Fail;      /* Index notdef_index code */      error = T1_Add_Table( swap_table, 3,                            code_table->elements[notdef_index],                            code_table->lengths [notdef_index] );      if ( error )        goto Fail;      error = T1_Add_Table( name_table, notdef_index,                            swap_table->elements[0],                            swap_table->lengths [0] );      if ( error )        goto Fail;      error = T1_Add_Table( code_table, notdef_index,                            swap_table->elements[1],                            swap_table->lengths [1] );      if ( error )        goto Fail;      error = T1_Add_Table( name_table, 0,                            swap_table->elements[2],                            swap_table->lengths [2] );      if ( error )        goto Fail;      error = T1_Add_Table( code_table, 0,                            swap_table->elements[3],                            swap_table->lengths [3] );      if ( error )        goto Fail;    }    return;  Fail:    parser->root.error = error;  }  static FT_Error  t42_load_keyword( T42_Face    face,                    T42_Loader  loader,                    T1_Field    field )  {    FT_Error  error;    void*     dummy_object;    void**    objects;    FT_UInt   max_objects = 0;    /* if the keyword has a dedicated callback, call it */    if ( field->type == T1_FIELD_TYPE_CALLBACK )    {      field->reader( (FT_Face)face, loader );      error = loader->parser.root.error;      goto Exit;    }    /* now the keyword is either a simple field or a table of fields; */    /* we are now going to take care of it                            */    switch ( field->location )    {    case T1_FIELD_LOCATION_FONT_INFO:      dummy_object = &face->type1.font_info;      break;    case T1_FIELD_LOCATION_BBOX:      dummy_object = &face->type1.font_bbox;      break;    default:      dummy_object = &face->type1;    }    objects = &dummy_object;    if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||         field->type == T1_FIELD_TYPE_FIXED_ARRAY   )      error = T1_Load_Field_Table( &loader->parser, field,                                   objects, max_objects, 0 );    else      error = T1_Load_Field( &loader->parser, field,                             objects, max_objects, 0 );   Exit:    return error;  }  FT_LOCAL_DEF( FT_Error )  t42_parse_dict( T42_Face    face,                  T42_Loader  loader,                  FT_Byte*    base,                  FT_Long     size )  {    T42_Parser  parser     = &loader->parser;    FT_Byte*    limit;    FT_Int      n_keywords = (FT_Int)( sizeof ( t42_keywords ) /                                         sizeof ( t42_keywords[0] ) );    parser->root.cursor = base;    parser->root.limit  = base + size;    parser->root.error  = T42_Err_Ok;    limit = parser->root.limit;    T1_Skip_Spaces( parser );    while ( parser->root.cursor < limit )    {      FT_Byte*  cur;      cur = parser->root.cursor;      /* look for `FontDirectory' which causes problems for some fonts */      if ( *cur == 'F' && cur + 25 < limit                    &&           ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 )      {        FT_Byte*  cur2;        /* skip the `FontDirectory' keyword */        T1_Skip_PS_Token( parser );        T1_Skip_Spaces  ( parser );        cur = cur2 = parser->root.cursor;        /* look up the `known' keyword */        while ( cur < limit )        {          if ( *cur == 'k' && cur + 5 < limit             &&                ft_strncmp( (char*)cur, "known", 5 ) == 0 )            break;          T1_Skip_PS_Token( parser );          if ( parser->root.error )            goto Exit;          T1_Skip_Spaces  ( parser );          cur = parser->root.cursor;        }        if ( cur < limit )        {          T1_TokenRec  token;          /* skip the `known' keyword and the token following it */          T1_Skip_PS_Token( parser );          T1_ToToken( parser, &token );          /* if the last token was an array, skip it! */          if ( token.type == T1_TOKEN_TYPE_ARRAY )            cur2 = parser->root.cursor;        }        parser->root.cursor = cur2;      }      /* look for immediates */      else if ( *cur == '/' && cur + 2 < limit )      {        FT_PtrDist  len;        cur++;        parser->root.cursor = cur;        T1_Skip_PS_Token( parser );        if ( parser->root.error )          goto Exit;        len = parser->root.cursor - cur;        if ( len > 0 && len < 22 && parser->root.cursor < limit )        {          int  i;          /* now compare the immediate name to the keyword table */          /* loop through all known keywords */          for ( i = 0; i < n_keywords; i++ )          {            T1_Field  keyword = (T1_Field)&t42_keywords[i];            FT_Byte   *name   = (FT_Byte*)keyword->ident;            if ( !name )              continue;            if ( cur[0] == name[0]                                  &&                 len == (FT_PtrDist)ft_strlen( (const char *)name ) &&                 ft_memcmp( cur, name, len ) == 0                   )            {              /* we found it -- run the parsing callback! */              parser->root.error = t42_load_keyword( face,                                                     loader,                                                     keyword );              if ( parser->root.error )                return parser->root.error;              break;            }          }        }      }      else      {        T1_Skip_PS_Token( parser );        if ( parser->root.error )          goto Exit;      }      T1_Skip_Spaces( parser );    }  Exit:    return parser->root.error;  }  FT_LOCAL_DEF( void )  t42_loader_init( T42_Loader  loader,                   T42_Face    face )  {    FT_UNUSED( face );    FT_MEM_ZERO( loader, sizeof ( *loader ) );    loader->num_glyphs = 0;    loader->num_chars  = 0;    /* initialize the tables -- simply set their `init' field to 0 */    loader->encoding_table.init = 0;    loader->charstrings.init    = 0;    loader->glyph_names.init    = 0;  }  FT_LOCAL_DEF( void )  t42_loader_done( T42_Loader  loader )  {    T42_Parser  parser = &loader->parser;    /* finalize tables */    T1_Release_Table( &loader->encoding_table );    T1_Release_Table( &loader->charstrings );    T1_Release_Table( &loader->glyph_names );    T1_Release_Table( &loader->swap_table );    /* finalize parser */    t42_parser_done( parser );  }/* END */

⌨️ 快捷键说明

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