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

📄 winfnt.c

📁 下载来的一个看图软件的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    FT_UInt    gindex = 0;    FT_UInt32  result = 0;    FT_UInt32  char_code = *pchar_code + 1;    if ( char_code <= cmap->first )    {      result = cmap->first;      gindex = 1;    }    else    {      char_code -= cmap->first;      if ( char_code < cmap->count )      {        result = cmap->first + char_code;        gindex = char_code + 1;      }    }    *pchar_code = result;    return gindex;  }  static FT_CMap_ClassRec  fnt_cmap_class_rec =  {    sizeof ( FNT_CMapRec ),    (FT_CMap_InitFunc)     fnt_cmap_init,    (FT_CMap_DoneFunc)     NULL,    (FT_CMap_CharIndexFunc)fnt_cmap_char_index,    (FT_CMap_CharNextFunc) fnt_cmap_char_next  };  static FT_CMap_Class  fnt_cmap_class = &fnt_cmap_class_rec;  static void  FNT_Face_Done( FNT_Face  face )  {    FT_Memory  memory = FT_FACE_MEMORY( face );    fnt_font_done( 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 );    /* try to load font from a DLL */    error = fnt_face_get_dll_font( face, face_index );    if ( error )    {      /* this didn't work; try to load a single FNT font */      FNT_Font  font;      if ( FT_NEW( face->font ) )        goto Exit;      face->root.num_faces = 1;      font           = face->font;      font->offset   = 0;      font->fnt_size = stream->size;      error = fnt_font_load( font, stream );      if ( error )        goto Fail;    }    /* we now need to fill the root FT_Face fields */    /* with relevant information                   */    {      FT_Face   root = FT_FACE( face );      FNT_Font  font = face->font;      root->face_flags = FT_FACE_FLAG_FIXED_SIZES |                         FT_FACE_FLAG_HORIZONTAL;      if ( font->header.avg_width == font->header.max_width )        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;      if ( font->header.italic )        root->style_flags |= FT_STYLE_FLAG_ITALIC;      if ( font->header.weight >= 800 )        root->style_flags |= FT_STYLE_FLAG_BOLD;      /* set up the `fixed_sizes' array */      if ( FT_NEW_ARRAY( root->available_sizes, 1 ) )        goto Fail;      root->num_fixed_sizes = 1;      {        FT_Bitmap_Size*  bsize = root->available_sizes;        bsize->width  = font->header.avg_width;        bsize->height =          font->header.pixel_height + font->header.external_leading;        bsize->size   = font->header.nominal_point_size << 6;        bsize->x_ppem =           (FT_Pos)( ( font->header.horizontal_resolution * bsize->size + 36 )                    / 72 );        bsize->y_ppem =          (FT_Pos)( ( font->header.vertical_resolution* bsize->size + 36 )                    / 72 );      }      {        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];      }      /* setup remaining flags */      /* reserve one slot for the .notdef glyph at index 0 */      root->num_glyphs = font->header.last_char -                           font->header.first_char + 1 + 1;      root->family_name = (FT_String*)font->fnt_frame +                            font->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( FT_Size  size )  {    FNT_Face  face = (FNT_Face)FT_SIZE_FACE( size );    FT_Face   root = FT_FACE( face );    if ( size->metrics.y_ppem == root->available_sizes->height )    {      FNT_Font  font = face->font;      size->metrics.ascender    = font->header.ascent * 64;      size->metrics.descender   = ( font->header.pixel_height -                                      font->header.ascent ) * 64;      size->metrics.height      = font->header.pixel_height * 64;      size->metrics.max_advance = font->header.max_width * 64;      return FNT_Err_Ok;    }    else      return FNT_Err_Invalid_Pixel_Size;  }  static FT_Error  FNT_Load_Glyph( FT_GlyphSlot  slot,                  FT_Size       size,                  FT_UInt       glyph_index,                  FT_Int32      load_flags )  {    FNT_Face    face   = (FNT_Face)FT_SIZE_FACE( size );    FNT_Font    font   = face->font;    FT_Error    error  = FNT_Err_Ok;    FT_Byte*    p;    FT_Int      len;    FT_Bitmap*  bitmap = &slot->bitmap;    FT_ULong    offset;    FT_Bool     new_format;    FT_UNUSED( load_flags );    if ( !face || !font )    {      error = FNT_Err_Invalid_Argument;      goto Exit;    }    if ( glyph_index > 0 )      glyph_index--;                           /* revert to real index */    else      glyph_index = font->header.default_char; /* the .notdef glyph */    new_format = FT_BOOL( font->header.version == 0x300 );    len        = new_format ? 6 : 4;    /* jump to glyph entry */    p = font->fnt_frame + ( new_format ? 146 : 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;      /* note: since glyphs are stored in columns and not in rows we */      /*       can't use ft_glyphslot_set_bitmap                     */      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 = *p;      }    }    slot->internal->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        |      FT_MODULE_DRIVER_NO_OUTLINES,      sizeof ( FT_DriverRec ),      "winfonts",      0x10000L,      0x20000L,      0,      (FT_Module_Constructor)0,      (FT_Module_Destructor) 0,      (FT_Module_Requester)  0    },    sizeof( FNT_FaceRec ),    sizeof( FT_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,    (FT_Face_GetKerningFunc)  0,    (FT_Face_AttachFunc)      0,    (FT_Face_GetAdvancesFunc) 0  };/* END */

⌨️ 快捷键说明

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