Implemented all text alignment methods
This commit is contained in:
parent
6258c77f86
commit
cdf805dadc
@ -98,10 +98,11 @@ func (word WordLayout) FirstRune () rune {
|
||||
|
||||
// LineLayout contains layout information for a single line.
|
||||
type LineLayout struct {
|
||||
Y fixed.Int26_6
|
||||
Width fixed.Int26_6
|
||||
SpaceAfter fixed.Int26_6
|
||||
Words []WordLayout
|
||||
Y fixed.Int26_6
|
||||
Width fixed.Int26_6
|
||||
ContentWidth fixed.Int26_6
|
||||
SpaceAfter fixed.Int26_6
|
||||
Words []WordLayout
|
||||
BreakAfter bool
|
||||
}
|
||||
|
||||
@ -147,12 +148,15 @@ func DoLine (text []rune, face font.Face, maxWidth fixed.Int26_6) (line LineLayo
|
||||
isFirstWord = false
|
||||
}
|
||||
|
||||
// set the width of the line's content.
|
||||
line.ContentWidth = lastWord.X + lastWord.Width
|
||||
|
||||
// set the line's width. this is subject to be overridden by the
|
||||
// TypeSetter to match the longest line.
|
||||
if maxWidth > 0 {
|
||||
line.Width = maxWidth
|
||||
} else {
|
||||
line.Width = lastWord.X + lastWord.Width
|
||||
line.Width = line.ContentWidth
|
||||
line.SpaceAfter = lastWord.SpaceAfter
|
||||
}
|
||||
return
|
||||
@ -161,5 +165,44 @@ func DoLine (text []rune, face font.Face, maxWidth fixed.Int26_6) (line LineLayo
|
||||
// Align aligns the text in the line according to the specified alignment
|
||||
// method.
|
||||
func (line *LineLayout) Align (align Align) {
|
||||
// TODO
|
||||
if len(line.Words) == 0 { return }
|
||||
|
||||
if align == AlignJustify {
|
||||
line.justify()
|
||||
return
|
||||
}
|
||||
|
||||
leftOffset := -line.Words[0].X
|
||||
|
||||
if align == AlignCenter {
|
||||
leftOffset += (line.Width - line.ContentWidth) / 2
|
||||
} else if align == AlignRight {
|
||||
leftOffset += line.Width - line.ContentWidth
|
||||
}
|
||||
|
||||
for index := range line.Words {
|
||||
line.Words[index].X += leftOffset
|
||||
}
|
||||
}
|
||||
|
||||
func (line *LineLayout) justify () {
|
||||
if len(line.Words) < 2 {
|
||||
line.Align(AlignLeft)
|
||||
return
|
||||
}
|
||||
|
||||
// We are going to be moving the words, so we can't take SpaceAfter into
|
||||
// account.
|
||||
trueContentWidth := fixed.Int26_6(0)
|
||||
for _, word := range line.Words {
|
||||
trueContentWidth += word.Width
|
||||
}
|
||||
|
||||
spaceCount := fixed.Int26_6(len(line.Words) - 1)
|
||||
spacePerWord := (line.Width - trueContentWidth) / spaceCount
|
||||
x := fixed.Int26_6(0)
|
||||
for index, word := range line.Words {
|
||||
line.Words[index].X = x
|
||||
x += spacePerWord + word.Width
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +95,11 @@ func (setter *TypeSetter) needAlignedLayout () {
|
||||
setter.alignClean = true
|
||||
|
||||
for index := range setter.lines {
|
||||
setter.lines[index].Align(setter.align)
|
||||
align := setter.align
|
||||
if index == len(setter.lines) - 1 && align == AlignJustify {
|
||||
align = AlignLeft
|
||||
}
|
||||
setter.lines[index].Align(align)
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user