func (r *Dasher) QuadBezier(b, c fixed.Point26_6) {
	r.quadBezierf(r.sgm, b, c)
}
QuadBezier for dashing
package rasterx
import (
	"golang.org/x/image/math/fixed"
)
type Dasher struct {
	Stroker
	Dashes                    []fixed.Int26_6
	dashPlace                 int
	firstDashIsGap, dashIsGap bool
	deltaDash, DashOffset     fixed.Int26_6
	sgm                       Rasterx
}
func (r *Dasher) joinF() {
	if len(r.Dashes) == 0 || !r.inStroke || !r.dashIsGap {
		r.Stroker.joinF()
	}
}
func (r *Dasher) Start(a fixed.Point26_6) {
	if len(r.Dashes) > 0 {
		r.deltaDash = r.DashOffset
		r.dashIsGap = false
		r.dashPlace = 0
		for r.deltaDash > r.Dashes[r.dashPlace] {
			r.deltaDash -= r.Dashes[r.dashPlace]
			r.dashIsGap = !r.dashIsGap
			r.dashPlace++
			if r.dashPlace == len(r.Dashes) {
				r.dashPlace = 0
			}
		}
		r.firstDashIsGap = r.dashIsGap
	}
	r.Stroker.Start(a)
}
func (r *Dasher) lineF(b fixed.Point26_6) {
	var bnorm fixed.Point26_6
	a := r.a  
	ba := b.Sub(a)
	segLen := Length(ba)
	var nlt fixed.Int26_6
	if b == r.leadPoint.P {  
		bnorm = r.leadPoint.TNorm  
	} else {
		bnorm = turnPort90(ToLength(b.Sub(a), r.u))  
	}
	for segLen+r.deltaDash > r.Dashes[r.dashPlace] {
		nl := r.Dashes[r.dashPlace] - r.deltaDash
		nlt += nl
		r.dashLineStrokeBit(a.Add(ToLength(ba, nlt)), bnorm, false)
		r.dashIsGap = !r.dashIsGap
		segLen -= nl
		r.deltaDash = 0
		r.dashPlace++
		if r.dashPlace == len(r.Dashes) {
			r.dashPlace = 0
		}
	}
	r.deltaDash += segLen
	r.dashLineStrokeBit(b, bnorm, true)
}
func (r *Dasher) SetStroke(width, miterLimit fixed.Int26_6, capL, capT CapFunc, gp GapFunc, jm JoinMode, dashes []float64, dashOffset float64) {
	r.Stroker.SetStroke(width, miterLimit, capL, capT, gp, jm)
	r.Dashes = r.Dashes[:0]  
	if len(dashes) == 0 {
		r.sgm = &r.Stroker  
		return
	}
	oneIsPos := false  
	for _, v := range dashes {
		fv := fixed.Int26_6(v * 64)
		if fv <= 0 {  
			fv = 0
		} else {
			oneIsPos = true
		}
		r.Dashes = append(r.Dashes, fv)
	}
	if oneIsPos == false {
		r.Dashes = r.Dashes[:0]
		r.sgm = &r.Stroker  
		return
	}
	r.DashOffset = fixed.Int26_6(dashOffset * 64)
	r.sgm = r  
}
func (r *Dasher) Stop(isClosed bool) {
	if len(r.Dashes) == 0 {
		r.Stroker.Stop(isClosed)
		return
	}
	if r.inStroke == false {
		return
	}
	if isClosed && r.a != r.firstP.P {
		r.LineSeg(r.sgm, r.firstP.P)
	}
	ra := &r.Filler
	if isClosed && !r.firstDashIsGap && !r.dashIsGap {  
		a := r.a
		r.firstP.TNorm = r.leadPoint.TNorm
		r.firstP.RT = r.leadPoint.RT
		r.firstP.TTan = r.leadPoint.TTan
		ra.Start(r.firstP.P.Sub(r.firstP.TNorm))
		ra.Line(a.Sub(r.ln))
		ra.Start(a.Add(r.ln))
		ra.Line(r.firstP.P.Add(r.firstP.TNorm))
		r.Joiner(r.firstP)
		r.firstP.blackWidowMark(ra)
	} else {  
		if !r.dashIsGap {
			r.CapL(ra, r.leadPoint.P, r.leadPoint.TNorm)
		}
		if !r.firstDashIsGap {
			r.CapT(ra, r.firstP.P, Invert(r.firstP.LNorm))
		}
	}
	r.inStroke = false
}
func (r *Dasher) dashLineStrokeBit(b, bnorm fixed.Point26_6, dontClose bool) {
	if !r.dashIsGap {  
		a := r.a
		ra := &r.Filler
		ra.Start(b.Sub(bnorm))
		ra.Line(a.Sub(r.ln))
		ra.Start(a.Add(r.ln))
		ra.Line(b.Add(bnorm))
		if dontClose == false {
			r.CapL(ra, b, bnorm)
		}
	} else {  
		if dontClose == false {
			ra := &r.Filler
			r.CapT(ra, b, Invert(bnorm))
		}
	}
	r.a = b
	r.ln = bnorm
}
func (r *Dasher) Line(b fixed.Point26_6) {
	r.LineSeg(r.sgm, b)
}