func (dw *DrawingWand) Line(sx, sy, ex, ey float64) {
	C.MagickDrawLine(dw.dw, C.double(sx), C.double(sy), C.double(ex), C.double(ey))
}
Draws a line on the image using the current stroke color, stroke opacity,
and stroke width.

sx: starting x ordinate

sy: starting y ordinate

ex: ending x ordinate

ey: ending y ordinate
package gmagick
import (
	"runtime"
	"sync"
	"sync/atomic"
	"unsafe"
)
import "C"
type DrawingWand struct {
	dw   *C.DrawingWand
	init sync.Once
}
func newDrawingWand(cdw *C.DrawingWand) *DrawingWand {
	dw := &DrawingWand{dw: cdw}
	runtime.SetFinalizer(dw, Destroy)
	dw.IncreaseCount()
	return dw
}
func NewDrawingWand() *DrawingWand {
	return newDrawingWand(C.NewDrawingWand())
}
func (dw *DrawingWand) Clone() *DrawingWand {
	return newDrawingWand(C.CloneDrawingWand(dw.dw))
}
func (dw *DrawingWand) Destroy() {
	if dw.dw == nil {
		return
	}
	dw.init.Do(func() {
		C.DestroyDrawingWand(dw.dw)
		dw.dw = nil
		dw.DecreaseCount()
	})
}
func (dw *DrawingWand) IncreaseCount() {
	atomic.AddInt64(&drawingWandCounter, int64(1))
	unsetCanTerminate()
}
func (dw *DrawingWand) DecreaseCount() {
	atomic.AddInt64(&drawingWandCounter, int64(-1))
	setCanTerminate()
}
func (dw *DrawingWand) Affine(affine *AffineMatrix) {
	C.MagickDrawAffine(dw.dw, affine.ptr())
}
func (dw *DrawingWand) Annotation(x, y float64, text string) {
	cstext := (*C.uchar)((unsafe.Pointer)(C.CString(text)))
	defer C.free(unsafe.Pointer(cstext))
	C.MagickDrawAnnotation(dw.dw, C.double(x), C.double(y), cstext)
}
func (dw *DrawingWand) Arc(sx, sy, ex, ey, sd, ed float64) {
	C.MagickDrawArc(dw.dw, C.double(sx), C.double(sy), C.double(ex), C.double(ey), C.double(sd), C.double(ed))
}
func (dw *DrawingWand) Bezier(coordinates []PointInfo) {
	ccoordinates := [1 << 16]C.PointInfo{}
	for k, v := range coordinates {
		ccoordinates[k] = C.PointInfo{C.double(v.X), C.double(v.Y)}
	}
	C.MagickDrawBezier(dw.dw, C.ulong(len(coordinates)), (*C.PointInfo)(&ccoordinates[0]))
}
func (dw *DrawingWand) Circle(ox, oy, px, py float64) {
	C.MagickDrawCircle(dw.dw, C.double(ox), C.double(oy), C.double(px), C.double(py))
}
func (dw *DrawingWand) Composite(compose CompositeOperator, x, y, width, height float64, mw *MagickWand) {
	C.draw_composite(dw.dw, C.CompositeOperator(compose), C.double(x), C.double(y), C.double(width), C.double(height), mw.mw)
}
func (dw *DrawingWand) Color(x, y float64, pm PaintMethod) {
	C.MagickDrawColor(dw.dw, C.double(x), C.double(y), C.PaintMethod(pm))
}
func (dw *DrawingWand) Comment(comment string) {
	cscomment := C.CString(comment)
	defer C.free(unsafe.Pointer(cscomment))
	C.MagickDrawComment(dw.dw, cscomment)
}
func (dw *DrawingWand) Ellipse(ox, oy, rx, ry, start, end float64) {
	C.MagickDrawEllipse(dw.dw, C.double(ox), C.double(oy), C.double(rx), C.double(ry), C.double(start), C.double(end))
}
func (dw *DrawingWand) GetClipPath() string {
	cscp := C.MagickDrawGetClipPath(dw.dw)
	defer C.MagickRelinquishMemory(unsafe.Pointer(cscp))
	return C.GoString(cscp)
}
func (dw *DrawingWand) GetClipRule() FillRule {
	return FillRule(C.MagickDrawGetClipRule(dw.dw))
}
func (dw *DrawingWand) GetClipUnits() ClipPathUnits {
	return ClipPathUnits(C.MagickDrawGetClipUnits(dw.dw))
}
func (dw *DrawingWand) GetFillColor() (pw *PixelWand) {
	pw = NewPixelWand()
	C.MagickDrawGetFillColor(dw.dw, pw.pw)
	return
}
func (dw *DrawingWand) GetFillOpacity() float64 {
	return float64(C.MagickDrawGetFillOpacity(dw.dw))
}
func (dw *DrawingWand) GetFillRule() FillRule {
	return FillRule(C.MagickDrawGetFillRule(dw.dw))
}
func (dw *DrawingWand) GetFont() string {
	csfont := C.DrawGetFont(dw.dw)
	defer C.MagickRelinquishMemory(unsafe.Pointer(csfont))
	return C.GoString(csfont)
}
func (dw *DrawingWand) GetFontFamily() string {
	csfamily := C.MagickDrawGetFontFamily(dw.dw)
	defer C.MagickRelinquishMemory(unsafe.Pointer(csfamily))
	return C.GoString(csfamily)
}
func (dw *DrawingWand) GetFontSize() float64 {
	return float64(C.MagickDrawGetFontSize(dw.dw))
}
func (dw *DrawingWand) GetFontStretch() StretchType {
	return StretchType(C.MagickDrawGetFontStretch(dw.dw))
}
func (dw *DrawingWand) GetFontStyle() StyleType {
	return StyleType(C.MagickDrawGetFontStyle(dw.dw))
}
func (dw *DrawingWand) GetFontWeight() uint {
	return uint(C.MagickDrawGetFontWeight(dw.dw))
}
func (dw *DrawingWand) GetGravity() GravityType {
	return GravityType(C.MagickDrawGetGravity(dw.dw))
}
func (dw *DrawingWand) GetStrokeAntialias() bool {
	return 1 == C.MagickDrawGetStrokeAntialias(dw.dw)
}
func (dw *DrawingWand) GetStrokeColor() (pw *PixelWand) {
	pw = NewPixelWand()
	C.MagickDrawGetStrokeColor(dw.dw, pw.pw)
	return
}
func (dw *DrawingWand) GetStrokeDashArray() (nums []float64) {
	count := C.ulong(0)
	p := C.MagickDrawGetStrokeDashArray(dw.dw, &count)
	nums = sizedDoubleArrayToFloat64Slice(p, count)
	return
}
func (dw *DrawingWand) GetStrokeDashOffset() float64 {
	return float64(C.MagickDrawGetStrokeDashOffset(dw.dw))
}
func (dw *DrawingWand) GetStrokeLineCap() LineCap {
	return LineCap(C.MagickDrawGetStrokeLineCap(dw.dw))
}
func (dw *DrawingWand) GetStrokeLineJoin() LineJoin {
	return LineJoin(C.MagickDrawGetStrokeLineJoin(dw.dw))
}
func (dw *DrawingWand) GetStrokeMiterLimit() uint {
	return uint(C.MagickDrawGetStrokeMiterLimit(dw.dw))
}
func (dw *DrawingWand) GetStrokeOpacity() float64 {
	return float64(C.MagickDrawGetStrokeOpacity(dw.dw))
}
func (dw *DrawingWand) GetStrokeWidth() float64 {
	return float64(C.MagickDrawGetStrokeWidth(dw.dw))
}
func (dw *DrawingWand) GetTextAntialias() bool {
	return 1 == C.MagickDrawGetTextAntialias(dw.dw)
}
func (dw *DrawingWand) GetTextDecoration() DecorationType {
	return DecorationType(C.MagickDrawGetTextDecoration(dw.dw))
}
func (dw *DrawingWand) GetTextEncoding() string {
	cstr := C.MagickDrawGetTextEncoding(dw.dw)
	defer C.MagickRelinquishMemory(unsafe.Pointer(cstr))
	return C.GoString(cstr)
}
func (dw *DrawingWand) GetTextUnderColor() (pw *PixelWand) {
	pw = NewPixelWand()
	C.MagickDrawGetTextUnderColor(dw.dw, pw.pw)
	return
}