diff --git a/gpu/gpu.go b/gpu/gpu.go index afb7199c..efa3c0f7 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -168,18 +168,8 @@ func decodeStrokeOp(data []byte) clip.StrokeStyle { } type quadsOp struct { - quads uint32 - key ops.Key - aux []byte -} - -func decodeQuadsOp(data []byte) uint32 { - _ = data[:1+4] - if opconst.OpType(data[0]) != opconst.TypePath { - panic("invalid op") - } - bo := binary.LittleEndian - return bo.Uint32(data[1:]) + key ops.Key + aux []byte } type material struct { @@ -922,15 +912,12 @@ loop: stroke = decodeStrokeOp(encOp.Data) case opconst.TypePath: - quads.quads = decodeQuadsOp(encOp.Data) - if quads.quads > 0 { - encOp, ok = r.Decode() - if !ok { - break loop - } - quads.aux = encOp.Data[opconst.TypeAuxLen:] - quads.key = encOp.Key + encOp, ok = r.Decode() + if !ok { + break loop } + quads.aux = encOp.Data[opconst.TypeAuxLen:] + quads.key = encOp.Key case opconst.TypeClip: var op clipOp diff --git a/internal/opconst/ops.go b/internal/opconst/ops.go index 8e9a1a35..002bf31f 100644 --- a/internal/opconst/ops.go +++ b/internal/opconst/ops.go @@ -60,7 +60,7 @@ const ( TypeClipLen = 1 + 4*4 + 1 TypeProfileLen = 1 TypeCursorLen = 1 + 1 - TypePathLen = 1 + 4 + TypePathLen = 1 TypeStrokeLen = 1 + 4 + 4 + 1 + 1 TypeDashLen = 1 + 4 + 1 ) diff --git a/op/clip/clip.go b/op/clip/clip.go index d32da87b..3a2cd9e3 100644 --- a/op/clip/clip.go +++ b/op/clip/clip.go @@ -25,11 +25,9 @@ type Op struct { } func (p Op) Add(o *op.Ops) { - if p.path.quads > 0 { + if p.path.hasSegments { data := o.Write(opconst.TypePathLen) data[0] = byte(opconst.TypePath) - bo := binary.LittleEndian - bo.PutUint32(data[1:], p.path.quads) p.path.spec.Add(o) } @@ -68,8 +66,9 @@ type PathSpec struct { spec op.CallOp // open is true if any path contour is not closed. A closed contour starts // and ends in the same point. - open bool - quads uint32 // quads is the number Bézier segments in the path. + open bool + // hasSegments tracks whether there is more than one path segment in the path. + hasSegments bool } // Path constructs a Op clip path described by lines and @@ -80,13 +79,13 @@ type PathSpec struct { // Path generates no garbage and can be used for dynamic paths; path // data is stored directly in the Ops list supplied to Begin. type Path struct { - ops *op.Ops - open bool - contour int - pen f32.Point - macro op.MacroOp - start f32.Point - quads uint32 + ops *op.Ops + open bool + contour int + pen f32.Point + macro op.MacroOp + start f32.Point + hasSegments bool } // Pos returns the current pen position. @@ -105,9 +104,9 @@ func (p *Path) Begin(ops *op.Ops) { func (p *Path) End() PathSpec { c := p.macro.Stop() return PathSpec{ - spec: c, - open: p.open || p.pen != p.start, - quads: p.quads, + spec: c, + open: p.open || p.pen != p.start, + hasSegments: p.hasSegments, } } @@ -162,7 +161,7 @@ func (p *Path) QuadTo(ctrl, to f32.Point) { To: to, }) p.pen = to - p.quads++ + p.hasSegments = true } // Arc adds an elliptical arc to the path. The implied ellipse is defined