func (f *font) Measure(fl *gxui.TextBlock) math.Size { size := math.Size{W: 0, H: f.glyphMaxSizeDips.H} var offset math.Point for _, r := range fl.Runes { if r == '\n' { offset.X = 0 offset.Y += f.glyphMaxSizeDips.H continue } offset.X += f.advanceDips(r) size = size.Max(math.Size{W: offset.X, H: offset.Y + f.glyphMaxSizeDips.H}) } return size }
func (f *font) align(rect math.Rect, size math.Size, ascent int, h gxui.HorizontalAlignment, v gxui.VerticalAlignment) math.Point { var origin math.Point switch h { case gxui.AlignLeft: origin.X = rect.Min.X case gxui.AlignCenter: origin.X = rect.Mid().X - (size.W / 2) case gxui.AlignRight: origin.X = rect.Max.X - size.W } switch v { case gxui.AlignTop: origin.Y = rect.Min.Y + ascent case gxui.AlignMiddle: origin.Y = rect.Mid().Y - (size.H / 2) + ascent case gxui.AlignBottom: origin.Y = rect.Max.Y - size.H + ascent } return origin }
func (f *font) Layout(fl *gxui.TextBlock) (offsets []math.Point) { sizeDips := math.Size{} offsets = make([]math.Point, len(fl.Runes)) var offset math.Point for i, r := range fl.Runes { if r == '\n' { offset.X = 0 offset.Y += f.glyphMaxSizeDips.H continue } offsets[i] = offset offset.X += f.advanceDips(r) sizeDips = sizeDips.Max(math.Size{W: offset.X, H: offset.Y + f.glyphMaxSizeDips.H}) } origin := f.align(fl.AlignRect, sizeDips, f.ascentDips, fl.H, fl.V) for i, p := range offsets { offsets[i] = p.Add(origin) } return offsets }
func (l *LinearLayout) DesiredSize(min, max math.Size) math.Size { if l.sizeMode.Fill() { return max } bounds := min.Rect() children := l.outer.Children() horizontal := l.direction.Orientation().Horizontal() offset := math.Point{X: 0, Y: 0} for _, c := range children { cs := c.Control.DesiredSize(math.ZeroSize, max) cm := c.Control.Margin() cb := cs.Expand(cm).Rect().Offset(offset) if horizontal { offset.X += cb.W() } else { offset.Y += cb.H() } bounds = bounds.Union(cb) } return bounds.Size().Expand(l.outer.Padding()).Clamp(min, max) }