蔡军生先生第二人生的源码分析(五十九)字体类LLFont的实现

本文介绍了第二人生游戏中使用的LLFont类,该类负责通过FreeType库加载和管理字体资源。主要内容包括初始化FreeType库、打开字体文件、设置字体大小、生成位图及纹理等。此外还详细说明了LLFont类的各种成员函数及其作用。
上面已经介绍到第二人生里是使用FreeType来显示字体的,因此需要使用一个类来封装这些操作,这类就叫做LLFont。在这个类里基本的任务,就是:
1)初始化FreeType的库。
2)打开字体文件。
3)设置字体每点或者每个像素的大小。
4)加载一个字符的笔画,并生成位图。
5)把位图数据生成RAW图片的格式。
6)最后变成纹理贴图让OpenGL输出。
 
在类LLFontManager里就已经调用函数FT_Init_FreeType来实始化FreeType库了,调用函数FT_Done_FreeType来删除FreeType库。
#001 class LLFont
#002 {
#003 public:
#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
#054 protected:
#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
#059 not 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
#067 protected:
#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 
#097 private:
#098      LLPointer<LLImageRaw> mRawImagep; // Bitmaps of glyphs are stored here.
#099 };
 
尽管点阵字体在时间和空间性能上都有较佳的表现,但是由于缺乏灵活性,无法改变字体的大小和风格,除了在一些嵌入式设备中仍然在使用外,大多数系统都使用矢量字体了。矢量字体不像点阵字体那样直接记录字符的字模数据,而是记录字体描述信息,其中最重要的两部分是outline和hint。
内容概要:本文介绍了基于条件生成对抗网络(Conditional Generative Adversarial Networks, CGAN)的可再生能源日前场景生成方法的复现研究,旨在通过Python代码实现对风电、光伏等可再生能源出力的不确定性进行高效建模与多场景生成。该方法利用历史数据作为条件输入,训练生成器与判别器网络,从而生成符合实际统计特性的高精度出力场景集,有效支撑电力系统调度、规划与风险评估等应用。文中详细阐述了CGAN的网络结构设计、损失函数构建、训练流程优化及生成场景的质量评价指标,并提供了完整的代码实现与案例分析,验证了其在捕捉时空相关性与概率分布方面的优越性。; 适合人群:具备一定深度学习与电力系统基础知识,从事新能源预测、电力系统优化调度、场景生成等相关方向的科研人员及研究生。; 使用场景及目标:①用于可再生能源出力不确定性建模,生成满足日前调度需求的典型场景集;②支撑含高比例新能源的电力系统随机优化、鲁棒调度与风险评估研究;③为学术研究提供可复现的CGAN应用场景与代码参考。; 阅读建议:建议读者结合提供的Python代码逐模块学习,重点关注数据预处理、模型搭建与训练细节,通过调整超参数和输入数据进行实验对比,深入理解CGAN在电力系统场景生成中的实际应用价值。
内容概要:本文系统介绍了基于去噪概率扩散模型(DDPM)的光伏功率场景生成方法,并提供了完整的Python代码实现。该模型通过模拟扩散与去噪过程,从历史光伏出力数据中学习其复杂的时序特征与概率分布,进而生成高保真、多样化的光伏功率场景,能够有效刻画新能源出力的不确定性、波动性与时序相关性。文中强调该资源属于科研复现内容,聚焦于模型原理剖析与代码实践,适用于推动新型电力系统中新能源建模与风险评估的研究进展。; 适合人群:具备一定Python编程能力与机器学习基础知识,从事新能源发电预测、电力系统规划、能源系统建模、不确定性分析等方向研究的研究生、科研人员及工程师;熟悉深度学习框架(如PyTorch)者更佳。; 使用场景及目标:①用于生成高质量的光伏功率时序场景,支撑含高比例可再生能源的电力系统随机优化调度、鲁棒规划与风险评估;②作为科研复现案例,深入理解DDPM在能源时间序列生成任务中的建模机制与训练策略;③可拓展应用于风电、负荷等其他不确定性能源变量的场景生成问题,具备良好的迁移性与研究价值。; 阅读建议:建议读者结合提供的代码与网盘资料,按照目录结构循序渐进地学习,重点掌握模型网络架构设计、前向扩散与反向去噪过程、损失函数构建及采样生成逻辑,鼓励在真实数据集上进行调试、训练与结果可视化,以深化对扩散模型内在机理的理解与应用能力。
内容概要:本文系统研究了基于多面体聚合与闵可夫斯基和的电动汽车可调能力评估方法,提出了一种结合内近似模型与外近似技术的聚合可行域建模策略,用于精确刻画大规模电动汽车集群的功率调节潜力。通过引入多面体几何表示与闵可夫斯基和运算,实现了对异构电动汽车充放电行为的高效聚合,并采用SOCP(二阶锥规划)等先进数学优化手段完成对聚合可行域的紧凑逼近与计算求解,进而评估其在配电网中的灵活性贡献。该方法为高比例新能源接入背景下电动汽车作为灵活性资源参与电网调峰、调频等辅助服务提供了理论支撑与量化工具,配套提供的Matlab代码实现了从建模到优化的全流程仿真,便于研究成果的复现与拓展。; 适合人群:具备电力系统分析、凸优化理论基础及Matlab编程能力,从事新能源并网、电动汽车与电网互动、灵活性资源调度等相关方向研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①评估大规模电动汽车集群接入对配电网灵活性的影响及其可调度容量;②研究电动汽车聚合商参与电力系统辅助服务市场的可行性与调控潜力;③为新型电力系统中多主体、多源协同的优化调度提供精细化建模方法与技术支持; 阅读建议:建议读者深入理解多面体建模与闵可夫斯基和的基本原理,结合所提供的Matlab代码重点掌握SOCP模型的构建技巧与YALMIP等优化工具箱的使用方法,通过调整参数与场景设置进行对比分析,以深化对电动汽车聚合特性与优化求解过程的认识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值