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

📄 gxvjust.c

📁 奇趣公司比较新的qt/emd版本
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//*  gxvjust.c                                                              *//*                                                                         *//*    TrueTypeGX/AAT just table validation (body).                         *//*                                                                         *//*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       *//*  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.                                        *//*                                                                         *//***************************************************************************//***************************************************************************//*                                                                         *//* gxvalid is derived from both gxlayout module and otvalid module.        *//* Development of gxlayout is supported by the Information-technology      *//* Promotion Agency(IPA), Japan.                                           *//*                                                                         *//***************************************************************************/#include "gxvalid.h"#include "gxvcommn.h"#include FT_SFNT_NAMES_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_gxvjust  /*   * referred `just' table format specification:   * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6just.html   * last updated 2000.   * ----------------------------------------------   * [JUST HEADER]: GXV_JUST_HEADER_SIZE   * version     (fixed:  32bit) = 0x00010000   * format      (uint16: 16bit) = 0 is only defined (2000)   * horizOffset (uint16: 16bit)   * vertOffset  (uint16: 16bit)   * ----------------------------------------------   */  typedef struct  GXV_just_DataRec_  {    FT_UShort  wdc_offset_max;    FT_UShort  wdc_offset_min;    FT_UShort  pc_offset_max;    FT_UShort  pc_offset_min;  } GXV_just_DataRec, *GXV_just_Data;#define  GXV_JUST_DATA( a )  GXV_TABLE_DATA( just, a )  static void  gxv_just_wdp_entry_validate( FT_Bytes       table,                               FT_Bytes       limit,                               GXV_Validator  valid )  {    FT_Bytes   p = table;    FT_ULong   justClass;    FT_Fixed   beforeGrowLimit;    FT_Fixed   beforeShrinkGrowLimit;    FT_Fixed   afterGrowLimit;    FT_Fixed   afterShrinkGrowLimit;    FT_UShort  growFlags;    FT_UShort  shrinkFlags;    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 + 4 + 2 + 2 );    justClass             = FT_NEXT_ULONG( p );    beforeGrowLimit       = FT_NEXT_ULONG( p );    beforeShrinkGrowLimit = FT_NEXT_ULONG( p );    afterGrowLimit        = FT_NEXT_ULONG( p );    afterShrinkGrowLimit  = FT_NEXT_ULONG( p );    growFlags             = FT_NEXT_USHORT( p );    shrinkFlags           = FT_NEXT_USHORT( p );    /* TODO: decode flags for human readability */    valid->subtable_length = p - table;  }  static void  gxv_just_wdc_entry_validate( FT_Bytes       table,                               FT_Bytes       limit,                               GXV_Validator  valid )  {    FT_Bytes  p = table;    FT_ULong  count, i;    GXV_LIMIT_CHECK( 4 );    count = FT_NEXT_ULONG( p );    for ( i = 0; i < count; i++ )    {      GXV_TRACE(( "validating wdc pair %d/%d\n", i + 1, count ));      gxv_just_wdp_entry_validate( p, limit, valid );      p += valid->subtable_length;    }    valid->subtable_length = p - table;  }  static void  gxv_just_widthDeltaClusters_validate( FT_Bytes       table,                                        FT_Bytes       limit,                                        GXV_Validator  valid )  {    FT_Bytes  p         = table ;    FT_Bytes  wdc_end   = table + GXV_JUST_DATA( wdc_offset_max );    FT_UInt   i;    GXV_NAME_ENTER( "just justDeltaClusters" );    if ( limit <= wdc_end )      FT_INVALID_OFFSET;    for ( i = 0; p <= wdc_end; i++ )    {      gxv_just_wdc_entry_validate( p, limit, valid );      p += valid->subtable_length;    }    valid->subtable_length = p - table;    GXV_EXIT;  }  static void  gxv_just_actSubrecord_type0_validate( FT_Bytes       table,                                        FT_Bytes       limit,                                        GXV_Validator  valid )  {    FT_Bytes   p = table;    FT_Fixed   lowerLimit;    FT_Fixed   upperLimit;    FT_UShort  order;    FT_UShort  decomposedCount;    FT_UInt    i;    GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 );    lowerLimit      = FT_NEXT_ULONG( p );    upperLimit      = FT_NEXT_ULONG( p );    order           = FT_NEXT_USHORT( p );    decomposedCount = FT_NEXT_USHORT( p );    for ( i = 0; i < decomposedCount; i++ )    {      FT_UShort glyphs;      GXV_LIMIT_CHECK( 2 );      glyphs = FT_NEXT_USHORT( p );    }    valid->subtable_length = p - table;  }  static void  gxv_just_actSubrecord_type1_validate( FT_Bytes       table,                                        FT_Bytes       limit,                                        GXV_Validator  valid )  {    FT_Bytes   p = table;    FT_UShort  addGlyph;    GXV_LIMIT_CHECK( 2 );    addGlyph = FT_NEXT_USHORT( p );    valid->subtable_length = p - table;  }  static void  gxv_just_actSubrecord_type2_validate( FT_Bytes       table,                                        FT_Bytes       limit,                                        GXV_Validator  valid )  {    FT_Bytes   p = table;    FT_Fixed   substThreshhold; /* Apple misspelled "Threshhold" */    FT_UShort  addGlyph;    FT_UShort  substGlyph;    GXV_LIMIT_CHECK( 4 + 2 + 2 );    substThreshhold = FT_NEXT_ULONG( p );    addGlyph        = FT_NEXT_USHORT( p );    substGlyph      = FT_NEXT_USHORT( p );    valid->subtable_length = p - table;  }  static void  gxv_just_actSubrecord_type4_validate( FT_Bytes       table,                                        FT_Bytes       limit,                                        GXV_Validator  valid )  {    FT_Bytes  p = table;    FT_ULong  variantsAxis;    FT_Fixed  minimumLimit;    FT_Fixed  noStretchValue;    FT_Fixed  maximumLimit;    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );    variantsAxis   = FT_NEXT_ULONG( p );    minimumLimit   = FT_NEXT_ULONG( p );    noStretchValue = FT_NEXT_ULONG( p );    maximumLimit   = FT_NEXT_ULONG( p );    valid->subtable_length = p - table;  }  static void  gxv_just_actSubrecord_type5_validate( FT_Bytes       table,                                        FT_Bytes       limit,                                        GXV_Validator  valid )  {    FT_Bytes   p = table;    FT_UShort  flags;    FT_UShort  glyph;    GXV_LIMIT_CHECK( 2 + 2 );    flags = FT_NEXT_USHORT( p );    glyph = FT_NEXT_USHORT( p );    valid->subtable_length = p - table;  }  /* parse single actSubrecord */  static void  gxv_just_actSubrecord_validate( FT_Bytes       table,                                  FT_Bytes       limit,                                  GXV_Validator  valid )  {    FT_Bytes   p = table;    FT_UShort  actionClass;    FT_UShort  actionType;    FT_ULong   actionLength;    GXV_NAME_ENTER( "just actSubrecord" );    GXV_LIMIT_CHECK( 2 + 2 + 4 );    actionClass  = FT_NEXT_USHORT( p );    actionType   = FT_NEXT_USHORT( p );    actionLength = FT_NEXT_ULONG( p );    if ( actionType == 0 )      gxv_just_actSubrecord_type0_validate( p, limit, valid );    else if ( actionType == 1 )      gxv_just_actSubrecord_type1_validate( p, limit, valid );    else if ( actionType == 2 )      gxv_just_actSubrecord_type2_validate( p, limit, valid );    else if ( actionType == 3 )      ;                         /* Stretch glyph action: no actionData */    else if ( actionType == 4 )      gxv_just_actSubrecord_type4_validate( p, limit, valid );    else if ( actionType == 5 )      gxv_just_actSubrecord_type5_validate( p, limit, valid );    else      FT_INVALID_DATA;    valid->subtable_length = actionLength;    GXV_EXIT;  }  static void  gxv_just_pcActionRecord_validate( FT_Bytes       table,                                    FT_Bytes       limit,                                    GXV_Validator  valid )  {    FT_Bytes  p = table;    FT_ULong  actionCount;    FT_ULong  i;    GXV_LIMIT_CHECK( 4 );    actionCount = FT_NEXT_ULONG( p );    GXV_TRACE(( "actionCount = %d\n", actionCount ));    for ( i = 0; i < actionCount; i++ )    {      gxv_just_actSubrecord_validate( p, limit, valid );      p += valid->subtable_length;    }

⌨️ 快捷键说明

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