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

📄 ttpost.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
    }  Fail:    FT_FREE( name_strings );    FT_FREE( glyph_indices );  Exit:    return error;  }  static FT_Error  load_format_25( TT_Face    face,                  FT_Stream  stream )  {    FT_Memory  memory = stream->memory;    FT_Error   error;    FT_Int     num_glyphs;    FT_Char*   offset_table = 0;    /* UNDOCUMENTED!  This value appears only in the Apple TT specs. */    if ( FT_READ_USHORT( num_glyphs ) )      goto Exit;    /* check the number of glyphs */    if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )    {      error = SFNT_Err_Invalid_File_Format;      goto Exit;    }    if ( FT_NEW_ARRAY( offset_table, num_glyphs )   ||         FT_STREAM_READ( offset_table, num_glyphs ) )      goto Fail;    /* now check the offset table */    {      FT_Int  n;      for ( n = 0; n < num_glyphs; n++ )      {        FT_Long  idx = (FT_Long)n + offset_table[n];        if ( idx < 0 || idx > num_glyphs )        {          error = SFNT_Err_Invalid_File_Format;          goto Fail;        }      }    }    /* OK, set table fields and exit successfully */    {      TT_Post_25  table = &face->postscript_names.names.format_25;      table->num_glyphs = (FT_UShort)num_glyphs;      table->offsets    = offset_table;    }    return SFNT_Err_Ok;  Fail:    FT_FREE( offset_table );  Exit:    return error;  }  static FT_Error  load_post_names( TT_Face  face )  {    FT_Stream  stream;    FT_Error   error;    FT_Fixed   format;    /* get a stream for the face's resource */    stream = face->root.stream;    /* seek to the beginning of the PS names table */    error = face->goto_table( face, TTAG_post, stream, 0 );    if ( error )      goto Exit;    format = face->postscript.FormatType;    /* go to beginning of subtable */    if ( FT_STREAM_SKIP( 32 ) )      goto Exit;    /* now read postscript table */    if ( format == 0x00020000L )      error = load_format_20( face, stream );    else if ( format == 0x00028000L )      error = load_format_25( face, stream );    else      error = SFNT_Err_Invalid_File_Format;    face->postscript_names.loaded = 1;  Exit:    return error;  }  FT_LOCAL_DEF( void )  tt_face_free_ps_names( TT_Face  face )  {    FT_Memory      memory = face->root.memory;    TT_Post_Names  names  = &face->postscript_names;    FT_Fixed       format;    if ( names->loaded )    {      format = face->postscript.FormatType;      if ( format == 0x00020000L )      {        TT_Post_20  table = &names->names.format_20;        FT_UShort   n;        FT_FREE( table->glyph_indices );        table->num_glyphs = 0;        for ( n = 0; n < table->num_names; n++ )          FT_FREE( table->glyph_names[n] );        FT_FREE( table->glyph_names );        table->num_names = 0;      }      else if ( format == 0x00028000L )      {        TT_Post_25  table = &names->names.format_25;        FT_FREE( table->offsets );        table->num_glyphs = 0;      }    }    names->loaded = 0;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    tt_face_get_ps_name                                                */  /*                                                                       */  /* <Description>                                                         */  /*    Gets the PostScript glyph name of a glyph.                         */  /*                                                                       */  /* <Input>                                                               */  /*    face   :: A handle to the parent face.                             */  /*                                                                       */  /*    idx    :: The glyph index.                                         */  /*                                                                       */  /*    PSname :: The address of a string pointer.  Will be NULL in case   */  /*              of error, otherwise it is a pointer to the glyph name.   */  /*                                                                       */  /*              You must not modify the returned string!                 */  /*                                                                       */  /* <Output>                                                              */  /*    FreeType error code.  0 means success.                             */  /*                                                                       */  FT_LOCAL_DEF( FT_Error )  tt_face_get_ps_name( TT_Face      face,                       FT_UInt      idx,                       FT_String**  PSname )  {    FT_Error         error;    TT_Post_Names    names;    FT_Fixed         format;#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES    FT_Service_PsCMaps  psnames;#endif    if ( !face )      return SFNT_Err_Invalid_Face_Handle;    if ( idx >= (FT_UInt)face->max_profile.numGlyphs )      return SFNT_Err_Invalid_Glyph_Index;#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES    psnames = (FT_Service_PsCMaps)face->psnames;    if ( !psnames )      return SFNT_Err_Unimplemented_Feature;#endif    names = &face->postscript_names;    /* `.notdef' by default */    *PSname = MAC_NAME( 0 );    format = face->postscript.FormatType;    if ( format == 0x00010000L )    {      if ( idx < 258 )                    /* paranoid checking */        *PSname = MAC_NAME( idx );    }    else if ( format == 0x00020000L )    {      TT_Post_20  table = &names->names.format_20;      if ( !names->loaded )      {        error = load_post_names( face );        if ( error )          goto End;      }      if ( idx < (FT_UInt)table->num_glyphs )      {        FT_UShort  name_index = table->glyph_indices[idx];        if ( name_index < 258 )          *PSname = MAC_NAME( name_index );        else          *PSname = (FT_String*)table->glyph_names[name_index - 258];      }    }    else if ( format == 0x00028000L )    {      TT_Post_25  table = &names->names.format_25;      if ( !names->loaded )      {        error = load_post_names( face );        if ( error )          goto End;      }      if ( idx < (FT_UInt)table->num_glyphs )    /* paranoid checking */      {        idx    += table->offsets[idx];        *PSname = MAC_NAME( idx );      }    }    /* nothing to do for format == 0x00030000L */  End:    return SFNT_Err_Ok;  }/* END */

⌨️ 快捷键说明

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