Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
SpriteFont.cs
Go to the documentation of this file.
1using System;
5using System.Text;
6
8
9public sealed class SpriteFont
10{
11 internal struct StringProxy
12 {
13 private string textString;
14
16
17 public readonly int Length;
18
19 public char this[int index]
20 {
21 get
22 {
23 if (textString != null)
24 {
25 return textString[index];
26 }
27 return textBuilder[index];
28 }
29 }
30
31 public StringProxy(string text)
32 {
34 textBuilder = null;
35 Length = text.Length;
36 }
37
39 {
41 textString = null;
42 Length = text.Length;
43 }
44 }
45
47
49
51
53
55
56 private int lineSpacing;
57
58 private float spacing;
59
60 private char? defaultCharacter;
61
63
64 public int LineSpacing
65 {
66 get
67 {
68 return lineSpacing;
69 }
70 set
71 {
73 }
74 }
75
76 public float Spacing
77 {
78 get
79 {
80 return spacing;
81 }
82 set
83 {
84 spacing = value;
85 }
86 }
87
88 public char? DefaultCharacter
89 {
90 get
91 {
92 return defaultCharacter;
93 }
94 set
95 {
96 if (value.HasValue && !characterMap.Contains(value.Value))
97 {
99 {
100 value.Value,
101 (int)value.Value
102 }));
103 }
105 }
106 }
107
109 {
110 get
111 {
112 if (characters == null)
113 {
115 }
116 return characters;
117 }
118 }
119
121 {
122 textureValue = texture;
126 this.lineSpacing = lineSpacing;
127 this.spacing = spacing;
128 this.kerning = kerning;
129 this.defaultCharacter = defaultCharacter;
130 }
131
133 {
134 if (text == null)
135 {
136 throw new ArgumentNullException("text");
137 }
139 return InternalMeasure(ref text2);
140 }
141
143 {
144 if (text == null)
145 {
146 throw new ArgumentNullException("text");
147 }
149 return InternalMeasure(ref text2);
150 }
151
153 {
154 if (text.Length == 0)
155 {
156 return Vector2.Zero;
157 }
159 zero.Y = lineSpacing;
160 float val = 0f;
161 int num = 0;
162 float num2 = 0f;
163 bool flag = true;
164 for (int i = 0; i < text.Length; i++)
165 {
166 if (text[i] == '\r')
167 {
168 continue;
169 }
170 if (text[i] == '\n')
171 {
172 zero.X += Math.Max(num2, 0f);
173 num2 = 0f;
174 val = Math.Max(zero.X, val);
175 zero = Vector2.Zero;
176 zero.Y = lineSpacing;
177 flag = true;
178 num++;
179 continue;
180 }
182 if (flag)
183 {
184 vector.X = Math.Max(vector.X, 0f);
185 }
186 else
187 {
188 zero.X += spacing + num2;
189 }
190 zero.X += vector.X + vector.Y;
191 num2 = vector.Z;
193 zero.Y = Math.Max(zero.Y, rectangle.Height);
194 flag = false;
195 }
196 zero.X += Math.Max(num2, 0f);
197 zero.Y += num * lineSpacing;
198 zero.X = Math.Max(zero.X, val);
199 return zero;
200 }
201
202 internal void InternalDraw(ref StringProxy text, SpriteBatch spriteBatch, Vector2 textblockPosition, Color color, float rotation, Vector2 origin, ref Vector2 scale, SpriteEffects spriteEffects, float depth)
203 {
204 Matrix.CreateRotationZ(rotation, out var result);
205 Matrix.CreateTranslation((0f - origin.X) * scale.X, (0f - origin.Y) * scale.Y, 0f, out var result2);
206 Matrix.Multiply(ref result2, ref result, out result);
207 int num = 1;
208 float x = 0f;
209 Vector2 vector = default(Vector2);
210 bool flag = true;
211 if ((spriteEffects & SpriteEffects.FlipHorizontally) == SpriteEffects.FlipHorizontally)
212 {
213 x = InternalMeasure(ref text).X * scale.X;
214 num = -1;
215 }
216 if ((spriteEffects & SpriteEffects.FlipVertically) == SpriteEffects.FlipVertically)
217 {
218 vector.Y = (InternalMeasure(ref text).Y - (float)lineSpacing) * scale.Y;
219 }
220 else
221 {
222 vector.Y = 0f;
223 }
224 vector.X = x;
225 for (int i = 0; i < text.Length; i++)
226 {
227 char c = text[i];
228 switch (c)
229 {
230 case '\n':
231 flag = true;
232 vector.X = x;
233 if ((spriteEffects & SpriteEffects.FlipVertically) == SpriteEffects.FlipVertically)
234 {
235 vector.Y -= (float)lineSpacing * scale.Y;
236 }
237 else
238 {
239 vector.Y += (float)lineSpacing * scale.Y;
240 }
241 continue;
242 case '\r':
243 continue;
244 }
247 if (flag)
248 {
249 vector2.X = Math.Max(vector2.X, 0f);
250 }
251 else
252 {
253 vector.X += spacing * scale.X * (float)num;
254 }
255 vector.X += vector2.X * scale.X * (float)num;
258 if ((spriteEffects & SpriteEffects.FlipVertically) == SpriteEffects.FlipVertically)
259 {
260 rectangle.Y = lineSpacing - value.Height - rectangle.Y;
261 }
262 if ((spriteEffects & SpriteEffects.FlipHorizontally) == SpriteEffects.FlipHorizontally)
263 {
264 rectangle.X -= rectangle.Width;
265 }
266 Vector2 position = vector;
267 position.X += (float)rectangle.X * scale.X;
268 position.Y += (float)rectangle.Y * scale.Y;
269 Vector2.Transform(ref position, ref result, out position);
270 position += textblockPosition;
271 spriteBatch.Draw(textureValue, position, value, color, rotation, Vector2.Zero, scale, spriteEffects, depth);
272 flag = false;
273 vector.X += (vector2.Y + vector2.Z) * scale.X * (float)num;
274 }
275 }
276
278 {
279 int num = 0;
280 int num2 = characterMap.Count - 1;
281 while (num <= num2)
282 {
283 int num3 = num + (num2 - num >> 1);
284 char c = characterMap[num3];
285 if (c == character)
286 {
287 return num3;
288 }
289 if (c < character)
290 {
291 num = num3 + 1;
292 }
293 else
294 {
295 num2 = num3 - 1;
296 }
297 }
298 if (defaultCharacter.HasValue)
299 {
300 char value = defaultCharacter.Value;
301 if (character != value)
302 {
304 }
305 }
306 string message = string.Format(CultureInfo.CurrentCulture, FrameworkResources.CharacterNotInFont, new object[2]
307 {
308 character,
309 (int)character
310 });
311 throw new ArgumentException(message, "character");
312 }
313}
void Draw(Texture2D texture, Vector2 position, Color color)
Vector2 InternalMeasure(ref StringProxy text)
ReadOnlyCollection< char > Characters
SpriteFont(Texture2D texture, List< Rectangle > glyphs, List< Rectangle > cropping, List< char > charMap, int lineSpacing, float spacing, List< Vector3 > kerning, char? defaultCharacter)
Vector2 MeasureString(StringBuilder text)
ReadOnlyCollection< char > characters
Definition SpriteFont.cs:62
void InternalDraw(ref StringProxy text, SpriteBatch spriteBatch, Vector2 textblockPosition, Color color, float rotation, Vector2 origin, ref Vector2 scale, SpriteEffects spriteEffects, float depth)
static CultureInfo CurrentCulture
static byte Max(byte val1, byte val2)
Definition Math.cs:738
static Matrix Multiply(Matrix matrix1, Matrix matrix2)
Definition Matrix.cs:1982
static Matrix CreateTranslation(Vector3 position)
Definition Matrix.cs:438
static Matrix CreateRotationZ(float radians)
Definition Matrix.cs:746
static Vector2 Transform(Vector2 position, Matrix matrix)
Definition Vector2.cs:317