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

📄 ttmtx.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//*  ttmtx.c                                                                *//*                                                                         *//*    Load the metrics tables common to TTF and OTF fonts (body).          *//*                                                                         *//*  Copyright 2006, 2007 by                                                *//*  David Turner, Robert Wilhelm, and Werner Lemberg.                      *//*                                                                         *//*  This file is part of the FreeType project, and may only be used,       *//*  modified, and distributed under the terms of the FreeType project      *//*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     *//*  this file you indicate that you have read the license and              *//*  understand and accept it fully.                                        *//*                                                                         *//***************************************************************************/#include <ft2build.h>#include FT_INTERNAL_DEBUG_H#include FT_INTERNAL_STREAM_H#include FT_TRUETYPE_TAGS_H#include "ttmtx.h"#include "sferrors.h"  /*************************************************************************/  /*                                                                       */  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */  /* messages during execution.                                            */  /*                                                                       */#undef  FT_COMPONENT#define FT_COMPONENT  trace_ttmtx  /*   *  Unfortunately, we can't enable our memory optimizations if   *  FT_CONFIG_OPTION_OLD_INTERNALS is defined.  This is because at least   *  one rogue client (libXfont in the X.Org XServer) is directly accessing   *  the metrics.   */  /*************************************************************************/  /*                                                                       */  /* <Function>                                                            */  /*    tt_face_load_hmtx                                                  */  /*                                                                       */  /* <Description>                                                         */  /*    Load the `hmtx' or `vmtx' 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 `vmtx'.                  */  /*                                                                       */  /* <Return>                                                              */  /*    FreeType error code.  0 means success.                             */  /*                                                                       */#if !defined FT_CONFIG_OPTION_OLD_INTERNALS  FT_LOCAL_DEF( FT_Error )  tt_face_load_hmtx( TT_Face    face,                     FT_Stream  stream,                     FT_Bool    vertical )  {    FT_Error   error;    FT_ULong   tag, table_size;    FT_ULong*  ptable_offset;    FT_ULong*  ptable_size;    if ( vertical )    {      tag           = TTAG_vmtx;      ptable_offset = &face->vert_metrics_offset;      ptable_size   = &face->vert_metrics_size;    }    else    {      tag           = TTAG_hmtx;      ptable_offset = &face->horz_metrics_offset;      ptable_size   = &face->horz_metrics_size;    }    error = face->goto_table( face, tag, stream, &table_size );    if ( error )      goto Fail;    *ptable_size   = table_size;    *ptable_offset = FT_STREAM_POS();  Fail:    return error;  }#else /* !OPTIMIZE_MEMORY || OLD_INTERNALS */  FT_LOCAL_DEF( FT_Error )  tt_face_load_hmtx( TT_Face    face,                     FT_Stream  stream,                     FT_Bool    vertical )  {    FT_Error   error;    FT_Memory  memory = stream->memory;    FT_ULong   table_len;    FT_Long    num_shorts, num_longs, num_shorts_checked;    TT_LongMetrics *   longs;    TT_ShortMetrics**  shorts;    FT_Byte*           p;    if ( vertical )    {      error = face->goto_table( face, TTAG_vmtx, stream, &table_len );      if ( error )        goto Fail;      num_longs = face->vertical.number_Of_VMetrics;      if ( (FT_ULong)num_longs > table_len / 4 )        num_longs = (FT_Long)(table_len / 4);      face->vertical.number_Of_VMetrics = 0;      longs  = (TT_LongMetrics *)&face->vertical.long_metrics;      shorts = (TT_ShortMetrics**)&face->vertical.short_metrics;    }    else    {      error = face->goto_table( face, TTAG_hmtx, stream, &table_len );      if ( error )        goto Fail;      num_longs = face->horizontal.number_Of_HMetrics;      if ( (FT_ULong)num_longs > table_len / 4 )        num_longs = (FT_Long)(table_len / 4);      face->horizontal.number_Of_HMetrics = 0;      longs  = (TT_LongMetrics *)&face->horizontal.long_metrics;      shorts = (TT_ShortMetrics**)&face->horizontal.short_metrics;    }    /* never trust derived values */    num_shorts         = face->max_profile.numGlyphs - num_longs;    num_shorts_checked = ( table_len - num_longs * 4L ) / 2;    if ( num_shorts < 0 )    {      FT_ERROR(( "%cmtx has more metrics than glyphs.\n" ));      /* Adobe simply ignores this problem.  So we shall do the same. */#if 0      error = vertical ? SFNT_Err_Invalid_Vert_Metrics                       : SFNT_Err_Invalid_Horiz_Metrics;      goto Exit;#else      num_shorts = 0;#endif    }    if ( FT_QNEW_ARRAY( *longs,  num_longs  ) ||         FT_QNEW_ARRAY( *shorts, num_shorts ) )      goto Fail;    if ( FT_FRAME_ENTER( table_len ) )      goto Fail;    p = stream->cursor;    {      TT_LongMetrics  cur   = *longs;      TT_LongMetrics  limit = cur + num_longs;      for ( ; cur < limit; cur++ )      {        cur->advance = FT_NEXT_USHORT( p );        cur->bearing = FT_NEXT_SHORT( p );      }    }    /* do we have an inconsistent number of metric values? */    {      TT_ShortMetrics*  cur   = *shorts;      TT_ShortMetrics*  limit = cur +                                FT_MIN( num_shorts, num_shorts_checked );      for ( ; cur < limit; cur++ )        *cur = FT_NEXT_SHORT( p );      /* We fill up the missing left side bearings with the     */      /* last valid value.  Since this will occur for buggy CJK */      /* fonts usually only, nothing serious will happen.       */      if ( num_shorts > num_shorts_checked && num_shorts_checked > 0 )      {        FT_Short  val = (*shorts)[num_shorts_checked - 1];        limit = *shorts + num_shorts;        for ( ; cur < limit; cur++ )          *cur = val;      }    }    FT_FRAME_EXIT();    if ( vertical )      face->vertical.number_Of_VMetrics = (FT_UShort)num_longs;    else      face->horizontal.number_Of_HMetrics = (FT_UShort)num_longs;  Fail:    return error;  }#endif /* !OPTIMIZE_MEMORY || OLD_INTERNALS */

⌨️ 快捷键说明

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