public static void CalculateLines(ref WorldSpaceRect rect, float2 canvasScale, float styleSpaceMultiplier, ref DynamicBuffer <FontGlyphData> glyphData, ref DynamicBuffer <TextData> textBuffer, NativeList <TextLineInfo> ret) { float maxLineWidth = rect.Max.x - rect.Min.x; CurrentLineData currentLine = default; for (int i = 0; i < textBuffer.Length; i++) { var character = textBuffer[i].Value; if (character == '\n') { ret.Add(new TextLineInfo() { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth, }); currentLine.CharacterOffset = i + 1; currentLine.LineWidth = 0.0f; currentLine.LineWordIndex = 0; currentLine.WordCharacterCount = 0; currentLine.WordWidth = 0.0f; continue; } if (character == ' ') { currentLine.LineWordIndex++; currentLine.WordCharacterCount = -1; currentLine.WordWidth = 0.0f; } if (GetGlyph(character, ref glyphData, out var ch)) { if (((ch.Metrics.width * styleSpaceMultiplier * canvasScale.x) < rect.Width)) { currentLine.WordCharacterCount++; float characterWidth = ch.Metrics.horizontalAdvance * styleSpaceMultiplier * canvasScale.x; currentLine.LineWidth += characterWidth; currentLine.WordWidth += characterWidth; if (currentLine.LineWidth > maxLineWidth) { if (currentLine.LineWordIndex != 0) { ret.Add(new TextLineInfo() { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth - currentLine.WordWidth, }); currentLine.CharacterOffset = i - currentLine.WordCharacterCount + 1; currentLine.LineWidth = 0.0f; currentLine.WordWidth = 0.0f; i = i - currentLine.WordCharacterCount + 1; currentLine.LineWordIndex = 0; currentLine.WordCharacterCount = 0; } else { ret.Add(new TextLineInfo() { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth, }); currentLine.CharacterOffset = i; currentLine.LineWidth = 0.0f; currentLine.WordWidth = 0.0f; currentLine.LineWordIndex = 0; currentLine.WordCharacterCount = 0; } } continue; } ret.Add(new TextLineInfo() { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth, }); currentLine.CharacterOffset = i; currentLine.LineWidth = 0.0f; currentLine.WordWidth = 0.0f; currentLine.LineWordIndex = 0; currentLine.WordCharacterCount = 0; } } ret.Add(new TextLineInfo() { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth }); }
public static void CalculateLines( LocalRectTransform renderBounds, float2 canvasScale, float styleSpaceMultiplier, DynamicBuffer <FontGlyph> glyphData, TextData textData, DynamicBuffer <TextLine> ret) { var maxLineWidth = renderBounds.Value.Size.x; //rect.Max.x - rect.Min.x; CurrentLineData currentLine = default; for (int i = 0; i < textData.Value.LengthInBytes; i++) { var character = textData.Value.GetChar(i); if (character == '\n') { ret.Add(new TextLine { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth, }); currentLine.CharacterOffset = i + 1; currentLine.LineWidth = 0.0f; currentLine.LineWordIndex = 0; currentLine.WordCharacterCount = 0; currentLine.WordWidth = 0.0f; continue; } if (character == ' ') { currentLine.LineWordIndex++; currentLine.WordCharacterCount = -1; currentLine.WordWidth = 0.0f; } if (GetGlyph(character, glyphData, out var ch)) { if ((ch.Metrics.width * styleSpaceMultiplier * canvasScale.x) < renderBounds.Value.Size.x) { currentLine.WordCharacterCount++; float characterWidth = ch.Metrics.horizontalAdvance * styleSpaceMultiplier * canvasScale.x; currentLine.LineWidth += characterWidth; currentLine.WordWidth += characterWidth; if (currentLine.LineWidth > maxLineWidth) { if (currentLine.LineWordIndex != 0) { ret.Add(new TextLine { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth - currentLine.WordWidth, }); currentLine.CharacterOffset = i - currentLine.WordCharacterCount + 1; currentLine.LineWidth = 0.0f; currentLine.WordWidth = 0.0f; i = i - currentLine.WordCharacterCount + 1; currentLine.LineWordIndex = 0; currentLine.WordCharacterCount = 0; } else { ret.Add(new TextLine { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth, }); currentLine.CharacterOffset = i; currentLine.LineWidth = 0.0f; currentLine.WordWidth = 0.0f; currentLine.LineWordIndex = 0; currentLine.WordCharacterCount = 0; } } continue; } ret.Add(new TextLine { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth, }); currentLine.CharacterOffset = i; currentLine.LineWidth = 0.0f; currentLine.WordWidth = 0.0f; currentLine.LineWordIndex = 0; currentLine.WordCharacterCount = 0; } } ret.Add(new TextLine { CharacterOffset = currentLine.CharacterOffset, LineWidth = currentLine.LineWidth }); }