diff --git a/gpu/gpu.go b/gpu/gpu.go index 4b8f674d..2124241b 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -957,7 +957,9 @@ func (d *drawOps) addClipPath(state *drawState, aux []byte, auxKey opKey, bounds func (d *drawOps) save(id int, state f32.Affine2D) { if extra := id - len(d.states) + 1; extra > 0 { - d.states = append(d.states, make([]f32.Affine2D, extra)...) + for range extra { + d.states = append(d.states, f32.AffineId()) + } } d.states[id] = state } @@ -972,12 +974,13 @@ func (k opKey) SetTransform(t f32.Affine2D) opKey { } func (d *drawOps) collectOps(r *ops.Reader, viewport f32.Rectangle) { - var ( - quads quadsOp - state drawState - ) + var quads quadsOp + state := drawState{ + t: f32.AffineId(), + } reset := func() { state = drawState{ + t: f32.AffineId(), color: color.NRGBA{A: 0xff}, } } @@ -1163,6 +1166,7 @@ func expandPathOp(p *pathOp, clip image.Rectangle) { func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, partTrans f32.Affine2D, clip image.Rectangle) material { m := material{ opacity: 1., + uvTrans: f32.AffineId(), } switch d.matType { case materialColor: @@ -1521,6 +1525,7 @@ func decodeToOutlineQuads(qs *quadSplitter, tr f32.Affine2D, pathData []byte) { // create GPU vertices for transformed r, find the bounds and establish texture transform. func (d *drawOps) boundsForTransformedRect(r f32.Rectangle, tr f32.Affine2D) (aux []byte, bnd f32.Rectangle, ptr f32.Affine2D) { + ptr = f32.AffineId() if isPureOffset(tr) { // fast-path to allow blitting of pure rectangles _, _, ox, _, _, oy := tr.Elems() @@ -1573,7 +1578,7 @@ func (d *drawOps) boundsForTransformedRect(r f32.Rectangle, tr f32.Affine2D) (au sx, sy := P2.X-P3.X, P2.Y-P3.Y ptr = f32.NewAffine2D(sx, P2.X-P1.X, P1.X-sx, sy, P2.Y-P1.Y, P1.Y-sy).Invert() - return + return aux, bnd, ptr } func isPureOffset(t f32.Affine2D) bool { diff --git a/internal/stroke/stroke.go b/internal/stroke/stroke.go index 5de5036f..4073e422 100644 --- a/internal/stroke/stroke.go +++ b/internal/stroke/stroke.go @@ -581,12 +581,10 @@ func ArcTransform(p, f1, f2 f32.Point, angle float32) (transform f32.Affine2D, s } } - var ( - θ = angle / float32(segments) - ref f32.Affine2D // transform from absolute frame to ellipse-based one - rot f32.Affine2D // rotation matrix for each segment - inv f32.Affine2D // transform from ellipse-based frame to absolute one - ) + θ := angle / float32(segments) + ref := f32.AffineId() // transform from absolute frame to ellipse-based one + rot := f32.AffineId() // rotation matrix for each segment + inv := f32.AffineId() // transform from ellipse-based frame to absolute one center := f32.Point{ X: 0.5 * (f1.X + f2.X), Y: 0.5 * (f1.Y + f2.Y), diff --git a/io/input/key.go b/io/input/key.go index c9c6216c..6606109c 100644 --- a/io/input/key.go +++ b/io/input/key.go @@ -281,6 +281,7 @@ func (q *keyQueue) Focus(handlers map[event.Tag]*handler, state keyState, focus return state, nil } state.content = EditorState{} + state.content.Selection.Transform = f32.AffineId() var evts []taggedEvent if state.focus != nil { evts = append(evts, taggedEvent{tag: state.focus, event: key.FocusEvent{Focus: false}}) diff --git a/io/input/pointer.go b/io/input/pointer.go index 5cef405a..c3e399f8 100644 --- a/io/input/pointer.go +++ b/io/input/pointer.go @@ -144,7 +144,9 @@ const ( ) func (c *pointerCollector) resetState() { - c.state = collectState{} + c.state = collectState{ + t: f32.AffineId(), + } c.nodeStack = c.nodeStack[:0] // Pop every node except the root. if len(c.q.hitTree) > 0 { diff --git a/io/input/router.go b/io/input/router.go index e5f73658..3080f458 100644 --- a/io/input/router.go +++ b/io/input/router.go @@ -779,13 +779,15 @@ func (q *Router) collect() { pc.Reset() kq := &q.key.queue q.key.queue.Reset() - var t f32.Affine2D + t := f32.AffineId() for encOp, ok := q.reader.Decode(); ok; encOp, ok = q.reader.Decode() { switch ops.OpType(encOp.Data[0]) { case ops.TypeSave: id := ops.DecodeSave(encOp.Data) if extra := id - len(q.savedTrans) + 1; extra > 0 { - q.savedTrans = append(q.savedTrans, make([]f32.Affine2D, extra)...) + for range extra { + q.savedTrans = append(q.savedTrans, f32.AffineId()) + } } q.savedTrans[id] = t case ops.TypeLoad: