added StrokePath and FillPath functions
This commit is contained in:
parent
7ce0b7bf9d
commit
f77841e973
1 changed files with 34 additions and 29 deletions
63
paths.go
63
paths.go
|
@ -70,28 +70,27 @@ func (cv *Canvas) ClosePath() {
|
||||||
cv.path.ClosePath()
|
cv.path.ClosePath()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stroke uses the current StrokeStyle to draw the path
|
// Stroke uses the current StrokeStyle to draw the current path
|
||||||
func (cv *Canvas) Stroke(params ...interface{}) {
|
func (cv *Canvas) Stroke() {
|
||||||
if len(params) > 0 {
|
cv.strokePath(&cv.path)
|
||||||
if p, ok := params[0].(*Path2D); ok {
|
|
||||||
for i := range p.p {
|
|
||||||
p.p[i].tf = cv.tf(p.p[i].pos)
|
|
||||||
}
|
|
||||||
cv.stroke(p.p)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cv.stroke(cv.path.p)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cv *Canvas) stroke(path []pathPoint) {
|
// StrokePath uses the current StrokeStyle to draw the given path
|
||||||
if len(path) == 0 {
|
func (cv *Canvas) StrokePath(path *Path2D) {
|
||||||
|
for i := range path.p {
|
||||||
|
path.p[i].tf = cv.tf(path.p[i].pos)
|
||||||
|
}
|
||||||
|
cv.strokePath(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cv *Canvas) strokePath(path *Path2D) {
|
||||||
|
if len(path.p) == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
cv.activate()
|
cv.activate()
|
||||||
|
|
||||||
path = cv.applyLineDash(path)
|
dashedPath := cv.applyLineDash(path.p)
|
||||||
|
|
||||||
var triBuf [1000]float32
|
var triBuf [1000]float32
|
||||||
tris := triBuf[:0]
|
tris := triBuf[:0]
|
||||||
|
@ -99,7 +98,7 @@ func (cv *Canvas) stroke(path []pathPoint) {
|
||||||
|
|
||||||
start := true
|
start := true
|
||||||
var p0 vec
|
var p0 vec
|
||||||
for _, p := range path {
|
for _, p := range dashedPath {
|
||||||
if p.flags&pathMove != 0 {
|
if p.flags&pathMove != 0 {
|
||||||
p0 = p.tf
|
p0 = p.tf
|
||||||
start = true
|
start = true
|
||||||
|
@ -374,9 +373,14 @@ func lineIntersection(a0, a1, b0, b1 vec) (vec, float64, float64) {
|
||||||
return a0.add(va.mulf(p)), p, q
|
return a0.add(va.mulf(p)), p, q
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill fills the current path with the given FillStyle
|
// Fill fills the current path with the current FillStyle
|
||||||
func (cv *Canvas) Fill() {
|
func (cv *Canvas) Fill() {
|
||||||
if len(cv.path.p) < 3 {
|
cv.FillPath(&cv.path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FillPath fills the given path with the current FillStyle
|
||||||
|
func (cv *Canvas) FillPath(path *Path2D) {
|
||||||
|
if len(path.p) < 3 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cv.activate()
|
cv.activate()
|
||||||
|
@ -386,17 +390,17 @@ func (cv *Canvas) Fill() {
|
||||||
tris = append(tris, 0, 0, float32(cv.fw), 0, float32(cv.fw), float32(cv.fh), 0, 0, float32(cv.fw), float32(cv.fh), 0, float32(cv.fh))
|
tris = append(tris, 0, 0, float32(cv.fw), 0, float32(cv.fw), float32(cv.fh), 0, 0, float32(cv.fw), float32(cv.fh), 0, float32(cv.fh))
|
||||||
|
|
||||||
start := 0
|
start := 0
|
||||||
for i, p := range cv.path.p {
|
for i, p := range path.p {
|
||||||
if p.flags&pathMove == 0 {
|
if p.flags&pathMove == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if i >= start+3 {
|
if i >= start+3 {
|
||||||
tris = cv.appendSubPathTriangles(tris, cv.path.p[start:i])
|
tris = cv.appendSubPathTriangles(tris, path.p[start:i])
|
||||||
}
|
}
|
||||||
start = i
|
start = i
|
||||||
}
|
}
|
||||||
if len(cv.path.p) >= start+3 {
|
if len(path.p) >= start+3 {
|
||||||
tris = cv.appendSubPathTriangles(tris, cv.path.p[start:])
|
tris = cv.appendSubPathTriangles(tris, path.p[start:])
|
||||||
}
|
}
|
||||||
if len(tris) == 0 {
|
if len(tris) == 0 {
|
||||||
return
|
return
|
||||||
|
@ -594,13 +598,14 @@ func (cv *Canvas) StrokeRect(x, y, w, h float64) {
|
||||||
v2 := vec{x + w, y + h}
|
v2 := vec{x + w, y + h}
|
||||||
v3 := vec{x, y + h}
|
v3 := vec{x, y + h}
|
||||||
v0t, v1t, v2t, v3t := cv.tf(v0), cv.tf(v1), cv.tf(v2), cv.tf(v3)
|
v0t, v1t, v2t, v3t := cv.tf(v0), cv.tf(v1), cv.tf(v2), cv.tf(v3)
|
||||||
var path [5]pathPoint
|
var p [5]pathPoint
|
||||||
path[0] = pathPoint{pos: v0, tf: v0t, flags: pathMove | pathAttach, next: v1t}
|
p[0] = pathPoint{pos: v0, tf: v0t, flags: pathMove | pathAttach, next: v1t}
|
||||||
path[1] = pathPoint{pos: v1, tf: v1t, next: v2t, flags: pathAttach}
|
p[1] = pathPoint{pos: v1, tf: v1t, next: v2t, flags: pathAttach}
|
||||||
path[2] = pathPoint{pos: v2, tf: v2t, next: v3t, flags: pathAttach}
|
p[2] = pathPoint{pos: v2, tf: v2t, next: v3t, flags: pathAttach}
|
||||||
path[3] = pathPoint{pos: v3, tf: v3t, next: v0t, flags: pathAttach}
|
p[3] = pathPoint{pos: v3, tf: v3t, next: v0t, flags: pathAttach}
|
||||||
path[4] = pathPoint{pos: v0, tf: v0t, next: v1t, flags: pathAttach}
|
p[4] = pathPoint{pos: v0, tf: v0t, next: v1t, flags: pathAttach}
|
||||||
cv.stroke(path[:])
|
path := Path2D{p: p[:]}
|
||||||
|
cv.strokePath(&path)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FillRect fills a rectangle with the active fill style
|
// FillRect fills a rectangle with the active fill style
|
||||||
|
|
Loading…
Reference in a new issue