clipping is now saved and restored
This commit is contained in:
parent
56f9d04c91
commit
3ead983efa
2 changed files with 18 additions and 1 deletions
10
canvas.go
10
canvas.go
|
@ -49,6 +49,8 @@ type drawState struct {
|
|||
lineDash []float32
|
||||
lineDashPoint int
|
||||
lineDashOffset float32
|
||||
|
||||
clip []pathPoint
|
||||
/*
|
||||
The current transformation matrix.
|
||||
The current clipping region.
|
||||
|
@ -264,8 +266,16 @@ func (cv *Canvas) Restore() {
|
|||
if l <= 0 {
|
||||
return
|
||||
}
|
||||
hadClip := len(cv.state.clip) > 0
|
||||
cv.state = cv.stateStack[l-1]
|
||||
cv.stateStack = cv.stateStack[:l-1]
|
||||
if len(cv.state.clip) > 0 {
|
||||
cv.clip(cv.state.clip)
|
||||
} else if hadClip {
|
||||
gli.StencilMask(0x02)
|
||||
gli.Clear(gl_STENCIL_BUFFER_BIT)
|
||||
gli.StencilMask(0xFF)
|
||||
}
|
||||
}
|
||||
|
||||
func (cv *Canvas) Scale(x, y float32) {
|
||||
|
|
9
paths.go
9
paths.go
|
@ -334,6 +334,10 @@ func (cv *Canvas) Clip() {
|
|||
return
|
||||
}
|
||||
|
||||
cv.clip(cv.polyPath)
|
||||
}
|
||||
|
||||
func (cv *Canvas) clip(path []pathPoint) {
|
||||
cv.activate()
|
||||
|
||||
gli.ColorMask(false, false, false, false)
|
||||
|
@ -353,7 +357,7 @@ func (cv *Canvas) Clip() {
|
|||
tris := buf[:0]
|
||||
tris = append(tris, -1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1)
|
||||
|
||||
tris = triangulatePath(cv.polyPath, tris)
|
||||
tris = triangulatePath(path, tris)
|
||||
total := len(tris)
|
||||
for i := 12; i < total; i += 2 {
|
||||
x, y := tris[i], tris[i+1]
|
||||
|
@ -373,4 +377,7 @@ func (cv *Canvas) Clip() {
|
|||
gli.StencilOp(gl_KEEP, gl_KEEP, gl_KEEP)
|
||||
gli.StencilMask(0xFF)
|
||||
gli.StencilFunc(gl_EQUAL, 0, 0xFF)
|
||||
|
||||
cv.state.clip = make([]pathPoint, len(cv.polyPath))
|
||||
copy(cv.state.clip, cv.polyPath)
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue