From 48a96305c8258e016f445acb681f7bd559612eee Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 3 Nov 2021 12:32:26 +0100 Subject: [PATCH] io/router: move transform state tracking from pointerCollector to Router We're going to need transform tracking for the upcoming meta ops. Signed-off-by: Elias Naur --- io/router/pointer.go | 34 +++++++--------------------------- io/router/router.go | 29 +++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/io/router/pointer.go b/io/router/pointer.go index d2bcebea..cf6712ad 100644 --- a/io/router/pointer.go +++ b/io/router/pointer.go @@ -82,12 +82,9 @@ type collectState struct { // pointerCollector tracks the state needed to update an pointerQueue // from pointer ops. type pointerCollector struct { - q *pointerQueue - state collectState - nodeStack []int - transStack []f32.Affine2D - // states holds the storage for save/restore ops. - states []f32.Affine2D + q *pointerQueue + state collectState + nodeStack []int } const ( @@ -95,15 +92,12 @@ const ( areaEllipse ) -func (c *pointerCollector) save(id int) { - if extra := id - len(c.states) + 1; extra > 0 { - c.states = append(c.states, make([]f32.Affine2D, extra)...) - } - c.states[id] = c.state.t +func (c *pointerCollector) resetState() { + c.state = collectState{} } -func (c *pointerCollector) load(id int) { - c.state = collectState{t: c.states[id]} +func (c *pointerCollector) setTrans(t f32.Affine2D) { + c.state.t = t } func (c *pointerCollector) clip(op ops.ClipOp) { @@ -155,19 +149,6 @@ func (c *pointerCollector) popPass() { c.state.pass-- } -func (c *pointerCollector) transform(t f32.Affine2D, push bool) { - if push { - c.transStack = append(c.transStack, c.state.t) - } - c.state.t = c.state.t.Mul(t) -} - -func (c *pointerCollector) popTransform() { - n := len(c.transStack) - c.state.t = c.transStack[n-1] - c.transStack = c.transStack[:n-1] -} - func (c *pointerCollector) inputOp(op pointer.InputOp, events *handlerEvents) { area := -1 if i := c.state.nodePlusOne - 1; i != -1 { @@ -207,7 +188,6 @@ func (c *pointerCollector) reset(q *pointerQueue) { q.reset() c.state = collectState{} c.nodeStack = c.nodeStack[:0] - c.transStack = c.transStack[:0] c.q = q } diff --git a/io/router/router.go b/io/router/router.go index 03ba608e..4bc8a49c 100644 --- a/io/router/router.go +++ b/io/router/router.go @@ -15,6 +15,7 @@ import ( "image" "time" + "gioui.org/f32" "gioui.org/internal/ops" "gioui.org/io/clipboard" "gioui.org/io/event" @@ -27,7 +28,9 @@ import ( // Router is a Queue implementation that routes events // to handlers declared in operation lists. type Router struct { - pointer struct { + savedTrans []f32.Affine2D + transStack []f32.Affine2D + pointer struct { queue pointerQueue collector pointerCollector } @@ -135,11 +138,13 @@ func (q *Router) Cursor() pointer.CursorName { } func (q *Router) collect() { + q.transStack = q.transStack[:0] pc := &q.pointer.collector pc.reset(&q.pointer.queue) kc := &q.key.collector *kc = keyCollector{q: &q.key.queue} q.key.queue.Reset() + var t f32.Affine2D for encOp, ok := q.reader.Decode(); ok; encOp, ok = q.reader.Decode() { switch ops.OpType(encOp.Data[0]) { case ops.TypeInvalidate: @@ -160,10 +165,15 @@ func (q *Router) collect() { q.cqueue.ProcessWriteClipboard(encOp.Refs) case ops.TypeSave: id := ops.DecodeSave(encOp.Data) - pc.save(id) + if extra := id - len(q.savedTrans) + 1; extra > 0 { + q.savedTrans = append(q.savedTrans, make([]f32.Affine2D, extra)...) + } + q.savedTrans[id] = t case ops.TypeLoad: id := ops.DecodeLoad(encOp.Data) - pc.load(id) + t = q.savedTrans[id] + pc.resetState() + pc.setTrans(t) // Pointer ops. case ops.TypeClip: @@ -177,10 +187,17 @@ func (q *Router) collect() { case ops.TypePopPass: pc.popPass() case ops.TypeTransform: - t, push := ops.DecodeTransform(encOp.Data) - pc.transform(t, push) + t2, push := ops.DecodeTransform(encOp.Data) + if push { + q.transStack = append(q.transStack, t) + } + t = t.Mul(t2) + pc.setTrans(t) case ops.TypePopTransform: - pc.popTransform() + n := len(q.transStack) + t = q.transStack[n-1] + q.transStack = q.transStack[:n-1] + pc.setTrans(t) case ops.TypePointerInput: bo := binary.LittleEndian op := pointer.InputOp{