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

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

?? pcfread.c

?? 智能設備中PDF閱讀器的源碼!用于windows mobile2003或者WM5以上
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*  pcfread.c

    FreeType font driver for pcf fonts

  Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006 by
  Francesco Zappa Nardelli

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/


#include <ft2build.h>

#include FT_INTERNAL_DEBUG_H
#include FT_INTERNAL_STREAM_H
#include FT_INTERNAL_OBJECTS_H

#include "pcf.h"
#include "pcfdrivr.h"
#include "pcfread.h"

#include "pcferror.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_pcfread


#if defined( FT_DEBUG_LEVEL_TRACE )
  static const char* const  tableNames[] =
  {
    "prop", "accl", "mtrcs", "bmps", "imtrcs",
    "enc", "swidth", "names", "accel"
  };
#endif


  static
  const FT_Frame_Field  pcf_toc_header[] =
  {
#undef  FT_STRUCTURE
#define FT_STRUCTURE  PCF_TocRec

    FT_FRAME_START( 8 ),
      FT_FRAME_ULONG_LE( version ),
      FT_FRAME_ULONG_LE( count ),
    FT_FRAME_END
  };


  static
  const FT_Frame_Field  pcf_table_header[] =
  {
#undef  FT_STRUCTURE
#define FT_STRUCTURE  PCF_TableRec

    FT_FRAME_START( 16  ),
      FT_FRAME_ULONG_LE( type ),
      FT_FRAME_ULONG_LE( format ),
      FT_FRAME_ULONG_LE( size ),
      FT_FRAME_ULONG_LE( offset ),
    FT_FRAME_END
  };


  static FT_Error
  pcf_read_TOC( FT_Stream  stream,
                PCF_Face   face )
  {
    FT_Error   error;
    PCF_Toc    toc = &face->toc;
    PCF_Table  tables;

    FT_Memory  memory = FT_FACE(face)->memory;
    FT_UInt    n;


    if ( FT_STREAM_SEEK ( 0 )                          ||
         FT_STREAM_READ_FIELDS ( pcf_toc_header, toc ) )
      return PCF_Err_Cannot_Open_Resource;

    if ( toc->version != PCF_FILE_VERSION                 ||
         toc->count   >  FT_ARRAY_MAX( face->toc.tables ) )
      return PCF_Err_Invalid_File_Format;

    if ( FT_NEW_ARRAY( face->toc.tables, toc->count ) )
      return PCF_Err_Out_Of_Memory;

    tables = face->toc.tables;
    for ( n = 0; n < toc->count; n++ )
    {
      if ( FT_STREAM_READ_FIELDS( pcf_table_header, tables ) )
        goto Exit;
      tables++;
    }

#if defined( FT_DEBUG_LEVEL_TRACE )

    {
      FT_UInt      i, j;
      const char*  name = "?";


      FT_TRACE4(( "pcf_read_TOC:\n" ));

      FT_TRACE4(( "  number of tables: %ld\n", face->toc.count ));

      tables = face->toc.tables;
      for ( i = 0; i < toc->count; i++ )
      {
        for( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] ); j++ )
          if ( tables[i].type == (FT_UInt)( 1 << j ) )
            name = tableNames[j];

        FT_TRACE4(( "  %d: type=%s, format=0x%X, "
                    "size=%ld (0x%lX), offset=%ld (0x%lX)\n",
                    i, name,
                    tables[i].format,
                    tables[i].size, tables[i].size,
                    tables[i].offset, tables[i].offset ));
      }
    }

#endif

    return PCF_Err_Ok;

  Exit:
    FT_FREE( face->toc.tables );
    return error;
  }


  static
  const FT_Frame_Field  pcf_metric_header[] =
  {
#undef  FT_STRUCTURE
#define FT_STRUCTURE  PCF_MetricRec

    FT_FRAME_START( 12 ),
      FT_FRAME_SHORT_LE( leftSideBearing ),
      FT_FRAME_SHORT_LE( rightSideBearing ),
      FT_FRAME_SHORT_LE( characterWidth ),
      FT_FRAME_SHORT_LE( ascent ),
      FT_FRAME_SHORT_LE( descent ),
      FT_FRAME_SHORT_LE( attributes ),
    FT_FRAME_END
  };


  static
  const FT_Frame_Field  pcf_metric_msb_header[] =
  {
#undef  FT_STRUCTURE
#define FT_STRUCTURE  PCF_MetricRec

    FT_FRAME_START( 12 ),
      FT_FRAME_SHORT( leftSideBearing ),
      FT_FRAME_SHORT( rightSideBearing ),
      FT_FRAME_SHORT( characterWidth ),
      FT_FRAME_SHORT( ascent ),
      FT_FRAME_SHORT( descent ),
      FT_FRAME_SHORT( attributes ),
    FT_FRAME_END
  };


  static
  const FT_Frame_Field  pcf_compressed_metric_header[] =
  {
#undef  FT_STRUCTURE
#define FT_STRUCTURE  PCF_Compressed_MetricRec

    FT_FRAME_START( 5 ),
      FT_FRAME_BYTE( leftSideBearing ),
      FT_FRAME_BYTE( rightSideBearing ),
      FT_FRAME_BYTE( characterWidth ),
      FT_FRAME_BYTE( ascent ),
      FT_FRAME_BYTE( descent ),
    FT_FRAME_END
  };


  static FT_Error
  pcf_get_metric( FT_Stream   stream,
                  FT_ULong    format,
                  PCF_Metric  metric )
  {
    FT_Error  error = PCF_Err_Ok;


    if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
    {
      const FT_Frame_Field*  fields;


      /* parsing normal metrics */
      fields = PCF_BYTE_ORDER( format ) == MSBFirst
               ? pcf_metric_msb_header
               : pcf_metric_header;

      /* the following sets 'error' but doesn't return in case of failure */
      (void)FT_STREAM_READ_FIELDS( fields, metric );
    }
    else
    {
      PCF_Compressed_MetricRec  compr;


      /* parsing compressed metrics */
      if ( FT_STREAM_READ_FIELDS( pcf_compressed_metric_header, &compr ) )
        goto Exit;

      metric->leftSideBearing  = (FT_Short)( compr.leftSideBearing  - 0x80 );
      metric->rightSideBearing = (FT_Short)( compr.rightSideBearing - 0x80 );
      metric->characterWidth   = (FT_Short)( compr.characterWidth   - 0x80 );
      metric->ascent           = (FT_Short)( compr.ascent           - 0x80 );
      metric->descent          = (FT_Short)( compr.descent          - 0x80 );
      metric->attributes       = 0;
    }

  Exit:
    return error;
  }


  static FT_Error
  pcf_seek_to_table_type( FT_Stream  stream,
                          PCF_Table  tables,
                          FT_Int     ntables,
                          FT_ULong   type,
                          FT_ULong  *aformat,
                          FT_ULong  *asize )
  {
    FT_Error  error = PCF_Err_Invalid_File_Format;
    FT_Int    i;


    for ( i = 0; i < ntables; i++ )
      if ( tables[i].type == type )
      {
        if ( stream->pos > tables[i].offset ) {
          error = PCF_Err_Invalid_Stream_Skip;
          goto Fail;
        }

        if ( FT_STREAM_SKIP( tables[i].offset - stream->pos ) ) {
          error = PCF_Err_Invalid_Stream_Skip;
          goto Fail;
        }

        *asize   = tables[i].size;  /* unused - to be removed */
        *aformat = tables[i].format;

        return PCF_Err_Ok;
      }

  Fail:
    return error;
  }


  static FT_Bool
  pcf_has_table_type( PCF_Table  tables,
                      FT_Int     ntables,
                      FT_ULong   type )
  {
    FT_Int  i;


    for ( i = 0; i < ntables; i++ )
      if ( tables[i].type == type )
        return TRUE;

    return FALSE;
  }


  static
  const FT_Frame_Field  pcf_property_header[] =
  {
#undef  FT_STRUCTURE
#define FT_STRUCTURE  PCF_ParsePropertyRec

    FT_FRAME_START( 9 ),
      FT_FRAME_LONG_LE( name ),
      FT_FRAME_BYTE   ( isString ),
      FT_FRAME_LONG_LE( value ),
    FT_FRAME_END
  };


  static
  const FT_Frame_Field  pcf_property_msb_header[] =
  {
#undef  FT_STRUCTURE
#define FT_STRUCTURE  PCF_ParsePropertyRec

    FT_FRAME_START( 9 ),
      FT_FRAME_LONG( name ),
      FT_FRAME_BYTE( isString ),
      FT_FRAME_LONG( value ),
    FT_FRAME_END
  };


  FT_LOCAL_DEF( PCF_Property )
  pcf_find_property( PCF_Face          face,
                     const FT_String*  prop )
  {
    PCF_Property  properties = face->properties;
    FT_Bool       found      = 0;
    int           i;


    for ( i = 0 ; i < face->nprops && !found; i++ )
    {
      if ( !ft_strcmp( properties[i].name, prop ) )
        found = 1;
    }

    if ( found )
      return properties + i - 1;
    else
      return NULL;
  }


  static FT_Error
  pcf_get_properties( FT_Stream  stream,
                      PCF_Face   face )
  {
    PCF_ParseProperty  props      = 0;
    PCF_Property       properties = 0;
    FT_Int             nprops, i;
    FT_ULong           format, size;
    FT_Error           error;
    FT_Memory          memory     = FT_FACE(face)->memory;
    FT_ULong           string_size;
    FT_String*         strings    = 0;


    error = pcf_seek_to_table_type( stream,
                                    face->toc.tables,
                                    face->toc.count,
                                    PCF_PROPERTIES,
                                    &format,
                                    &size );
    if ( error )
      goto Bail;

    if ( FT_READ_ULONG_LE( format ) )
      goto Bail;

    FT_TRACE4(( "pcf_get_properties:\n" ));

    FT_TRACE4(( "  format = %ld\n", format ));

    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
      goto Bail;

    if ( PCF_BYTE_ORDER( format ) == MSBFirst )
      (void)FT_READ_ULONG( nprops );
    else
      (void)FT_READ_ULONG_LE( nprops );
    if ( error )
      goto Bail;

    FT_TRACE4(( "  nprop = %d\n", nprops ));

    if ( FT_NEW_ARRAY( props, nprops ) )
      goto Bail;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
538prom精品视频线放| 久久综合色婷婷| 国产精品77777| 另类成人小视频在线| 亚洲成人777| 婷婷成人激情在线网| 午夜精品久久久久久久99樱桃| 亚洲视频精选在线| 亚洲人吸女人奶水| 玉米视频成人免费看| 亚洲最大成人综合| 亚洲国产成人精品视频| 日韩国产欧美在线观看| 日韩电影网1区2区| 国产一区二区h| 9色porny自拍视频一区二区| 97se狠狠狠综合亚洲狠狠| 色综合天天性综合| 欧美日韩免费视频| 精品久久久久久亚洲综合网| 欧美一级在线视频| 国产亚洲一区字幕| 综合久久综合久久| 亚洲精品成人a在线观看| 午夜精品久久久久久久久久 | 久久久www免费人成精品| 久久亚洲精品小早川怜子| 国产精品高潮久久久久无| 亚洲综合在线视频| 精品午夜久久福利影院| 成人一级黄色片| 欧美另类久久久品| 亚洲国产精品黑人久久久| 尤物av一区二区| 精品一区二区免费视频| 国产91精品免费| 欧美乱妇20p| 欧美国产1区2区| 琪琪久久久久日韩精品| 成人午夜在线播放| 91精品国产色综合久久| 亚洲国产精华液网站w| 亚洲高清免费在线| 国产成人aaa| 91精品国产91久久久久久一区二区| 久久久国产精品麻豆| 午夜视频在线观看一区二区| 国产精品夜夜嗨| 欧美色图第一页| 中文字幕免费观看一区| 亚洲国产综合在线| yourporn久久国产精品| 欧美一区二区三区四区久久| 一区二区三区影院| 国产乱色国产精品免费视频| 日本精品一区二区三区四区的功能| 日韩精品一区在线| 亚洲国产一区在线观看| 国产99一区视频免费| 欧洲激情一区二区| 国产精品美女久久久久久久 | 国产乱色国产精品免费视频| 国产亚洲精品免费| 日韩电影在线免费| 欧美性xxxxx极品少妇| 国产精品久久久久久久久快鸭 | 国产在线不卡一区| 在线成人高清不卡| 亚洲综合成人网| 欧美伊人久久大香线蕉综合69| 中文字幕在线一区免费| 国产精品伊人色| 国产日本欧美一区二区| 国产一区二区三区免费播放| 欧美不卡视频一区| 精品一区二区三区在线视频| 91精品黄色片免费大全| 日韩电影在线观看一区| 欧美高清精品3d| 日本不卡高清视频| 精品av久久707| 极品尤物av久久免费看| 久久久无码精品亚洲日韩按摩| 看片网站欧美日韩| wwwwxxxxx欧美| 国产98色在线|日韩| 成人免费在线观看入口| 国产一区二区三区电影在线观看 | 日韩午夜av电影| 视频一区国产视频| 欧美日韩高清一区二区三区| 亚洲国产va精品久久久不卡综合| 欧美三级中文字| 日本伊人色综合网| 正在播放亚洲一区| 国产精华液一区二区三区| 国产精品色在线| 精品视频在线免费看| 青娱乐精品视频| 国产欧美日韩视频一区二区| 色狠狠一区二区三区香蕉| 亚洲高清视频中文字幕| 欧美mv和日韩mv国产网站| 成人三级在线视频| 亚洲午夜成aⅴ人片| 日韩欧美国产午夜精品| av在线不卡电影| 日韩av一区二| 中文字幕一区二区在线播放| 欧美剧在线免费观看网站| 国产成人一区在线| 亚洲国产aⅴ天堂久久| 久久久久久久久久久久久久久99| 色综合久久综合网| 精品一区二区三区免费毛片爱 | 色综合久久久久综合体桃花网| 水野朝阳av一区二区三区| 日本一区二区免费在线| 欧美日韩国产高清一区二区三区| 国产精品一卡二卡| 天天色综合成人网| 亚洲乱码日产精品bd| 精品电影一区二区三区| 欧洲av一区二区嗯嗯嗯啊| 国产不卡视频在线观看| 日本不卡视频在线| 亚洲国产另类精品专区| 中文字幕欧美激情| 久久久精品天堂| 555夜色666亚洲国产免| 欧美在线观看视频在线| 成人黄色网址在线观看| 久久99久久精品| 天堂蜜桃一区二区三区| 一区二区三区 在线观看视频| 成人午夜精品在线| 精品午夜久久福利影院| 日韩va欧美va亚洲va久久| 亚洲黄色录像片| 国产日韩精品一区二区三区| 911国产精品| 欧美视频一区二区三区四区 | 樱桃视频在线观看一区| 欧美国产日韩亚洲一区| 99久久免费视频.com| 国产一区二区三区免费观看| 天堂影院一区二区| 日韩影院精彩在线| 免费成人在线观看视频| 亚洲成a人片在线不卡一二三区| 亚洲柠檬福利资源导航| 亚洲美女在线一区| 亚洲免费观看高清完整版在线 | 欧美精品一级二级| 欧美日韩专区在线| 色综合久久88色综合天天6| 99久久777色| 色综合久久久久| 色综合久久中文字幕综合网| 日本高清视频一区二区| 欧洲亚洲国产日韩| 91国产福利在线| 欧美日韩视频在线第一区| 欧美高清视频不卡网| 欧美tickling挠脚心丨vk| 欧美精品一区二区久久婷婷| 久久精品视频网| 国产精品久久久久一区二区三区 | 色综合网站在线| 日本道免费精品一区二区三区| 色婷婷久久99综合精品jk白丝| 欧美性受xxxx| 欧美一区二区三区在线看| 日韩精品在线网站| 国产精品福利在线播放| 亚洲欧洲av色图| 亚洲电影欧美电影有声小说| 亚洲乱码国产乱码精品精的特点| 一区二区三区视频在线看| 日韩专区欧美专区| 国产91精品免费| 欧美情侣在线播放| 国产日产精品1区| 亚洲免费成人av| 免费观看成人av| 高清shemale亚洲人妖| 欧美影片第一页| 久久亚洲影视婷婷| 亚洲高清视频的网址| 国产乱子轮精品视频| 欧美在线不卡视频| 国产亚洲va综合人人澡精品| 亚洲欧美日韩人成在线播放| 亚洲图片欧美综合| 国产一区二区调教| 欧美日韩一区在线观看| 久久久久国产精品麻豆| 亚洲va天堂va国产va久| 福利电影一区二区| 8x福利精品第一导航|