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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? bdfdrivr.c

?? 智能設(shè)備中PDF閱讀器的源碼!用于windows mobile2003或者WM5以上
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*  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 );

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线免费观看| 久久久久久久久久久黄色| 午夜精品视频一区| 国产欧美一区二区精品久导航| 99热99精品| 美国一区二区三区在线播放| 综合av第一页| 久久看人人爽人人| 欧美精品xxxxbbbb| 不卡av电影在线播放| 亚洲成人激情社区| 国产欧美一区视频| 欧美综合天天夜夜久久| 黄色日韩网站视频| 亚洲自拍都市欧美小说| 日韩欧美国产综合| 色94色欧美sute亚洲13| 激情综合五月婷婷| 亚洲日本在线观看| 欧美精品一区二区久久婷婷| 91在线视频免费91| 韩国三级在线一区| 亚洲成人www| 国产精品久久久久久福利一牛影视 | 欧美日韩国产一二三| 丁香激情综合国产| 免费欧美在线视频| 亚洲一区精品在线| 国产精品久久久99| 精品欧美一区二区久久| 丁香六月久久综合狠狠色| 亚洲v中文字幕| 久久久91精品国产一区二区精品| 色婷婷综合久久久中文字幕| 日本vs亚洲vs韩国一区三区二区 | 亚洲欧美电影一区二区| 久久婷婷国产综合精品青草| 欧美日韩1区2区| 91成人国产精品| 不卡的av在线| 国产精品综合视频| 久久精品国产第一区二区三区| 亚洲欧美色一区| 自拍偷在线精品自拍偷无码专区| 久久精品视频在线看| 欧美大片国产精品| 欧美猛男男办公室激情| 在线视频综合导航| 一本大道av一区二区在线播放| 成人免费三级在线| 久久99精品久久久久| 全部av―极品视觉盛宴亚洲| 亚洲成年人影院| 亚洲国产毛片aaaaa无费看| 亚洲视频一二三区| 亚洲天堂精品视频| 中文字幕日韩av资源站| 国产精品久久久久影视| 欧美激情自拍偷拍| 国产精品视频一区二区三区不卡| 久久久精品免费免费| 久久影音资源网| 亚洲精品一区二区三区精华液 | 精品国产污污免费网站入口| 欧美一区2区视频在线观看| 欧美高清hd18日本| 日韩视频一区二区三区 | 欧美成va人片在线观看| 欧美岛国在线观看| 久久精品亚洲一区二区三区浴池| 精品国产一区二区三区不卡 | 欧美极品美女视频| 国产偷国产偷精品高清尤物| 久久久久国产精品厨房| 久久人人超碰精品| 久久久久久亚洲综合| 国产亚洲综合av| 中日韩免费视频中文字幕| 国产丝袜欧美中文另类| 欧美电视剧免费观看| 8v天堂国产在线一区二区| 欧美精品久久一区二区三区| 欧美人体做爰大胆视频| 欧美一区二区三区四区久久| 欧美一区二区三区四区高清| 91精品国产日韩91久久久久久| 9191精品国产综合久久久久久 | www.欧美日韩| 欧日韩精品视频| 日韩欧美亚洲一区二区| 国产亚洲一区二区在线观看| 国产精品二三区| 亚洲成人免费看| 国产一区三区三区| 91看片淫黄大片一级在线观看| 欧美丝袜丝交足nylons图片| 91精品国产综合久久福利| 26uuu国产电影一区二区| 国产精品对白交换视频| 三级影片在线观看欧美日韩一区二区| 日本不卡一二三区黄网| 成人一区在线看| 欧美色网一区二区| 久久综合丝袜日本网| 亚洲资源中文字幕| 国产高清不卡二三区| 欧美日韩色一区| 国产亚洲综合av| 水蜜桃久久夜色精品一区的特点| 国产精品亚洲成人| 精品污污网站免费看| 中文字幕高清一区| 亚洲国产wwwccc36天堂| 成人永久看片免费视频天堂| 色妞www精品视频| 久久伊人蜜桃av一区二区| 亚洲一卡二卡三卡四卡无卡久久| 久久精品久久99精品久久| 色老汉一区二区三区| 国产欧美精品一区二区三区四区| 亚洲成人1区2区| 国产成人精品一区二区三区四区 | 99久久精品免费| 精品欧美一区二区久久| 亚洲va韩国va欧美va| 成人国产精品免费观看视频| 欧美成人性福生活免费看| 亚洲一区在线免费观看| 成人激情免费视频| 日韩精品一区二区三区在线观看 | 亚洲超碰97人人做人人爱| 国产麻豆精品一区二区| 欧美日韩成人高清| 亚洲色图在线播放| 国产91对白在线观看九色| 日韩欧美123| 亚洲成人手机在线| 91成人免费网站| 亚洲欧美国产高清| 波多野结衣一区二区三区| 9191成人精品久久| 亚洲国产成人午夜在线一区| 美女脱光内衣内裤视频久久网站| 欧美日本在线看| 午夜电影久久久| 欧美色涩在线第一页| 亚洲香肠在线观看| 91网站在线播放| 一区二区三区中文在线| av资源站一区| 中文字幕一区二| 波多野结衣91| 综合欧美一区二区三区| 成人精品免费视频| 国产精品久久久久久久久久免费看| 国产jizzjizz一区二区| 欧美国产日韩a欧美在线观看| 国产一区二区成人久久免费影院 | 亚洲卡通动漫在线| 91香蕉视频在线| 一区二区三区中文免费| 91久久精品网| 亚洲线精品一区二区三区八戒| 欧美最新大片在线看| 香蕉久久夜色精品国产使用方法| 欧美日韩三级视频| 日本不卡一二三| 精品毛片乱码1区2区3区| 精品一区二区三区的国产在线播放 | 日韩成人精品在线| 欧美一个色资源| 国产乱码精品一区二区三区忘忧草 | 精品久久五月天| 国产白丝精品91爽爽久久 | 欧洲精品中文字幕| 亚洲mv在线观看| 精品久久久影院| 成人免费视频网站在线观看| 国产人妖乱国产精品人妖| 国产尤物一区二区| 久久久国产精品麻豆| 国产精品亚洲午夜一区二区三区| 26uuu久久天堂性欧美| 国产99久久久久| 亚洲天堂久久久久久久| 欧美日韩一区二区三区不卡| 久久精品国产亚洲高清剧情介绍| 国产亚洲精品7777| 色综合久久天天| 日韩不卡一区二区三区| 国产日本欧洲亚洲| 欧美日韩在线一区二区| 国产在线一区观看| 一区二区三区四区激情| 精品国产免费一区二区三区香蕉 | 国产成人av自拍| 亚洲乱码国产乱码精品精小说 | 精品国产乱码久久久久久蜜臀| 成人午夜电影小说| 性做久久久久久免费观看欧美|