~eliasnaur/gio

872b4ba41be0d8b476d1cfd419d9bd9c94e2dc10 — Pierre Curto 5 months ago e6e6981
op/clip: fix Path open state

If a Move/MoveTo did not move the pen, the Path
was still set as open.

Signed-off-by: Pierre Curto <pierre.curto@gmail.com>
2 files changed, 32 insertions(+), 10 deletions(-)

M op/clip/clip.go
M op/clip/clip_test.go
M op/clip/clip.go => op/clip/clip.go +3 -0
@@ 154,6 154,9 @@ func (p *Path) Move(delta f32.Point) {

// MoveTo moves the pen to the specified absolute coordinate.
func (p *Path) MoveTo(to f32.Point) {
	if p.pen == to {
		return
	}
	p.open = p.open || p.pen != p.start
	p.end()
	p.pen = to

M op/clip/clip_test.go => op/clip/clip_test.go +29 -10
@@ 4,6 4,7 @@ package clip_test

import (
	"image/color"
	"math"
	"testing"

	"gioui.org/f32"


@@ 13,16 14,34 @@ import (
	"gioui.org/op/paint"
)

func TestOpenPathOutlinePanic(t *testing.T) {
	defer func() {
		if err := recover(); err == nil {
			t.Error("Outline of an open path didn't panic")
		}
	}()
	var p clip.Path
	p.Begin(new(op.Ops))
	p.Line(f32.Pt(10, 10))
	clip.Outline{Path: p.End()}.Op()
func TestPathOutline(t *testing.T) {
	t.Run("unclosed path", func(t *testing.T) {
		defer func() {
			if err := recover(); err == nil {
				t.Error("Outline of an open path didn't panic")
			}
		}()
		var p clip.Path
		p.Begin(new(op.Ops))
		p.Line(f32.Pt(10, 10))
		clip.Outline{Path: p.End()}.Op()
	})
	t.Run("closed path", func(t *testing.T) {
		defer func() {
			if err := recover(); err != nil {
				t.Error("Outline of a closed path did panic")
			}
		}()
		var p clip.Path
		p.Begin(new(op.Ops))
		p.MoveTo(f32.Pt(300, 200))
		p.LineTo(f32.Pt(150, 200))
		p.MoveTo(f32.Pt(150, 200))
		p.ArcTo(f32.Pt(300, 200), f32.Pt(300, 200), 3*math.Pi/4)
		p.LineTo(f32.Pt(300, 200))
		p.Close()
		clip.Outline{Path: p.End()}.Op()
	})
}

func TestPathBegin(t *testing.T) {