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

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

?? ttkern.c

?? 智能設備中PDF閱讀器的源碼!用于windows mobile2003或者WM5以上
?? C
字號:
/***************************************************************************/
/*                                                                         */
/*  ttkern.c                                                               */
/*                                                                         */
/*    Load the basic TrueType kerning table.  This doesn't handle          */
/*    kerning data within the GPOS table at the moment.                    */
/*                                                                         */
/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 by                   */
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
/*                                                                         */
/*  This file is part of the FreeType project, and may only be used,       */
/*  modified, and distributed under the terms of the FreeType project      */
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
/*  this file you indicate that you have read the license and              */
/*  understand and accept it fully.                                        */
/*                                                                         */
/***************************************************************************/


#include <ft2build.h>
#include FT_INTERNAL_DEBUG_H
#include FT_INTERNAL_STREAM_H
#include FT_TRUETYPE_TAGS_H
#include "ttkern.h"
#include "ttload.h"

#include "sferrors.h"


  /*************************************************************************/
  /*                                                                       */
  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
  /* messages during execution.                                            */
  /*                                                                       */
#undef  FT_COMPONENT
#define FT_COMPONENT  trace_ttkern


#undef  TT_KERN_INDEX
#define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )


#ifdef FT_OPTIMIZE_MEMORY

  FT_LOCAL_DEF( FT_Error )
  tt_face_load_kern( TT_Face    face,
                     FT_Stream  stream )
  {
    FT_Error   error;
    FT_ULong   table_size;
    FT_Byte*   p;
    FT_Byte*   p_limit;
    FT_UInt    nn, num_tables;
    FT_UInt32  avail = 0, ordered = 0;


    /* the kern table is optional; exit silently if it is missing */
    error = face->goto_table( face, TTAG_kern, stream, &table_size );
    if ( error )
      goto Exit;

    if ( table_size < 4 )  /* the case of a malformed table */
    {
      FT_ERROR(( "kerning table is too small - ignored\n" ));
      error = SFNT_Err_Table_Missing;
      goto Exit;
    }

    if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) )
    {
      FT_ERROR(( "could not extract kerning table\n" ));
      goto Exit;
    }

    face->kern_table_size = table_size;

    p       = face->kern_table;
    p_limit = p + table_size;

    p         += 2; /* skip version */
    num_tables = FT_NEXT_USHORT( p );

    if ( num_tables > 32 ) /* we only support up to 32 sub-tables */
      num_tables = 32;

    for ( nn = 0; nn < num_tables; nn++ )
    {
      FT_UInt    num_pairs, version, length, coverage;
      FT_Byte*   p_next;
      FT_UInt32  mask = 1UL << nn;


      if ( p + 6 > p_limit )
        break;

      p_next = p;

      version  = FT_NEXT_USHORT( p );
      length   = FT_NEXT_USHORT( p );
      coverage = FT_NEXT_USHORT( p );

      if ( length <= 6 )
        break;

      p_next += length;

      /* only use horizontal kerning tables */
      if ( ( coverage & ~8 ) != 0x0001 ||
           p + 8 > p_limit             )
        goto NextTable;

      num_pairs = FT_NEXT_USHORT( p );
      p        += 6;

      if ( p + 6 * num_pairs > p_limit )
        goto NextTable;

      avail |= mask;

      /*
       *  Now check whether the pairs in this table are ordered.
       *  We then can use binary search.
       */
      if ( num_pairs > 0 )
      {
        FT_UInt  count;
        FT_UInt  old_pair;


        old_pair = FT_NEXT_ULONG( p );
        p       += 2;

        for ( count = num_pairs - 1; count > 0; count-- )
        {
          FT_UInt32  cur_pair;


          cur_pair = FT_NEXT_ULONG( p );
          if ( cur_pair <= old_pair )
            break;

          p += 2;
          old_pair = cur_pair;
        }

        if ( count == 0 )
          ordered |= mask;
      }

    NextTable:
      p = p_next;
    }

    face->num_kern_tables = nn;
    face->kern_avail_bits = avail;
    face->kern_order_bits = ordered;

  Exit:
    return error;
  }


  FT_LOCAL_DEF( void )
  tt_face_done_kern( TT_Face  face )
  {
    FT_Stream  stream = face->root.stream;


    FT_FRAME_RELEASE( face->kern_table );
    face->kern_table_size = 0;
    face->num_kern_tables = 0;
    face->kern_avail_bits = 0;
    face->kern_order_bits = 0;
  }


  FT_LOCAL_DEF( FT_Int )
  tt_face_get_kerning( TT_Face  face,
                       FT_UInt  left_glyph,
                       FT_UInt  right_glyph )
  {
    FT_Int    result = 0;
    FT_UInt   count, mask = 1;
    FT_Byte*  p       = face->kern_table;


    p   += 4;
    mask = 0x0001;

    for ( count = face->num_kern_tables; count > 0; count--, mask <<= 1 )
    {
      FT_Byte* base     = p;
      FT_Byte* next     = base;
      FT_UInt  version  = FT_NEXT_USHORT( p );
      FT_UInt  length   = FT_NEXT_USHORT( p );
      FT_UInt  coverage = FT_NEXT_USHORT( p );
      FT_Int   value    = 0;

      FT_UNUSED( version );


      next = base + length;

      if ( ( face->kern_avail_bits & mask ) == 0 )
        goto NextTable;

      if ( p + 8 > next )
        goto NextTable;

      switch ( coverage >> 8 )
      {
      case 0:
        {
          FT_UInt   num_pairs = FT_NEXT_USHORT( p );
          FT_ULong  key0      = TT_KERN_INDEX( left_glyph, right_glyph );


          p += 6;

          if ( face->kern_order_bits & mask )   /* binary search */
          {
            FT_UInt   min = 0;
            FT_UInt   max = num_pairs;


            while ( min < max )
            {
              FT_UInt   mid = ( min + max ) >> 1;
              FT_Byte*  q   = p + 6 * mid;
              FT_ULong  key;


              key = FT_NEXT_ULONG( q );

              if ( key == key0 )
              {
                value = FT_PEEK_SHORT( q );
                goto Found;
              }
              if ( key < key0 )
                min = mid + 1;
              else
                max = mid;
            }
          }
          else /* linear search */
          {
            FT_UInt  count2;


            for ( count2 = num_pairs; count2 > 0; count2-- )
            {
              FT_ULong  key = FT_NEXT_ULONG( p );


              if ( key == key0 )
              {
                value = FT_PEEK_SHORT( p );
                goto Found;
              }
              p += 2;
            }
          }
        }
        break;

       /*
        *  We don't support format 2 because we haven't seen a single font
        *  using it in real life...
        */

      default:
        ;
      }

      goto NextTable;

    Found:
      if ( coverage & 8 ) /* overide or add */
        result = value;
      else
        result += value;

    NextTable:
      p = next;
    }

    return result;
  }

#else /* !OPTIMIZE_MEMORY */

  FT_CALLBACK_DEF( int )
  tt_kern_pair_compare( const void*  a,
                        const void*  b );


  FT_LOCAL_DEF( FT_Error )
  tt_face_load_kern( TT_Face    face,
                     FT_Stream  stream )
  {
    FT_Error   error;
    FT_Memory  memory = stream->memory;

    FT_UInt    n, num_tables;


    /* the kern table is optional; exit silently if it is missing */
    error = face->goto_table( face, TTAG_kern, stream, 0 );
    if ( error )
      return SFNT_Err_Ok;

    if ( FT_FRAME_ENTER( 4L ) )
      goto Exit;

    (void)FT_GET_USHORT();         /* version */
    num_tables = FT_GET_USHORT();

    FT_FRAME_EXIT();

    for ( n = 0; n < num_tables; n++ )
    {
      FT_UInt  coverage;
      FT_UInt  length;


      if ( FT_FRAME_ENTER( 6L ) )
        goto Exit;

      (void)FT_GET_USHORT();           /* version                 */
      length   = FT_GET_USHORT() - 6;  /* substract header length */
      coverage = FT_GET_USHORT();

      FT_FRAME_EXIT();

      if ( coverage == 0x0001 )
      {
        FT_UInt        num_pairs;
        TT_Kern0_Pair  pair;
        TT_Kern0_Pair  limit;


        /* found a horizontal format 0 kerning table! */
        if ( FT_FRAME_ENTER( 8L ) )
          goto Exit;

        num_pairs = FT_GET_USHORT();

        /* skip the rest */

        FT_FRAME_EXIT();

        /* allocate array of kerning pairs */
        if ( FT_QNEW_ARRAY( face->kern_pairs, num_pairs ) ||
             FT_FRAME_ENTER( 6L * num_pairs )             )
          goto Exit;

        pair  = face->kern_pairs;
        limit = pair + num_pairs;
        for ( ; pair < limit; pair++ )
        {
          pair->left  = FT_GET_USHORT();
          pair->right = FT_GET_USHORT();
          pair->value = FT_GET_USHORT();
        }

        FT_FRAME_EXIT();

        face->num_kern_pairs   = num_pairs;
        face->kern_table_index = n;

        /* ensure that the kerning pair table is sorted (yes, some */
        /* fonts have unsorted tables!)                            */

        if ( num_pairs > 0 )
        {
          TT_Kern0_Pair  pair0 = face->kern_pairs;
          FT_ULong       prev  = TT_KERN_INDEX( pair0->left, pair0->right );


          for ( pair0++; pair0 < limit; pair0++ )
          {
            FT_ULong  next = TT_KERN_INDEX( pair0->left, pair0->right );


            if ( next < prev )
              goto SortIt;

            prev = next;
          }
          goto Exit;

        SortIt:
          ft_qsort( (void*)face->kern_pairs, (int)num_pairs,
                    sizeof ( TT_Kern0_PairRec ), tt_kern_pair_compare );
        }

        goto Exit;
      }

      if ( FT_STREAM_SKIP( length ) )
        goto Exit;
    }

    /* no kern table found -- doesn't matter */
    face->kern_table_index = -1;
    face->num_kern_pairs   = 0;
    face->kern_pairs       = NULL;

  Exit:
    return error;
  }


  FT_CALLBACK_DEF( int )
  tt_kern_pair_compare( const void*  a,
                        const void*  b )
  {
    TT_Kern0_Pair  pair1 = (TT_Kern0_Pair)a;
    TT_Kern0_Pair  pair2 = (TT_Kern0_Pair)b;

    FT_ULong  index1 = TT_KERN_INDEX( pair1->left, pair1->right );
    FT_ULong  index2 = TT_KERN_INDEX( pair2->left, pair2->right );

    return index1 < index2 ? -1
                           : ( index1 > index2 ? 1
                                               : 0 );
  }


  FT_LOCAL_DEF( void )
  tt_face_done_kern( TT_Face  face )
  {
    FT_Memory  memory = face->root.stream->memory;


    FT_FREE( face->kern_pairs );
    face->num_kern_pairs = 0;
  }


  FT_LOCAL_DEF( FT_Int )
  tt_face_get_kerning( TT_Face  face,
                       FT_UInt  left_glyph,
                       FT_UInt  right_glyph )
  {
    FT_Int         result = 0;
    TT_Kern0_Pair  pair;


    if ( face && face->kern_pairs )
    {
      /* there are some kerning pairs in this font file! */
      FT_ULong  search_tag = TT_KERN_INDEX( left_glyph, right_glyph );
      FT_Long   left, right;


      left  = 0;
      right = face->num_kern_pairs - 1;

      while ( left <= right )
      {
        FT_Long   middle = left + ( ( right - left ) >> 1 );
        FT_ULong  cur_pair;


        pair     = face->kern_pairs + middle;
        cur_pair = TT_KERN_INDEX( pair->left, pair->right );

        if ( cur_pair == search_tag )
          goto Found;

        if ( cur_pair < search_tag )
          left = middle + 1;
        else
          right = middle - 1;
      }
    }

  Exit:
    return result;

  Found:
    result = pair->value;
    goto Exit;
  }

#endif /* !OPTIMIZE_MEMORY */


#undef TT_KERN_INDEX

/* END */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
大胆欧美人体老妇| 久久精品一区二区三区不卡牛牛 | 亚洲成人自拍偷拍| 亚洲精品国产精品乱码不99| 中文字幕一区三区| 中文字幕中文在线不卡住| 国产三区在线成人av| 国产午夜亚洲精品午夜鲁丝片| 欧美精品一区二区三区视频| 精品理论电影在线观看| 欧美成人官网二区| 国产性做久久久久久| 国产精品午夜在线观看| 1区2区3区欧美| 亚洲精品乱码久久久久久久久| 一区二区三区免费网站| 亚洲电影欧美电影有声小说| 日韩福利电影在线观看| 理论片日本一区| 国产超碰在线一区| 色综合天天视频在线观看| 欧美日本国产视频| 欧美草草影院在线视频| 中文字幕免费一区| 亚洲一二三四区| 免费成人性网站| 成人一区二区三区| 色老汉av一区二区三区| 在线不卡a资源高清| 国产亚洲综合色| 亚洲精品成人少妇| 免费看欧美女人艹b| 成人视屏免费看| 欧美系列日韩一区| 精品久久国产字幕高潮| 中文字幕一区二区三区在线播放| 亚洲综合无码一区二区| 久久精品国产亚洲一区二区三区| 国产成人免费视| 欧美日韩一级二级三级| 久久久久久久精| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲高清免费观看高清完整版在线观看| 美腿丝袜亚洲三区| 99re8在线精品视频免费播放| 欧美日韩美少妇| 日本一区二区三区免费乱视频| 一区二区三区在线影院| 精品一区二区三区在线观看 | 日本高清视频一区二区| 日韩精品一区二区三区在线观看 | 免费成人av在线播放| 成人av在线资源| 欧美一级二级在线观看| 最新国产精品久久精品| 美国欧美日韩国产在线播放| 99riav一区二区三区| 日韩欧美国产午夜精品| 亚洲精品国产无天堂网2021| 国产一区999| 欧美老肥妇做.爰bbww视频| 中文字幕欧美日韩一区| 日韩av电影免费观看高清完整版 | 91国在线观看| 国产午夜精品一区二区三区嫩草| 午夜精品久久久久久| 97久久久精品综合88久久| 日韩精品在线一区二区| 亚洲国产日韩av| www.欧美日韩| 国产亚洲va综合人人澡精品| 轻轻草成人在线| 欧美午夜精品久久久久久孕妇| 中文无字幕一区二区三区| 美国欧美日韩国产在线播放| 欧美日韩成人综合天天影院| 亚洲另类一区二区| 成人激情图片网| 久久久精品日韩欧美| 免费在线观看不卡| 欧美二区三区的天堂| 亚洲一区二区视频在线| 色综合天天综合网天天狠天天 | 性欧美大战久久久久久久久| 91在线精品一区二区| 欧美国产激情一区二区三区蜜月 | 在线视频观看一区| 国产精品人妖ts系列视频| 国产一区二区导航在线播放| 日韩欧美成人一区| 日韩av电影免费观看高清完整版 | 国产婷婷一区二区| 久久99热这里只有精品| 91精品国产综合久久精品性色| 一区二区三区日韩欧美精品| 91日韩精品一区| 国产精品女上位| 成人黄动漫网站免费app| 国产香蕉久久精品综合网| 国产精品一区专区| 国产丝袜在线精品| 国产成人精品网址| 国产欧美日韩一区二区三区在线观看| 国内偷窥港台综合视频在线播放| 日韩精品一区二区在线| 黄色成人免费在线| 精品国产伦理网| 国产成人av福利| 中文一区一区三区高中清不卡| 成人免费视频免费观看| 国产精品毛片久久久久久久| 波多野结衣精品在线| 亚洲男人都懂的| 欧美体内she精视频| 天堂资源在线中文精品| 欧美一区二区三区小说| 国产在线一区观看| 国产精品久久毛片a| 色欧美片视频在线观看在线视频| 亚洲精品久久久久久国产精华液| 欧美色成人综合| 美女久久久精品| 久久久99久久| 99v久久综合狠狠综合久久| 一区二区久久久久| 宅男噜噜噜66一区二区66| 九九热在线视频观看这里只有精品| 久久影音资源网| 成人av资源站| 午夜视频久久久久久| 日韩视频免费观看高清完整版在线观看| 久久不见久久见免费视频1| 中文字幕制服丝袜成人av| 在线观看亚洲a| 免费av成人在线| 亚洲国产精品精华液2区45| 在线精品视频小说1| 精品中文av资源站在线观看| 中文av一区特黄| 欧美酷刑日本凌虐凌虐| 国产东北露脸精品视频| 一区二区三区中文字幕在线观看| 日韩一级大片在线观看| 成人自拍视频在线| 亚洲美女视频在线观看| 日韩女优毛片在线| 99久久777色| 久久精品国产一区二区三区免费看| 国产精品无圣光一区二区| 欧美日韩国产一级片| 国产一区视频网站| 亚洲一区二区在线视频| 久久亚洲欧美国产精品乐播| 日本丶国产丶欧美色综合| 看电视剧不卡顿的网站| 亚洲男人都懂的| 26uuu欧美| 欧美日韩在线播放一区| 国产精品1024| 日本三级韩国三级欧美三级| 中文字幕综合网| 欧美v国产在线一区二区三区| 色欧美日韩亚洲| 国产91丝袜在线播放九色| 午夜精品福利在线| 最新国产成人在线观看| 久久久久久亚洲综合影院红桃| 欧美性一二三区| 成人福利视频在线| 九色综合狠狠综合久久| 亚洲第一久久影院| 国产精品久久久久久妇女6080 | 亚洲猫色日本管| 久久久久九九视频| 日韩一级在线观看| 欧美色电影在线| 91丨国产丨九色丨pron| 国产黑丝在线一区二区三区| 午夜a成v人精品| 亚洲精品乱码久久久久久久久| 欧美国产日韩亚洲一区| 2022国产精品视频| 欧美一二三四在线| 欧美日韩的一区二区| 91黄色免费版| 一本久久精品一区二区| 豆国产96在线|亚洲| 国产精品一二三区| 久久爱www久久做| 麻豆视频一区二区| 日韩精品福利网| 亚洲成人一区二区| 一二三四社区欧美黄| 亚洲美女在线一区| 亚洲人成影院在线观看| 国产精品久久久久毛片软件| 久久久av毛片精品| 久久精品人人爽人人爽| 337p粉嫩大胆色噜噜噜噜亚洲 | 亚洲一级电影视频|