forked from joejulian/gio
io/router: make the zero value collectState the reset state
Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+14
-18
@@ -79,9 +79,11 @@ type areaKind uint8
|
|||||||
|
|
||||||
// collectState represents the state for collectHandlers
|
// collectState represents the state for collectHandlers
|
||||||
type collectState struct {
|
type collectState struct {
|
||||||
t f32.Affine2D
|
t f32.Affine2D
|
||||||
node int
|
// nodePlusOne is the current node index, plus one to
|
||||||
pass int
|
// make the zero value collectState the initial state.
|
||||||
|
nodePlusOne int
|
||||||
|
pass int
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -98,39 +100,33 @@ func (q *pointerQueue) save(id int, state f32.Affine2D) {
|
|||||||
|
|
||||||
func (q *pointerQueue) collectHandlers(r *ops.Reader, events *handlerEvents) {
|
func (q *pointerQueue) collectHandlers(r *ops.Reader, events *handlerEvents) {
|
||||||
var state collectState
|
var state collectState
|
||||||
reset := func() {
|
|
||||||
state = collectState{
|
|
||||||
node: -1,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
reset()
|
|
||||||
for encOp, ok := r.Decode(); ok; encOp, ok = r.Decode() {
|
for encOp, ok := r.Decode(); ok; encOp, ok = r.Decode() {
|
||||||
switch ops.OpType(encOp.Data[0]) {
|
switch ops.OpType(encOp.Data[0]) {
|
||||||
case ops.TypeSave:
|
case ops.TypeSave:
|
||||||
id := ops.DecodeSave(encOp.Data)
|
id := ops.DecodeSave(encOp.Data)
|
||||||
q.save(id, state.t)
|
q.save(id, state.t)
|
||||||
case ops.TypeLoad:
|
case ops.TypeLoad:
|
||||||
reset()
|
state = collectState{}
|
||||||
id := ops.DecodeLoad(encOp.Data)
|
id := ops.DecodeLoad(encOp.Data)
|
||||||
state.t = q.states[id]
|
state.t = q.states[id]
|
||||||
case ops.TypeArea:
|
case ops.TypeArea:
|
||||||
var op areaOp
|
var op areaOp
|
||||||
op.Decode(encOp.Data)
|
op.Decode(encOp.Data)
|
||||||
area := -1
|
area := -1
|
||||||
if i := state.node; i != -1 {
|
if i := state.nodePlusOne - 1; i != -1 {
|
||||||
n := q.hitTree[i]
|
n := q.hitTree[i]
|
||||||
area = n.area
|
area = n.area
|
||||||
}
|
}
|
||||||
q.areas = append(q.areas, areaNode{trans: state.t, next: area, area: op, pass: state.pass > 0})
|
q.areas = append(q.areas, areaNode{trans: state.t, next: area, area: op, pass: state.pass > 0})
|
||||||
q.nodeStack = append(q.nodeStack, state.node)
|
q.nodeStack = append(q.nodeStack, state.nodePlusOne-1)
|
||||||
q.hitTree = append(q.hitTree, hitNode{
|
q.hitTree = append(q.hitTree, hitNode{
|
||||||
next: state.node,
|
next: state.nodePlusOne - 1,
|
||||||
area: len(q.areas) - 1,
|
area: len(q.areas) - 1,
|
||||||
})
|
})
|
||||||
state.node = len(q.hitTree) - 1
|
state.nodePlusOne = len(q.hitTree) - 1 + 1
|
||||||
case ops.TypePopArea:
|
case ops.TypePopArea:
|
||||||
n := len(q.nodeStack)
|
n := len(q.nodeStack)
|
||||||
state.node = q.nodeStack[n-1]
|
state.nodePlusOne = q.nodeStack[n-1] + 1
|
||||||
q.nodeStack = q.nodeStack[:n-1]
|
q.nodeStack = q.nodeStack[:n-1]
|
||||||
case ops.TypePass:
|
case ops.TypePass:
|
||||||
state.pass++
|
state.pass++
|
||||||
@@ -154,16 +150,16 @@ func (q *pointerQueue) collectHandlers(r *ops.Reader, events *handlerEvents) {
|
|||||||
Types: pointer.Type(bo.Uint16(encOp.Data[2:])),
|
Types: pointer.Type(bo.Uint16(encOp.Data[2:])),
|
||||||
}
|
}
|
||||||
area := -1
|
area := -1
|
||||||
if i := state.node; i != -1 {
|
if i := state.nodePlusOne - 1; i != -1 {
|
||||||
n := q.hitTree[i]
|
n := q.hitTree[i]
|
||||||
area = n.area
|
area = n.area
|
||||||
}
|
}
|
||||||
q.hitTree = append(q.hitTree, hitNode{
|
q.hitTree = append(q.hitTree, hitNode{
|
||||||
next: state.node,
|
next: state.nodePlusOne - 1,
|
||||||
area: area,
|
area: area,
|
||||||
tag: op.Tag,
|
tag: op.Tag,
|
||||||
})
|
})
|
||||||
state.node = len(q.hitTree) - 1
|
state.nodePlusOne = len(q.hitTree) - 1 + 1
|
||||||
h, ok := q.handlers[op.Tag]
|
h, ok := q.handlers[op.Tag]
|
||||||
if !ok {
|
if !ok {
|
||||||
h = new(pointerHandler)
|
h = new(pointerHandler)
|
||||||
|
|||||||
Reference in New Issue
Block a user