2021SC@SDUSC
一、简述
在之前的博客中我们已经吧2D渲染中大部分内容都分析结束,接下来这篇博客将会对剩余内容进行分析,如字体等。。。
二、分析
首先是几个头文件:
(一)、font.h
结构体fontRange(文本范围):
struct TextRange
{
DECLARE_SCRIPTING_TYPE_MINIMAL(TextRange);
API_FIELD() int32 StartIndex;
API_FIELD() int32 EndIndex;
int32 Length() const
{return EndIndex - StartIndex;}
bool IsEmpty() const
{return (EndIndex - StartIndex) <= 0;}
bool Contains(int32 index) const
{return index >= StartIndex && index < EndIndex;}
bool Intersect(const TextRange& other) const
{return Math::Min(EndIndex, other.EndIndex) > Math::Max(StartIndex, other.StartIndex);}
};
包括开始索引StartIndex,结束索引 EndIndex
Contains()确定此范围是否包含字符索引,index为索引,如果范围包含指定的字符索引返回true;
Intersect()确定此范围是否与其他范围相交,other其他文本范围,如果范围与指定的范围索引相交返回true。
结构体FontLineCache(文本处理过程中生成的字体行信息):
struct FontLineCache
{
DECLARE_SCRIPTING_TYPE_MINIMAL(FontLineCache);
API_FIELD() Vector2 Location;
API_FIELD() Vector2 Size;
API_FIELD() int32 FirstCharIndex;
API_FIELD() int32 LastCharIndex;
};
Location线的root位置(左上角),Size线条边界(宽度和高度),FirstCharIndex第一个字符索引(来自输入文本), LastCharIndex最后一个字符索引(来自输入文本)。
下面是Flax Engine开发人员给出的字体字形指标:
结构体FontCharacterEntry(缓存的字体字符条目(读取以进行渲染和进一步处理)) :
FontCharacterEntry
{
DECLARE_SCRIPTING_TYPE_MINIMAL(FontCharacterEntry);
API_FIELD() Char Character;
API_FIELD() bool IsValid = false;
API_FIELD() byte TextureIndex;
API_FIELD() int16 OffsetX;
API_FIELD() int16 OffsetY;
API_FIELD() int16 AdvanceX;
API_FIELD() int16 BearingY;
API_FIELD() int16 Height;
API_FIELD() Vector2 UV;
API_FIELD() Vector2 UVSize;
};
Character此条目表示的字符,Valid有效性,TextureIndex字体缓存中特定纹理的索引,OffsetX和OffsexY分别以整数像素表示的左方位角和顶部方位,AdvanceX在绘制字符串中的下一个字符之前在 X 中前进的数量,BearingY从基线到字形最高点的距离,Height字形的高度(以像素为单位),UV角色在纹理中的起始位置(在纹理坐标空间中),UVSize纹理中字符的大小(在纹理坐标空间中)。
接下来我们看比较关键的部分,也就是字体类(Font),表示可以在文本呈现期间使用的字体对象(它使用字体资源,但具有用于所选字体属性的预缓存数据)。
API_CLASS(Sealed, NoSpawn) class FLAXENGINE_API Font : public ManagedScriptingObject
属性:
friend FontAsset;
private:
FontAsset* _asset;
int32 _size;
int32 _height;
int32 _ascender;
int32 _descender;
int32 _lineGap;
bool _hasKerning;
Dictionary<Char, FontCharacterEntry> _characters;
mutable Dictionary<uint32, int32> _kerningTable;
一个无参构造方法和一个带参构造方法:
Font(FontAsset* parentAsset, int32 size);
Font();
包括一些基本的Get和Set函数,其他功能函数:
void CacheText(const StringView& text);
void Invalidate();
void ProcessText(const StringView& text, Array<FontLineCache>& outputLines, API_PARAM(Ref) const TextLayoutOptions& layout);
Vector2 MeasureText(const StringView& text, API_PARAM(Ref) const TextLayoutOptions& layout);
int32 HitTestText(const StringView& text, const Vector2& location, API_PARAM(Ref) const TextLayoutOptions& layout);
Vector2 GetCharPosition(const StringView& text, int32 index, API_PARAM(Ref) const TextLayoutOptions& layout);
void FlushFaceSize() const;
大部分有重载,这里不再过多解释,仅介绍几个函数的功能:
CacheText()缓存给定的文本以准备呈现。"text"要缓存的文本字符。
Invalidate()使用此字体使所有缓存的动态字体图集无效。 可用于在更改字体资产选项后重新加载字体字符。
ProcessText()处理文本以获取用于渲染的缓存行。"text"输入文本。"layout"布局属性。"outputLines"输出行列表。
MeasureText()测量绘制给定文本所需的矩形的最小尺寸。"text"要测试的输入文本。"layout"布局属性。返回该文本和照片的最小尺寸以正确呈现。
HitTestText()计算给定位置的命中字符索引。"text"要测试的输入文本。"textRange"输入文本范围(输入文本参数的子字符串范围)。"location"要测试的输入位置。"layout"文本布局属性。返回选中的字符位置索引(如果位置在布局矩形之外,可以等于文本长度)。
GetCharPosition()计算给定文本和字符索引的字符位置。"text"要测试的输入文本。"index"获取坐标的文本位置。"layout"文本布局属性。返回字符位置(可用于插入符号位置的左上角)。
FlushFaceSize()使用自由类型库后端刷新人脸的大小。
(二)、FontAsset.h
枚举:
enum class FontHinting : byte
enum class FontFlags : byte
FontHinting渲染字符时使用的字体提示。FontFlags渲染字符时使用的字体标志。
下面我们直接看类字体资源(FontAsset):
属性:
friend Font;
private:
FT_Face _face;
FontOptions _options;
BytesContainer _fontFile;
Array<Font*, InlinedAllocation<32>> _fonts;
基本Get和Set方法,其他方法:
Font* CreateFont(int32 size);
bool Save(const StringView& path = StringView::Empty);
void Invalidate();
CreateFont()创建给定字符大小的字体对象。“size”字体字符大小。返回创建的字体对象。
Save()将此资产保存到文件中。 仅在编辑器中支持。"path"用于保存的自定义资产路径。 使用空值将此资产保存到其自己的存储位置, 可用于复制资产。,保存虚拟资产时必须指定。如果不能保存数据则为真,否则为假。
Invalidate()使用此字体使所有缓存的动态字体图集无效。 可用于在更改字体资产选项后重新加载字体字符。
这篇博客就先介绍到这里。