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

📄 otlgpos.c

📁 下载来的一个看图软件的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        }        break;      default:        OTL_INVALID_DATA;    }  } /************************************************************************/ /************************************************************************/ /*****                                                              *****/ /*****                 GPOS LOOKUP TYPE 6                           *****/ /*****                                                              *****/ /************************************************************************/ /************************************************************************/  static void  otl_mark2_array_validate( OTL_Bytes      table,                            OTL_UInt       class_count,                            OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   count, count2;    OTL_CHECK( 2 );    count = OTL_NEXT_USHORT( p );    OTL_CHECK( count*class_count*2 );    for ( ; count > 0; count-- )      for ( count2 = class_count; class_count > 0; class_count-- )        otl_anchor_validate( table + OTL_NEXT_USHORT( p ), valid );  }  static void  otl_gpos_lookup6_validate( OTL_Bytes  table,                             OTL_Valid  valid )  {    OTL_Bytes  p = table;    OTL_UInt   format;    OTL_CHECK( 2 );    format = OTL_NEXT_USHORT( p );    switch (format)    {      case 1:        {          OTL_UInt  coverage1, coverage2, class_count, array1, array2;          OTL_CHECK( 10 );          coverage1   = OTL_NEXT_USHORT( p );          coverage2   = OTL_NEXT_USHORT( p );          class_count = OTL_NEXT_USHORT( p );          array1      = OTL_NEXT_USHORT( p );          array2      = OTL_NEXT_USHORT( p );          otl_coverage_validate( table + coverage1, valid );          otl_coverage_validate( table + coverage2, valid );          otl_mark_array_validate( table + array1, valid );          otl_mark2_array_validate( table + array2, valid );        }        break;      default:        OTL_INVALID_DATA;    }  } /************************************************************************/ /************************************************************************/ /*****                                                              *****/ /*****                 GPOS LOOKUP TYPE 7                           *****/ /*****                                                              *****/ /************************************************************************/ /************************************************************************/  static void  otl_pos_rule_validate( OTL_Bytes      table,                         OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   glyph_count, pos_count;    OTL_CHECK( 4 );    glyph_count = OTL_NEXT_USHORT( p );    pos_count   = OTL_NEXT_USHORT( p );    if ( glyph_count == 0 )      OTL_INVALID_DATA;    OTL_CHECK( (glyph_count-1)*2 + pos_count*4 );    /* XXX: check glyph indices and pos lookups */  }  static void  otl_pos_rule_set_validate( OTL_Bytes      table,                             OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   count;    OTL_CHECK( 2 );    count = OTL_NEXT_USHORT( p );    OTL_CHECK( count*2 );    for ( ; count > 0; count-- )      otl_pos_rule_validate( table + OTL_NEXT_USHORT(p), valid );  }  static void  otl_pos_class_rule_validate( OTL_Bytes      table,                               OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   glyph_count, pos_count;    OTL_CHECK( 4 );    glyph_count = OTL_NEXT_USHORT( p );    pos_count   = OTL_NEXT_USHORT( p );    if ( glyph_count == 0 )      OTL_INVALID_DATA;    OTL_CHECK( (glyph_count-1)*2 + pos_count*4 );    /* XXX: check glyph indices and pos lookups */  }  static void  otl_pos_class_set_validate( OTL_Bytes      table,                              OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   count;    OTL_CHECK( 2 );    count = OTL_NEXT_USHORT( p );    OTL_CHECK( count*2 );    for ( ; count > 0; count-- )      otl_pos_rule_validate( table + OTL_NEXT_USHORT(p), valid );  }  static void  otl_gpos_lookup7_validate( OTL_Bytes      table,                             OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   format;    OTL_CHECK( 2 );    format = OTL_NEXT_USHORT( p );    switch (format)    {      case 1:        {          OTL_UInt  coverage, count;          OTL_CHECK( 4 );          coverage = OTL_NEXT_USHORT( p );          count    = OTL_NEXT_USHORT( p );          otl_coverage_validate( table + coverage, valid );          OTL_CHECK( count*2 );          for ( ; count > 0; count-- )            otl_pos_rule_set_validate( table + OTL_NEXT_USHORT( p ), valid );        }        break;      case 2:        {          OTL_UInt  coverage, class_def, count;          OTL_CHECK( 6 );          coverage  = OTL_NEXT_USHORT( p );          class_def = OTL_NEXT_USHORT( p );          count     = OTL_NEXT_USHORT( p );          otl_coverage_validate        ( table + coverage, valid );          otl_class_definition_validate( table + class_def, valid );          OTL_CHECK( count*2 );          for ( ; count > 0; count-- )            otl_        }        break;      case 3:        {          OTL_UInt  glyph_count, pos_count;          OTL_CHECK( 4 );          glyph_count = OTL_NEXT_USHORT( p );          pos_count   = OTL_NEXT_USHORT( p );          OTL_CHECK( glyph_count*2 + pos_count*4 );          for ( ; glyph_count > 0; glyph_count )            otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid );          /* XXX: check pos lookups */        }        break;      default:        OTL_INVALID_DATA;    }  } /************************************************************************/ /************************************************************************/ /*****                                                              *****/ /*****                 GPOS LOOKUP TYPE 8                           *****/ /*****                                                              *****/ /************************************************************************/ /************************************************************************/  static void  otl_chain_pos_rule_validate( OTL_Bytes      table,                               OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   back_count, input_count, ahead_count, pos_count;    OTL_CHECK( 2 );    back_count = OTL_NEXT_USHORT( p );    OTL_CHECK( back_count*2 + 2 );    p += back_count*2;    input_count = OTL_NEXT_USHORT( p );    if ( input_count == 0 )      OTL_INVALID_DATA;    OTL_CHECK( input_count*2 );    p += (input_count-1)*2;    ahead_count = OTL_NEXT_USHORT( p );    OTL_CHECK( ahead_count*2 + 2 );    p += ahead_count*2;    pos_count = OTL_NEXT_USHORT( p );    OTL_CHECK( pos_count*4 );  }  static void  otl_chain_pos_rule_set_validate( OTL_Bytes      table,                                   OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   count;    OTL_CHECK( 2 );    count = OTL_NEXT_USHORT( p );    OTL_CHECK( 2*count );    for ( ; count > 0; count-- )      otl_chain_pos_rule_validate( table + OTL_NEXT_USHORT( p ), valid );  }  static void  otl_chain_pos_class_rule_validate( OTL_Bytes      table,                                     OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   back_count, input_count, ahead_count, pos_count;    OTL_CHECK( 2 );    back_count = OTL_NEXT_USHORT( p );    OTL_CHECK( back_count*2 + 2 );    p += back_count*2;    input_count = OTL_NEXT_USHORT( p );    if ( input_count == 0 )      OTL_INVALID_DATA;    OTL_CHECK( input_count*2 );    p += (input_count-1)*2;    ahead_count = OTL_NEXT_USHORT( p );    OTL_CHECK( ahead_count*2 + 2 );    p += ahead_count*2;    pos_count = OTL_NEXT_USHORT( p );    OTL_CHECK( pos_count*4 );  }  static void  otl_chain_pos_class_set_validate( OTL_Bytes      table,                                   OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   count;    OTL_CHECK( 2 );    count = OTL_NEXT_USHORT( p );    OTL_CHECK( 2*count );    for ( ; count > 0; count-- )      otl_chain_pos_class_rule_validate( table + OTL_NEXT_USHORT( p ), valid );  }  static void  otl_gpos_lookup8_validate( OTL_Bytes      table,                             OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   format;    OTL_CHECK( 2 );    format = OTL_NEXT_USHORT( p );    switch (format)    {      case 1:        {          OTL_UInt  coverage, count;          OTL_CHECK( 4 );          coverage = OTL_NEXT_USHORT( p );          count    = OTL_NEXT_USHORT( p );          otl_coverage_validate( table + coverage, valid );          OTL_CHECK( count*2 );          for ( ; count > 0; count-- )            otl_chain_pos_rule_set_validate( table + OTL_NEXT_USHORT( p ),                                             valid );        }        break;      case 2:        {          OTL_UInt  coverage, back_class, input_class, ahead_class, count;          OTL_CHECK( 10 );          coverage    = OTL_NEXT_USHORT( p );          back_class  = OTL_NEXT_USHORT( p );          input_class = OTL_NEXT_USHORT( p );          ahead_class = OTL_NEXT_USHORT( p );          count       = OTL_NEXT_USHORT( p );          otl_coverage_validate( table + coverage, valid );          otl_class_definition_validate( table + back_class,  valid );          otl_class_definition_validate( table + input_class, valid );          otl_class_definition_validate( table + ahead_class, valid );          OTL_CHECK( count*2 );          for ( ; count > 0; count-- )            otl_chain_pos_class_set_validate( table + OTL_NEXT_USHORT( p ),                                              valid );        }        break;      case 3:        {          OTL_UInt  back_count, input_count, ahead_count, pos_count, count;          OTL_CHECK( 2 );          back_count = OTL_NEXT_USHORT( p );          OTL_CHECK( 2*back_count+2 );          for ( count = back_count; count > 0; count-- )            otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid );          input_count = OTL_NEXT_USHORT( p );          OTL_CHECK( 2*input_count+2 );          for ( count = input_count; count > 0; count-- )            otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid );          ahead_count = OTL_NEXT_USHORT( p );          OTL_CHECK( 2*ahead_count+2 );          for ( count = ahead_count; count > 0; count-- )            otl_coverage_validate( table + OTL_NEXT_USHORT( p ), valid );          pos_count = OTL_NEXT_USHORT( p );          OTL_CHECK( pos_count*4 );        }        break;      default:        OTL_INVALID_DATA;    }  } /************************************************************************/ /************************************************************************/ /*****                                                              *****/ /*****                 GPOS LOOKUP TYPE 9                           *****/ /*****                                                              *****/ /************************************************************************/ /************************************************************************/  static void  otl_gpos_lookup9_validate( OTL_Bytes  table,                             OTL_Valid  valid )  {    OTL_Bytes  p = table;    OTL_UInt   format;    OTL_CHECK( 2 );    format = OTL_NEXT_USHORT( p );    switch (format)    {      case 1:        {          OTL_UInt          lookup_type, lookup_offset;          OTL_ValidateFunc  validate;          OTL_CHECK( 6 );          lookup_type   = OTL_NEXT_USHORT( p );          lookup_offset = OTL_NEXT_ULONG( p );          if ( lookup_type == 0 || lookup_type >= 9 )            OTL_INVALID_DATA;          validate = otl_gpos_validate_funcs[ lookup_type-1 ];          validate( table + lookup_offset, valid );        }        break;      default:        OTL_INVALID_DATA;    }  }  static OTL_ValidateFunc  otl_gpos_validate_funcs[ 9 ] =  {    otl_gpos_lookup1_validate,    otl_gpos_lookup2_validate,    otl_gpos_lookup3_validate,    otl_gpos_lookup4_validate,    otl_gpos_lookup5_validate,    otl_gpos_lookup6_validate,    otl_gpos_lookup7_validate,    otl_gpos_lookup8_validate,    otl_gpos_lookup9_validate,  }; /************************************************************************/ /************************************************************************/ /*****                                                              *****/ /*****                         GPOS TABLE                           *****/ /*****                                                              *****/ /************************************************************************/ /************************************************************************/  OTL_LOCALDEF( void )  otl_gpos_validate( OTL_Bytes      table,                     OTL_Validator  valid )  {    OTL_Bytes  p = table;    OTL_UInt   scripts, features, lookups;    OTL_CHECK( 10 );    if ( OTL_NEXT_USHORT( p ) != 0x10000UL )      OTL_INVALID_DATA;    scripts  = OTL_NEXT_USHORT( p );    features = OTL_NEXT_USHORT( p );    lookups  = OTL_NEXT_USHORT( p );    otl_script_list_validate ( table + scripts, valid );    otl_feature_list_validate( table + features, valid );    otl_lookup_list_validate( table + lookups, 9, otl_gpos_validate_funcs,                              valid );  }  

⌨️ 快捷键说明

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