亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ftxgpos.c

?? 字體縮放顯示
?? C
?? 第 1 頁 / 共 5 頁
字號:
    if ( !pvr )      return TTO_Err_Invalid_GPOS_SubTable;    glyph2 = in->string[in->pos];    for ( numpvr = ppf1->PairSet[index].PairValueCount;          numpvr;          numpvr--, pvr++ )    {      if ( glyph2 == pvr->SecondGlyph )      {        error = Get_ValueRecord( gpi, &pvr->Value1, format1,                                 &out[first_pos] );        if ( error )          return error;        return Get_ValueRecord( gpi, &pvr->Value2, format2,                                &out[in->pos] );      }    }    return TTO_Err_Not_Covered;  }  static TT_Error  Lookup_PairPos2( GPOS_Instance*       gpi,                                    TTO_PairPosFormat2*  ppf2,                                    TTO_GSUB_String*     in,                                    TTO_GPOS_Data*       out,                                    UShort               first_pos,                                    UShort               format1,                                    UShort               format2 )  {    TT_Error           error;    UShort             cl1, cl2;    TTO_Class1Record*  c1r;    TTO_Class2Record*  c2r;    error = Get_Class( &ppf2->ClassDef1, in->string[first_pos],                       &cl1, NULL );    if ( error )      return error;    error = Get_Class( &ppf2->ClassDef2, in->string[in->pos],                       &cl2, NULL );    if ( error )      return error;    c1r = &ppf2->Class1Record[cl1];    if ( !c1r )      return TTO_Err_Invalid_GPOS_SubTable;    c2r = &c1r->Class2Record[cl2];    error = Get_ValueRecord( gpi, &c2r->Value1, format1, &out[first_pos] );    if ( error )      return error;    return Get_ValueRecord( gpi, &c2r->Value2, format2, &out[in->pos] );  }  static TT_Error  Lookup_PairPos( GPOS_Instance*    gpi,                                   TTO_PairPos*      pp,                                   TTO_GSUB_String*  in,                                   TTO_GPOS_Data*    out,                                   UShort            flags,                                   UShort            context_length )  {    TT_Error         error;    UShort           index, property, first_pos;    TTO_GPOSHeader*  gpos = gpi->gpos;    if ( in->pos >= in->length - 1 )      return TTO_Err_Not_Covered;           /* Not enough glyphs in input */    if ( context_length != 0xFFFF && context_length < 2 )      return TTO_Err_Not_Covered;    if ( CHECK_Property( gpos->gdef, in->string[in->pos], flags, &property ) )      return error;    error = Coverage_Index( &pp->Coverage, in->string[in->pos], &index );    if ( error )      return error;    /* second glyph */    first_pos = in->pos;    (in->pos)++;    while ( CHECK_Property( gpos->gdef, in->string[in->pos],                            flags, &property ) )    {      if ( error && error != TTO_Err_Not_Covered )        return error;      if ( in->pos < in->length )        (in->pos)++;      else        break;    }    switch ( pp->PosFormat )    {    case 1:      error = Lookup_PairPos1( gpi, &pp->ppf.ppf1, in, out,                               first_pos, index,                               pp->ValueFormat1, pp->ValueFormat2 );      break;    case 2:      error = Lookup_PairPos2( gpi, &pp->ppf.ppf2, in, out, first_pos,                               pp->ValueFormat1, pp->ValueFormat2 );      break;    default:      return TTO_Err_Invalid_GPOS_SubTable_Format;    }    /* adjusting the `next' glyph */    if ( pp->ValueFormat2 )      (in->pos)++;    return error;  }  /* LookupType 3 */  /* CursivePosFormat1 */  TT_Error  Load_CursivePos( TTO_CursivePos*  cp,                             PFace            input )  {    DEFINE_LOAD_LOCALS( input->stream );    UShort                n, count;    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 );  }  static TT_Error  Lookup_CursivePos( GPOS_Instance*    gpi,                                      TTO_CursivePos*   cp,                                      TTO_GSUB_String*  in,                                      TTO_GPOS_Data*    out,                                      UShort            flags,                                      UShort            context_length )  {    UShort           index, property;    TT_Error         error;    TTO_GPOSHeader*  gpos = gpi->gpos;    TTO_EntryExitRecord*  eer;    TT_Pos                entry_x, entry_y;    TT_Pos                exit_x, exit_y;    if ( context_length != 0xFFFF && context_length < 1 )    {      gpi->last = 0xFFFF;      return TTO_Err_Not_Covered;    }    /* Glyphs not having the right GDEF properties will be ignored, i.e.,       gpi->last won't be reset (contrary to user defined properties). */    if ( CHECK_Property( gpos->gdef, in->string[in->pos], flags, &property ) )      return error;    /* We don't handle mark glyphs here.  According to Andrei, this isn't       possible, but who knows...                                         */    if ( property == MARK_GLYPH )    {      gpi->last = 0xFFFF;      return TTO_Err_Not_Covered;    }    error = Coverage_Index( &cp->Coverage, in->string[in->pos], &index );    if ( error )    {      gpi->last = 0xFFFF;      return error;    }    if ( index >= cp->EntryExitCount )      return TTO_Err_Invalid_GPOS_SubTable;    eer = &cp->EntryExitRecord[index];    /* Now comes the messiest part of the whole OpenType       specification.  At first glance, cursive connections seem easy       to understand, but there are pitfalls!  The reason is that       the specs don't mention how to compute the advance values       resp. glyph offsets.  I was told it would be an omission, to       be fixed in the next OpenType version...  Again many thanks to       Andrei Burago <andreib@microsoft.com> for clarifications.       Consider the following example:                        |  xadv1    |                         +---------+                         |         |                   +-----+--+ 1    |                   |     | .|      |                   |    0+--+------+                   |   2    |                   |        |                  0+--------+                  |  xadv2   |         glyph1: advance width = 12                 anchor point = (3,1)         glyph2: advance width = 11                 anchor point = (9,4)         LSB is 1 for both glyphs (so the boxes drawn above are glyph         bboxes).  Writing direction is R2L; `0' denotes the glyph's         coordinate origin.       Now the surprising part: The advance width of the *left* glyph       (resp. of the *bottom* glyph) will be modified, no matter       whether the writing direction is L2R or R2L (resp. T2B or       B2T)!  This assymetry is caused by the fact that the glyph's       coordinate origin is always the lower left corner for all       writing directions.       Continuing the above example, we can compute the new       (horizontal) advance width of glyph2 as         9 - 3 = 6  ,       and the new vertical offset of glyph2 as         1 - 4 = -3  .       Vertical writing direction is far more complicated:       a) Assuming that we recompute the advance height of the lower glyph:                                    --                         +---------+                --       |         |                   +-----+--+ 1    | yadv1                   |     | .|      |             yadv2 |    0+--+------+        -- BSB1  --                   |   2    |       --      --        y_offset                   |        |     BSB2 --      0+--------+                        --          --    --         glyph1: advance height = 6                 anchor point = (3,1)         glyph2: advance height = 7                 anchor point = (9,4)         TSB is 1 for both glyphs; writing direction is T2B.           BSB1     = yadv1 - (TSB1 + ymax1)           BSB2     = yadv2 - (TSB2 + ymax2)           y_offset = y2 - y1         vertical advance width of glyph2           = y_offset + BSB2 - BSB1           = (y2 - y1) + (yadv2 - (TSB2 + ymax2)) - (yadv1 - (TSB1 + ymax1))           = y2 - y1 + yadv2 - TSB2 - ymax2 - (yadv1 - TSB1 - ymax1)           = y2 - y1 + yadv2 - TSB2 - ymax2 - yadv1 + TSB1 + ymax1       b) Assuming that we recompute the advance height of the upper glyph:                                    --      --                         +---------+        -- TSB1          --    --       |         |     TSB2 --       +-----+--+ 1    | yadv1   ymax1                   |     | .|      |             yadv2 |    0+--+------+        --       --      ymax2        |   2    |       --                y_offset                   |        |          --      0+--------+                        --                --         glyph1: advance height = 6                 anchor point = (3,1)         glyph2: advance height = 7                 anchor point = (9,4)         TSB is 1 for both glyphs; writing direction is T2B.         y_offset = y2 - y1         vertical advance width of glyph2           = TSB1 + ymax1 + y_offset - (TSB2 + ymax2)           = TSB1 + ymax1 + y2 - y1 - TSB2 - ymax2       Comparing a) with b) shows that b) is easier to compute.  I'll wait       for a reply from Andrei to see what should really be implemented...       Since horizontal advance widths or vertical advance heights       can be used alone but not together, no ambiguity occurs.        */    if ( gpi->last == 0xFFFF )      goto end;    /* Get_Anchor() returns TTO_Err_Not_Covered if there is no anchor       table.                                                         */    error = Get_Anchor( gpi, &eer->EntryAnchor, in->string[in->pos],                        &entry_x, &entry_y );    if ( error == TTO_Err_Not_Covered )      goto end;    if ( error )      return error;    if ( gpi->r2l )    {      out[in->pos].x_advance   = entry_x - gpi->anchor_x;      out[in->pos].new_advance = TRUE;    }    else    {      out[gpi->last].x_advance   = gpi->anchor_x - entry_x;      out[gpi->last].new_advance = TRUE;    }    out[in->pos].y_pos = gpi->anchor_y - entry_y + out[gpi->last].y_pos;  end:    error = Get_Anchor( gpi, &eer->ExitAnchor, in->string[in->pos],                        &exit_x, &exit_y );    if ( error == TTO_Err_Not_Covered )      gpi->last = 0xFFFF;    else    {      if ( gpi->first == 0xFFFF )        gpi->first  = in->pos;      gpi->last     = in->pos;      gpi->anchor_x = exit_x;      gpi->anchor_y = exit_y;    }    if ( error )      return error;    (in->pos)++;    return TT_Err_Ok;  }  /* 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++ )    {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品萝li| 成人免费不卡视频| 岛国av在线一区| 欧美美女直播网站| 中文字幕综合网| 精品一区二区国语对白| 欧美日韩一区二区三区在线看| 久久久久久久久蜜桃| 五月激情六月综合| 色综合久久中文综合久久牛| 国产色一区二区| 乱中年女人伦av一区二区| 欧美亚洲动漫精品| 国产精品久久久久久亚洲毛片| 九九热在线视频观看这里只有精品| 欧美在线视频你懂得| 国产精品福利影院| 国产成人在线观看| 日韩精品一区二区三区四区视频| 午夜在线成人av| 欧美亚洲愉拍一区二区| 亚洲欧美日韩国产综合在线 | 精品伦理精品一区| 亚洲国产日日夜夜| 色网综合在线观看| 亚洲尤物在线视频观看| 91精品1区2区| 亚洲成a人v欧美综合天堂下载| 不卡一卡二卡三乱码免费网站 | 欧美色爱综合网| 亚洲精品免费看| 色狠狠av一区二区三区| 综合婷婷亚洲小说| 91丨九色porny丨蝌蚪| 国产精品成人免费| 成人综合在线观看| 亚洲欧洲另类国产综合| 色欧美88888久久久久久影院| 1区2区3区精品视频| 色94色欧美sute亚洲线路一ni| 亚洲色图制服诱惑 | 国产一区二区网址| 国产亚洲一区二区三区在线观看 | 亚洲成av人片在线观看无码| 欧美体内she精高潮| 亚洲国产精品久久不卡毛片| 91精品在线麻豆| 久久国产剧场电影| 久久九九久久九九| 91丨九色porny丨蝌蚪| 亚洲美女精品一区| 在线不卡免费av| 精品中文字幕一区二区小辣椒 | 国产精品久久一级| 欧美性受xxxx黑人xyx| 视频一区欧美日韩| 国产色产综合色产在线视频 | 亚洲欧美日韩成人高清在线一区| 91免费观看视频| 日韩国产高清影视| 久久久精品一品道一区| 91啪在线观看| 蜜桃av一区二区三区电影| 亚洲国产电影在线观看| 91黄色免费看| 国产一二三精品| 亚洲综合无码一区二区| 日韩三级在线观看| 91视频你懂的| 九九久久精品视频| 一区二区三区精品久久久| 精品国产乱码久久久久久蜜臀| 成人免费视频播放| 美女国产一区二区三区| 最新国产精品久久精品| 日韩一卡二卡三卡四卡| 91免费看视频| 国产精品综合在线视频| 亚洲国产精品欧美一二99| 国产亚洲欧美日韩俺去了| 欧美人与性动xxxx| 成人h动漫精品一区二区| 久久精品国产秦先生| 亚洲精品中文在线| 中文字幕不卡的av| 精品美女在线观看| 欧美日韩一区在线| av成人免费在线| 国产**成人网毛片九色| 日韩成人免费电影| 亚洲国产日韩av| 亚洲美女屁股眼交| 1024成人网| 国产精品丝袜一区| 久久久99久久精品欧美| 欧美一区二区三区爱爱| 欧美日韩一区二区三区不卡 | 777色狠狠一区二区三区| 91在线免费播放| 成熟亚洲日本毛茸茸凸凹| 黄色资源网久久资源365| 久热成人在线视频| 蜜臀av一区二区三区| 日产国产高清一区二区三区| 亚洲精品videosex极品| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲国产精品久久久男人的天堂| 中文字幕欧美区| 国产精品无遮挡| 国产欧美日产一区| 国产精品少妇自拍| 国产精品国产三级国产aⅴ入口| 久久久精品国产免大香伊| 久久久五月婷婷| 国产日韩欧美综合一区| 国产欧美日韩在线| 亚洲欧美一区二区在线观看| 中文字幕中文字幕一区| 国产精品伦一区| √…a在线天堂一区| 亚洲欧美电影一区二区| 亚洲一区在线播放| 日韩成人免费在线| 国产一区欧美二区| 国产91精品入口| 99久久婷婷国产| 色综合av在线| 在线播放一区二区三区| 日韩午夜激情免费电影| 欧美精品一区二区三区一线天视频 | 欧美精选一区二区| 欧美一级生活片| 久久一区二区三区四区| 中文幕一区二区三区久久蜜桃| 国产精品国产三级国产aⅴ中文| 亚洲人成人一区二区在线观看 | 综合分类小说区另类春色亚洲小说欧美| 欧美激情综合五月色丁香小说| 国产精品女上位| 亚洲一区av在线| 极品少妇一区二区| 972aa.com艺术欧美| 欧美日韩视频专区在线播放| 日韩欧美视频在线| 一区精品在线播放| 奇米色一区二区| 99久久亚洲一区二区三区青草| 色妹子一区二区| 欧美大片拔萝卜| 国产精品每日更新| 日本不卡免费在线视频| av在线综合网| 91精品国产综合久久精品麻豆| 久久久久久免费| 天天影视色香欲综合网老头| 国产美女精品一区二区三区| 在线亚洲精品福利网址导航| 日韩精品中文字幕在线不卡尤物| 国产精品久久久久影院| 日本美女一区二区三区视频| 9色porny自拍视频一区二区| 日韩一区二区三区视频在线| 亚洲色图丝袜美腿| 国产一区二区不卡在线| 欧美日韩成人综合| 亚洲色图视频免费播放| 狠狠色丁香婷综合久久| 欧美日韩国产天堂| 国产精品初高中害羞小美女文| 奇米精品一区二区三区四区| 色综合久久久久网| 欧美经典一区二区三区| 日韩中文字幕91| 欧美最猛性xxxxx直播| 欧美激情综合网| 国产一区二三区| 欧美一区在线视频| 亚洲一本大道在线| 91在线视频在线| 国产精品色呦呦| 国产在线精品免费| 日韩亚洲国产中文字幕欧美| 亚洲国产综合视频在线观看| 成人少妇影院yyyy| 久久综合五月天婷婷伊人| 美女视频一区二区| 91精品国产高清一区二区三区 | 久久综合九色综合久久久精品综合| 一区二区三区高清在线| 91一区二区三区在线观看| 国产视频视频一区| 国产99久久精品| 国产色91在线| 国产精品一级黄| 久久亚洲综合av| 国产乱子伦视频一区二区三区| 欧美大胆一级视频| 精品一区二区精品| 国产亚洲va综合人人澡精品 | 色哦色哦哦色天天综合|