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) 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 (a *DefaultAdapter) SetSizeAsLargest(theme Theme) { s := math.Size{} font := theme.DefaultFont() for i := 0; i < a.Count(); i++ { switch t := a.ItemAt(i).(type) { case Viewer: s = s.Max(t.View(theme).DesiredSize(math.ZeroSize, math.MaxSize)) case Stringer: s = s.Max(font.Measure(&TextBlock{ Runes: []rune(t.String()), })) default: s = s.Max(font.Measure(&TextBlock{ Runes: []rune(fmt.Sprintf("%+v", t)), })) } } a.SetSize(s) }