(5)UpdateCharRec

该函数的源码分析如下:

procedure TTextLayoutNG.UpdateCharRec(const ACanvas: TCanvas; NeedBitmap: Boolean; var NewRec: PCharRec;HasItem: Boolean; const CharDic: TCharDic; const AFont: TFont; const Ch: UCS4Char; const NeedPath: Boolean = False);
varMap: TBitmapData;J: Integer;Bitmap: TBitmap;LFont: TFont;GlyphSettings: TFontGlyphSettings;
begin{新建一个记录,或释放原记录中的图形对象}if not HasItem thenNew(NewRec)elsebeginFreeAndNil(NewRec.Glyph);FreeAndNil(NewRec.Bitmap);end;{如果指定了字体则使用之,否则使用缺省字体}if not Assigned(AFont) thenLFont := Self.FontelseLFont := AFont;{使用Bitmap形式存储,或使用Path存储渲染过程}GlyphSettings := [];if NeedBitmap thenGlyphSettings := [TFontGlyphSetting.Bitmap, TFontGlyphSetting.PremultipliedAlpha];if NeedPath thenGlyphSettings := GlyphSettings + [TFontGlyphSetting.Path];{在TFontGlyphManager中使用当前的FontGlyph生成缺省图形}NewRec.Glyph := TFontGlyphManager.Current.GetGlyph(Ch, LFont, FScale, GlyphSettings);{计算基准线的位置}CharDic.Baseline := TFontGlyphManager.Current.GetBaseline(LFont, FScale);{如果采用图形模式,则生成之}if not (TFontGlyphStyle.NoGlyph in NewRec.Glyph.Style) and Assigned(NewRec.Glyph.Bitmap) and (NewRec.Glyph.Bitmap.Width > 0) and (NewRec.Glyph.Bitmap.Height > 0) thenbegin{采用图形渲染模式,生成Bitmap}if FRendering > 0 thenbeginBitmap := TBitmap.Create(NewRec.Glyph.Bitmap.Width + AntiAliasMargin * 2, NewRec.Glyph.Bitmap.Height + AntiAliasMargin * 2);Bitmap.BitmapScale := FScale;{将Glyph中的图形复制到Bitmap中}if Bitmap.Map(TMapAccess.Write, Map) thentry
        FillChar(Map.Data^, Map.Pitch * Map.Height, 0);
        NewRec.Bitmap := Bitmap;NewRec.SrcRect := RectF(0, 0, NewRec.Glyph.Bitmap.Width, NewRec.Glyph.Bitmap.Height);NewRec.SrcRect.Offset(AntiAliasMargin, AntiAliasMargin);
for J := 0 to NewRec.Glyph.Bitmap.Height - 1 doMove(NewRec.Glyph.Bitmap.Scanline[J]^, Map.GetPixelAddr(AntiAliasMargin, J + AntiAliasMargin)^, NewRec.Glyph.Bitmap.Pitch);finallyBitmap.Unmap(Map);end;{构建图形列表,并将其放入}if not Assigned(FNewGlyphList) thenFNewGlyphList := TList<PCharRec>.Create;FNewGlyphList.Add(NewRec);endelse{直接将Glyph映射到Bitmap中}MapGlyphToCache(NewRec);endelse{采用Path模式}beginNewRec.Bitmap := nil;NewRec.SrcRect := RectF(0, 0, 0, 0);end;{加入到列表中}if not HasItem thenCharDic.Add(Ch, NewRec);
end;

其中2个重要的函数是:

TFontGlyphManager.Current.GetGlyph

TFontGlyphManager.Current.GetBaseline

FireMonkey 源码学习(5)相关推荐

  1. FireMonkey 源码学习(2)

    三.TControl FireMonkey重写了TControl的代码,实现了众多接口,如下图: 基类上实现了众多功能,这里不详细描述. 四.TEdit 编辑框是从TControl-TStyledCo ...

  2. FireMonkey 源码学习(4)

    (4)DoDrawLayout DoDrawLayout函数的源代码分析如下: procedure TTextLayoutNG.DoDrawLayout(const ACanvas: TCanvas) ...

  3. Shiro源码学习之二

    接上一篇 Shiro源码学习之一 3.subject.login 进入login public void login(AuthenticationToken token) throws Authent ...

  4. Shiro源码学习之一

    一.最基本的使用 1.Maven依赖 <dependency><groupId>org.apache.shiro</groupId><artifactId&g ...

  5. mutations vuex 调用_Vuex源码学习(六)action和mutation如何被调用的(前置准备篇)...

    前言 Vuex源码系列不知不觉已经到了第六篇.前置的五篇分别如下: 长篇连载:Vuex源码学习(一)功能梳理 长篇连载:Vuex源码学习(二)脉络梳理 作为一个Web前端,你知道Vuex的instal ...

  6. vue实例没有挂载到html上,vue 源码学习 - 实例挂载

    前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...

  7. 2021-03-19Tomcat源码学习--WebAppClassLoader类加载机制

    Tomcat源码学习--WebAppClassLoader类加载机制 在WebappClassLoaderBase中重写了ClassLoader的loadClass方法,在这个实现方法中我们可以一窥t ...

  8. jQuery源码学习之Callbacks

    jQuery源码学习之Callbacks jQuery的ajax.deferred通过回调实现异步,其实现核心是Callbacks. 使用方法 使用首先要先新建一个实例对象.创建时可以传入参数flag ...

  9. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

最新文章

  1. SQL语句导入导出大全
  2. 推荐一本好书《改变,从阅读开始》
  3. 码栈开发手册(三)---编码方式开发(高级课程①)
  4. 从Setting.settings到Resource.resx
  5. html5学习笔记(audio)
  6. Honeycomb——BFS
  7. 前端学习(2432):上午总结
  8. php自定义商品属性,php – 可变产品属性:自定义每个显示的单选按钮文本值
  9. 如何轻松地将可访问LAN的Pod部署到Kubernetes集群上
  10. python之rabbitMQ
  11. WAS6.1在JDK1.5环境下JSP无法编译问题
  12. python使用正则表达式删除字符串中的数字
  13. layui表格有边框_layui前端框架表格如何进行屏幕适配
  14. spring ,springmvc的常用标签注解
  15. 使用ExtJs实现文件下载
  16. QT 5.9.0下载安装及配置教程
  17. 企业应用快速跨向容器时代的正确姿势
  18. iOS 安全锁原理集合
  19. java 汉字转拼音(解决多音字问题)
  20. 2022年全球市场电动线性气缸总体规模、主要生产商、主要地区、产品和应用细分研究报告

热门文章

  1. Maven 手动安装JAR包到本地maven仓库后,但在项目中依旧报错找不到JAR包解决方法
  2. Missing artifact com.oracle:ojdbc6:jar:11.2.0.3 Maven中不能引入ojdbc解决方法,错误
  3. 在使用Navicat for MySQL 出现 异常“You have an error in your SQL syntax......“
  4. img src SVG使用CSS更改样式
  5. CSS显示:内联vs内联块[重复]
  6. 电脑关机很慢是怎么回事
  7. classcastexception异常_让你为之颤抖的Java常见的异常exception
  8. 对计算机专业的认识500字_【热门】我的朋友作文500字4篇
  9. vue页面乱码_项目部署到weblogic后页面乱码问题
  10. Java解决找不到主类或者无法加载主类