FireMonkey 源码学习(5)
(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)的更多相关文章
- FireMonkey 源码学习(1)
FireMonkey采用了与VCL不同的机制,很多基础类已经重新编写了,好在一如既往地提供了源代码,故此有机会学习一下. 一.图形引擎 FireMonkey采用了纯图形化技术解决可视化控件,而不是使用 ...
- FireMonkey 源码学习(3)
五.TTextLayoutNG 在FMX.TextLayout.GPU.pas文件中,实现了几个基础功能,其中: (1)渲染单元 在TextLayout中,每一批同字体和颜色的1~n个字符,组成一个最 ...
- FireMonkey 源码学习(2)
三.TControl FireMonkey重写了TControl的代码,实现了众多接口,如下图: 基类上实现了众多功能,这里不详细描述. 四.TEdit 编辑框是从TControl—TStyledCo ...
- FireMonkey 源码学习(6)
(6)GetGlyph和GetBaseline TFontGlyphManager是一个抽象类,在不同平台上的实现是不同的,以Windows为例,在FMX.FontGlyphs.Win.pas文件中定 ...
- FireMonkey 源码学习(4)
(4)DoDrawLayout DoDrawLayout函数的源代码分析如下: procedure TTextLayoutNG.DoDrawLayout(const ACanvas: TCanvas) ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- jQuery源码学习感想
还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
随机推荐
- VMware vSphere
在进行操作vSphere产品之前,就曾经对它进行过一个简单了解:[运维]VMware vSphere简单了解,现在再回头看,发现了解的真的是太简单了.经过前一段时间学习之后,对它又有了新的感悟,再来谈 ...
- db2修改表结构,增加列,删除列等
增加一列:ALTER TABLE tbname ADD COLUMN columnName datatype; 增加多列:ALTER TABLE tbname ADD COLUMN columnNam ...
- html5-css的使用强制优先级
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Problem(莫比乌斯反演)
我不是传送门 题意 : 中文题目不解释 求gcd(x,y) = k (a<=x<=b, c<=y<=d); 根据gcd(ka,kb) = k*gcd(a,b), 可将问题转化为 ...
- word2vector 资料
http://blog.csdn.net/garfielder007/article/details/51345201 https://cs224d.stanford.edu/lecture_note ...
- sitecore系列教程之Sitecore个性化-体验概况概述
SITECORE 8:体验概况概述 什么是体验简介? 体验配置文件是Sitecore中的仪表板应用程序,它说明了客户体验和交互的关键区域,例如访问者详细信息,访问,活动,目标,配置文件,自动化等等. ...
- 1.python虚拟环境的安装-用以同时使用py2,py3
第一步:安装环境支持[linux下在前加sudo] http://www.lfd.uci.edu/~gohlke/pythonlibs/#pycurl pip install virtualenv 第 ...
- mysql安装使用
linux系统 mysql-5.7.14-linux.zip部署包支持在CentOS 6.x/7.x 服务器硬盘大小要求 a) /data/mysql_data 如果存在该独立分区,要求该分区 &g ...
- Flask视图函数报fmalformed url rule错误的原因
Flask视图函数报fmalformed url rule错误,原因可能是包含中文字符了 把标点符号都重新写一遍英文格式的,可能就不会报这个了
- Linux基础命令---添加组groupadd、删除组groupdel
groupadd 指定群组名称来建立新的群组账号,需要时可以从系统中取得新的群组值. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. ...