⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winfnt.c

📁 a very goog book
💻 C
📖 第 1 页 / 共 2 页
字号:
    (FT_CMap_CharNextFunc) fnt_cmap_char_next  };  static FT_CMap_Class  fnt_cmap_class = &fnt_cmap_class_rec;#else /* !FT_CONFIG_OPTION_USE_CMAPS */  static FT_UInt  FNT_Get_Char_Index( FT_CharMap  charmap,                      FT_Long     char_code )  {    FT_Long  result = char_code;    if ( charmap )    {      FNT_Font  font  = ((FNT_Face)charmap->face)->fonts;      FT_Long   first = font->header.first_char;      FT_Long   count = font->header.last_char - first + 1;      char_code -= first;      if ( char_code < count )        result = char_code + 1;      else        result = 0;    }    return result;  }  static FT_Long  FNT_Get_Next_Char( FT_CharMap  charmap,                     FT_Long     char_code )  {    char_code++;    if ( charmap )    {      FNT_Font  font  = ((FNT_Face)charmap->face)->fonts;      FT_Long   first = font->header.first_char;      if ( char_code < first )        char_code = first;      if ( char_code <= font->header.last_char )        return char_code;    }    else      return char_code;    return 0;  }#endif /* !FT_CONFIG_OPTION_USE_CMAPS */  static void  FNT_Face_Done( FNT_Face  face )  {    FT_Memory  memory = FT_FACE_MEMORY( face );    fnt_face_done_fonts( face );    FT_FREE( face->root.available_sizes );    face->root.num_fixed_sizes = 0;  }  static FT_Error  FNT_Face_Init( FT_Stream      stream,                 FNT_Face       face,                 FT_Int         face_index,                 FT_Int         num_params,                 FT_Parameter*  params )  {    FT_Error   error;    FT_Memory  memory = FT_FACE_MEMORY( face );    FT_UNUSED( num_params );    FT_UNUSED( params );    FT_UNUSED( face_index );    /* try to load several fonts from a DLL */    error = fnt_face_get_dll_fonts( face );    if ( error )    {      /* this didn't work, now try to load a single FNT font */      FNT_Font  font;      if ( FT_NEW( face->fonts ) )        goto Exit;      face->num_fonts = 1;      font            = face->fonts;      font->offset   = 0;      font->fnt_size = stream->size;      error = fnt_font_load( font, stream );      if ( error )        goto Fail;    }    /* all right, one or more fonts were loaded; we now need to */    /* fill the root FT_Face fields with relevant information   */    {      FT_Face   root  = FT_FACE( face );      FNT_Font  fonts = face->fonts;      FNT_Font  limit = fonts + face->num_fonts;      FNT_Font  cur;      root->num_faces  = 1;      root->face_flags = FT_FACE_FLAG_FIXED_SIZES |                         FT_FACE_FLAG_HORIZONTAL;      if ( fonts->header.avg_width == fonts->header.max_width )        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;      if ( fonts->header.italic )        root->style_flags |= FT_STYLE_FLAG_ITALIC;      if ( fonts->header.weight >= 800 )        root->style_flags |= FT_STYLE_FLAG_BOLD;      /* Setup the `fixed_sizes' array */      if ( FT_NEW_ARRAY( root->available_sizes, face->num_fonts ) )        goto Fail;      root->num_fixed_sizes = face->num_fonts;      {        FT_Bitmap_Size*  size = root->available_sizes;        for ( cur = fonts; cur < limit; cur++, size++ )        {          size->width  = cur->header.pixel_width;          size->height = cur->header.pixel_height;        }      }#ifdef FT_CONFIG_OPTION_USE_CMAPS      {        FT_CharMapRec  charmap;        charmap.encoding    = ft_encoding_unicode;        charmap.platform_id = 3;        charmap.encoding_id = 1;        charmap.face        = root;        error = FT_CMap_New( fnt_cmap_class,                             NULL,                             &charmap,                             NULL );        if ( error )          goto Fail;        /* Select default charmap */        if ( root->num_charmaps )          root->charmap = root->charmaps[0];      }#else /* !FT_CONFIG_OPTION_USE_CMAPS */      /* Setup the `charmaps' array */      root->charmaps     = &face->charmap_handle;      root->num_charmaps = 1;      face->charmap.encoding    = ft_encoding_unicode;      face->charmap.platform_id = 3;      face->charmap.encoding_id = 1;      face->charmap.face        = root;      face->charmap_handle = &face->charmap;      root->charmap = face->charmap_handle;#endif /* !FT_CONFIG_OPTION_USE_CMAPS */      /* setup remaining flags */      root->num_glyphs = fonts->header.last_char -                         fonts->header.first_char + 1;      root->family_name = (FT_String*)fonts->fnt_frame +                          fonts->header.face_name_offset;      root->style_name  = (char *)"Regular";      if ( root->style_flags & FT_STYLE_FLAG_BOLD )      {        if ( root->style_flags & FT_STYLE_FLAG_ITALIC )          root->style_name = (char *)"Bold Italic";        else          root->style_name = (char *)"Bold";      }      else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )        root->style_name = (char *)"Italic";    }  Fail:    if ( error )      FNT_Face_Done( face );  Exit:    return error;  }  static FT_Error  FNT_Size_Set_Pixels( FNT_Size  size )  {    /* look up a font corresponding to the current pixel size */    FNT_Face  face  = (FNT_Face)FT_SIZE_FACE( size );    FNT_Font  cur   = face->fonts;    FNT_Font  limit = cur + face->num_fonts;    size->font = 0;    for ( ; cur < limit; cur++ )    {      /* we only compare the character height, as fonts used some strange */      /* values                                                           */      if ( cur->header.pixel_height == size->root.metrics.y_ppem )      {        size->font = cur;        size->root.metrics.ascender  = cur->header.ascent * 64;        size->root.metrics.descender = ( cur->header.pixel_height -                                           cur->header.ascent ) * 64;        size->root.metrics.height    = cur->header.pixel_height * 64;        break;      }    }    return ( size->font ? FNT_Err_Ok : FNT_Err_Invalid_Pixel_Size );  }  static FT_Error  FNT_Load_Glyph( FT_GlyphSlot  slot,                  FNT_Size      size,                  FT_UInt       glyph_index,                  FT_Int        load_flags )  {    FNT_Font    font  = size->font;    FT_Error    error = 0;    FT_Byte*    p;    FT_Int      len;    FT_Bitmap*  bitmap = &slot->bitmap;    FT_ULong    offset;    FT_Bool     new_format;    FT_UNUSED( slot );    FT_UNUSED( load_flags );    if ( !font )    {      error = FNT_Err_Invalid_Argument;      goto Exit;    }    if ( glyph_index > 0 )      glyph_index--;    else      glyph_index = font->header.default_char - font->header.first_char;    new_format = FT_BOOL( font->header.version == 0x300 );    len        = new_format ? 6 : 4;    /* jump to glyph entry */    p = font->fnt_frame + 118 + len * glyph_index;    bitmap->width = FT_NEXT_SHORT_LE( p );    if ( new_format )      offset = FT_NEXT_ULONG_LE( p );    else      offset = FT_NEXT_USHORT_LE( p );    /* jump to glyph data */    p = font->fnt_frame + /* font->header.bits_offset */ + offset;    /* allocate and build bitmap */    {      FT_Memory  memory = FT_FACE_MEMORY( slot->face );      FT_Int     pitch  = ( bitmap->width + 7 ) >> 3;      FT_Byte*   column;      FT_Byte*   write;      bitmap->pitch      = pitch;      bitmap->rows       = font->header.pixel_height;      bitmap->pixel_mode = ft_pixel_mode_mono;      if ( FT_ALLOC( bitmap->buffer, pitch * bitmap->rows ) )        goto Exit;      column = (FT_Byte*)bitmap->buffer;      for ( ; pitch > 0; pitch--, column++ )      {        FT_Byte*  limit = p + bitmap->rows;        for ( write = column; p < limit; p++, write += bitmap->pitch )          write[0] = p[0];      }    }    slot->flags       = FT_GLYPH_OWN_BITMAP;    slot->bitmap_left = 0;    slot->bitmap_top  = font->header.ascent;    slot->format      = ft_glyph_format_bitmap;    /* now set up metrics */    slot->metrics.horiAdvance  = bitmap->width << 6;    slot->metrics.horiBearingX = 0;    slot->metrics.horiBearingY = slot->bitmap_top << 6;    slot->linearHoriAdvance    = (FT_Fixed)bitmap->width << 16;    slot->format               = ft_glyph_format_bitmap;  Exit:    return error;  }  FT_CALLBACK_TABLE_DEF  const FT_Driver_ClassRec  winfnt_driver_class =  {    {      ft_module_font_driver,      sizeof ( FT_DriverRec ),      "winfonts",      0x10000L,      0x20000L,      0,      (FT_Module_Constructor)0,      (FT_Module_Destructor) 0,      (FT_Module_Requester)  0    },    sizeof( FNT_FaceRec ),    sizeof( FNT_SizeRec ),    sizeof( FT_GlyphSlotRec ),    (FT_Face_InitFunc)        FNT_Face_Init,    (FT_Face_DoneFunc)        FNT_Face_Done,    (FT_Size_InitFunc)        0,    (FT_Size_DoneFunc)        0,    (FT_Slot_InitFunc)        0,    (FT_Slot_DoneFunc)        0,    (FT_Size_ResetPointsFunc) FNT_Size_Set_Pixels,    (FT_Size_ResetPixelsFunc) FNT_Size_Set_Pixels,    (FT_Slot_LoadFunc)        FNT_Load_Glyph,#ifdef FT_CONFIG_OPTION_USE_CMAPS    (FT_CharMap_CharIndexFunc)0,#else    (FT_CharMap_CharIndexFunc)FNT_Get_Char_Index,#endif        (FT_Face_GetKerningFunc)  0,    (FT_Face_AttachFunc)      0,    (FT_Face_GetAdvancesFunc) 0,#ifdef FT_CONFIG_OPTION_USE_CMAPS    (FT_CharMap_CharNextFunc) 0#else    (FT_CharMap_CharNextFunc) FNT_Get_Next_Char#endif      };/* END */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -