diff --git a/canvas.go b/canvas.go index be3cb49..9937ae7 100644 --- a/canvas.go +++ b/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) { diff --git a/paths.go b/paths.go index 27266d9..97f4e6d 100644 --- a/paths.go +++ b/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) }