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

📄 ftxgpos.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    ULong                 cur_offset, new_offset, base_offset;    TTO_EntryExitRecord*  eer;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 4L ) )      return error;    cp->PosFormat = GET_UShort();    new_offset    = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_Coverage( &cp->Coverage, input ) ) != TT_Err_Ok )      return error;    (void)FILE_Seek( cur_offset );    if ( ACCESS_Frame( 2L ) )      goto Fail2;    count = cp->EntryExitCount = GET_UShort();    FORGET_Frame();    cp->EntryExitRecord = NULL;    if ( ALLOC_ARRAY( cp->EntryExitRecord, count, TTO_EntryExitRecord ) )      goto Fail2;    eer = cp->EntryExitRecord;    for ( n = 0; n < count; n++ )    {      if ( ACCESS_Frame( 2L ) )        return error;      new_offset = GET_UShort();      FORGET_Frame();      if ( new_offset )      {        new_offset += base_offset;        cur_offset = FILE_Pos();        if ( FILE_Seek( new_offset ) ||             ( error = Load_Anchor( &eer[n].EntryAnchor,                                    input ) ) != TT_Err_Ok )          goto Fail1;        (void)FILE_Seek( cur_offset );      }      else        eer[n].EntryAnchor.PosFormat   = 0;      if ( ACCESS_Frame( 2L ) )        return error;      new_offset = GET_UShort();      FORGET_Frame();      if ( new_offset )      {        new_offset += base_offset;        cur_offset = FILE_Pos();        if ( FILE_Seek( new_offset ) ||             ( error = Load_Anchor( &eer[n].ExitAnchor,                                    input ) ) != TT_Err_Ok )          goto Fail1;        (void)FILE_Seek( cur_offset );      }      else        eer[n].ExitAnchor.PosFormat   = 0;    }    return TT_Err_Ok;  Fail1:    for ( n = 0; n < count; n++ )    {      Free_Anchor( &eer[n].EntryAnchor );      Free_Anchor( &eer[n].ExitAnchor );    }    FREE( eer );  Fail2:    Free_Coverage( &cp->Coverage );    return error;  }  void  Free_CursivePos( TTO_CursivePos*  cp )  {    UShort                n, count;    TTO_EntryExitRecord*  eer;    if ( cp->EntryExitRecord )    {      count = cp->EntryExitCount;      eer   = cp->EntryExitRecord;      for ( n = 0; n < count; n++ )      {        Free_Anchor( &eer[n].EntryAnchor );        Free_Anchor( &eer[n].ExitAnchor );      }      FREE( eer );    }    Free_Coverage( &cp->Coverage );  }  /* LookupType 4 */  /* BaseArray */  static TT_Error  Load_BaseArray( TTO_BaseArray*  ba,                                   UShort          num_classes,                                   PFace           input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort           m, n, count;    ULong            cur_offset, new_offset, base_offset;    TTO_BaseRecord*  br;    TTO_Anchor*      ban;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 2L ) )      return error;    count = ba->BaseCount = GET_UShort();        FORGET_Frame();    ba->BaseRecord = NULL;    if ( ALLOC_ARRAY( ba->BaseRecord, count, TTO_BaseRecord ) )      return error;    br = ba->BaseRecord;    for ( m = 0; m < count; m++ )    {      br[m].BaseAnchor = NULL;      if ( ALLOC_ARRAY( br[m].BaseAnchor, num_classes, TTO_Anchor ) )        goto Fail;      ban = br[m].BaseAnchor;      for ( n = 0; n < num_classes; 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_Anchor( &ban[n], input ) ) != TT_Err_Ok )          goto Fail;        (void)FILE_Seek( cur_offset );      }    }    return TT_Err_Ok;  Fail:    for ( m = 0; m < count; m++ )    {      ban = br[m].BaseAnchor;            for ( n = 0; n < num_classes; n++ )        Free_Anchor( &ban[n] );      FREE( ban );    }    FREE( br );    return error;  }  static void  Free_BaseArray( TTO_BaseArray*  ba,                               UShort          num_classes )  {    UShort           m, n, count;    TTO_BaseRecord*  br;    TTO_Anchor*      ban;    if ( ba->BaseRecord )    {      count = ba->BaseCount;      br    = ba->BaseRecord;      for ( m = 0; m < count; m++ )      {        ban = br[m].BaseAnchor;        for ( n = 0; n < num_classes; n++ )          Free_Anchor( &ban[n] );        FREE( ban );      }      FREE( br );    }  }  /* MarkBasePosFormat1 */  TT_Error  Load_MarkBasePos( TTO_MarkBasePos*  mbp,                              PFace             input )  {    DEFINE_LOAD_LOCALS( input->stream );    ULong  cur_offset, new_offset, base_offset;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 4L ) )      return error;    mbp->PosFormat = GET_UShort();    new_offset     = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_Coverage( &mbp->MarkCoverage, input ) ) != TT_Err_Ok )      return error;    (void)FILE_Seek( cur_offset );    if ( ACCESS_Frame( 2L ) )      goto Fail3;    new_offset = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_Coverage( &mbp->BaseCoverage, input ) ) != TT_Err_Ok )      goto Fail3;    (void)FILE_Seek( cur_offset );    if ( ACCESS_Frame( 4L ) )      goto Fail2;    mbp->ClassCount = GET_UShort();    new_offset      = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_MarkArray( &mbp->MarkArray, input ) ) != TT_Err_Ok )      goto Fail2;    (void)FILE_Seek( cur_offset );    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_BaseArray( &mbp->BaseArray, mbp->ClassCount,                                   input ) ) != TT_Err_Ok )      goto Fail1;    return TT_Err_Ok;  Fail1:    Free_MarkArray( &mbp->MarkArray );  Fail2:    Free_Coverage( &mbp->BaseCoverage );  Fail3:    Free_Coverage( &mbp->MarkCoverage );    return error;  }  void  Free_MarkBasePos( TTO_MarkBasePos*  mbp )  {    Free_BaseArray( &mbp->BaseArray, mbp->ClassCount );    Free_MarkArray( &mbp->MarkArray );    Free_Coverage( &mbp->BaseCoverage );    Free_Coverage( &mbp->MarkCoverage );  }  /* LookupType 5 */  /* LigatureAttach */  static TT_Error  Load_LigatureAttach( TTO_LigatureAttach*  lat,                                        UShort               num_classes,                                        PFace                input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort                m, n, count;    ULong                 cur_offset, new_offset, base_offset;    TTO_ComponentRecord*  cr;    TTO_Anchor*           lan;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 2L ) )      return error;    count = lat->ComponentCount = GET_UShort();        FORGET_Frame();    lat->ComponentRecord = NULL;    if ( ALLOC_ARRAY( lat->ComponentRecord, count, TTO_ComponentRecord ) )      return error;    cr = lat->ComponentRecord;    for ( m = 0; m < count; m++ )    {      cr[m].LigatureAnchor = NULL;      if ( ALLOC_ARRAY( cr[m].LigatureAnchor, num_classes, TTO_Anchor ) )        goto Fail;      lan = cr[m].LigatureAnchor;      for ( n = 0; n < num_classes; n++ )      {        if ( ACCESS_Frame( 2L ) )          goto Fail;        new_offset = GET_UShort();        FORGET_Frame();        if ( new_offset )        {          new_offset += base_offset;          cur_offset = FILE_Pos();          if ( FILE_Seek( new_offset ) ||               ( error = Load_Anchor( &lan[n], input ) ) != TT_Err_Ok )            goto Fail;          (void)FILE_Seek( cur_offset );        }        else          lan[n].PosFormat = 0;      }    }    return TT_Err_Ok;  Fail:    for ( m = 0; m < count; m++ )    {      lan = cr[m].LigatureAnchor;            for ( n = 0; n < num_classes; n++ )        Free_Anchor( &lan[n] );      FREE( lan );    }    FREE( cr );    return error;  }  static void  Free_LigatureAttach( TTO_LigatureAttach*  lat,                                    UShort               num_classes )  {    UShort           m, n, count;    TTO_ComponentRecord*  cr;    TTO_Anchor*           lan;    if ( lat->ComponentRecord )    {      count = lat->ComponentCount;      cr    = lat->ComponentRecord;      for ( m = 0; m < count; m++ )      {        lan = cr[m].LigatureAnchor;        for ( n = 0; n < num_classes; n++ )          Free_Anchor( &lan[n] );        FREE( lan );      }      FREE( cr );    }  }  /* LigatureArray */  static TT_Error  Load_LigatureArray( TTO_LigatureArray*  la,                                       UShort              num_classes,                                       PFace               input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort               n, count;    ULong                cur_offset, new_offset, base_offset;    TTO_LigatureAttach*  lat;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 2L ) )      return error;    count = la->LigatureCount = GET_UShort();    FORGET_Frame();    la->LigatureAttach = NULL;    if ( ALLOC_ARRAY( la->LigatureAttach, count, TTO_LigatureAttach ) )      return error;    lat = la->LigatureAttach;    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_LigatureAttach( &lat[n], num_classes,                                          input ) ) != TT_Err_Ok )        goto Fail;      (void)FILE_Seek( cur_offset );    }    return TT_Err_Ok;  Fail:    for ( n = 0; n < count; n++ )      Free_LigatureAttach( &lat[n], num_classes );    FREE( lat );    return error;  }  static void  Free_LigatureArray( TTO_LigatureArray*  la,                                   UShort              num_classes )  {    UShort               n, count;    TTO_LigatureAttach*  lat;    if ( la->LigatureAttach )    {      count = la->LigatureCount;      lat   = la->LigatureAttach;      for ( n = 0; n < count; n++ )        Free_LigatureAttach( &lat[n], num_classes );      FREE( lat );    }  }  /* MarkLigPosFormat1 */  TT_Error  Load_MarkLigPos( TTO_MarkLigPos*  mlp,                             PFace            input )  {    DEFINE_LOAD_LOCALS( input->stream );    ULong  cur_offset, new_offset, base_offset;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 4L ) )      return error;    mlp->PosFormat = GET_UShort();    new_offset     = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_Coverage( &mlp->MarkCoverage, input ) ) != TT_Err_Ok )      return error;    (void)FILE_Seek( cur_offset );    if ( ACCESS_Frame( 2L ) )      goto Fail3;    new_offset = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_Coverage( &mlp->LigatureCoverage,                                  input ) ) != TT_Err_Ok )      goto Fail3;    (void)FILE_Seek( cur_offset );    if ( ACCESS_Frame( 4L ) )      goto Fail2;    mlp->ClassCount = GET_UShort();    new_offset      = GET_UShort() + base_offset;    FORGET_Frame();    cur_offset = FILE_Pos();    if ( FILE_Seek( new_offset ) ||         ( error = Load_MarkArray( &mlp->MarkArray, input ) ) != TT_Err_Ok )      goto Fail2;    (void)FILE_Seek( cur_offset );    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_LigatureArray( &mlp->LigatureArray, mlp->ClassCount,                                       input ) ) != TT_Err_Ok )      goto Fail1;    return TT_Err_Ok;  Fail1:    Free_MarkArray( &mlp->MarkArray );  Fail2:    Free_Coverage( &mlp->LigatureCoverage );  Fail3:    Free_Coverage( &mlp->MarkCoverage );    return error;  }  void  Free_MarkLigPos( TTO_MarkLigPos*  mlp )  {    Free_LigatureArray( &mlp->LigatureArray, mlp->ClassCount );    Free_MarkArray( &mlp->MarkArray );    Free_Coverage( &mlp->LigatureCoverage );    Free_Coverage( &mlp->MarkCoverage );  }  /* LookupType 6 */  /* Mark2Array */  static TT_Error  Load_Mark2Array( TTO_Mark2Array*  m2a,                                    UShort           num_classes,                                    PFace            input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort            m, n, count;    ULong             cur_offset, new_offset, base_offset;    TTO_Mark2Record*  m2r;    TTO_Anchor*       m2an;    base_offset = FILE_Pos();    if ( ACCESS_Frame( 2L ) )      return error;

⌨️ 快捷键说明

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