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功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
随机推荐
- filename
package com.enjoyor.soa.traffic.server.tms.controller; import java.io.BufferedReader;import java.io. ...
- C# 对数据库操作的帮助类SQLHelper.cs
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- C# Control.Invoke匿名委托
if (txbValue.InvokeRequired) txbValue.Invoke(new MethodInvoker(delegate() { ...
- Vue系列之 => 结合ajax完成列表增删查
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [博客迁移]探索Windows Azure 监控和自动伸缩系列2 - 获取虚拟机的监控定义和监控数据
上一篇博文介绍了如何连接Windows Azure: http://www.cnblogs.com/teld/p/5113063.html 本篇我们继续上次的示例代码,获取虚拟机的监控定义和监控数据. ...
- [openjudge-动态规划]买书
题目描述 描述 小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元.问小明有多少种买书方案?(每种书可购买多本) 输入 一个整数 n,代表总共钱数.(0 <= n < ...
- 理解本真的 REST 架构风格
1. http://kb.cnblogs.com/page/186516/ 2. http://www.infoq.com/cn/articles/rest-introduction 3. http: ...
- flask上下文全局变量,程序上下文、请求上下文、上下文钩子
Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...
- tensorflow--variable_scope
1.with tf.variable_scope(name , reuse = reuse) (1)创建variable scope with tf.variable_scope("foo& ...
- 转:【专题七】UDP编程补充——UDP广播程序的实现
上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享下,本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果. 一.程序实现 UDP广播程序的实现代 ...