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

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

?? cffparse.c

?? 智能設備中PDF閱讀器的源碼!用于windows mobile2003或者WM5以上
?? C
?? 第 1 頁 / 共 2 頁
字號:
/***************************************************************************/
/*                                                                         */
/*  cffparse.c                                                             */
/*                                                                         */
/*    CFF token stream parser (body)                                       */
/*                                                                         */
/*  Copyright 1996-2001, 2002, 2003, 2004 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 "cffparse.h"
#include FT_INTERNAL_STREAM_H

#include "cfferrs.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_cffparse


  enum
  {
    cff_kind_none = 0,
    cff_kind_num,
    cff_kind_fixed,
    cff_kind_fixed_thousand,
    cff_kind_string,
    cff_kind_bool,
    cff_kind_delta,
    cff_kind_callback,

    cff_kind_max  /* do not remove */
  };


  /* now generate handlers for the most simple fields */
  typedef FT_Error  (*CFF_Field_Reader)( CFF_Parser  parser );

  typedef struct  CFF_Field_Handler_
  {
    int               kind;
    int               code;
    FT_UInt           offset;
    FT_Byte           size;
    CFF_Field_Reader  reader;
    FT_UInt           array_max;
    FT_UInt           count_offset;

  } CFF_Field_Handler;


  FT_LOCAL_DEF( void )
  cff_parser_init( CFF_Parser  parser,
                   FT_UInt     code,
                   void*       object )
  {
    FT_MEM_ZERO( parser, sizeof ( *parser ) );

    parser->top         = parser->stack;
    parser->object_code = code;
    parser->object      = object;
  }


  /* read an integer */
  static FT_Long
  cff_parse_integer( FT_Byte*  start,
                     FT_Byte*  limit )
  {
    FT_Byte*  p   = start;
    FT_Int    v   = *p++;
    FT_Long   val = 0;


    if ( v == 28 )
    {
      if ( p + 2 > limit )
        goto Bad;

      val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] );
      p  += 2;
    }
    else if ( v == 29 )
    {
      if ( p + 4 > limit )
        goto Bad;

      val = ( (FT_Long)p[0] << 24 ) |
            ( (FT_Long)p[1] << 16 ) |
            ( (FT_Long)p[2] <<  8 ) |
                       p[3];
      p += 4;
    }
    else if ( v < 247 )
    {
      val = v - 139;
    }
    else if ( v < 251 )
    {
      if ( p + 1 > limit )
        goto Bad;

      val = ( v - 247 ) * 256 + p[0] + 108;
      p++;
    }
    else
    {
      if ( p + 1 > limit )
        goto Bad;

      val = -( v - 251 ) * 256 - p[0] - 108;
      p++;
    }

  Exit:
    return val;

  Bad:
    val = 0;
    goto Exit;
  }


  /* read a real */
  static FT_Fixed
  cff_parse_real( FT_Byte*  start,
                  FT_Byte*  limit,
                  FT_Int    power_ten )
  {
    FT_Byte*  p    = start;
    FT_Long   num, divider, result, exponent;
    FT_Int    sign = 0, exponent_sign = 0;
    FT_UInt   nib;
    FT_UInt   phase;


    result  = 0;
    num     = 0;
    divider = 1;

    /* first of all, read the integer part */
    phase = 4;

    for (;;)
    {
      /* If we entered this iteration with phase == 4, we need to */
      /* read a new byte.  This also skips past the intial 0x1E.  */
      if ( phase )
      {
        p++;

        /* Make sure we don't read past the end. */
        if ( p >= limit )
          goto Bad;
      }

      /* Get the nibble. */
      nib   = ( p[0] >> phase ) & 0xF;
      phase = 4 - phase;

      if ( nib == 0xE )
        sign = 1;
      else if ( nib > 9 )
        break;
      else
        result = result * 10 + nib;
    }

    /* read decimal part, if any */
    if ( nib == 0xa )
      for (;;)
      {
        /* If we entered this iteration with phase == 4, we need */
        /* to read a new byte.                                   */
        if ( phase )
        {
          p++;

          /* Make sure we don't read past the end. */
          if ( p >= limit )
            goto Bad;
        }

        /* Get the nibble. */
        nib   = ( p[0] >> phase ) & 0xF;
        phase = 4 - phase;
        if ( nib >= 10 )
          break;

        if ( divider < 10000000L )
        {
          num      = num * 10 + nib;
          divider *= 10;
        }
      }

    /* read exponent, if any */
    if ( nib == 12 )
    {
      exponent_sign = 1;
      nib           = 11;
    }

    if ( nib == 11 )
    {
      exponent = 0;

      for (;;)
      {
        /* If we entered this iteration with phase == 4, we need */
        /* to read a new byte.                                   */
        if ( phase )
        {
          p++;

          /* Make sure we don't read past the end. */
          if ( p >= limit )
            goto Bad;
        }

        /* Get the nibble. */
        nib   = ( p[0] >> phase ) & 0xF;
        phase = 4 - phase;
        if ( nib >= 10 )
          break;

        exponent = exponent * 10 + nib;
      }

      if ( exponent_sign )
        exponent = -exponent;

      power_ten += (FT_Int)exponent;
    }

    /* raise to power of ten if needed */
    while ( power_ten > 0 )
    {
      result = result * 10;
      num    = num * 10;

      power_ten--;
    }

    while ( power_ten < 0 )
    {
      result  = result / 10;
      divider = divider * 10;

      power_ten++;
    }

    /* Move the integer part into the high 16 bits. */
    result <<= 16;

    /* Place the decimal part into the low 16 bits. */
    if ( num )
      result |= FT_DivFix( num, divider );

    if ( sign )
      result = -result;

  Exit:
    return result;

  Bad:
    result = 0;
    goto Exit;
  }


  /* read a number, either integer or real */
  static FT_Long
  cff_parse_num( FT_Byte**  d )
  {
    return ( **d == 30 ? ( cff_parse_real   ( d[0], d[1], 0 ) >> 16 )
                       :   cff_parse_integer( d[0], d[1] ) );
  }


  /* read a floating point number, either integer or real */
  static FT_Fixed
  cff_parse_fixed( FT_Byte**  d )
  {
    return ( **d == 30 ? cff_parse_real   ( d[0], d[1], 0 )
                       : cff_parse_integer( d[0], d[1] ) << 16 );
  }

  /* read a floating point number, either integer or real, */
  /* but return 1000 times the number read in.             */
  static FT_Fixed
  cff_parse_fixed_thousand( FT_Byte**  d )
  {
    return **d ==
      30 ? cff_parse_real     ( d[0], d[1], 3 )
         : (FT_Fixed)FT_MulFix( cff_parse_integer( d[0], d[1] ) << 16, 1000 );
  }

  static FT_Error
  cff_parse_font_matrix( CFF_Parser  parser )
  {
    CFF_FontRecDict  dict   = (CFF_FontRecDict)parser->object;
    FT_Matrix*       matrix = &dict->font_matrix;
    FT_Vector*       offset = &dict->font_offset;
    FT_UShort*       upm    = &dict->units_per_em;
    FT_Byte**        data   = parser->stack;
    FT_Error         error;
    FT_Fixed         temp;


    error = CFF_Err_Stack_Underflow;

    if ( parser->top >= parser->stack + 6 )
    {
      matrix->xx = cff_parse_fixed_thousand( data++ );
      matrix->yx = cff_parse_fixed_thousand( data++ );
      matrix->xy = cff_parse_fixed_thousand( data++ );
      matrix->yy = cff_parse_fixed_thousand( data++ );
      offset->x  = cff_parse_fixed_thousand( data++ );
      offset->y  = cff_parse_fixed_thousand( data   );

      temp = FT_ABS( matrix->yy );

      *upm = (FT_UShort)FT_DivFix( 0x10000L, FT_DivFix( temp, 1000 ) );

      if ( temp != 0x10000L )
      {
        matrix->xx = FT_DivFix( matrix->xx, temp );
        matrix->yx = FT_DivFix( matrix->yx, temp );
        matrix->xy = FT_DivFix( matrix->xy, temp );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产普通话蜜臀| 色婷婷综合久久久久中文 | 欧美精选一区二区| 一本到不卡免费一区二区| 成人污视频在线观看| 国产一区二区伦理片| 国产伦精品一区二区三区视频青涩| 欧美aaaaaa午夜精品| 蜜桃视频在线观看一区| 免费看欧美女人艹b| 久久精品国产精品亚洲红杏| 国产在线不卡一区| 国产成人在线观看| 99re6这里只有精品视频在线观看| 波多野结衣91| 欧美色国产精品| 欧美一区二区女人| 久久久精品国产免费观看同学| 国产日韩在线不卡| 亚洲精品日韩专区silk| 午夜国产不卡在线观看视频| 日韩综合小视频| 极品瑜伽女神91| www.av精品| 欧美日韩久久不卡| 欧美精品一区二区三区在线播放| 国产农村妇女精品| 一区二区三区电影在线播| 日本欧美一区二区三区乱码| 国产精品亚洲成人| 久久无码av三级| 一区二区三区高清在线| 狠狠色丁香九九婷婷综合五月| 99视频一区二区| 5月丁香婷婷综合| 国产欧美一区二区在线| 亚洲一区二区三区不卡国产欧美| 免费在线观看视频一区| 不卡一区在线观看| 91精品国产综合久久香蕉的特点| 欧美激情一区二区三区蜜桃视频| 一区二区三区高清不卡| 国产不卡视频在线观看| 欧美久久久久久久久久| 亚洲视频在线观看一区| 老司机午夜精品99久久| 在线免费视频一区二区| 国产视频在线观看一区二区三区| 亚洲综合久久久| 成人免费视频caoporn| 日韩一区二区影院| 亚洲一二三区在线观看| eeuss鲁片一区二区三区在线观看| 欧美一区二区私人影院日本| 一区二区中文视频| 国产精品白丝jk白祙喷水网站| 欧美日韩二区三区| 亚洲品质自拍视频网站| 成人午夜精品在线| 精品国产乱码久久久久久图片 | 视频一区二区欧美| 一本到不卡免费一区二区| 国产日韩在线不卡| 国产在线不卡一卡二卡三卡四卡| 91精品国模一区二区三区| 亚洲午夜国产一区99re久久| 99久久精品久久久久久清纯| 国产免费观看久久| 国产成人精品综合在线观看| 欧美不卡一区二区| 久99久精品视频免费观看| 欧美高清视频不卡网| 婷婷开心久久网| 在线播放中文字幕一区| 亚洲成人精品一区| 91精品婷婷国产综合久久性色| 午夜视频在线观看一区| 欧美精品久久久久久久多人混战 | 972aa.com艺术欧美| 国产精品拍天天在线| 99久久久国产精品免费蜜臀| 亚洲天天做日日做天天谢日日欢| a4yy欧美一区二区三区| 成人免费在线播放视频| 91国偷自产一区二区三区观看| 亚洲人123区| 91国偷自产一区二区三区成为亚洲经典 | 午夜精品福利一区二区三区av| 欧美午夜免费电影| 视频一区二区三区入口| 日韩久久免费av| 国产精品一区二区三区乱码| **性色生活片久久毛片| 一本久道久久综合中文字幕| 亚洲成人av电影在线| 日韩女优av电影| 成人免费看的视频| 一区二区欧美在线观看| 51精品秘密在线观看| 精品一区二区av| 国产精品成人免费| 欧美日本在线看| 国产一区不卡在线| 亚洲精品水蜜桃| 日韩一级片在线观看| 国产成人日日夜夜| 一区二区三区在线观看欧美| 91精品国产美女浴室洗澡无遮挡| 国产精品综合在线视频| 亚洲综合丝袜美腿| 久久影音资源网| 91久久香蕉国产日韩欧美9色| 久久国产视频网| 国产精品不卡一区二区三区| 欧美日韩精品电影| 成人av网站在线观看免费| 亚洲一区二区三区四区在线免费观看| 91精品久久久久久久99蜜桃| 成人精品国产一区二区4080| 日本不卡视频在线观看| 国产精品美女久久久久aⅴ国产馆| 欧美影视一区在线| 成人黄色免费短视频| 日韩激情av在线| 国产精品福利一区| 欧美不卡一区二区三区| 在线免费不卡视频| 大桥未久av一区二区三区中文| 亚洲一区二区视频| 国产精品麻豆网站| 精品久久久久99| 欧美猛男男办公室激情| 97精品国产露脸对白| 久久爱www久久做| 午夜久久久久久| 亚洲视频香蕉人妖| 国产精品美女久久久久久久久 | 欧美日韩国产免费一区二区 | 欧美日韩精品三区| 一道本成人在线| 99久久精品免费| 成人小视频免费观看| 国产一区在线不卡| 精品亚洲aⅴ乱码一区二区三区| 亚洲国产成人精品视频| 亚洲一区二区精品3399| 亚洲欧美成人一区二区三区| 国产精品乱码妇女bbbb| 久久久国产午夜精品| 久久久亚洲午夜电影| 精品精品国产高清a毛片牛牛| 欧美三级视频在线| 在线国产电影不卡| 欧美视频一区二| 欧美精品xxxxbbbb| 在线成人免费视频| 日韩欧美另类在线| 亚洲国产wwwccc36天堂| 亚洲精品第一国产综合野| 亚洲精选在线视频| 夜夜嗨av一区二区三区中文字幕| 日韩美女精品在线| 亚洲精品国产精品乱码不99| 亚洲卡通动漫在线| 亚洲成人一区二区在线观看| 午夜电影久久久| 美女久久久精品| 国产成人小视频| 91在线精品一区二区| 欧美性色aⅴ视频一区日韩精品| 欧美日韩在线不卡| 日韩一二三区视频| 久久久久久久久岛国免费| 亚洲欧美在线另类| 婷婷综合五月天| 国产电影一区二区三区| hitomi一区二区三区精品| 在线精品观看国产| 精品人伦一区二区色婷婷| 国产精品视频yy9299一区| 亚洲欧美另类图片小说| 视频在线观看91| 国产精品 欧美精品| 91免费视频观看| 欧美一区二区三区白人| 国产欧美日韩不卡| 天堂一区二区在线| 国产不卡视频在线观看| 欧美日韩国产经典色站一区二区三区| 日韩欧美国产一二三区| 中文字幕av在线一区二区三区| 亚洲一区二区三区中文字幕在线| 免费一级片91| 91蝌蚪国产九色| 精品少妇一区二区| 亚洲午夜一区二区三区| 成人综合在线观看| 欧美一区二区三区四区五区 | 欧美中文字幕一区二区三区亚洲| 日韩一区二区麻豆国产|