PageRenderTime 38ms CodeModel.GetById 15ms app.highlight 20ms RepoModel.GetById 2ms app.codeStats 0ms

/src/freetype/src/gxvalid/gxvmort0.c

https://bitbucket.org/cabalistic/ogredeps/
C | 151 lines | 91 code | 29 blank | 31 comment | 5 complexity | 32abf017e7c022d2ecb2321e2f842699 MD5 | raw file
  1/***************************************************************************/
  2/*                                                                         */
  3/*  gxvmort0.c                                                             */
  4/*                                                                         */
  5/*    TrueTypeGX/AAT mort table validation                                 */
  6/*    body for type0 (Indic Script Rearrangement) subtable.                */
  7/*                                                                         */
  8/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
  9/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 10/*                                                                         */
 11/*  This file is part of the FreeType project, and may only be used,       */
 12/*  modified, and distributed under the terms of the FreeType project      */
 13/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
 14/*  this file you indicate that you have read the license and              */
 15/*  understand and accept it fully.                                        */
 16/*                                                                         */
 17/***************************************************************************/
 18
 19/***************************************************************************/
 20/*                                                                         */
 21/* gxvalid is derived from both gxlayout module and otvalid module.        */
 22/* Development of gxlayout is supported by the Information-technology      */
 23/* Promotion Agency(IPA), Japan.                                           */
 24/*                                                                         */
 25/***************************************************************************/
 26
 27
 28#include "gxvmort.h"
 29
 30
 31  /*************************************************************************/
 32  /*                                                                       */
 33  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
 34  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
 35  /* messages during execution.                                            */
 36  /*                                                                       */
 37#undef  FT_COMPONENT
 38#define FT_COMPONENT  trace_gxvmort
 39
 40
 41  static const char* GXV_Mort_IndicScript_Msg[] =
 42  {
 43    "no change",
 44    "Ax => xA",
 45    "xD => Dx",
 46    "AxD => DxA",
 47    "ABx => xAB",
 48    "ABx => xBA",
 49    "xCD => CDx",
 50    "xCD => DCx",
 51    "AxCD => CDxA",
 52    "AxCD => DCxA",
 53    "ABxD => DxAB",
 54    "ABxD => DxBA",
 55    "ABxCD => CDxAB",
 56    "ABxCD => CDxBA",
 57    "ABxCD => DCxAB",
 58    "ABxCD => DCxBA",
 59
 60  };
 61
 62
 63  static void
 64  gxv_mort_subtable_type0_entry_validate(
 65    FT_Byte                         state,
 66    FT_UShort                       flags,
 67    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
 68    FT_Bytes                        table,
 69    FT_Bytes                        limit,
 70    GXV_Validator                   valid )
 71  {
 72    FT_UShort  markFirst;
 73    FT_UShort  dontAdvance;
 74    FT_UShort  markLast;
 75    FT_UShort  reserved;
 76    FT_UShort  verb = 0;
 77
 78    FT_UNUSED( state );
 79    FT_UNUSED( table );
 80    FT_UNUSED( limit );
 81
 82    FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */
 83    FT_UNUSED( glyphOffset_p );                  /* case                  */
 84
 85
 86    markFirst   = (FT_UShort)( ( flags >> 15 ) & 1 );
 87    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
 88    markLast    = (FT_UShort)( ( flags >> 13 ) & 1 );
 89
 90    reserved = (FT_UShort)( flags & 0x1FF0 );
 91    verb     = (FT_UShort)( flags & 0x000F );
 92
 93    GXV_TRACE(( "  IndicScript MorphRule for glyphOffset 0x%04x",
 94                glyphOffset_p->u ));
 95    GXV_TRACE(( " markFirst=%01d", markFirst ));
 96    GXV_TRACE(( " dontAdvance=%01d", dontAdvance ));
 97    GXV_TRACE(( " markLast=%01d", markLast ));
 98    GXV_TRACE(( " %02d", verb ));
 99    GXV_TRACE(( " %s\n", GXV_Mort_IndicScript_Msg[verb] ));
100
101    if ( markFirst > 0 && markLast > 0 )
102    {
103      GXV_TRACE(( "  [odd] a glyph is marked as the first and last"
104                  "  in Indic rearrangement\n" ));
105      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
106    }
107
108    if ( markFirst > 0 && dontAdvance > 0 )
109    {
110      GXV_TRACE(( "  [odd] the first glyph is marked as dontAdvance"
111                  " in Indic rearrangement\n" ));
112      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
113    }
114
115    if ( 0 < reserved )
116    {
117      GXV_TRACE(( " non-zero bits found in reserved range\n" ));
118      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
119    }
120    else
121      GXV_TRACE(( "\n" ));
122  }
123
124
125  FT_LOCAL_DEF( void )
126  gxv_mort_subtable_type0_validate( FT_Bytes       table,
127                                    FT_Bytes       limit,
128                                    GXV_Validator  valid )
129  {
130    FT_Bytes  p = table;
131
132
133    GXV_NAME_ENTER(
134      "mort chain subtable type0 (Indic-Script Rearrangement)" );
135
136    GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE );
137
138    valid->statetable.optdata               = NULL;
139    valid->statetable.optdata_load_func     = NULL;
140    valid->statetable.subtable_setup_func   = NULL;
141    valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
142    valid->statetable.entry_validate_func =
143      gxv_mort_subtable_type0_entry_validate;
144
145    gxv_StateTable_validate( p, limit, valid );
146
147    GXV_EXIT;
148  }
149
150
151/* END */