line widths now work more like the html5 canvas

This commit is contained in:
Thomas Friedel 2018-05-17 16:24:29 +02:00
parent a42e694c47
commit 0efc4c6d59
2 changed files with 19 additions and 3 deletions

View file

@ -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) {
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

View file

@ -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[:])
}