widget: make Fit.scale a pure function

Most importantly, return dimensions and transformation instead of adding
operations. Makes the function easier to test, and supports scoped
transform and clip stacks.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2021-10-02 10:36:45 +02:00
parent cccb8d2c2b
commit cd5a78f3d8
3 changed files with 23 additions and 54 deletions
+5 -2
View File
@@ -8,6 +8,7 @@ import (
"gioui.org/f32"
"gioui.org/layout"
"gioui.org/op"
"gioui.org/op/clip"
"gioui.org/op/paint"
"gioui.org/unit"
)
@@ -42,10 +43,12 @@ func (im Image) Layout(gtx layout.Context) layout.Dimensions {
wf, hf := float32(size.X), float32(size.Y)
w, h := gtx.Px(unit.Dp(wf*scale)), gtx.Px(unit.Dp(hf*scale))
dims := im.Fit.scale(gtx, im.Position, layout.Dimensions{Size: image.Pt(w, h)})
dims, trans := im.Fit.scale(gtx.Constraints, im.Position, layout.Dimensions{Size: image.Pt(w, h)})
clip.Rect{Max: dims.Size}.Add(gtx.Ops)
pixelScale := scale * gtx.Metric.PxPerDp
op.Affine(f32.Affine2D{}.Scale(f32.Point{}, f32.Pt(pixelScale, pixelScale))).Add(gtx.Ops)
trans = trans.Mul(f32.Affine2D{}.Scale(f32.Point{}, f32.Pt(pixelScale, pixelScale)))
op.Affine(trans).Add(gtx.Ops)
im.Src.Add(gtx.Ops)
paint.PaintOp{}.Add(gtx.Ops)