diff --git a/io/router/pointer.go b/io/router/pointer.go index 8680ebde..18d1d921 100644 --- a/io/router/pointer.go +++ b/io/router/pointer.go @@ -409,7 +409,7 @@ func searchTag(tags []event.Tag, tag event.Tag) (int, bool) { } func opDecodeFloat32(d []byte) float32 { - return float32(binary.LittleEndian.Uint32(d)) + return float32(int32(binary.LittleEndian.Uint32(d))) } func (op *areaOp) Decode(d []byte) { diff --git a/io/router/pointer_test.go b/io/router/pointer_test.go index 7f876068..82c79642 100644 --- a/io/router/pointer_test.go +++ b/io/router/pointer_test.go @@ -57,6 +57,28 @@ func TestPointerDrag(t *testing.T) { assertEventSequence(t, r.Events(handler), pointer.Cancel, pointer.Enter, pointer.Press, pointer.Leave, pointer.Drag) } +func TestPointerDragNegative(t *testing.T) { + handler := new(int) + var ops op.Ops + addPointerHandler(&ops, handler, image.Rect(-100, -100, 0, 0)) + + var r Router + r.Frame(&ops) + r.Queue( + // Press. + pointer.Event{ + Type: pointer.Press, + Position: f32.Pt(-50, -50), + }, + // Move outside the area. + pointer.Event{ + Type: pointer.Move, + Position: f32.Pt(-150, -150), + }, + ) + assertEventSequence(t, r.Events(handler), pointer.Cancel, pointer.Enter, pointer.Press, pointer.Leave, pointer.Drag) +} + func TestPointerMove(t *testing.T) { handler1 := new(int) handler2 := new(int)