From 0efc4c6d59e48a5a29d9c3b96fe106640e4b0f56 Mon Sep 17 00:00:00 2001 From: Thomas Friedel Date: Thu, 17 May 2018 16:24:29 +0200 Subject: [PATCH] line widths now work more like the html5 canvas --- canvas.go | 12 +++++++++++- paths.go | 10 ++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/canvas.go b/canvas.go index 38aebc4..e43fb6a 100644 --- a/canvas.go +++ b/canvas.go @@ -33,6 +33,7 @@ type drawState struct { font *Font fontSize float64 textAlign textAlign + lineAlpha float64 lineWidth float64 lineJoin lineJoin lineEnd lineEnd @@ -474,7 +475,16 @@ func (cv *Canvas) useAlphaShader(style *drawStyle, alphaTexSlot int32) (vertexLo // SetLineWidth sets the line width for any line drawing calls func (cv *Canvas) SetLineWidth(width float64) { - cv.state.lineWidth = width + if width < 0 { + cv.state.lineWidth = 1 + cv.state.lineAlpha = 0 + } else if width < 1 { + cv.state.lineWidth = 1 + cv.state.lineAlpha = width + } else { + cv.state.lineWidth = width + cv.state.lineAlpha = 1 + } } // SetFont sets the font and font size. The font parameter can be a font loaded diff --git a/paths.go b/paths.go index dc9c7b8..9fddf57 100644 --- a/paths.go +++ b/paths.go @@ -349,7 +349,7 @@ func (cv *Canvas) stroke(path []pathPoint) { float32(lp0[0]), float32(lp0[1]), float32(lp1[0]), float32(lp1[1]), float32(lp3[0]), float32(lp3[1]), float32(lp0[0]), float32(lp0[1]), float32(lp3[0]), float32(lp3[1]), float32(lp2[0]), float32(lp2[1])) - if p.flags&pathAttach != 0 { + if p.flags&pathAttach != 0 && cv.state.lineWidth > 1 { tris = cv.lineJoint(p, p0, p1, p.next, lp0, lp1, lp2, lp3, tris) } @@ -378,7 +378,13 @@ func (cv *Canvas) stroke(path []pathPoint) { gli.StencilFunc(gl_EQUAL, 1, 0xFF) + origAlpha := cv.state.globalAlpha + if cv.state.lineAlpha < 1 { + cv.state.globalAlpha *= cv.state.lineAlpha + } vertex := cv.useShader(&cv.state.stroke) + cv.state.globalAlpha = origAlpha + gli.EnableVertexAttribArray(vertex) gli.VertexAttribPointer(vertex, 2, gl_FLOAT, false, 0, 0) gli.DrawArrays(gl_TRIANGLES, 0, 6) @@ -681,7 +687,7 @@ func (cv *Canvas) StrokeRect(x, y, w, h float64) { path[1] = pathPoint{pos: v1, tf: v1t, next: v2t, flags: pathAttach} path[2] = pathPoint{pos: v2, tf: v2t, next: v3t, flags: pathAttach} path[3] = pathPoint{pos: v3, tf: v3t, next: v0t, flags: pathAttach} - path[4] = pathPoint{pos: v0, tf: v0t} + path[4] = pathPoint{pos: v0, tf: v0t, next: v1t, flags: pathAttach} cv.stroke(path[:]) }