上面已经介绍到第二人生里是使用FreeType来显示字体的,因此需要使用一个类来封装这些操作,这类就叫做LLFont。在这个类里基本的任务,就是:
1)初始化FreeType的库。
2)打开字体文件。
3)设置字体每点或者每个像素的大小。
4)加载一个字符的笔画,并生成位图。
5)把位图数据生成RAW图片的格式。
6)最后变成纹理贴图让OpenGL输出。
在类LLFontManager里就已经调用函数FT_Init_FreeType来实始化FreeType库了,调用函数FT_Done_FreeType来删除FreeType库。
#001class LLFont
#002{
#003public:
#004 LLFont(LLImageRaw *imagep = NULL);
#005 virtual ~LLFont();
#006
#007 // is_fallback should be true for fallback fonts that aren't used to render directly (Unicode backup, primarily)
下面函数实现打开字体文件,主要调用FT_New_Face函数来打开字体文件,然后调用函数FT_Set_Char_Size来设置字体点或像素大小。同时也创建LLImageRaw对象。
#008 virtual BOOL loadFace(const std::string& filename,
#009 const F32 point_size,
#010 const F32 vert_dpi,
#011 const F32 horz_dpi,
#012 const S32 components,
#013 BOOL is_fallback);
下面函数设置字体列表。
#014 void setFallbackFont(LLFontList *fontp) { mFallbackFontp = fontp; }
#015
#016 void setCharToGlyphMap(llwchar wch, U32 glyph_index) const;
下面函数设置字体生成的图片对象。
#017 void setRawImage( LLImageRaw *imagep );
#018
下面函数获取字体属性。
#019 // Global font metrics - in units of pixels
#020 virtual F32 getLineHeight() const;
#021 virtual F32 getAscenderHeight() const;
#022 virtual F32 getDescenderHeight() const;
#023
#024
#025// For a lowercase "g":
#026//
#027// ------------------------------
#028// ^ ^
#029// | |
#030// xxx x |Ascender
#031// x x | |
#032// --------- xxxx-------------- Baseline
#033// ^ x | |
#034//| descender x | |
#035// v xxxx v |LineHeight
#036//----------------------- |
#037// v
#038// ------------------------------
#039
#040 enum
#041 {
#042 FIRST_CHAR = 32,
#043 NUM_CHARS = 127 - 32,
#044 LAST_CHAR_BASIC = 127,
#045
#046 // Need full 8-bit ascii range for spanish
#047 NUM_CHARS_FULL = 255 - 32,
#048 LAST_CHAR_FULL = 255
#049 };
#050
#051 const LLFontGlyphInfo &getMetrics(const llwchar wc) const;
#052 F32 getXAdvance(const llwchar wc) const;
#053 F32 getXKerning(const llwchar char_left, const llwchar char_right) const; // Get the kerning between the two characters
#054protected:
#055 virtual BOOL hasGlyph(const llwchar wch) const; // Has a glyph for this character
下面函数添加一个字符到字体文件。
#056 virtual BOOL addChar(const llwchar wch); // Add a new character to the font if necessary
#057 virtual BOOL addGlyph(const llwchar wch, const U32 glyph_index); // Add a new glyph to the existing font
下面函数从一个字符生成RAW格式的位图对象。
#058 virtual BOOL addGlyphFromFont(LLFont *fontp, const llwchar wch, const U32 glyph_index); // Add a glyph from this font to the other (returns the glyph_index, 0 if
#059not found)
#060
#061 virtual LLFontGlyphInfo* getGlyphInfo(const llwchar wch) const;
#062
#063 void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const;
下面函数获取字体的位图。
#064 void renderGlyph(const U32 glyph_index);
#065
#066 void resetBitmap(); // Reset bitmap to contain only the null glyph
#067protected:
#068 std::string mName;
#069 F32 mAscender;
#070 F32 mDescender;
#071 F32 mLineHeight;
#072
#073 S32 mNumComponents;
#074 S32 mBitmapWidth;
#075 S32 mBitmapHeight;
#076 S32 mMaxCharWidth;
#077 S32 mMaxCharHeight;
#078 S32 mCurrentOffsetX;
#079 S32 mCurrentOffsetY;
#080
#081 LLFT_Face mFTFace;
#082
#083 BOOL mIsFallback;
#084 LLFontList *mFallbackFontp; // A list of fallback fonts to look for glyphs in (for Unicode chars)
#085
#086 typedef std::map<llwchar, LLFontGlyphInfo*> char_glyph_info_map_t;
#087 mutable char_glyph_info_map_t mCharGlyphInfoMap; // Information about glyph location in bitmap
#088
#089 BOOL mValid;
#090 void setSubImageLuminanceAlpha(const U32 x,
#091 const U32 y,
#092 const U32 width,
#093 const U32 height,
#094 const U8 *data,
#095 S32 stride = 0);
#096
#097private:
#098 LLPointer<LLImageRaw> mRawImagep; // Bitmaps of glyphs are stored here.
#099};
尽管点阵字体在时间和空间性能上都有较佳的表现,但是由于缺乏灵活性,无法改变字体的大小和风格,除了在一些嵌入式设备中仍然在使用外,大多数系统都使用矢量字体了。矢量字体不像点阵字体那样直接记录字符的字模数据,而是记录字体描述信息,其中最重要的两部分是outline和hint。
分享到:
相关推荐
网上收集的第二人生源码分析资料,感谢原创作者的无私支持!原作者就是CSDN的资深。。。
图解U-Boot:第二阶段源码分析(清晰)
网络上收集的quake3源码分析资料,感谢原创作者的无私奉献。第二人生和传奇的代码分析CSDN上就有,一并感谢各位资深的贡献!
Spring源代码解析(一):Spring中的事务处理 Spring源代码解析(二):ioc容器在Web容器中的启动 Spring源代码分析(三):Spring JDBC Spring源代码解析(四):Spring ...Spring源代码解析(十):Spring Acegi框架授权的实现
Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux...
源代码版本:0.47cVeryCD版 eMULE源码分析 1 1目录结构: 1 2 Src\目录下代码结构 2 3重要的功能子类 2 4TCP和UDP网络通迅过程详细介绍: 6 5eMule中信誉机制的实现 8 6下载如上传任务及...
zookeeper源码分析(一)工作原理概述 zookeeper源码分析(二)FastLeader选举算法 Zookeeper源码分析之Paxos算法之旅
Kettle体系结构与源码分析,详细剖析Kettle的架构与源码,对Kettle的二次开发起关键指导作用
Spring Security系列 Spring Security源码分析一:Spring Security 认证过程 ...Spring Security源码分析十:初识Spring Security OAuth2 Spring Security源码分析十一:Spring Security OAuth2
本源码是一个简单记事本源码,可实现修改字体、颜色等简单功能 三、菜单功能 1、文件:新建;打开;保存;页面设置;打印;退出 2、编辑:复制;粘贴;剪切;删除;查找;替换;全选;时期/时间 3、格式:字体 ...
《数据结构》算法实现与分析 高一凡(第二版)书+源码
还有一篇博客,希望能分享点东西, 直接百度搜"Qt实现GUI的二进制文件读写操作(源码分析+工程打包+测试例子)
第一章 系统架构总概 第二章 系统初始化 第三章 打开数据截获接口 第四章 插件初始化 第五章 检测规则初始化引擎 第六章 构建规则快速配匹引擎 第七章 数据包处理 snort流程 规则体系
数字图像处理的MATLAB实现第二版书上的源码,图片,还有一些小例题,帮助学习
qemu源码分析--qemu是开源的二进制翻译器,支持多种平台,具有很好的移植性。
Weka各个功能的java代码的详细解读,读者可根据这些源码分析实现自己的二次开发。
《精通Visual C++数字图像处理典型算法及实现(第二版)》一书的附带源码,有较好的参考和学习价值
《数据结构》算法实现与解析(第二版)书+源码.zip
大名鼎鼎的第二人生大型在线社区游戏,开源了啊。要做网游的,研究网络的可以好好研究下SecondLife的源码。
LibreCAD 源码 用QT可以编译打开