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

📄 ftxgsub.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    if ( ACCESS_Frame( count * 2L ) )      goto Fail3;    for ( n = 0; n < count; n++ )      i[n] = GET_UShort();    FORGET_Frame();    if ( ACCESS_Frame( 2L ) )      goto Fail3;    csr->LookaheadGlyphCount = GET_UShort();    FORGET_Frame();    csr->Lookahead = NULL;    count = csr->LookaheadGlyphCount;    if ( ALLOC_ARRAY( csr->Lookahead, count, UShort ) )      goto Fail3;    l = csr->Lookahead;    if ( ACCESS_Frame( count * 2L ) )      goto Fail2;    for ( n = 0; n < count; n++ )      l[n] = GET_UShort();    FORGET_Frame();    if ( ACCESS_Frame( 2L ) )      goto Fail2;    csr->SubstCount = GET_UShort();    FORGET_Frame();    csr->SubstLookupRecord = NULL;    count = csr->SubstCount;    if ( ALLOC_ARRAY( csr->SubstLookupRecord, count, TTO_SubstLookupRecord ) )      goto Fail2;    slr = csr->SubstLookupRecord;    if ( ACCESS_Frame( count * 4L ) )      goto Fail1;    for ( n = 0; n < count; n++ )    {      slr[n].SequenceIndex   = GET_UShort();      slr[n].LookupListIndex = GET_UShort();    }    FORGET_Frame();    return TT_Err_Ok;  Fail1:    FREE( slr );  Fail2:    FREE( l );  Fail3:    FREE( i );  Fail4:    FREE( b );    return error;  }  static void  Free_ChainSubRule( TTO_ChainSubRule*  csr )  {    FREE( csr->SubstLookupRecord );    FREE( csr->Lookahead );    FREE( csr->Input );    FREE( csr->Backtrack );  }  /* ChainSubRuleSet */  static TT_Error  Load_ChainSubRuleSet( TTO_ChainSubRuleSet*  csrs,                                         PFace                 input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort             n, count;    ULong              cur_offset, new_offset, base_offset;    TTO_ChainSubRule*  csr;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 2L ) )      return error;    count = csrs->ChainSubRuleCount = GET_UShort();    FORGET_Frame();    csrs->ChainSubRule = NULL;    if ( ALLOC_ARRAY( csrs->ChainSubRule, count, TTO_ChainSubRule ) )      return error;    csr = csrs->ChainSubRule;    for ( n = 0; n < count; n++ )    {      if ( ACCESS_Frame( 2L ) )        goto Fail;      new_offset = GET_UShort() + base_offset;      FORGET_Frame();      cur_offset = FILE_Pos();      if ( FILE_Seek( new_offset ) ||           ( error = Load_ChainSubRule( &csr[n], input ) ) != TT_Err_Ok )        goto Fail;      (void)FILE_Seek( cur_offset );    }    return TT_Err_Ok;  Fail:    for ( n = 0; n < count; n++ )      Free_ChainSubRule( &csr[n] );    FREE( csr );    return error;  }  static void  Free_ChainSubRuleSet( TTO_ChainSubRuleSet*  csrs )  {    UShort             n, count;    TTO_ChainSubRule*  csr;    if ( csrs->ChainSubRule )    {      count = csrs->ChainSubRuleCount;      csr   = csrs->ChainSubRule;      for ( n = 0; n < count; n++ )        Free_ChainSubRule( &csr[n] );      FREE( csr );    }  }  /* ChainContextSubstFormat1 */  static TT_Error  Load_ChainContextSubst1(                     TTO_ChainContextSubstFormat1*  ccsf1,                     PFace                          input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort                n, count;    ULong                 cur_offset, new_offset, base_offset;    TTO_ChainSubRuleSet*  csrs;    base_offset = FILE_Pos() - 2L;    if ( ACCESS_Frame( 2L ) )      return error;    new_offset = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_Coverage( &ccsf1->Coverage, input ) ) != TT_Err_Ok )      return error;    (void)FILE_Seek( cur_offset );    if ( ACCESS_Frame( 2L ) )      goto Fail2;    count = ccsf1->ChainSubRuleSetCount = GET_UShort();    FORGET_Frame();    ccsf1->ChainSubRuleSet = NULL;    if ( ALLOC_ARRAY( ccsf1->ChainSubRuleSet, count, TTO_ChainSubRuleSet ) )      goto Fail2;    csrs = ccsf1->ChainSubRuleSet;    for ( n = 0; n < count; n++ )    {      if ( ACCESS_Frame( 2L ) )        goto Fail1;      new_offset = GET_UShort() + base_offset;      FORGET_Frame();      cur_offset = FILE_Pos();      if ( FILE_Seek( new_offset ) ||           ( error = Load_ChainSubRuleSet( &csrs[n], input ) ) != TT_Err_Ok )        goto Fail1;      (void)FILE_Seek( cur_offset );    }    return TT_Err_Ok;  Fail1:    for ( n = 0; n < count; n++ )      Free_ChainSubRuleSet( &csrs[n] );    FREE( csrs );  Fail2:    Free_Coverage( &ccsf1->Coverage );    return error;  }  static void  Free_ChainContext1( TTO_ChainContextSubstFormat1*  ccsf1 )  {    UShort                n, count;    TTO_ChainSubRuleSet*  csrs;    if ( ccsf1->ChainSubRuleSet )    {      count = ccsf1->ChainSubRuleSetCount;      csrs  = ccsf1->ChainSubRuleSet;      for ( n = 0; n < count; n++ )        Free_ChainSubRuleSet( &csrs[n] );      FREE( csrs );    }    Free_Coverage( &ccsf1->Coverage );  }  /* ChainSubClassRule */  static TT_Error  Load_ChainSubClassRule(                     TTO_ChainContextSubstFormat2*  ccsf2,                     TTO_ChainSubClassRule*         cscr,                     PFace                          input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort                  n, count;    UShort*                 b;    UShort*                 i;    UShort*                 l;    TTO_SubstLookupRecord*  slr;    Bool*                   d;    if ( ACCESS_Frame( 2L ) )      return error;    cscr->BacktrackGlyphCount = GET_UShort();    FORGET_Frame();    if ( cscr->BacktrackGlyphCount > ccsf2->MaxBacktrackLength )      ccsf2->MaxBacktrackLength = cscr->BacktrackGlyphCount;    cscr->Backtrack = NULL;    count = cscr->BacktrackGlyphCount;    if ( ALLOC_ARRAY( cscr->Backtrack, count, UShort ) )      return error;    b = cscr->Backtrack;    d = ccsf2->BacktrackClassDef.Defined;    if ( ACCESS_Frame( count * 2L ) )      goto Fail4;    for ( n = 0; n < count; n++ )    {      b[n] = GET_UShort();      /* We check whether the specific class is used at all.  If not,         class 0 is used instead.                                     */      if ( !d[b[n]] )        b[n] = 0;    }    FORGET_Frame();    if ( ACCESS_Frame( 2L ) )      goto Fail4;    cscr->InputGlyphCount = GET_UShort();    FORGET_Frame();    if ( cscr->InputGlyphCount > ccsf2->MaxInputLength )      ccsf2->MaxInputLength = cscr->InputGlyphCount;    cscr->Input = NULL;    count = cscr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */    if ( ALLOC_ARRAY( cscr->Input, count, UShort ) )      goto Fail4;    i = cscr->Input;    d = ccsf2->InputClassDef.Defined;    if ( ACCESS_Frame( count * 2L ) )      goto Fail3;    for ( n = 0; n < count; n++ )    {      i[n] = GET_UShort();      if ( !d[i[n]] )        i[n] = 0;    }    FORGET_Frame();    if ( ACCESS_Frame( 2L ) )      goto Fail3;    cscr->LookaheadGlyphCount = GET_UShort();    FORGET_Frame();    if ( cscr->LookaheadGlyphCount > ccsf2->MaxLookaheadLength )      ccsf2->MaxLookaheadLength = cscr->LookaheadGlyphCount;    cscr->Lookahead = NULL;    count = cscr->LookaheadGlyphCount;    if ( ALLOC_ARRAY( cscr->Lookahead, count, UShort ) )      goto Fail3;    l = cscr->Lookahead;    d = ccsf2->LookaheadClassDef.Defined;    if ( ACCESS_Frame( count * 2L ) )      goto Fail2;    for ( n = 0; n < count; n++ )    {      l[n] = GET_UShort();      if ( !d[l[n]] )        l[n] = 0;    }    FORGET_Frame();    if ( ACCESS_Frame( 2L ) )      goto Fail2;    cscr->SubstCount = GET_UShort();    FORGET_Frame();    cscr->SubstLookupRecord = NULL;    count = cscr->SubstCount;    if ( ALLOC_ARRAY( cscr->SubstLookupRecord, count,                      TTO_SubstLookupRecord ) )      goto Fail2;    slr = cscr->SubstLookupRecord;    if ( ACCESS_Frame( count * 4L ) )      goto Fail1;    for ( n = 0; n < count; n++ )    {      slr[n].SequenceIndex   = GET_UShort();      slr[n].LookupListIndex = GET_UShort();    }    FORGET_Frame();    return TT_Err_Ok;  Fail1:    FREE( slr );  Fail2:    FREE( l );  Fail3:    FREE( i );  Fail4:    FREE( b );    return error;  }  static void  Free_ChainSubClassRule( TTO_ChainSubClassRule*  cscr )  {    FREE( cscr->SubstLookupRecord );    FREE( cscr->Lookahead );    FREE( cscr->Input );    FREE( cscr->Backtrack );  }  /* SubClassSet */  static TT_Error  Load_ChainSubClassSet(                     TTO_ChainContextSubstFormat2*  ccsf2,                     TTO_ChainSubClassSet*          cscs,                     PFace                          input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort                  n, count;    ULong                   cur_offset, new_offset, base_offset;    TTO_ChainSubClassRule*  cscr;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 2L ) )      return error;    count = cscs->ChainSubClassRuleCount = GET_UShort();    FORGET_Frame();    cscs->ChainSubClassRule = NULL;    if ( ALLOC_ARRAY( cscs->ChainSubClassRule, count,                      TTO_ChainSubClassRule ) )      return error;    cscr = cscs->ChainSubClassRule;    for ( n = 0; n < count; n++ )    {      if ( ACCESS_Frame( 2L ) )        goto Fail;      new_offset = GET_UShort() + base_offset;      FORGET_Frame();      cur_offset = FILE_Pos();      if ( FILE_Seek( new_offset ) ||           ( error = Load_ChainSubClassRule( ccsf2, &cscr[n],                                             input ) ) != TT_Err_Ok )        goto Fail;      (void)FILE_Seek( cur_offset );    }    return TT_Err_Ok;  Fail:    for ( n = 0; n < count; n++ )      Free_ChainSubClassRule( &cscr[n] );    FREE( cscr );    return error;  }  static void  Free_ChainSubClassSet( TTO_ChainSubClassSet*  cscs )  {    UShort                  n, count;    TTO_ChainSubClassRule*  cscr;    if ( cscs->ChainSubClassRule )    {      count = cscs->ChainSubClassRuleCount;      cscr  = cscs->ChainSubClassRule;      for ( n = 0; n < count; n++ )        Free_ChainSubClassRule( &cscr[n] );      FREE( cscr );    }  }  /* ChainContextSubstFormat2 */  static TT_Error  Load_ChainContextSubst2(                     TTO_ChainContextSubstFormat2*  ccsf2,                     PFace                          input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort                 n, count;    ULong                  cur_offset, new_offset, base_offset;    ULong                  backtrack_offset, input_offset, lookahead_offset;    TTO_ChainSubClassSet*  cscs;    base_offset = FILE_Pos() - 2;    if ( ACCESS_Frame( 2L ) )      return error;    new_offset = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_Coverage( &ccsf2->Coverage, input ) ) != TT_Err_Ok )      return error;    (void)FILE_Seek( cur_offset );    if ( ACCESS_Frame( 8L ) )      goto Fail5;    backtrack_offset = GET_UShort() + base_offset;    input_offset     = GET_UShort() + base_offset;    lookahead_offset = GET_UShort() + base_offset;    /* `ChainSubClassSetCount' is the upper limit for input class values,       thus we read it now to make an additional safety check.            */    count = ccsf2->ChainSubClassSetCount = GET_UShort();    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( backtrack_offset ) ||         ( error = Load_ClassDefinition( &ccsf2->BacktrackClassDef, count,                                         input ) ) != TT_Err_Ok )      goto Fail5;    if ( FILE_Seek( input_offset ) ||         ( error = Load_ClassDefinition( &ccsf2->InputClassDef, count,                                         input ) ) != TT_Err_Ok )      goto Fail4;    if ( FILE_Seek( lookahead_offset ) ||         ( error = Load_ClassDefinition( &ccsf2->LookaheadClassDef, count,                                         input ) ) != TT_Err_Ok )      goto Fail3;    (void)FILE_Seek( cur_offset );    ccsf2->ChainSubClassSet   = NULL;    ccsf2->MaxBacktrackLength = 0;    ccsf2->MaxInputLength     = 0;    ccsf2->MaxLookaheadLength = 0;    if ( ALLOC_ARRAY( ccsf2->ChainSubClassSet, count, TTO_ChainSubClassSet ) )      goto Fail2;    cscs

⌨️ 快捷键说明

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