func (dw *DrawingWand) PathEllipticArcRelative(rx, ry, xAxisRotation float64, largeArcFlag, sweepFlag bool, x, y float64) {
	C.MagickDrawPathEllipticArcRelative(dw.dw, C.double(rx), C.double(ry), C.double(xAxisRotation), b2i(largeArcFlag), b2i(sweepFlag), C.double(x), C.double(y))
}
Draws an elliptical arc from the current point to (x, y) using relative
coordinates. The size and orientation of the ellipse are defined by two
radii (rx, ry) and an xAxisRotation, which indicates how the ellipse as a
whole is rotated relative to the current coordinate system. The center (cx,
cy) of the ellipse is calculated automagically to satisfy the constraints
imposed by the other parameters. largeArcFlag and sweepFlag contribute to
the automatic calculations and help determine how the arc is drawn. If
largeArcFlag is true then draw the larger of the available arcs. If
sweepFlag is true, then draw the arc matching a clock-wise rotation.

rx, ry: x, y radius

xAxisRotation: indicates how the ellipse as a whole is rotated relative to
the current coordinate system

largeArcFlag: If true then draw the larger of the available arcs

sweepFlag: If true then draw the arc matching a clock-wise rotation
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
}
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))
}
func (dw *DrawingWand) Matte(x, y float64, pmethod PaintMethod) {
	C.MagickDrawMatte(dw.dw, C.double(x), C.double(y), C.PaintMethod(pmethod))
}
func (dw *DrawingWand) PathClose() {
	C.MagickDrawPathClose(dw.dw)
}
func (dw *DrawingWand) PathCurveToAbsolute(x1, y1, x2, y2, x, y float64) {
	C.MagickDrawPathCurveToAbsolute(dw.dw, C.double(x1), C.double(y1), C.double(x2), C.double(y2), C.double(x), C.double(y))
}
func (dw *DrawingWand) PathCurveToRelative(x1, y1, x2, y2, x, y float64) {
	C.MagickDrawPathCurveToRelative(dw.dw, C.double(x1), C.double(y1), C.double(x2), C.double(y2), C.double(x), C.double(y))
}
func (dw *DrawingWand) PathCurveToQuadraticBezierAbsolute(x1, y1, x, y float64) {
	C.MagickDrawPathCurveToQuadraticBezierAbsolute(dw.dw, C.double(x1), C.double(y1), C.double(x), C.double(y))
}
func (dw *DrawingWand) PathCurveToQuadraticBezierRelative(x1, y1, x, y float64) {
	C.MagickDrawPathCurveToQuadraticBezierRelative(dw.dw, C.double(x1), C.double(y1), C.double(x), C.double(y))
}
func (dw *DrawingWand) PathCurveToQuadraticBezierSmoothAbsolute(x, y float64) {
	C.MagickDrawPathCurveToQuadraticBezierSmoothAbsolute(dw.dw, C.double(x), C.double(y))
}
func (dw *DrawingWand) PathCurveToQuadraticBezierSmoothRelative(x, y float64) {
	C.MagickDrawPathCurveToQuadraticBezierSmoothRelative(dw.dw, C.double(x), C.double(y))
}
func (dw *DrawingWand) PathCurveToSmoothAbsolute(x2, y2, x, y float64) {
	C.MagickDrawPathCurveToSmoothAbsolute(dw.dw, C.double(x2), C.double(y2), C.double(x), C.double(y))
}
func (dw *DrawingWand) PathCurveToSmoothRelative(x2, y2, x, y float64) {
	C.MagickDrawPathCurveToSmoothRelative(dw.dw, C.double(x2), C.double(y2), C.double(x), C.double(y))
}
func (dw *DrawingWand) PathEllipticArcAbsolute(rx, ry, xAxisRotation float64, largeArcFlag, sweepFlag bool, x, y float64) {
	C.MagickDrawPathEllipticArcAbsolute(dw.dw, C.double(rx), C.double(ry), C.double(xAxisRotation), b2i(largeArcFlag), b2i(sweepFlag), C.double(x), C.double(y))
}