Ejemplo n.º 1
0
        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
            });
        }
Ejemplo n.º 2
0
        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
            });
        }