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功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
随机推荐
- HDU 3117 Fibonacci Numbers(矩阵)
Fibonacci Numbers [题目链接]Fibonacci Numbers [题目类型]矩阵 &题解: 后4位是矩阵快速幂求,前4位是用log加Fibonacci通项公式求,详见上一篇 ...
- 014-Session服务器状态保持
开始并为Session赋值:Session[“uName”]=“CNYaoMing”;取值:string strName = Session[“uName”].ToString();销毁(取消/退出) ...
- 源码解读 Laravel PHP artisan config:cache
来源 https://laravel-china.org/articles/5101/source-code-reading-laravel-php-artisan-configcache 源码在哪 ...
- 加快cin读取速度
cin在读取大量数据时会比C里的scanf慢很多,但这并不是cin"无能",而是C++为了兼容C,对cin做了scanf的同步,只要关闭这个同步,cin就会有不弱于scanf的速度 ...
- Java基础语法(三)
七.方法 定义: 方法就是完成特定功能的代码块 在很多语言里面都有函数的定义 函数在Java中被称为方法 格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) { 函数体; ...
- 20155228 实验五 Android开发基础
20155228 实验五 Android开发基础 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 1.没有Linux基础的同学建议先学习< ...
- 【Hive学习之八】Hive 调优【重要】
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 apache-hive-3.1.1 ...
- python的print函数自动换行及其避免
print函数自带换行功能,即在输出内容后会自动换行,但是有时我们并不需要这个功能,那怎么办呢?这时候就需要用到end这个参数了,使用方法参考下面这段打印$矩阵的代码: i = 1 while i&l ...
- margin、padding、border区分
margin 是设置两个标签的间隔,也就是距离: padding 这个是比如一个p标签,它是100px*100px,我们使用的时候p标签的文字是贴着p标签的最左侧的,想要它的文字距离边界远一点,好看一 ...
- HDU 2176 取(m堆)石子游戏 (尼姆博奕)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎 ...