From 48a8540a68c778ca74d792aa8c76193c721199e3 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Tue, 26 Apr 2022 09:36:52 +0200 Subject: [PATCH] all: [API] change clip.RRect and UniformRRect to take integer coordinates Like the change to op.Offset before this, clip.RRect and UniformRRect is usually used with integer coordinates. Change to integer coordinates to eliminate many useless conversions to float32. Signed-off-by: Elias Naur --- gpu/headless/headless_test.go | 15 +++------ gpu/internal/rendertest/bench_test.go | 8 ++--- gpu/internal/rendertest/clip_test.go | 14 ++++----- gpu/internal/rendertest/render_test.go | 6 ++-- gpu/internal/rendertest/transform_test.go | 14 ++++----- io/router/pointer_test.go | 2 +- op/clip/shapes.go | 37 ++++++++--------------- op/clip/shapes_test.go | 4 +-- widget/border.go | 14 ++++----- widget/material/button.go | 37 +++++++++-------------- widget/material/checkable.go | 3 +- widget/material/decorations.go | 24 +++++++-------- widget/material/list.go | 8 ++--- widget/material/progressbar.go | 16 +++++----- widget/material/slider.go | 7 ++--- widget/material/switch.go | 33 ++++++++++---------- 16 files changed, 103 insertions(+), 139 deletions(-) diff --git a/gpu/headless/headless_test.go b/gpu/headless/headless_test.go index 6c6cb10c..e58efa26 100644 --- a/gpu/headless/headless_test.go +++ b/gpu/headless/headless_test.go @@ -7,7 +7,6 @@ import ( "image/color" "testing" - "gioui.org/f32" "gioui.org/internal/f32color" "gioui.org/op" "gioui.org/op/clip" @@ -50,20 +49,14 @@ func TestClipping(t *testing.T) { var ops op.Ops paint.ColorOp{Color: col}.Add(&ops) clip.RRect{ - Rect: f32.Rectangle{ - Min: f32.Point{X: 50, Y: 50}, - Max: f32.Point{X: 250, Y: 250}, - }, - SE: 75, + Rect: image.Rect(50, 50, 250, 250), + SE: 75, }.Push(&ops) paint.PaintOp{}.Add(&ops) paint.ColorOp{Color: col2}.Add(&ops) clip.RRect{ - Rect: f32.Rectangle{ - Min: f32.Point{X: 100, Y: 100}, - Max: f32.Point{X: 350, Y: 350}, - }, - NW: 75, + Rect: image.Rect(100, 100, 350, 350), + NW: 75, }.Push(&ops) paint.PaintOp{}.Add(&ops) if err := w.Frame(&ops); err != nil { diff --git a/gpu/internal/rendertest/bench_test.go b/gpu/internal/rendertest/bench_test.go index 196c9972..3ac066c7 100644 --- a/gpu/internal/rendertest/bench_test.go +++ b/gpu/internal/rendertest/bench_test.go @@ -161,7 +161,7 @@ func draw1000Circles(gtx layout.Context) { for y := 0; y < 10; y++ { paint.FillShape(ops, color.NRGBA{R: 100 + uint8(x), G: 100 + uint8(y), B: 100, A: 120}, - clip.RRect{Rect: f32.Rect(0, 0, 10, 10), NE: 5, SE: 5, SW: 5, NW: 5}.Op(ops), + clip.RRect{Rect: image.Rect(0, 0, 10, 10), NE: 5, SE: 5, SW: 5, NW: 5}.Op(ops), ) op.Offset(image.Pt(0, 100)).Add(ops) } @@ -172,7 +172,7 @@ func draw1000CirclesInstanced(gtx layout.Context) { ops := gtx.Ops r := op.Record(ops) - cl := clip.RRect{Rect: f32.Rect(0, 0, 10, 10), NE: 5, SE: 5, SW: 5, NW: 5}.Push(ops) + cl := clip.RRect{Rect: image.Rect(0, 0, 10, 10), NE: 5, SE: 5, SW: 5, NW: 5}.Push(ops) paint.PaintOp{}.Add(ops) cl.Pop() c := r.Stop() @@ -207,7 +207,7 @@ func drawIndividualShapes(gtx layout.Context, th *material.Theme) chan op.CallOp for y := 0; y < 9; y++ { paint.FillShape(ops, color.NRGBA{R: 100 + uint8(x), G: 100 + uint8(y), B: 100, A: 120}, - clip.RRect{Rect: f32.Rect(0, 0, 25, 25), NE: 10, SE: 10, SW: 10, NW: 10}.Op(ops), + clip.RRect{Rect: image.Rect(0, 0, 25, 25), NE: 10, SE: 10, SW: 10, NW: 10}.Op(ops), ) op.Offset(image.Pt(0, 50)).Add(ops) } @@ -224,7 +224,7 @@ func drawShapeInstances(gtx layout.Context, th *material.Theme) chan op.CallOp { co := op.Record(ops) r := op.Record(ops) - cl := clip.RRect{Rect: f32.Rect(0, 0, 25, 25), NE: 10, SE: 10, SW: 10, NW: 10}.Push(ops) + cl := clip.RRect{Rect: image.Rect(0, 0, 25, 25), NE: 10, SE: 10, SW: 10, NW: 10}.Push(ops) paint.PaintOp{}.Add(ops) cl.Pop() c := r.Stop() diff --git a/gpu/internal/rendertest/clip_test.go b/gpu/internal/rendertest/clip_test.go index f7469add..f1ee9c13 100644 --- a/gpu/internal/rendertest/clip_test.go +++ b/gpu/internal/rendertest/clip_test.go @@ -29,7 +29,7 @@ func TestPaintRect(t *testing.T) { func TestPaintClippedRect(t *testing.T) { run(t, func(o *op.Ops) { - defer clip.RRect{Rect: f32.Rect(25, 25, 60, 60)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(25, 25, 60, 60)}.Push(o).Pop() paint.FillShape(o, red, clip.Rect(image.Rect(0, 0, 50, 50)).Op()) }, func(r result) { r.expect(0, 0, transparent) @@ -42,8 +42,8 @@ func TestPaintClippedRect(t *testing.T) { func TestPaintClippedCircle(t *testing.T) { run(t, func(o *op.Ops) { - r := float32(10) - defer clip.RRect{Rect: f32.Rect(20, 20, 40, 40), SE: r, SW: r, NW: r, NE: r}.Push(o).Pop() + const r = 10 + defer clip.RRect{Rect: image.Rect(20, 20, 40, 40), SE: r, SW: r, NW: r, NE: r}.Push(o).Pop() defer clip.Rect(image.Rect(0, 0, 30, 50)).Push(o).Pop() paint.Fill(o, red) }, func(r result) { @@ -126,10 +126,10 @@ func TestTexturedStrokeClipped(t *testing.T) { smallSquares.Add(o) defer op.Offset(image.Pt(50, 50)).Push(o).Pop() defer clip.Stroke{ - Path: clip.RRect{Rect: f32.Rect(0, 0, 30, 30)}.Path(o), + Path: clip.RRect{Rect: image.Rect(0, 0, 30, 30)}.Path(o), Width: 10, }.Op().Push(o).Pop() - defer clip.RRect{Rect: f32.Rect(-30, -30, 60, 60)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(-30, -30, 60, 60)}.Push(o).Pop() defer op.Offset(image.Pt(-10, -10)).Push(o).Pop() paint.PaintOp{}.Add(o) }, func(r result) { @@ -141,7 +141,7 @@ func TestTexturedStroke(t *testing.T) { smallSquares.Add(o) defer op.Offset(image.Pt(50, 50)).Push(o).Pop() defer clip.Stroke{ - Path: clip.RRect{Rect: f32.Rect(0, 0, 30, 30)}.Path(o), + Path: clip.RRect{Rect: image.Rect(0, 0, 30, 30)}.Path(o), Width: 10, }.Op().Push(o).Pop() defer op.Offset(image.Pt(-10, -10)).Push(o).Pop() @@ -153,7 +153,7 @@ func TestTexturedStroke(t *testing.T) { func TestPaintClippedTexture(t *testing.T) { run(t, func(o *op.Ops) { squares.Add(o) - defer clip.RRect{Rect: f32.Rect(0, 0, 40, 40)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(0, 0, 40, 40)}.Push(o).Pop() defer scale(80.0/512, 80.0/512).Push(o).Pop() paint.PaintOp{}.Add(o) }, func(r result) { diff --git a/gpu/internal/rendertest/render_test.go b/gpu/internal/rendertest/render_test.go index d32b543e..57b29274 100644 --- a/gpu/internal/rendertest/render_test.go +++ b/gpu/internal/rendertest/render_test.go @@ -143,7 +143,7 @@ func constSqPath() clip.Op { func constSqCirc() clip.Op { innerOps := new(op.Ops) - return clip.RRect{Rect: f32.Rect(0, 0, 40, 40), + return clip.RRect{Rect: image.Rect(0, 0, 40, 40), NW: 20, NE: 20, SW: 20, SE: 20}.Op(innerOps) } @@ -204,7 +204,7 @@ func TestBuildOffscreen(t *testing.T) { func TestNegativeOverlaps(t *testing.T) { run(t, func(ops *op.Ops) { - defer clip.RRect{Rect: f32.Rect(50, 50, 100, 100)}.Push(ops).Pop() + defer clip.RRect{Rect: image.Rect(50, 50, 100, 100)}.Push(ops).Pop() clip.Rect(image.Rect(0, 120, 100, 122)).Push(ops).Pop() paint.PaintOp{}.Add(ops) }, func(r result) { @@ -257,7 +257,7 @@ func TestLinearGradient(t *testing.T) { Stop2: f32.Pt(gr.Max.X, gr.Min.Y), Color2: g.To, }.Add(ops) - cl := clip.RRect{Rect: gr}.Push(ops) + cl := clip.RRect{Rect: gr.Round()}.Push(ops) t1 := op.Affine(f32.Affine2D{}.Offset(pixelAligned.Min)).Push(ops) t2 := scale(pixelAligned.Dx()/128, 1).Push(ops) paint.PaintOp{}.Add(ops) diff --git a/gpu/internal/rendertest/transform_test.go b/gpu/internal/rendertest/transform_test.go index d70906cc..060fa42a 100644 --- a/gpu/internal/rendertest/transform_test.go +++ b/gpu/internal/rendertest/transform_test.go @@ -52,7 +52,7 @@ func TestPaintShear(t *testing.T) { func TestClipPaintOffset(t *testing.T) { run(t, func(o *op.Ops) { - defer clip.RRect{Rect: f32.Rect(10, 10, 30, 30)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(10, 10, 30, 30)}.Push(o).Pop() defer op.Offset(image.Pt(20, 20)).Push(o).Pop() paint.FillShape(o, red, clip.Rect(image.Rect(0, 0, 100, 100)).Op()) }, func(r result) { @@ -66,7 +66,7 @@ func TestClipPaintOffset(t *testing.T) { func TestClipOffset(t *testing.T) { run(t, func(o *op.Ops) { defer op.Offset(image.Pt(20, 20)).Push(o).Pop() - defer clip.RRect{Rect: f32.Rect(10, 10, 30, 30)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(10, 10, 30, 30)}.Push(o).Pop() paint.FillShape(o, red, clip.Rect(image.Rect(0, 0, 100, 100)).Op()) }, func(r result) { r.expect(0, 0, transparent) @@ -81,7 +81,7 @@ func TestClipScale(t *testing.T) { run(t, func(o *op.Ops) { a := f32.Affine2D{}.Scale(f32.Point{}, f32.Pt(2, 2)).Offset(f32.Pt(10, 10)) defer op.Affine(a).Push(o).Pop() - defer clip.RRect{Rect: f32.Rect(10, 10, 20, 20)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(10, 10, 20, 20)}.Push(o).Pop() paint.FillShape(o, red, clip.Rect(image.Rect(0, 0, 1000, 1000)).Op()) }, func(r result) { r.expect(19+10, 19+10, transparent) @@ -94,7 +94,7 @@ func TestClipScale(t *testing.T) { func TestClipRotate(t *testing.T) { run(t, func(o *op.Ops) { defer op.Affine(f32.Affine2D{}.Rotate(f32.Pt(40, 40), -math.Pi/4)).Push(o).Pop() - defer clip.RRect{Rect: f32.Rect(30, 30, 50, 50)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(30, 30, 50, 50)}.Push(o).Pop() paint.FillShape(o, red, clip.Rect(image.Rect(0, 40, 100, 100)).Op()) }, func(r result) { r.expect(39, 39, transparent) @@ -148,7 +148,7 @@ func TestRotateClipTexture(t *testing.T) { squares.Add(o) a := f32.Affine2D{}.Rotate(f32.Pt(40, 40), math.Pi/8) defer op.Affine(a).Push(o).Pop() - defer clip.RRect{Rect: f32.Rect(30, 30, 50, 50)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(30, 30, 50, 50)}.Push(o).Pop() defer op.Affine(f32.Affine2D{}.Offset(f32.Pt(10, 10))).Push(o).Pop() defer scale(60.0/512, 60.0/512).Push(o).Pop() paint.PaintOp{}.Add(o) @@ -166,11 +166,11 @@ func TestComplicatedTransform(t *testing.T) { run(t, func(o *op.Ops) { squares.Add(o) - defer clip.RRect{Rect: f32.Rect(0, 0, 100, 100), SE: 50, SW: 50, NW: 50, NE: 50}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(0, 0, 100, 100), SE: 50, SW: 50, NW: 50, NE: 50}.Push(o).Pop() a := f32.Affine2D{}.Shear(f32.Point{}, math.Pi/4, 0) defer op.Affine(a).Push(o).Pop() - defer clip.RRect{Rect: f32.Rect(0, 0, 50, 40)}.Push(o).Pop() + defer clip.RRect{Rect: image.Rect(0, 0, 50, 40)}.Push(o).Pop() defer scale(50.0/512, 50.0/512).Push(o).Pop() paint.PaintOp{}.Add(o) diff --git a/io/router/pointer_test.go b/io/router/pointer_test.go index abef0bc5..9decd302 100644 --- a/io/router/pointer_test.go +++ b/io/router/pointer_test.go @@ -741,7 +741,7 @@ func TestEllipse(t *testing.T) { var ops op.Ops h := new(int) - cl := clip.Ellipse(f32.Rect(0, 0, 100, 100)).Push(&ops) + cl := clip.Ellipse(image.Rect(0, 0, 100, 100)).Push(&ops) pointer.InputOp{Tag: h, Types: pointer.Press}.Add(&ops) cl.Pop() var r Router diff --git a/op/clip/shapes.go b/op/clip/shapes.go index 30609e57..2fc32331 100644 --- a/op/clip/shapes.go +++ b/op/clip/shapes.go @@ -37,7 +37,7 @@ func (r Rect) Path() PathSpec { // UniformRRect returns an RRect with all corner radii set to the // provided radius. -func UniformRRect(rect f32.Rectangle, radius float32) RRect { +func UniformRRect(rect image.Rectangle, radius int) RRect { return RRect{ Rect: rect, SE: radius, @@ -53,22 +53,15 @@ func UniformRRect(rect f32.Rectangle, radius float32) RRect { // Specify a square with corner radii equal to half the square size to // construct a circular clip area. type RRect struct { - Rect f32.Rectangle + Rect image.Rectangle // The corner radii. - SE, SW, NW, NE float32 + SE, SW, NW, NE int } // Op returns the op for the rounded rectangle. func (rr RRect) Op(ops *op.Ops) Op { if rr.SE == 0 && rr.SW == 0 && rr.NW == 0 && rr.NE == 0 { - r := image.Rectangle{ - Min: image.Point{X: int(rr.Rect.Min.X), Y: int(rr.Rect.Min.Y)}, - Max: image.Point{X: int(rr.Rect.Max.X), Y: int(rr.Rect.Max.Y)}, - } - // Only use Rect if rr is pixel-aligned, as Rect is guaranteed to be. - if fPt(r.Min) == rr.Rect.Min && fPt(r.Max) == rr.Rect.Max { - return Rect(r).Op() - } + return Rect(rr.Rect).Op() } return Outline{Path: rr.Path(ops)}.Op() } @@ -87,8 +80,9 @@ func (rr RRect) Path(ops *op.Ops) PathSpec { const q = 4 * (math.Sqrt2 - 1) / 3 const iq = 1 - q - se, sw, nw, ne := rr.SE, rr.SW, rr.NW, rr.NE - w, n, e, s := rr.Rect.Min.X, rr.Rect.Min.Y, rr.Rect.Max.X, rr.Rect.Max.Y + se, sw, nw, ne := float32(rr.SE), float32(rr.SW), float32(rr.NW), float32(rr.NE) + rrf := frect(rr.Rect) + w, n, e, s := rrf.Min.X, rrf.Min.Y, rrf.Max.X, rrf.Max.Y p.MoveTo(f32.Point{X: w + nw, Y: n}) p.LineTo(f32.Point{X: e - ne, Y: n}) // N @@ -117,7 +111,7 @@ func (rr RRect) Path(ops *op.Ops) PathSpec { // Ellipse represents the largest axis-aligned ellipse that // is contained in its bounds. -type Ellipse f32.Rectangle +type Ellipse image.Rectangle // Op returns the op for the filled ellipse. func (e Ellipse) Op(ops *op.Ops) Op { @@ -131,7 +125,7 @@ func (e Ellipse) Push(ops *op.Ops) Stack { // Path constructs a path for the ellipse. func (e Ellipse) Path(o *op.Ops) PathSpec { - bounds := f32.Rectangle(e) + bounds := image.Rectangle(e) if bounds.Dx() == 0 || bounds.Dy() == 0 { return PathSpec{shape: ops.Rect} } @@ -139,12 +133,13 @@ func (e Ellipse) Path(o *op.Ops) PathSpec { var p Path p.Begin(o) - center := bounds.Max.Add(bounds.Min).Mul(.5) - diam := bounds.Dx() + bf := frect(bounds) + center := bf.Max.Add(bf.Min).Mul(.5) + diam := bf.Dx() r := diam * .5 // We'll model the ellipse as a circle scaled in the Y // direction. - scale := bounds.Dy() / diam + scale := bf.Dy() / diam // https://pomax.github.io/bezierinfo/#circles_cubic. const q = 4 * (math.Sqrt2 - 1) / 3 @@ -177,9 +172,3 @@ func (e Ellipse) Path(o *op.Ops) PathSpec { ellipse.shape = ops.Ellipse return ellipse } - -func fPt(p image.Point) f32.Point { - return f32.Point{ - X: float32(p.X), Y: float32(p.Y), - } -} diff --git a/op/clip/shapes_test.go b/op/clip/shapes_test.go index 9e502ba6..149da2b4 100644 --- a/op/clip/shapes_test.go +++ b/op/clip/shapes_test.go @@ -1,17 +1,17 @@ package clip_test import ( + "image" "image/color" "testing" - "gioui.org/f32" "gioui.org/op" "gioui.org/op/clip" "gioui.org/op/paint" ) func TestZeroEllipse(t *testing.T) { - p := f32.Pt(1.0, 2.0) + p := image.Pt(1.0, 2.0) e := clip.Ellipse{Min: p, Max: p} ops := new(op.Ops) paint.FillShape(ops, color.NRGBA{R: 255, A: 255}, e.Op(ops)) diff --git a/widget/border.go b/widget/border.go index 8d1bcd10..e90e8dcf 100644 --- a/widget/border.go +++ b/widget/border.go @@ -3,9 +3,9 @@ package widget import ( + "image" "image/color" - "gioui.org/f32" "gioui.org/layout" "gioui.org/op/clip" "gioui.org/op/paint" @@ -21,21 +21,21 @@ type Border struct { func (b Border) Layout(gtx layout.Context, w layout.Widget) layout.Dimensions { dims := w(gtx) - sz := layout.FPt(dims.Size) + sz := dims.Size - rr := float32(gtx.Px(b.CornerRadius)) - width := float32(gtx.Px(b.Width)) + rr := gtx.Px(b.CornerRadius) + width := gtx.Px(b.Width) sz.X -= width sz.Y -= width - r := f32.Rectangle{Max: sz} - r = r.Add(f32.Point{X: width * 0.5, Y: width * 0.5}) + r := image.Rectangle{Max: sz} + r = r.Add(image.Point{X: width / 2, Y: width / 2}) paint.FillShape(gtx.Ops, b.Color, clip.Stroke{ Path: clip.UniformRRect(r, rr).Path(gtx.Ops), - Width: width, + Width: float32(width), }.Op(), ) diff --git a/widget/material/button.go b/widget/material/button.go index 32493248..b21cc1cf 100644 --- a/widget/material/button.go +++ b/widget/material/button.go @@ -7,7 +7,6 @@ import ( "image/color" "math" - "gioui.org/f32" "gioui.org/internal/f32color" "gioui.org/io/semantic" "gioui.org/layout" @@ -130,11 +129,8 @@ func (b ButtonLayoutStyle) Layout(gtx layout.Context, w layout.Widget) layout.Di semantic.Button.Add(gtx.Ops) return layout.Stack{Alignment: layout.Center}.Layout(gtx, layout.Expanded(func(gtx layout.Context) layout.Dimensions { - rr := float32(gtx.Px(b.CornerRadius)) - defer clip.UniformRRect(f32.Rectangle{Max: f32.Point{ - X: float32(gtx.Constraints.Min.X), - Y: float32(gtx.Constraints.Min.Y), - }}, rr).Push(gtx.Ops).Pop() + rr := gtx.Px(b.CornerRadius) + defer clip.UniformRRect(image.Rectangle{Max: gtx.Constraints.Min}, rr).Push(gtx.Ops).Pop() background := b.Background switch { case gtx.Queue == nil: @@ -165,12 +161,8 @@ func (b IconButtonStyle) Layout(gtx layout.Context) layout.Dimensions { } return layout.Stack{Alignment: layout.Center}.Layout(gtx, layout.Expanded(func(gtx layout.Context) layout.Dimensions { - sizex, sizey := gtx.Constraints.Min.X, gtx.Constraints.Min.Y - sizexf, sizeyf := float32(sizex), float32(sizey) - rr := (sizexf + sizeyf) * .25 - defer clip.UniformRRect(f32.Rectangle{ - Max: f32.Point{X: sizexf, Y: sizeyf}, - }, rr).Push(gtx.Ops).Pop() + rr := (gtx.Constraints.Min.X + gtx.Constraints.Min.Y) / 4 + defer clip.UniformRRect(image.Rectangle{Max: gtx.Constraints.Min}, rr).Push(gtx.Ops).Pop() background := b.Background switch { case gtx.Queue == nil: @@ -199,7 +191,7 @@ func (b IconButtonStyle) Layout(gtx layout.Context) layout.Dimensions { ) }) c := m.Stop() - bounds := f32.Rectangle{Max: layout.FPt(dims.Size)} + bounds := image.Rectangle{Max: dims.Size} defer clip.Ellipse(bounds).Push(gtx.Ops).Pop() c.Add(gtx.Ops) return dims @@ -282,25 +274,24 @@ func drawInk(gtx layout.Context, c widget.Press) { // BeziƩr ease-in curve. alphaBezier := t2 * t2 * (3.0 - 2.0*t2) sizeBezier := sizet * sizet * (3.0 - 2.0*sizet) - size := float32(gtx.Constraints.Min.X) - if h := float32(gtx.Constraints.Min.Y); h > size { + size := gtx.Constraints.Min.X + if h := gtx.Constraints.Min.Y; h > size { size = h } - // Cover the entire constraints min rectangle. - size *= 2 * float32(math.Sqrt(2)) - // Apply curve values to size and color. - size *= sizeBezier + // Cover the entire constraints min rectangle and + // apply curve values to size and color. + size = int(float32(size) * 2 * float32(math.Sqrt(2)) * sizeBezier) alpha := 0.7 * alphaBezier const col = 0.8 ba, bc := byte(alpha*0xff), byte(col*0xff) rgba := f32color.MulAlpha(color.NRGBA{A: 0xff, R: bc, G: bc, B: bc}, ba) ink := paint.ColorOp{Color: rgba} ink.Add(gtx.Ops) - rr := size * .5 + rr := size / 2 defer op.Offset(c.Position.Add(image.Point{ - X: -int(rr), - Y: -int(rr), + X: -rr, + Y: -rr, })).Push(gtx.Ops).Pop() - defer clip.UniformRRect(f32.Rectangle{Max: f32.Pt(size, size)}, rr).Push(gtx.Ops).Pop() + defer clip.UniformRRect(image.Rectangle{Max: image.Pt(size, size)}, rr).Push(gtx.Ops).Pop() paint.PaintOp{}.Add(gtx.Ops) } diff --git a/widget/material/checkable.go b/widget/material/checkable.go index a1da1197..9b597d31 100644 --- a/widget/material/checkable.go +++ b/widget/material/checkable.go @@ -6,7 +6,6 @@ import ( "image" "image/color" - "gioui.org/f32" "gioui.org/internal/f32color" "gioui.org/layout" "gioui.org/op/clip" @@ -50,7 +49,7 @@ func (c *checkable) layout(gtx layout.Context, checked, hovered bool) layout.Dim background := f32color.MulAlpha(c.IconColor, 70) - b := f32.Rectangle{Max: f32.Pt(float32(size), float32(size))} + b := image.Rectangle{Max: image.Pt(size, size)} paint.FillShape(gtx.Ops, background, clip.Ellipse(b).Op(gtx.Ops)) return dims diff --git a/widget/material/decorations.go b/widget/material/decorations.go index ca2c8642..6fe6f86f 100644 --- a/widget/material/decorations.go +++ b/widget/material/decorations.go @@ -144,19 +144,18 @@ func minimizeWindow(gtx layout.Context) layout.Dimensions { // maximizeWindow draws a rectangle representing the maximize action. func maximizeWindow(gtx layout.Context) layout.Dimensions { size := gtx.Px(winIconSize) - size32 := float32(size) - margin := float32(gtx.Px(winIconMargin)) - width := float32(gtx.Px(winIconStroke)) + margin := gtx.Px(winIconMargin) + width := gtx.Px(winIconStroke) r := clip.RRect{ - Rect: f32.Rect(margin, margin, size32-margin, size32-margin), + Rect: image.Rect(margin, margin, size-margin, size-margin), } st := clip.Stroke{ Path: r.Path(gtx.Ops), - Width: width, + Width: float32(width), }.Op().Push(gtx.Ops) paint.PaintOp{}.Add(gtx.Ops) st.Pop() - r.Rect.Max = f32.Pt(size32-margin, 2*margin) + r.Rect.Max = image.Pt(size-margin, 2*margin) st = clip.Outline{ Path: r.Path(gtx.Ops), }.Op().Push(gtx.Ops) @@ -168,24 +167,23 @@ func maximizeWindow(gtx layout.Context) layout.Dimensions { // maximizedWindow draws interleaved rectangles representing the un-maximize action. func maximizedWindow(gtx layout.Context) layout.Dimensions { size := gtx.Px(winIconSize) - size32 := float32(size) - margin := float32(gtx.Px(winIconMargin)) - width := float32(gtx.Px(winIconStroke)) + margin := gtx.Px(winIconMargin) + width := gtx.Px(winIconStroke) r := clip.RRect{ - Rect: f32.Rect(margin, margin, size32-2*margin, size32-2*margin), + Rect: image.Rect(margin, margin, size-2*margin, size-2*margin), } st := clip.Stroke{ Path: r.Path(gtx.Ops), - Width: width, + Width: float32(width), }.Op().Push(gtx.Ops) paint.PaintOp{}.Add(gtx.Ops) st.Pop() r = clip.RRect{ - Rect: f32.Rect(2*margin, 2*margin, size32-margin, size32-margin), + Rect: image.Rect(2*margin, 2*margin, size-margin, size-margin), } st = clip.Stroke{ Path: r.Path(gtx.Ops), - Width: width, + Width: float32(width), }.Op().Push(gtx.Ops) paint.PaintOp{}.Add(gtx.Ops) st.Pop() diff --git a/widget/material/list.go b/widget/material/list.go index 8dcf3464..367c63a7 100644 --- a/widget/material/list.go +++ b/widget/material/list.go @@ -7,7 +7,6 @@ import ( "image/color" "math" - "gioui.org/f32" "gioui.org/io/pointer" "gioui.org/layout" "gioui.org/op" @@ -188,15 +187,14 @@ func (s ScrollbarStyle) layout(gtx layout.Context, axis layout.Axis, viewportSta X: indicatorLen, Y: gtx.Px(s.Indicator.MinorWidth), }) - indicatorDimsF := layout.FPt(indicatorDims) - radius := float32(gtx.Px(s.Indicator.CornerRadius)) + radius := gtx.Px(s.Indicator.CornerRadius) // Lay out the indicator. offset := axis.Convert(image.Pt(viewStart, 0)) defer op.Offset(offset).Push(gtx.Ops).Pop() paint.FillShape(gtx.Ops, s.Indicator.Color, clip.RRect{ - Rect: f32.Rectangle{ - Max: indicatorDimsF, + Rect: image.Rectangle{ + Max: indicatorDims, }, SW: radius, NW: radius, diff --git a/widget/material/progressbar.go b/widget/material/progressbar.go index 5b50ed46..28eae15c 100644 --- a/widget/material/progressbar.go +++ b/widget/material/progressbar.go @@ -6,7 +6,6 @@ import ( "image" "image/color" - "gioui.org/f32" "gioui.org/internal/f32color" "gioui.org/layout" "gioui.org/op/clip" @@ -29,27 +28,26 @@ func ProgressBar(th *Theme, progress float32) ProgressBarStyle { } func (p ProgressBarStyle) Layout(gtx layout.Context) layout.Dimensions { - shader := func(width float32, color color.NRGBA) layout.Dimensions { - maxHeight := unit.Dp(4) - rr := float32(gtx.Px(unit.Dp(2))) + shader := func(width int, color color.NRGBA) layout.Dimensions { + var maxHeight = unit.Dp(4) + rr := gtx.Px(unit.Dp(2)) - d := image.Point{X: int(width), Y: gtx.Px(maxHeight)} + d := image.Point{X: width, Y: gtx.Px(maxHeight)} - height := float32(gtx.Px(maxHeight)) - defer clip.UniformRRect(f32.Rectangle{Max: f32.Pt(width, height)}, rr).Push(gtx.Ops).Pop() + defer clip.UniformRRect(image.Rectangle{Max: image.Pt(width, d.Y)}, rr).Push(gtx.Ops).Pop() paint.ColorOp{Color: color}.Add(gtx.Ops) paint.PaintOp{}.Add(gtx.Ops) return layout.Dimensions{Size: d} } - progressBarWidth := float32(gtx.Constraints.Max.X) + progressBarWidth := gtx.Constraints.Max.X return layout.Stack{Alignment: layout.W}.Layout(gtx, layout.Stacked(func(gtx layout.Context) layout.Dimensions { return shader(progressBarWidth, p.TrackColor) }), layout.Stacked(func(gtx layout.Context) layout.Dimensions { - fillWidth := progressBarWidth * clamp1(p.Progress) + fillWidth := int(float32(progressBarWidth) * clamp1(p.Progress)) fillColor := p.Color if gtx.Queue == nil { fillColor = f32color.Disabled(fillColor) diff --git a/widget/material/slider.go b/widget/material/slider.go index 09536590..fd48a087 100644 --- a/widget/material/slider.go +++ b/widget/material/slider.go @@ -6,7 +6,6 @@ import ( "image" "image/color" - "gioui.org/f32" "gioui.org/internal/f32color" "gioui.org/layout" "gioui.org/op" @@ -78,9 +77,9 @@ func (s SliderStyle) Layout(gtx layout.Context) layout.Dimensions { // Draw thumb. pt := axis.Convert(image.Pt(thumbPos, sizeCross/2)) - thumb := f32.Rectangle{ - Min: f32.Pt(float32(pt.X-thumbRadius), float32(pt.Y-thumbRadius)), - Max: f32.Pt(float32(pt.X+thumbRadius), float32(pt.Y+thumbRadius)), + thumb := image.Rectangle{ + Min: image.Pt(pt.X-thumbRadius, pt.Y-thumbRadius), + Max: image.Pt(pt.X+thumbRadius, pt.Y+thumbRadius), } paint.FillShape(gtx.Ops, color, clip.Ellipse(thumb).Op(gtx.Ops)) diff --git a/widget/material/switch.go b/widget/material/switch.go index f31526a1..024ddd15 100644 --- a/widget/material/switch.go +++ b/widget/material/switch.go @@ -6,7 +6,6 @@ import ( "image" "image/color" - "gioui.org/f32" "gioui.org/internal/f32color" "gioui.org/io/semantic" "gioui.org/layout" @@ -47,10 +46,10 @@ func (s SwitchStyle) Layout(gtx layout.Context) layout.Dimensions { trackOff := (thumbSize - trackHeight) / 2 // Draw track. - trackCorner := float32(trackHeight) / 2 - trackRect := f32.Rectangle{Max: f32.Point{ - X: float32(trackWidth), - Y: float32(trackHeight), + trackCorner := trackHeight / 2 + trackRect := image.Rectangle{Max: image.Point{ + X: trackWidth, + Y: trackHeight, }} col := s.Color.Disabled if s.Switch.Value { @@ -69,14 +68,14 @@ func (s SwitchStyle) Layout(gtx layout.Context) layout.Dimensions { // Draw thumb ink. inkSize := gtx.Px(unit.Dp(44)) - rr := float32(inkSize) * .5 + rr := inkSize / 2 inkOff := image.Point{ - X: trackWidth/2 - int(rr), - Y: -int(rr) + trackHeight/2 + trackOff, + X: trackWidth/2 - rr, + Y: -rr + trackHeight/2 + trackOff, } t = op.Offset(inkOff).Push(gtx.Ops) gtx.Constraints.Min = image.Pt(inkSize, inkSize) - cl = clip.UniformRRect(f32.Rectangle{Max: layout.FPt(gtx.Constraints.Min)}, rr).Push(gtx.Ops) + cl = clip.UniformRRect(image.Rectangle{Max: gtx.Constraints.Min}, rr).Push(gtx.Ops) for _, p := range s.Switch.History() { drawInk(gtx, p) } @@ -89,18 +88,18 @@ func (s SwitchStyle) Layout(gtx layout.Context) layout.Dimensions { defer op.Offset(image.Point{X: xoff}).Push(gtx.Ops).Pop() } - thumbRadius := float32(thumbSize) / 2 + thumbRadius := thumbSize / 2 - circle := func(x, y, r float32) clip.Op { - b := f32.Rectangle{ - Min: f32.Pt(x-r, y-r), - Max: f32.Pt(x+r, y+r), + circle := func(x, y, r int) clip.Op { + b := image.Rectangle{ + Min: image.Pt(x-r, y-r), + Max: image.Pt(x+r, y+r), } return clip.Ellipse(b).Op(gtx.Ops) } // Draw hover. if s.Switch.Hovered() || s.Switch.Focused() { - r := 1.7 * thumbRadius + r := thumbRadius * 10 / 17 background := f32color.MulAlpha(s.Color.Enabled, 70) paint.FillShape(gtx.Ops, background, circle(thumbRadius, thumbRadius, r)) } @@ -108,7 +107,7 @@ func (s SwitchStyle) Layout(gtx layout.Context) layout.Dimensions { // Draw thumb shadow, a translucent disc slightly larger than the // thumb itself. // Center shadow horizontally and slightly adjust its Y. - paint.FillShape(gtx.Ops, argb(0x55000000), circle(thumbRadius, thumbRadius+.25, thumbRadius+1)) + paint.FillShape(gtx.Ops, argb(0x55000000), circle(thumbRadius, thumbRadius+gtx.Px(unit.Dp(.25)), thumbRadius+1)) // Draw thumb. paint.FillShape(gtx.Ops, col, circle(thumbRadius, thumbRadius, thumbRadius)) @@ -121,7 +120,7 @@ func (s SwitchStyle) Layout(gtx layout.Context) layout.Dimensions { } defer op.Offset(clickOff).Push(gtx.Ops).Pop() sz := image.Pt(clickSize, clickSize) - defer clip.Ellipse(f32.Rectangle{Max: layout.FPt(sz)}).Push(gtx.Ops).Pop() + defer clip.Ellipse(image.Rectangle{Max: sz}).Push(gtx.Ops).Pop() s.Switch.Layout(gtx, func(gtx layout.Context) layout.Dimensions { if d := s.Description; d != "" { semantic.DescriptionOp(d).Add(gtx.Ops)