Skip to content

Commit 58af503

Browse files
authored
Merge pull request #210 from JD557/rope-text-layout
Use a rope-like structure in the text layout
2 parents a6d3f42 + daa316e commit 58af503

1 file changed

Lines changed: 11 additions & 11 deletions

File tree

core/shared/src/main/scala/eu/joaocosta/interim/TextLayout.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,25 @@ object TextLayout:
3636
chars: List[RenderOp.DrawChar],
3737
areaWidth: Int,
3838
alignment: HorizontalAlignment
39-
): List[RenderOp.DrawChar] =
40-
if (chars.isEmpty) chars
39+
): Iterator[RenderOp.DrawChar] =
40+
if (chars.isEmpty) Iterator.empty
4141
else
4242
val minX = chars.foldLeft(Int.MaxValue)((acc, c) => math.min(acc, c.area.x))
4343
val maxX = chars.foldLeft(0)((acc, c) => math.max(acc, c.area.x + c.area.w))
4444
val deltaX = alignment.ordinal * (areaWidth - (maxX - minX)) / 2
45-
chars.map(c => c.copy(area = c.area.copy(x = c.area.x + deltaX)))
45+
chars.iterator.map(c => c.copy(area = c.area.copy(x = c.area.x + deltaX)))
4646

4747
private def alignV(
4848
chars: List[RenderOp.DrawChar],
4949
areaHeight: Int,
5050
alignment: VerticalAlignment
51-
): List[RenderOp.DrawChar] =
52-
if (chars.isEmpty) chars
51+
): Iterator[RenderOp.DrawChar] =
52+
if (chars.isEmpty) Iterator.empty
5353
else
5454
val minY = chars.foldLeft(Int.MaxValue)((acc, c) => math.min(acc, c.area.y))
5555
val maxY = chars.foldLeft(0)((acc, c) => math.max(acc, c.area.y + c.area.h))
5656
val deltaY = alignment.ordinal * (areaHeight - (maxY - minY)) / 2
57-
chars.map(c => c.copy(area = c.area.copy(y = c.area.y + deltaY)))
57+
chars.iterator.map(c => c.copy(area = c.area.copy(y = c.area.y + deltaY)))
5858

5959
private[interim] def asDrawChars(
6060
textOp: RenderOp.DrawText
@@ -63,12 +63,12 @@ object TextLayout:
6363
def layout(
6464
remaining: String,
6565
dy: Int,
66-
textAcc: List[RenderOp.DrawChar]
67-
): List[RenderOp.DrawChar] =
66+
textAcc: List[Iterator[RenderOp.DrawChar]]
67+
): Iterator[RenderOp.DrawChar] =
6868
remaining match
6969
case "" =>
7070
alignV(
71-
textAcc,
71+
textAcc.flatten,
7272
textOp.textArea.h,
7373
textOp.verticalAlignment
7474
)
@@ -91,9 +91,9 @@ object TextLayout:
9191
layout(
9292
nextLine,
9393
dy + textOp.font.lineHeight,
94-
alignH(ops.toList, textOp.textArea.w, textOp.horizontalAlignment) ++ textAcc
94+
alignH(ops.toList, textOp.textArea.w, textOp.horizontalAlignment) :: textAcc
9595
)
96-
layout(textOp.text, 0, Nil).filter(char => (char.area & textOp.area) == char.area)
96+
layout(textOp.text, 0, Nil).filter(char => (char.area & textOp.area) == char.area).toList
9797

9898
/** Computes the area that some text will occupy
9999
*

0 commit comments

Comments
 (0)