(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);
var
Map: TBitmapData;
J: Integer;
Bitmap: TBitmap;
LFont: TFont;
GlyphSettings: TFontGlyphSettings;
begin
{
新建一个记录,或释放原记录中的图形对象
}
if not HasItem then
New(NewRec)
else
begin
FreeAndNil(NewRec.Glyph);
FreeAndNil(NewRec.Bitmap);
end; {
如果指定了字体则使用之,否则使用缺省字体
}
if not Assigned(AFont) then
LFont := Self.Font
else
LFont := AFont; {
使用Bitmap形式存储,或使用Path存储渲染过程
}
GlyphSettings := [];
if NeedBitmap then
GlyphSettings := [TFontGlyphSetting.Bitmap, TFontGlyphSetting.PremultipliedAlpha];
if NeedPath then
GlyphSettings := 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 > ) and (NewRec.Glyph.Bitmap.Height > ) then
begin
{
采用图形渲染模式,生成Bitmap
}
if FRendering > then
begin
Bitmap := TBitmap.Create(NewRec.Glyph.Bitmap.Width + AntiAliasMargin * , NewRec.Glyph.Bitmap.Height + AntiAliasMargin * );
Bitmap.BitmapScale := FScale;
{
将Glyph中的图形复制到Bitmap中
}
if Bitmap.Map(TMapAccess.Write, Map) then
try
        FillChar(Map.Data^, Map.Pitch * Map.Height, );
NewRec.Bitmap := Bitmap;
NewRec.SrcRect := RectF(, , NewRec.Glyph.Bitmap.Width, NewRec.Glyph.Bitmap.Height);
NewRec.SrcRect.Offset(AntiAliasMargin, AntiAliasMargin);
for J := to NewRec.Glyph.Bitmap.Height - do
Move(NewRec.Glyph.Bitmap.Scanline[J]^, Map.GetPixelAddr(AntiAliasMargin, J + AntiAliasMargin)^, NewRec.Glyph.Bitmap.Pitch);
finally
Bitmap.Unmap(Map);
end;
{
构建图形列表,并将其放入
}
if not Assigned(FNewGlyphList) then
FNewGlyphList := TList<PCharRec>.Create;
FNewGlyphList.Add(NewRec);
end
else
{
直接将Glyph映射到Bitmap中
}
MapGlyphToCache(NewRec);
end
else
{
采用Path模式
}
begin
NewRec.Bitmap := nil;
NewRec.SrcRect := RectF(, , , );
end; {
加入到列表中
}
if not HasItem then
CharDic.Add(Ch, NewRec);
end;

其中2个重要的函数是:

TFontGlyphManager.Current.GetGlyph

TFontGlyphManager.Current.GetBaseline

FireMonkey 源码学习(5)的更多相关文章

  1. FireMonkey 源码学习(1)

    FireMonkey采用了与VCL不同的机制,很多基础类已经重新编写了,好在一如既往地提供了源代码,故此有机会学习一下. 一.图形引擎 FireMonkey采用了纯图形化技术解决可视化控件,而不是使用 ...

  2. FireMonkey 源码学习(3)

    五.TTextLayoutNG 在FMX.TextLayout.GPU.pas文件中,实现了几个基础功能,其中: (1)渲染单元 在TextLayout中,每一批同字体和颜色的1~n个字符,组成一个最 ...

  3. FireMonkey 源码学习(2)

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

  4. FireMonkey 源码学习(6)

    (6)GetGlyph和GetBaseline TFontGlyphManager是一个抽象类,在不同平台上的实现是不同的,以Windows为例,在FMX.FontGlyphs.Win.pas文件中定 ...

  5. FireMonkey 源码学习(4)

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

  6. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  7. jQuery源码学习感想

    还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...

  8. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

随机推荐

  1. C++的类型转换

    一.类型转换名称和语法 1.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a    2.C++风格的类型转换提供了4种类型转换操作符来应对 ...

  2. 【Hive学习之三】Hive 函数

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...

  3. base_review

    简述Python的字符串驻留机制. - 字符串驻留是一种仅保存一份相同且不可变字符串的方法. - 原理 - 系统维护interned字典,记录已被驻留的字符串对象. - 当字符串对象a需要驻留时,先在 ...

  4. python 简单了解namedtuple

    namedtuple类位于collections模块,有了namedtuple后通过属性访问数据能够让我们的代码更加的直观更好维护 namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引 ...

  5. Linux环境 vi/vim ESC无法退出原因

    原因是输入模式是中文的,需要切换成英文半角符号输入命令!

  6. Web 应用架构基础课(转载)

    Web 应用架构基础课 初级 web 应用开发者必学的基础网络架构概念 web 应用主流架构概览 上图便是我司(Storyblocks)网络架构的很好展现.如果你还没成为经验老道的 web 工程师,可 ...

  7. system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

    elasticsearch启动时遇到的错误 这个是elasticsearch配置文件的问题. 解决办法: 在elasticsearch.yml配置文件中 添加     bootstrap.system ...

  8. HADOOP nutch java mysql

    下载Hadoop安装包 wget  http://apache.fayea.com/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz   java安装 wg ...

  9. JavaScript使用localStorage缓存Js和css文件

    对于WebApp来说,将js css文件缓存到localstorage区可以减少页面在加载时与HTTP请求的交互次数,从而优化页面的加载时间.特别是当移端信号不好高延迟时优化效果还是很显见的 下面的代 ...

  10. avr定时器做的正弦波

    2010-04-19 16:53:00 实物照片如下 RC电路的电阻为1K与10K时的波形分别如下 仿真图片如下: 程序如下: #include <iom16v.h> #include & ...