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

📄 ttmtx.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    tt_face_load_hhea                                                  */  /*                                                                       */  /* <Description>                                                         */  /*    Load the `hhea' or 'vhea' table into a face object.                */  /*                                                                       */  /* <Input>                                                               */  /*    face     :: A handle to the target face object.                    */  /*                                                                       */  /*    stream   :: The input stream.                                      */  /*                                                                       */  /*    vertical :: A boolean flag.  If set, load `vhea'.                  */  /*                                                                       */  /* <Return>                                                              */  /*    FreeType error code.  0 means success.                             */  /*                                                                       */  FT_LOCAL_DEF( FT_Error )  tt_face_load_hhea( TT_Face    face,                     FT_Stream  stream,                     FT_Bool    vertical )  {    FT_Error        error;    TT_HoriHeader*  header;    const FT_Frame_Field  metrics_header_fields[] =    {#undef  FT_STRUCTURE#define FT_STRUCTURE  TT_HoriHeader      FT_FRAME_START( 36 ),        FT_FRAME_ULONG ( Version ),        FT_FRAME_SHORT ( Ascender ),        FT_FRAME_SHORT ( Descender ),        FT_FRAME_SHORT ( Line_Gap ),        FT_FRAME_USHORT( advance_Width_Max ),        FT_FRAME_SHORT ( min_Left_Side_Bearing ),        FT_FRAME_SHORT ( min_Right_Side_Bearing ),        FT_FRAME_SHORT ( xMax_Extent ),        FT_FRAME_SHORT ( caret_Slope_Rise ),        FT_FRAME_SHORT ( caret_Slope_Run ),        FT_FRAME_SHORT ( caret_Offset ),        FT_FRAME_SHORT ( Reserved[0] ),        FT_FRAME_SHORT ( Reserved[1] ),        FT_FRAME_SHORT ( Reserved[2] ),        FT_FRAME_SHORT ( Reserved[3] ),        FT_FRAME_SHORT ( metric_Data_Format ),        FT_FRAME_USHORT( number_Of_HMetrics ),      FT_FRAME_END    };    if ( vertical )    {      error = face->goto_table( face, TTAG_vhea, stream, 0 );      if ( error )        goto Fail;      header = (TT_HoriHeader*)&face->vertical;    }    else    {      error = face->goto_table( face, TTAG_hhea, stream, 0 );      if ( error )        goto Fail;      header = &face->horizontal;    }    if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )      goto Fail;    FT_TRACE3(( "Ascender:          %5d\n", header->Ascender ));    FT_TRACE3(( "Descender:         %5d\n", header->Descender ));    FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics ));    header->long_metrics  = NULL;    header->short_metrics = NULL;  Fail:    return error;  }  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    tt_face_get_metrics                                                */  /*                                                                       */  /* <Description>                                                         */  /*    Returns the horizontal or vertical metrics in font units for a     */  /*    given glyph.  The metrics are the left side bearing (resp. top     */  /*    side bearing) and advance width (resp. advance height).            */  /*                                                                       */  /* <Input>                                                               */  /*    header  :: A pointer to either the horizontal or vertical metrics  */  /*               structure.                                              */  /*                                                                       */  /*    idx     :: The glyph index.                                        */  /*                                                                       */  /* <Output>                                                              */  /*    bearing :: The bearing, either left side or top side.              */  /*                                                                       */  /*    advance :: The advance width resp. advance height.                 */  /*                                                                       */#if !defined FT_CONFIG_OPTION_OLD_INTERNALS  FT_LOCAL_DEF( FT_Error )  tt_face_get_metrics( TT_Face     face,                       FT_Bool     vertical,                       FT_UInt     gindex,                       FT_Short   *abearing,                       FT_UShort  *aadvance )  {    FT_Error        error;    FT_Stream       stream = face->root.stream;    TT_HoriHeader*  header;    FT_ULong        table_pos, table_size, table_end;    FT_UShort       k;    if ( vertical )    {      header     = (TT_HoriHeader*)&face->vertical;      table_pos  = face->vert_metrics_offset;      table_size = face->vert_metrics_size;    }    else    {      header     = &face->horizontal;      table_pos  = face->horz_metrics_offset;      table_size = face->horz_metrics_size;    }    table_end = table_pos + table_size;    k = header->number_Of_HMetrics;    if ( k > 0 )    {      if ( gindex < (FT_UInt)k )      {        table_pos += 4 * gindex;        if ( table_pos + 4 > table_end )          goto NoData;        if ( FT_STREAM_SEEK( table_pos ) ||             FT_READ_USHORT( *aadvance ) ||             FT_READ_SHORT( *abearing )  )          goto NoData;      }      else      {        table_pos += 4 * ( k - 1 );        if ( table_pos + 4 > table_end )          goto NoData;        if ( FT_STREAM_SEEK( table_pos ) ||             FT_READ_USHORT( *aadvance ) )          goto NoData;        table_pos += 4 + 2 * ( gindex - k );        if ( table_pos + 2 > table_end )          *abearing = 0;        else        {          if ( !FT_STREAM_SEEK( table_pos ) )            (void)FT_READ_SHORT( *abearing );        }      }    }    else    {    NoData:      *abearing = 0;      *aadvance = 0;    }    return SFNT_Err_Ok;  }#else /* OLD_INTERNALS */  FT_LOCAL_DEF( FT_Error )  tt_face_get_metrics( TT_Face     face,                       FT_Bool     vertical,                       FT_UInt     gindex,                       FT_Short*   abearing,                       FT_UShort*  aadvance )  {    TT_HoriHeader*  header = vertical ? (TT_HoriHeader*)&face->vertical                                      :                 &face->horizontal;    TT_LongMetrics  longs_m;    FT_UShort       k = header->number_Of_HMetrics;    if ( k == 0                                         ||         !header->long_metrics                          ||         gindex >= (FT_UInt)face->max_profile.numGlyphs )    {      *abearing = *aadvance = 0;      return SFNT_Err_Ok;    }    if ( gindex < (FT_UInt)k )    {      longs_m   = (TT_LongMetrics)header->long_metrics + gindex;      *abearing = longs_m->bearing;      *aadvance = longs_m->advance;    }    else    {      *abearing = ((TT_ShortMetrics*)header->short_metrics)[gindex - k];      *aadvance = ((TT_LongMetrics)header->long_metrics)[k - 1].advance;    }    return SFNT_Err_Ok;  }#endif /* !OPTIMIZE_MEMORY || OLD_INTERNALS *//* END */

⌨️ 快捷键说明

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