-
-
Notifications
You must be signed in to change notification settings - Fork 73
Expand file tree
/
Copy pathGlyphShapingData.cs
More file actions
217 lines (178 loc) · 6.67 KB
/
GlyphShapingData.cs
File metadata and controls
217 lines (178 loc) · 6.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System.Diagnostics;
using SixLabors.Fonts.Tables.AdvancedTypographic;
using SixLabors.Fonts.Unicode;
using SixLabors.Fonts.Unicode.Resources;
namespace SixLabors.Fonts;
/// <summary>
/// Contains supplementary data that allows the shaping of glyphs.
/// </summary>
[DebuggerDisplay("{DebuggerDisplay,nq}")]
internal class GlyphShapingData
{
/// <summary>
/// Initializes a new instance of the <see cref="GlyphShapingData"/> class.
/// </summary>
/// <param name="textRun">The text run.</param>
public GlyphShapingData(TextRun textRun) => this.TextRun = textRun;
/// <summary>
/// Initializes a new instance of the <see cref="GlyphShapingData"/> class.
/// </summary>
/// <param name="data">The data to copy properties from.</param>
/// <param name="clearFeatures">Whether to clear features.</param>
public GlyphShapingData(GlyphShapingData data, bool clearFeatures = false)
{
this.GlyphId = data.GlyphId;
this.CodePoint = data.CodePoint;
this.CodePointCount = data.CodePointCount;
this.Direction = data.Direction;
this.TextRun = data.TextRun;
this.LigatureId = data.LigatureId;
this.IsLigated = data.IsLigated;
this.LigatureComponent = data.LigatureComponent;
this.MarkAttachment = data.MarkAttachment;
this.CursiveAttachment = data.CursiveAttachment;
this.IsSubstituted = data.IsSubstituted;
this.IsDecomposed = data.IsDecomposed;
this.IsPositioned = data.IsPositioned;
this.IsKerned = data.IsKerned;
if (data.UniversalShapingEngineInfo != null)
{
this.UniversalShapingEngineInfo = new(
data.UniversalShapingEngineInfo.Category,
data.UniversalShapingEngineInfo.SyllableType,
data.UniversalShapingEngineInfo.Syllable);
}
if (data.IndicShapingEngineInfo != null)
{
this.IndicShapingEngineInfo = new(
data.IndicShapingEngineInfo.Category,
data.IndicShapingEngineInfo.Position,
data.IndicShapingEngineInfo.SyllableType,
data.IndicShapingEngineInfo.Syllable);
}
if (!clearFeatures)
{
this.Features.AddRange(data.Features);
}
foreach (Tag feature in data.AppliedFeatures)
{
this.AppliedFeatures.Add(feature);
}
this.Bounds = data.Bounds;
}
/// <summary>
/// Gets or sets the glyph id.
/// </summary>
public ushort GlyphId { get; set; }
/// <summary>
/// Gets or sets the leading codepoint.
/// </summary>
public CodePoint CodePoint { get; set; }
/// <summary>
/// Gets or sets the codepoint count represented by this glyph.
/// </summary>
public int CodePointCount { get; set; } = 1;
/// <summary>
/// Gets or sets the text direction.
/// </summary>
public TextDirection Direction { get; set; }
/// <summary>
/// Gets or sets the text run this glyph belongs to.
/// </summary>
public TextRun TextRun { get; set; }
/// <summary>
/// Gets or sets the id of any ligature this glyph is a member of.
/// </summary>
public int LigatureId { get; set; }
/// <summary>
/// Gets or sets a value indicating whether the glyph is ligated.
/// </summary>
public bool IsLigated { get; set; }
/// <summary>
/// Gets or sets the ligature component index of the glyph.
/// </summary>
public int LigatureComponent { get; set; } = -1;
/// <summary>
/// Gets or sets the index of any mark attachment.
/// </summary>
public int MarkAttachment { get; set; } = -1;
/// <summary>
/// Gets or sets the index of any cursive attachment.
/// </summary>
public int CursiveAttachment { get; set; } = -1;
/// <summary>
/// Gets or sets the collection of features.
/// </summary>
public List<TagEntry> Features { get; set; } = [];
/// <summary>
/// Gets or sets the collection of applied features.
/// </summary>
public HashSet<Tag> AppliedFeatures { get; set; } = [];
/// <summary>
/// Gets or sets the shaping bounds.
/// </summary>
public GlyphShapingBounds Bounds { get; set; } = new(0, 0, 0, 0);
/// <summary>
/// Gets or sets a value indicating whether this glyph is the result of a substitution.
/// </summary>
public bool IsSubstituted { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this glyph is the result of a decomposition substitution
/// </summary>
public bool IsDecomposed { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this glyph has been positioned.
/// </summary>
public bool IsPositioned { get; set; }
/// <summary>
/// Gets or sets a value indicating whether this glyph has been kerned.
/// </summary>
public bool IsKerned { get; set; }
/// <summary>
/// Gets or sets the universal shaping information.
/// </summary>
public UniversalShapingEngineInfo? UniversalShapingEngineInfo { get; set; }
/// <summary>
/// Gets or sets the Indic shaping information.
/// </summary>
public IndicShapingEngineInfo? IndicShapingEngineInfo { get; set; }
private string DebuggerDisplay
=> FormattableString
.Invariant($" {this.GlyphId} : {this.CodePoint.ToDebuggerDisplay()} : {CodePoint.GetScriptClass(this.CodePoint)} : {this.Direction} : {this.TextRun.TextAttributes} : {this.LigatureId} : {this.LigatureComponent} : {this.IsDecomposed}");
internal string ToDebuggerDisplay() => this.DebuggerDisplay;
}
/// <summary>
/// Represents information required for universal shaping.
/// </summary>
internal class UniversalShapingEngineInfo
{
public UniversalShapingEngineInfo(string category, string syllableType, int syllable)
{
this.Category = category;
this.SyllableType = syllableType;
this.Syllable = syllable;
}
public string Category { get; set; }
public string SyllableType { get; }
public int Syllable { get; }
}
internal class IndicShapingEngineInfo
{
public IndicShapingEngineInfo(
IndicShapingData.Categories category,
IndicShapingData.Positions position,
string syllableType,
int syllable)
{
this.Category = category;
this.Position = position;
this.SyllableType = syllableType;
this.Syllable = syllable;
}
public IndicShapingData.Categories Category { get; set; }
public IndicShapingData.Positions Position { get; set; }
public string SyllableType { get; }
public int Syllable { get; }
}