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

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

?? bdfdrivr.c

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

    FreeType font driver for bdf files

    Copyright (C) 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 FT_BDF_H

#include FT_SERVICE_BDF_H
#include FT_SERVICE_XFREE86_NAME_H

#include "bdf.h"
#include "bdfdrivr.h"

#include "bdferror.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_bdfdriver


  typedef struct  BDF_CMapRec_
  {
    FT_CMapRec        cmap;
    FT_UInt           num_encodings;
    BDF_encoding_el*  encodings;

  } BDF_CMapRec, *BDF_CMap;


  FT_CALLBACK_DEF( FT_Error )
  bdf_cmap_init( FT_CMap     bdfcmap,
                 FT_Pointer  init_data )
  {
    BDF_CMap  cmap = (BDF_CMap)bdfcmap;
    BDF_Face  face = (BDF_Face)FT_CMAP_FACE( cmap );
    FT_UNUSED( init_data );


    cmap->num_encodings = face->bdffont->glyphs_used;
    cmap->encodings     = face->en_table;

    return BDF_Err_Ok;
  }


  FT_CALLBACK_DEF( void )
  bdf_cmap_done( FT_CMap  bdfcmap )
  {
    BDF_CMap  cmap = (BDF_CMap)bdfcmap;


    cmap->encodings     = NULL;
    cmap->num_encodings = 0;
  }


  FT_CALLBACK_DEF( FT_UInt )
  bdf_cmap_char_index( FT_CMap    bdfcmap,
                       FT_UInt32  charcode )
  {
    BDF_CMap          cmap      = (BDF_CMap)bdfcmap;
    BDF_encoding_el*  encodings = cmap->encodings;
    FT_UInt           min, max, mid;
    FT_UInt           result    = 0;


    min = 0;
    max = cmap->num_encodings;

    while ( min < max )
    {
      FT_UInt32  code;


      mid  = ( min + max ) >> 1;
      code = encodings[mid].enc;

      if ( charcode == code )
      {
        /* increase glyph index by 1 --              */
        /* we reserve slot 0 for the undefined glyph */
        result = encodings[mid].glyph + 1;
        break;
      }

      if ( charcode < code )
        max = mid;
      else
        min = mid + 1;
    }

    return result;
  }


  FT_CALLBACK_DEF( FT_UInt )
  bdf_cmap_char_next( FT_CMap     bdfcmap,
                      FT_UInt32  *acharcode )
  {
    BDF_CMap          cmap      = (BDF_CMap)bdfcmap;
    BDF_encoding_el*  encodings = cmap->encodings;
    FT_UInt           min, max, mid;
    FT_UInt32         charcode = *acharcode + 1;
    FT_UInt           result   = 0;


    min = 0;
    max = cmap->num_encodings;

    while ( min < max )
    {
      FT_UInt32  code;


      mid  = ( min + max ) >> 1;
      code = encodings[mid].enc;

      if ( charcode == code )
      {
        /* increase glyph index by 1 --              */
        /* we reserve slot 0 for the undefined glyph */
        result = encodings[mid].glyph + 1;
        goto Exit;
      }

      if ( charcode < code )
        max = mid;
      else
        min = mid + 1;
    }

    charcode = 0;
    if ( min < cmap->num_encodings )
    {
      charcode = encodings[min].enc;
      result   = encodings[min].glyph + 1;
    }

  Exit:
    *acharcode = charcode;
    return result;
  }


  FT_CALLBACK_TABLE_DEF
  const FT_CMap_ClassRec  bdf_cmap_class =
  {
    sizeof ( BDF_CMapRec ),
    bdf_cmap_init,
    bdf_cmap_done,
    bdf_cmap_char_index,
    bdf_cmap_char_next
  };


  static FT_Error
  bdf_interpret_style( BDF_Face  bdf )
  {
    FT_Error         error  = BDF_Err_Ok;
    FT_Face          face   = FT_FACE( bdf );
    FT_Memory        memory = face->memory;
    bdf_font_t*      font   = bdf->bdffont;
    bdf_property_t*  prop;

    char  *istr = NULL, *bstr = NULL;
    char  *sstr = NULL, *astr = NULL;

    int  parts = 0, len = 0;


    face->style_flags = 0;

    prop = bdf_get_font_property( font, (char *)"SLANT" );
    if ( prop && prop->format == BDF_ATOM                             &&
         prop->value.atom                                             &&
         ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ||
           *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) )
    {
      face->style_flags |= FT_STYLE_FLAG_ITALIC;
      istr = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' )
               ? (char *)"Oblique"
               : (char *)"Italic";
      len += ft_strlen( istr );
      parts++;
    }

    prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" );
    if ( prop && prop->format == BDF_ATOM                             &&
         prop->value.atom                                             &&
         ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) )
    {
      face->style_flags |= FT_STYLE_FLAG_BOLD;
      bstr = (char *)"Bold";
      len += ft_strlen( bstr );
      parts++;
    }

    prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" );
    if ( prop && prop->format == BDF_ATOM                              &&
         prop->value.atom && *(prop->value.atom)                       &&
         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
    {
      sstr = (char *)(prop->value.atom);
      len += ft_strlen( sstr );
      parts++;
    }

    prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" );
    if ( prop && prop->format == BDF_ATOM                              &&
         prop->value.atom && *(prop->value.atom)                       &&
         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
    {
      astr = (char *)(prop->value.atom);
      len += ft_strlen( astr );
      parts++;
    }

    if ( !parts || !len )
    {
      if ( FT_ALLOC( face->style_name, ft_strlen( "Regular" ) + 1 ) )
        return error;

      ft_strcpy( face->style_name, "Regular" );
    }
    else
    {
      char          *style, *s;
      unsigned int  i;


      if ( FT_ALLOC( style, len + parts ) )
        return error;

      s = style;

      if ( astr )
      {
        ft_strcpy( s, astr );
        for ( i = 0; i < ft_strlen( astr ); i++, s++ )
          if ( *s == ' ' )
            *s = '-';                     /* replace spaces with dashes */
        *(s++) = ' ';
      }
      if ( bstr )
      {
        ft_strcpy( s, bstr );
        s += ft_strlen( bstr );
        *(s++) = ' ';
      }
      if ( istr )
      {
        ft_strcpy( s, istr );
        s += ft_strlen( istr );
        *(s++) = ' ';
      }
      if ( sstr )
      {
        ft_strcpy( s, sstr );
        for ( i = 0; i < ft_strlen( sstr ); i++, s++ )
          if ( *s == ' ' )
            *s = '-';                     /* replace spaces with dashes */
        *(s++) = ' ';
      }
      *(--s) = '\0';        /* overwrite last ' ', terminate the string */

      face->style_name = style;                     /* allocated string */
    }

    return error;
  }


  FT_CALLBACK_DEF( void )
  BDF_Face_Done( FT_Face  bdfface )         /* BDF_Face */
  {
    BDF_Face   face   = (BDF_Face)bdfface;
    FT_Memory  memory = FT_FACE_MEMORY( face );


    bdf_free_font( face->bdffont );

    FT_FREE( face->en_table );

    FT_FREE( face->charset_encoding );
    FT_FREE( face->charset_registry );
    FT_FREE( bdfface->family_name );
    FT_FREE( bdfface->style_name );

    FT_FREE( bdfface->available_sizes );

    FT_FREE( face->bdffont );

    FT_TRACE4(( "BDF_Face_Done: done face\n" ));
  }


  FT_CALLBACK_DEF( FT_Error )
  BDF_Face_Init( FT_Stream      stream,
                 FT_Face        bdfface,        /* BDF_Face */
                 FT_Int         face_index,
                 FT_Int         num_params,
                 FT_Parameter*  params )
  {
    FT_Error       error  = BDF_Err_Ok;
    BDF_Face       face   = (BDF_Face)bdfface;
    FT_Memory      memory = FT_FACE_MEMORY( face );

    bdf_font_t*    font = NULL;
    bdf_options_t  options;

    FT_UNUSED( num_params );
    FT_UNUSED( params );
    FT_UNUSED( face_index );


    if ( FT_STREAM_SEEK( 0 ) )
      goto Exit;

    options.correct_metrics = 1;   /* FZ XXX: options semantics */
    options.keep_unencoded  = 1;
    options.keep_comments   = 0;
    options.font_spacing    = BDF_PROPORTIONAL;

    error = bdf_load_font( stream, memory, &options, &font );
    if ( error == BDF_Err_Missing_Startfont_Field )
    {
      FT_TRACE2(( "[not a valid BDF file]\n" ));
      goto Fail;
    }
    else if ( error )
      goto Exit;

    /* we have a bdf font: let's construct the face object */
    face->bdffont = font;
    {
      bdf_property_t*  prop = NULL;


      FT_TRACE4(( "number of glyphs: %d (%d)\n",
                  font->glyphs_size,
                  font->glyphs_used ));
      FT_TRACE4(( "number of unencoded glyphs: %d (%d)\n",
                  font->unencoded_size,
                  font->unencoded_used ));

      bdfface->num_faces  = 1;
      bdfface->face_index = 0;
      bdfface->face_flags = FT_FACE_FLAG_FIXED_SIZES |
                            FT_FACE_FLAG_HORIZONTAL  |
                            FT_FACE_FLAG_FAST_GLYPHS;

      prop = bdf_get_font_property( font, "SPACING" );
      if ( prop && prop->format == BDF_ATOM                             &&
           prop->value.atom                                             &&
           ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' ||
             *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) )
        bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;

      /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL   */
      /* FZ XXX: I need a font to implement this */

      prop = bdf_get_font_property( font, "FAMILY_NAME" );
      if ( prop && prop->value.atom )
      {
        int  l = ft_strlen( prop->value.atom ) + 1;


        if ( FT_NEW_ARRAY( bdfface->family_name, l ) )
          goto Exit;
        ft_strcpy( bdfface->family_name, prop->value.atom );
      }
      else
        bdfface->family_name = 0;

      if ( ( error = bdf_interpret_style( face ) ) != 0 )
        goto Exit;

      /* the number of glyphs (with one slot for the undefined glyph */
      /* at position 0 and all unencoded glyphs)                     */
      bdfface->num_glyphs = font->glyphs_size + 1;

      bdfface->num_fixed_sizes = 1;
      if ( FT_NEW_ARRAY( bdfface->available_sizes, 1 ) )
        goto Exit;

      {
        FT_Bitmap_Size*  bsize = bdfface->available_sizes;
        FT_Short         resolution_x = 0, resolution_y = 0;


        FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );

        bsize->height = (FT_Short)( font->font_ascent + font->font_descent );

        prop = bdf_get_font_property( font, "AVERAGE_WIDTH" );
        if ( prop )
          bsize->width = (FT_Short)( ( prop->value.int32 + 5 ) / 10 );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲福利视频一区二区| 日韩国产一二三区| 色婷婷av久久久久久久| 亚洲黄色性网站| 精品美女被调教视频大全网站| 国精品**一区二区三区在线蜜桃| 国产精品国产三级国产| 欧美日本不卡视频| 国产大陆精品国产| 午夜精品久久久久久久99樱桃| 欧美xxx久久| 99久久99久久精品国产片果冻| 亚洲bdsm女犯bdsm网站| 精品人在线二区三区| 成人久久视频在线观看| 成人免费看片app下载| 精品国产乱码久久久久久蜜臀 | 国产自产v一区二区三区c| 久久综合久久久久88| 成人高清免费观看| 日韩高清在线观看| 欧美高清在线视频| 色爱区综合激月婷婷| 国产裸体歌舞团一区二区| 91网上在线视频| 欧美大片免费久久精品三p| 奇米精品一区二区三区在线观看| 欧美一卡2卡3卡4卡| 粉嫩久久99精品久久久久久夜| 亚洲美女偷拍久久| 日韩欧美在线123| 成人毛片在线观看| 亚洲成a人v欧美综合天堂下载| 精品国产自在久精品国产| 欧美日韩亚洲综合在线| 国产一区二区三区在线观看免费视频| 国产日韩欧美在线一区| 99九九99九九九视频精品| 蓝色福利精品导航| 久久精品夜色噜噜亚洲aⅴ| 盗摄精品av一区二区三区| 亚洲一区二区在线视频| 中文字幕一区二区三| 26uuu成人网一区二区三区| 在线精品视频一区二区三四 | 成人免费观看男女羞羞视频| 亚洲欧美激情插 | 午夜精品123| 国产一区二区三区久久久| 中文在线资源观看网站视频免费不卡| 欧美日韩精品高清| 日本久久一区二区三区| 91麻豆免费观看| 高清国产午夜精品久久久久久| 日本系列欧美系列| 亚洲电影你懂得| 一区二区三区在线免费播放| 国产色产综合色产在线视频| 欧美日韩精品久久久| av亚洲精华国产精华| 成人免费av在线| 91猫先生在线| 日本高清不卡在线观看| 91麻豆免费视频| 欧美色大人视频| 波多野结衣欧美| 成人手机电影网| 在线日韩av片| 欧美日本在线观看| 欧美精品色综合| 日韩一区和二区| 国产亚洲精品久| 国产精品福利一区| 亚洲一区二区三区中文字幕在线| 亚洲午夜久久久| 国产综合色视频| av一二三不卡影片| 欧美高清视频一二三区| 欧美一区欧美二区| 久久综合九色综合久久久精品综合| 国产亚洲欧美中文| 一区二区三区中文字幕| 美女久久久精品| 懂色av中文字幕一区二区三区| 成人免费精品视频| 欧美亚洲动漫精品| 日韩欧美一卡二卡| 国产精品久久久久久亚洲毛片 | www.亚洲激情.com| 欧美日韩你懂的| 欧美xxxxx牲另类人与| 国产精品第四页| 日韩精品一二三区| 91影视在线播放| 欧美男男青年gay1069videost| 久久视频一区二区| 亚洲欧洲精品一区二区三区不卡 | 欧美aaaaaa午夜精品| av在线播放一区二区三区| 色成人在线视频| 国产精品美女久久久久久2018| 亚洲精品国产无天堂网2021| 国产精品亚洲一区二区三区妖精| 欧美性大战久久久久久久蜜臀| 久久久精品人体av艺术| 午夜精品福利久久久| 91亚洲精华国产精华精华液| www亚洲一区| 青青草国产成人99久久| 国产不卡视频在线观看| 精品欧美黑人一区二区三区| 天天综合天天做天天综合| 91在线高清观看| 欧美—级在线免费片| 日韩国产高清在线| 欧美精品成人一区二区三区四区| 一区精品在线播放| 成人动漫视频在线| 国产日本一区二区| 成人免费va视频| 国产色婷婷亚洲99精品小说| 国产精品996| 久久免费美女视频| 成人免费视频视频| 欧美激情一区二区在线| 国产suv一区二区三区88区| 久久影院电视剧免费观看| 久久人人爽爽爽人久久久| 日韩精品一二三| 在线观看亚洲成人| 一区二区三区四区av| 欧美一区二区久久久| 成人一道本在线| 日产国产高清一区二区三区| 精品成人a区在线观看| 91免费版在线| 另类人妖一区二区av| 亚洲国产高清aⅴ视频| 6080国产精品一区二区| 懂色av一区二区三区免费观看| 亚洲综合成人在线视频| 国产日韩欧美精品综合| 欧美日韩亚洲高清一区二区| 国产一二精品视频| 午夜伦欧美伦电影理论片| 国产亚洲va综合人人澡精品| 欧美亚洲一区二区三区四区| 国产精品一卡二| 蜜桃av一区二区| 亚洲一区二区三区影院| 国产精品乱子久久久久| 精品免费一区二区三区| 欧美高清视频一二三区 | 91福利在线观看| 99久久99久久精品国产片果冻 | 国产日产亚洲精品系列| 欧美日韩视频第一区| 9i在线看片成人免费| 久久疯狂做爰流白浆xx| 免费看欧美女人艹b| 亚洲综合小说图片| 亚洲欧美日韩国产手机在线 | 精品日韩99亚洲| 91麻豆精品国产91久久久久| 欧美性色黄大片| 欧美日韩一区精品| 欧美精品色一区二区三区| 一本一道波多野结衣一区二区| 久久众筹精品私拍模特| 欧美一区二区精品| 欧美成人性战久久| 久久这里只精品最新地址| 久久久久久麻豆| 自拍偷自拍亚洲精品播放| 亚洲男人都懂的| 天天影视涩香欲综合网| 午夜天堂影视香蕉久久| 九九**精品视频免费播放| 国产麻豆精品一区二区| av在线综合网| 欧美日韩国产大片| 久久久综合精品| 亚洲素人一区二区| 免费精品99久久国产综合精品| 奇米精品一区二区三区四区 | 五月婷婷另类国产| 看国产成人h片视频| www..com久久爱| 欧美亚洲日本国产| 男女激情视频一区| 成人免费毛片嘿嘿连载视频| 欧美三级电影网| 欧美一区二区三区思思人| 久久久不卡网国产精品二区| 亚洲裸体在线观看| 狠狠色丁香久久婷婷综合丁香| voyeur盗摄精品| 2023国产精品| 亚洲18影院在线观看| 国产1区2区3区精品美女|