mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 18:05:35 +00:00
op/clip,gpu,internal/opconst: remove quad count from Path op
The check for path segments in gpu is redundant; clip.Op.Add doesn't add the Path op if there were no segments. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+7
-20
@@ -168,18 +168,8 @@ func decodeStrokeOp(data []byte) clip.StrokeStyle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type quadsOp struct {
|
type quadsOp struct {
|
||||||
quads uint32
|
key ops.Key
|
||||||
key ops.Key
|
aux []byte
|
||||||
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:])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type material struct {
|
type material struct {
|
||||||
@@ -922,15 +912,12 @@ loop:
|
|||||||
stroke = decodeStrokeOp(encOp.Data)
|
stroke = decodeStrokeOp(encOp.Data)
|
||||||
|
|
||||||
case opconst.TypePath:
|
case opconst.TypePath:
|
||||||
quads.quads = decodeQuadsOp(encOp.Data)
|
encOp, ok = r.Decode()
|
||||||
if quads.quads > 0 {
|
if !ok {
|
||||||
encOp, ok = r.Decode()
|
break loop
|
||||||
if !ok {
|
|
||||||
break loop
|
|
||||||
}
|
|
||||||
quads.aux = encOp.Data[opconst.TypeAuxLen:]
|
|
||||||
quads.key = encOp.Key
|
|
||||||
}
|
}
|
||||||
|
quads.aux = encOp.Data[opconst.TypeAuxLen:]
|
||||||
|
quads.key = encOp.Key
|
||||||
|
|
||||||
case opconst.TypeClip:
|
case opconst.TypeClip:
|
||||||
var op clipOp
|
var op clipOp
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ const (
|
|||||||
TypeClipLen = 1 + 4*4 + 1
|
TypeClipLen = 1 + 4*4 + 1
|
||||||
TypeProfileLen = 1
|
TypeProfileLen = 1
|
||||||
TypeCursorLen = 1 + 1
|
TypeCursorLen = 1 + 1
|
||||||
TypePathLen = 1 + 4
|
TypePathLen = 1
|
||||||
TypeStrokeLen = 1 + 4 + 4 + 1 + 1
|
TypeStrokeLen = 1 + 4 + 4 + 1 + 1
|
||||||
TypeDashLen = 1 + 4 + 1
|
TypeDashLen = 1 + 4 + 1
|
||||||
)
|
)
|
||||||
|
|||||||
+15
-16
@@ -25,11 +25,9 @@ type Op struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p Op) Add(o *op.Ops) {
|
func (p Op) Add(o *op.Ops) {
|
||||||
if p.path.quads > 0 {
|
if p.path.hasSegments {
|
||||||
data := o.Write(opconst.TypePathLen)
|
data := o.Write(opconst.TypePathLen)
|
||||||
data[0] = byte(opconst.TypePath)
|
data[0] = byte(opconst.TypePath)
|
||||||
bo := binary.LittleEndian
|
|
||||||
bo.PutUint32(data[1:], p.path.quads)
|
|
||||||
p.path.spec.Add(o)
|
p.path.spec.Add(o)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,8 +66,9 @@ type PathSpec struct {
|
|||||||
spec op.CallOp
|
spec op.CallOp
|
||||||
// open is true if any path contour is not closed. A closed contour starts
|
// open is true if any path contour is not closed. A closed contour starts
|
||||||
// and ends in the same point.
|
// and ends in the same point.
|
||||||
open bool
|
open bool
|
||||||
quads uint32 // quads is the number Bézier segments in the path.
|
// 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
|
// 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
|
// Path generates no garbage and can be used for dynamic paths; path
|
||||||
// data is stored directly in the Ops list supplied to Begin.
|
// data is stored directly in the Ops list supplied to Begin.
|
||||||
type Path struct {
|
type Path struct {
|
||||||
ops *op.Ops
|
ops *op.Ops
|
||||||
open bool
|
open bool
|
||||||
contour int
|
contour int
|
||||||
pen f32.Point
|
pen f32.Point
|
||||||
macro op.MacroOp
|
macro op.MacroOp
|
||||||
start f32.Point
|
start f32.Point
|
||||||
quads uint32
|
hasSegments bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pos returns the current pen position.
|
// Pos returns the current pen position.
|
||||||
@@ -105,9 +104,9 @@ func (p *Path) Begin(ops *op.Ops) {
|
|||||||
func (p *Path) End() PathSpec {
|
func (p *Path) End() PathSpec {
|
||||||
c := p.macro.Stop()
|
c := p.macro.Stop()
|
||||||
return PathSpec{
|
return PathSpec{
|
||||||
spec: c,
|
spec: c,
|
||||||
open: p.open || p.pen != p.start,
|
open: p.open || p.pen != p.start,
|
||||||
quads: p.quads,
|
hasSegments: p.hasSegments,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,7 +161,7 @@ func (p *Path) QuadTo(ctrl, to f32.Point) {
|
|||||||
To: to,
|
To: to,
|
||||||
})
|
})
|
||||||
p.pen = to
|
p.pen = to
|
||||||
p.quads++
|
p.hasSegments = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Arc adds an elliptical arc to the path. The implied ellipse is defined
|
// Arc adds an elliptical arc to the path. The implied ellipse is defined
|
||||||
|
|||||||
Reference in New Issue
Block a user