1// Copyright 2015 Google Inc. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Autogenerated by gen.go, do not edit.
16
17package cairo
18
19import (
20	"fmt"
21	"io"
22	"runtime"
23	"unsafe"
24)
25
26/*
27#cgo pkg-config: cairo
28#include <cairo.h>
29#if CAIRO_HAS_SVG_SURFACE
30#include <cairo-svg.h>
31#endif
32#if CAIRO_HAS_XLIB_SURFACE
33#include <cairo-xlib.h>
34#endif
35#include <stdlib.h>
36
37int gocairoWriteFunc(int key, const unsigned char* data, unsigned int length);
38int gocairoReadFunc(int key, const unsigned char* data, unsigned int length);
39
40// A cairo_write_func_t for use in cairo_surface_write_to_png.
41cairo_status_t gocairo_write_func(void *closure,
42                                  const unsigned char *data,
43                                  unsigned int length) {
44  return gocairoWriteFunc(*(int*)closure, data, length)
45    ? CAIRO_STATUS_SUCCESS
46    : CAIRO_STATUS_WRITE_ERROR;
47}
48
49// A cairo_read_func_t for use in cairo_image_surface_create_from_png_stream.
50cairo_status_t gocairo_read_func(void *closure,
51                                 const unsigned char *data,
52                                 unsigned int length) {
53  return gocairoReadFunc(*(int*)closure, data, length)
54    ? CAIRO_STATUS_SUCCESS
55    : CAIRO_STATUS_WRITE_ERROR;
56}
57*/
58import "C"
59
60// Error implements the error interface.
61func (s Status) Error() string {
62	return C.GoString(C.cairo_status_to_string(C.cairo_status_t(s)))
63}
64
65// WriteToPNG encodes a Surface to an io.Writer as a PNG file.
66func (surface *Surface) WriteToPNG(w io.Writer) error {
67	data := writeClosure{w: w}
68	key := goPointers.put(data)
69	status := C.cairo_surface_write_to_png_stream((*C.cairo_surface_t)(surface.Ptr),
70		(C.cairo_write_func_t)(unsafe.Pointer(C.gocairo_write_func)),
71		unsafe.Pointer(&key))
72	goPointers.clear(key)
73	// TODO: which should we prefer between writeClosure.err and status?
74	// Perhaps test against CAIRO_STATUS_WRITE_ERROR?  Needs a test case.
75	return Status(status).toError()
76}
77
78// ImageSurfaceCreateFromPNGStream creates an ImageSurface from a stream of
79// PNG data.
80func ImageSurfaceCreateFromPNGStream(r io.Reader) (*ImageSurface, error) {
81	data := readClosure{r: r}
82	key := goPointers.put(data)
83	surf := &ImageSurface{wrapSurface(C.cairo_image_surface_create_from_png_stream(
84		(C.cairo_read_func_t)(unsafe.Pointer(C.gocairo_read_func)),
85		unsafe.Pointer(&key)))}
86	goPointers.clear(key)
87	// TODO: which should we prefer between readClosure.err and status?
88	// Perhaps test against CAIRO_STATUS_WRITE_ERROR?  Needs a test case.
89	return surf, surf.status()
90}
91
92// PathIter creates an iterator over the segments within the path.
93func (p *Path) Iter() *PathIter {
94	return &PathIter{path: p, i: 0}
95}
96
97// PathIter iterates a Path.
98type PathIter struct {
99	path *Path
100	i    C.int
101}
102
103// Next returns the next PathSegment, or returns nil at the end of the path.
104func (pi *PathIter) Next() *PathSegment {
105	if pi.i >= pi.path.Ptr.num_data {
106		return nil
107	}
108	// path.data is an array of cairo_path_data_t, but the union makes
109	// things complicated.
110	dataArray := (*[1 << 30]C.cairo_path_data_t)(unsafe.Pointer(pi.path.Ptr.data))
111	seg, ofs := decodePathSegment(unsafe.Pointer(&dataArray[pi.i]))
112	pi.i += C.int(ofs)
113	return seg
114}
115
116type ImageSurface struct {
117	*Surface
118}
119type RecordingSurface struct {
120	*Surface
121}
122type SurfaceObserver struct {
123	*Surface
124}
125type ToyFontFace struct {
126	*FontFace
127}
128type MeshPattern struct {
129	*Pattern
130}
131type SVGSurface struct {
132	*Surface
133}
134type XlibSurface struct {
135	*Surface
136}
137type XlibDevice struct {
138	*Device
139}
140
141// See cairo_version().
142//
143// C API documentation: http://cairographics.org/manual/cairo-Version-Information.html#cairo-version
144func Version() int {
145	ret := int(C.cairo_version())
146	return ret
147}
148
149// See cairo_version_string().
150//
151// C API documentation: http://cairographics.org/manual/cairo-Version-Information.html#cairo-version-string
152func VersionString() string {
153	ret := C.GoString(C.cairo_version_string())
154	return ret
155}
156
157// See cairo_t.
158//
159// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-t
160type Context struct {
161	Ptr *C.cairo_t
162}
163
164func freeContext(obj *Context) {
165	C.cairo_destroy(obj.Ptr)
166}
167func wrapContext(p *C.cairo_t) *Context {
168	ret := &Context{p}
169	runtime.SetFinalizer(ret, freeContext)
170	return ret
171}
172
173// Wrap a C cairo_t* found from some external source as a *Context.  The Go side will destroy the reference when it's no longer used.
174func WrapContext(p unsafe.Pointer) *Context {
175	return wrapContext((*C.cairo_t)(p))
176}
177
178// Construct a Context from a C cairo_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
179func BorrowContext(p unsafe.Pointer) *Context {
180	return &Context{(*C.cairo_t)(p)}
181}
182
183// See cairo_surface_t.
184//
185// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-t
186type Surface struct {
187	Ptr *C.cairo_surface_t
188}
189
190func freeSurface(obj *Surface) {
191	C.cairo_surface_destroy(obj.Ptr)
192}
193func wrapSurface(p *C.cairo_surface_t) *Surface {
194	ret := &Surface{p}
195	runtime.SetFinalizer(ret, freeSurface)
196	return ret
197}
198
199// Wrap a C cairo_surface_t* found from some external source as a *Surface.  The Go side will destroy the reference when it's no longer used.
200func WrapSurface(p unsafe.Pointer) *Surface {
201	return wrapSurface((*C.cairo_surface_t)(p))
202}
203
204// Construct a Surface from a C cairo_surface_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
205func BorrowSurface(p unsafe.Pointer) *Surface {
206	return &Surface{(*C.cairo_surface_t)(p)}
207}
208
209// See cairo_device_t.
210//
211// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-t
212type Device struct {
213	Ptr *C.cairo_device_t
214}
215
216func freeDevice(obj *Device) {
217	C.cairo_device_destroy(obj.Ptr)
218}
219func wrapDevice(p *C.cairo_device_t) *Device {
220	ret := &Device{p}
221	runtime.SetFinalizer(ret, freeDevice)
222	return ret
223}
224
225// Wrap a C cairo_device_t* found from some external source as a *Device.  The Go side will destroy the reference when it's no longer used.
226func WrapDevice(p unsafe.Pointer) *Device {
227	return wrapDevice((*C.cairo_device_t)(p))
228}
229
230// Construct a Device from a C cairo_device_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
231func BorrowDevice(p unsafe.Pointer) *Device {
232	return &Device{(*C.cairo_device_t)(p)}
233}
234
235// See cairo_matrix_t.
236//
237// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-t
238type Matrix struct {
239	Xx float64
240	Yx float64
241	Xy float64
242	Yy float64
243	X0 float64
244	Y0 float64
245}
246
247// See cairo_pattern_t.
248//
249// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-t
250type Pattern struct {
251	Ptr *C.cairo_pattern_t
252}
253
254func freePattern(obj *Pattern) {
255	C.cairo_pattern_destroy(obj.Ptr)
256}
257func wrapPattern(p *C.cairo_pattern_t) *Pattern {
258	ret := &Pattern{p}
259	runtime.SetFinalizer(ret, freePattern)
260	return ret
261}
262
263// Wrap a C cairo_pattern_t* found from some external source as a *Pattern.  The Go side will destroy the reference when it's no longer used.
264func WrapPattern(p unsafe.Pointer) *Pattern {
265	return wrapPattern((*C.cairo_pattern_t)(p))
266}
267
268// Construct a Pattern from a C cairo_pattern_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
269func BorrowPattern(p unsafe.Pointer) *Pattern {
270	return &Pattern{(*C.cairo_pattern_t)(p)}
271}
272
273// See cairo_status_t.
274//
275// C API documentation: http://cairographics.org/manual/cairo-Error-handling.html#cairo-status-t
276type Status int
277
278const (
279	StatusSuccess                 Status = C.CAIRO_STATUS_SUCCESS
280	StatusNoMemory                Status = C.CAIRO_STATUS_NO_MEMORY
281	StatusInvalidRestore          Status = C.CAIRO_STATUS_INVALID_RESTORE
282	StatusInvalidPopGroup         Status = C.CAIRO_STATUS_INVALID_POP_GROUP
283	StatusNoCurrentPoint          Status = C.CAIRO_STATUS_NO_CURRENT_POINT
284	StatusInvalidMatrix           Status = C.CAIRO_STATUS_INVALID_MATRIX
285	StatusInvalidStatus           Status = C.CAIRO_STATUS_INVALID_STATUS
286	StatusNullPointer             Status = C.CAIRO_STATUS_NULL_POINTER
287	StatusInvalidString           Status = C.CAIRO_STATUS_INVALID_STRING
288	StatusInvalidPathData         Status = C.CAIRO_STATUS_INVALID_PATH_DATA
289	StatusReadError               Status = C.CAIRO_STATUS_READ_ERROR
290	StatusWriteError              Status = C.CAIRO_STATUS_WRITE_ERROR
291	StatusSurfaceFinished         Status = C.CAIRO_STATUS_SURFACE_FINISHED
292	StatusSurfaceTypeMismatch     Status = C.CAIRO_STATUS_SURFACE_TYPE_MISMATCH
293	StatusPatternTypeMismatch     Status = C.CAIRO_STATUS_PATTERN_TYPE_MISMATCH
294	StatusInvalidContent          Status = C.CAIRO_STATUS_INVALID_CONTENT
295	StatusInvalidFormat           Status = C.CAIRO_STATUS_INVALID_FORMAT
296	StatusInvalidVisual           Status = C.CAIRO_STATUS_INVALID_VISUAL
297	StatusFileNotFound            Status = C.CAIRO_STATUS_FILE_NOT_FOUND
298	StatusInvalidDash             Status = C.CAIRO_STATUS_INVALID_DASH
299	StatusInvalidDscComment       Status = C.CAIRO_STATUS_INVALID_DSC_COMMENT
300	StatusInvalidIndex            Status = C.CAIRO_STATUS_INVALID_INDEX
301	StatusClipNotRepresentable    Status = C.CAIRO_STATUS_CLIP_NOT_REPRESENTABLE
302	StatusTempFileError           Status = C.CAIRO_STATUS_TEMP_FILE_ERROR
303	StatusInvalidStride           Status = C.CAIRO_STATUS_INVALID_STRIDE
304	StatusFontTypeMismatch        Status = C.CAIRO_STATUS_FONT_TYPE_MISMATCH
305	StatusUserFontImmutable       Status = C.CAIRO_STATUS_USER_FONT_IMMUTABLE
306	StatusUserFontError           Status = C.CAIRO_STATUS_USER_FONT_ERROR
307	StatusNegativeCount           Status = C.CAIRO_STATUS_NEGATIVE_COUNT
308	StatusInvalidClusters         Status = C.CAIRO_STATUS_INVALID_CLUSTERS
309	StatusInvalidSlant            Status = C.CAIRO_STATUS_INVALID_SLANT
310	StatusInvalidWeight           Status = C.CAIRO_STATUS_INVALID_WEIGHT
311	StatusInvalidSize             Status = C.CAIRO_STATUS_INVALID_SIZE
312	StatusUserFontNotImplemented  Status = C.CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED
313	StatusDeviceTypeMismatch      Status = C.CAIRO_STATUS_DEVICE_TYPE_MISMATCH
314	StatusDeviceError             Status = C.CAIRO_STATUS_DEVICE_ERROR
315	StatusInvalidMeshConstruction Status = C.CAIRO_STATUS_INVALID_MESH_CONSTRUCTION
316	StatusDeviceFinished          Status = C.CAIRO_STATUS_DEVICE_FINISHED
317	StatusJbig2GlobalMissing      Status = C.CAIRO_STATUS_JBIG2_GLOBAL_MISSING
318	StatusLastStatus              Status = C.CAIRO_STATUS_LAST_STATUS
319)
320
321// See cairo_content_t.
322//
323// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-content-t
324type Content int
325
326const (
327	ContentColor      Content = C.CAIRO_CONTENT_COLOR
328	ContentAlpha      Content = C.CAIRO_CONTENT_ALPHA
329	ContentColorAlpha Content = C.CAIRO_CONTENT_COLOR_ALPHA
330)
331
332// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
333func (i Content) String() string {
334	switch i {
335	case ContentColor:
336		return "ContentColor"
337	case ContentAlpha:
338		return "ContentAlpha"
339	case ContentColorAlpha:
340		return "ContentColorAlpha"
341	default:
342		return fmt.Sprintf("Content(%d)", i)
343	}
344}
345
346// See cairo_format_t.
347//
348// C API documentation: http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-format-t
349type Format int
350
351const (
352	FormatInvalid  Format = C.CAIRO_FORMAT_INVALID
353	FormatARGB32   Format = C.CAIRO_FORMAT_ARGB32
354	FormatRGB24    Format = C.CAIRO_FORMAT_RGB24
355	FormatA8       Format = C.CAIRO_FORMAT_A8
356	FormatA1       Format = C.CAIRO_FORMAT_A1
357	FormatRGB16565 Format = C.CAIRO_FORMAT_RGB16_565
358	FormatRGB30    Format = C.CAIRO_FORMAT_RGB30
359)
360
361// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
362func (i Format) String() string {
363	switch i {
364	case FormatInvalid:
365		return "FormatInvalid"
366	case FormatARGB32:
367		return "FormatARGB32"
368	case FormatRGB24:
369		return "FormatRGB24"
370	case FormatA8:
371		return "FormatA8"
372	case FormatA1:
373		return "FormatA1"
374	case FormatRGB16565:
375		return "FormatRGB16565"
376	case FormatRGB30:
377		return "FormatRGB30"
378	default:
379		return fmt.Sprintf("Format(%d)", i)
380	}
381}
382
383// See cairo_create().
384//
385// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-create
386func Create(target *Surface) *Context {
387	ret := wrapContext(C.cairo_create(target.Ptr))
388	if err := ret.status(); err != nil {
389		panic(err)
390	}
391	return ret
392}
393
394// See cairo_save().
395//
396// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-save
397func (cr *Context) Save() {
398	C.cairo_save(cr.Ptr)
399	if err := cr.status(); err != nil {
400		panic(err)
401	}
402}
403
404// See cairo_restore().
405//
406// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-restore
407func (cr *Context) Restore() {
408	C.cairo_restore(cr.Ptr)
409	if err := cr.status(); err != nil {
410		panic(err)
411	}
412}
413
414// See cairo_push_group().
415//
416// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-push-group
417func (cr *Context) PushGroup() {
418	C.cairo_push_group(cr.Ptr)
419	if err := cr.status(); err != nil {
420		panic(err)
421	}
422}
423
424// See cairo_push_group_with_content().
425//
426// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-push-group-with-content
427func (cr *Context) PushGroupWithContent(content Content) {
428	C.cairo_push_group_with_content(cr.Ptr, C.cairo_content_t(content))
429	if err := cr.status(); err != nil {
430		panic(err)
431	}
432}
433
434// See cairo_pop_group().
435//
436// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-pop-group
437func (cr *Context) PopGroup() *Pattern {
438	ret := wrapPattern(C.cairo_pop_group(cr.Ptr))
439	if err := cr.status(); err != nil {
440		panic(err)
441	}
442	return ret
443}
444
445// See cairo_pop_group_to_source().
446//
447// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-pop-group-to-source
448func (cr *Context) PopGroupToSource() {
449	C.cairo_pop_group_to_source(cr.Ptr)
450	if err := cr.status(); err != nil {
451		panic(err)
452	}
453}
454
455// See cairo_operator_t.
456//
457// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-operator-t
458type Operator int
459
460const (
461	OperatorClear         Operator = C.CAIRO_OPERATOR_CLEAR
462	OperatorSource        Operator = C.CAIRO_OPERATOR_SOURCE
463	OperatorOver          Operator = C.CAIRO_OPERATOR_OVER
464	OperatorIn            Operator = C.CAIRO_OPERATOR_IN
465	OperatorOut           Operator = C.CAIRO_OPERATOR_OUT
466	OperatorAtop          Operator = C.CAIRO_OPERATOR_ATOP
467	OperatorDest          Operator = C.CAIRO_OPERATOR_DEST
468	OperatorDestOver      Operator = C.CAIRO_OPERATOR_DEST_OVER
469	OperatorDestIn        Operator = C.CAIRO_OPERATOR_DEST_IN
470	OperatorDestOut       Operator = C.CAIRO_OPERATOR_DEST_OUT
471	OperatorDestAtop      Operator = C.CAIRO_OPERATOR_DEST_ATOP
472	OperatorXOR           Operator = C.CAIRO_OPERATOR_XOR
473	OperatorAdd           Operator = C.CAIRO_OPERATOR_ADD
474	OperatorSaturate      Operator = C.CAIRO_OPERATOR_SATURATE
475	OperatorMultiply      Operator = C.CAIRO_OPERATOR_MULTIPLY
476	OperatorScreen        Operator = C.CAIRO_OPERATOR_SCREEN
477	OperatorOverlay       Operator = C.CAIRO_OPERATOR_OVERLAY
478	OperatorDarken        Operator = C.CAIRO_OPERATOR_DARKEN
479	OperatorLighten       Operator = C.CAIRO_OPERATOR_LIGHTEN
480	OperatorColorDodge    Operator = C.CAIRO_OPERATOR_COLOR_DODGE
481	OperatorColorBurn     Operator = C.CAIRO_OPERATOR_COLOR_BURN
482	OperatorHardLight     Operator = C.CAIRO_OPERATOR_HARD_LIGHT
483	OperatorSoftLight     Operator = C.CAIRO_OPERATOR_SOFT_LIGHT
484	OperatorDifference    Operator = C.CAIRO_OPERATOR_DIFFERENCE
485	OperatorExclusion     Operator = C.CAIRO_OPERATOR_EXCLUSION
486	OperatorHslHue        Operator = C.CAIRO_OPERATOR_HSL_HUE
487	OperatorHslSaturation Operator = C.CAIRO_OPERATOR_HSL_SATURATION
488	OperatorHslColor      Operator = C.CAIRO_OPERATOR_HSL_COLOR
489	OperatorHslLuminosity Operator = C.CAIRO_OPERATOR_HSL_LUMINOSITY
490)
491
492// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
493func (i Operator) String() string {
494	switch i {
495	case OperatorClear:
496		return "OperatorClear"
497	case OperatorSource:
498		return "OperatorSource"
499	case OperatorOver:
500		return "OperatorOver"
501	case OperatorIn:
502		return "OperatorIn"
503	case OperatorOut:
504		return "OperatorOut"
505	case OperatorAtop:
506		return "OperatorAtop"
507	case OperatorDest:
508		return "OperatorDest"
509	case OperatorDestOver:
510		return "OperatorDestOver"
511	case OperatorDestIn:
512		return "OperatorDestIn"
513	case OperatorDestOut:
514		return "OperatorDestOut"
515	case OperatorDestAtop:
516		return "OperatorDestAtop"
517	case OperatorXOR:
518		return "OperatorXOR"
519	case OperatorAdd:
520		return "OperatorAdd"
521	case OperatorSaturate:
522		return "OperatorSaturate"
523	case OperatorMultiply:
524		return "OperatorMultiply"
525	case OperatorScreen:
526		return "OperatorScreen"
527	case OperatorOverlay:
528		return "OperatorOverlay"
529	case OperatorDarken:
530		return "OperatorDarken"
531	case OperatorLighten:
532		return "OperatorLighten"
533	case OperatorColorDodge:
534		return "OperatorColorDodge"
535	case OperatorColorBurn:
536		return "OperatorColorBurn"
537	case OperatorHardLight:
538		return "OperatorHardLight"
539	case OperatorSoftLight:
540		return "OperatorSoftLight"
541	case OperatorDifference:
542		return "OperatorDifference"
543	case OperatorExclusion:
544		return "OperatorExclusion"
545	case OperatorHslHue:
546		return "OperatorHslHue"
547	case OperatorHslSaturation:
548		return "OperatorHslSaturation"
549	case OperatorHslColor:
550		return "OperatorHslColor"
551	case OperatorHslLuminosity:
552		return "OperatorHslLuminosity"
553	default:
554		return fmt.Sprintf("Operator(%d)", i)
555	}
556}
557
558// See cairo_set_operator().
559//
560// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-operator
561func (cr *Context) SetOperator(op Operator) {
562	C.cairo_set_operator(cr.Ptr, C.cairo_operator_t(op))
563	if err := cr.status(); err != nil {
564		panic(err)
565	}
566}
567
568// See cairo_set_source().
569//
570// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-source
571func (cr *Context) SetSource(source *Pattern) {
572	C.cairo_set_source(cr.Ptr, source.Ptr)
573	if err := cr.status(); err != nil {
574		panic(err)
575	}
576}
577
578// See cairo_set_source_rgb().
579//
580// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-source-rgb
581func (cr *Context) SetSourceRGB(red, green, blue float64) {
582	C.cairo_set_source_rgb(cr.Ptr, C.double(red), C.double(green), C.double(blue))
583	if err := cr.status(); err != nil {
584		panic(err)
585	}
586}
587
588// See cairo_set_source_rgba().
589//
590// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-source-rgba
591func (cr *Context) SetSourceRGBA(red, green, blue, alpha float64) {
592	C.cairo_set_source_rgba(cr.Ptr, C.double(red), C.double(green), C.double(blue), C.double(alpha))
593	if err := cr.status(); err != nil {
594		panic(err)
595	}
596}
597
598// See cairo_set_source_surface().
599//
600// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-source-surface
601func (cr *Context) SetSourceSurface(surface *Surface, x, y float64) {
602	C.cairo_set_source_surface(cr.Ptr, surface.Ptr, C.double(x), C.double(y))
603	if err := cr.status(); err != nil {
604		panic(err)
605	}
606}
607
608// See cairo_set_tolerance().
609//
610// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-tolerance
611func (cr *Context) SetTolerance(tolerance float64) {
612	C.cairo_set_tolerance(cr.Ptr, C.double(tolerance))
613	if err := cr.status(); err != nil {
614		panic(err)
615	}
616}
617
618// See cairo_antialias_t.
619//
620// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t
621type Antialias int
622
623const (
624	AntialiasDefault  Antialias = C.CAIRO_ANTIALIAS_DEFAULT
625	AntialiasNone     Antialias = C.CAIRO_ANTIALIAS_NONE
626	AntialiasGray     Antialias = C.CAIRO_ANTIALIAS_GRAY
627	AntialiasSubpixel Antialias = C.CAIRO_ANTIALIAS_SUBPIXEL
628	AntialiasFast     Antialias = C.CAIRO_ANTIALIAS_FAST
629	AntialiasGood     Antialias = C.CAIRO_ANTIALIAS_GOOD
630	AntialiasBest     Antialias = C.CAIRO_ANTIALIAS_BEST
631)
632
633// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
634func (i Antialias) String() string {
635	switch i {
636	case AntialiasDefault:
637		return "AntialiasDefault"
638	case AntialiasNone:
639		return "AntialiasNone"
640	case AntialiasGray:
641		return "AntialiasGray"
642	case AntialiasSubpixel:
643		return "AntialiasSubpixel"
644	case AntialiasFast:
645		return "AntialiasFast"
646	case AntialiasGood:
647		return "AntialiasGood"
648	case AntialiasBest:
649		return "AntialiasBest"
650	default:
651		return fmt.Sprintf("Antialias(%d)", i)
652	}
653}
654
655// See cairo_set_antialias().
656//
657// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-antialias
658func (cr *Context) SetAntialias(antialias Antialias) {
659	C.cairo_set_antialias(cr.Ptr, C.cairo_antialias_t(antialias))
660	if err := cr.status(); err != nil {
661		panic(err)
662	}
663}
664
665// See cairo_fill_rule_t.
666//
667// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-fill-rule-t
668type FillRule int
669
670const (
671	FillRuleWinding FillRule = C.CAIRO_FILL_RULE_WINDING
672	FillRuleEvenOdd FillRule = C.CAIRO_FILL_RULE_EVEN_ODD
673)
674
675// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
676func (i FillRule) String() string {
677	switch i {
678	case FillRuleWinding:
679		return "FillRuleWinding"
680	case FillRuleEvenOdd:
681		return "FillRuleEvenOdd"
682	default:
683		return fmt.Sprintf("FillRule(%d)", i)
684	}
685}
686
687// See cairo_set_fill_rule().
688//
689// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-fill-rule
690func (cr *Context) SetFillRule(fillRule FillRule) {
691	C.cairo_set_fill_rule(cr.Ptr, C.cairo_fill_rule_t(fillRule))
692	if err := cr.status(); err != nil {
693		panic(err)
694	}
695}
696
697// See cairo_set_line_width().
698//
699// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-line-width
700func (cr *Context) SetLineWidth(width float64) {
701	C.cairo_set_line_width(cr.Ptr, C.double(width))
702	if err := cr.status(); err != nil {
703		panic(err)
704	}
705}
706
707// See cairo_line_cap_t.
708//
709// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-line-cap-t
710type LineCap int
711
712const (
713	LineCapButt   LineCap = C.CAIRO_LINE_CAP_BUTT
714	LineCapRound  LineCap = C.CAIRO_LINE_CAP_ROUND
715	LineCapSquare LineCap = C.CAIRO_LINE_CAP_SQUARE
716)
717
718// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
719func (i LineCap) String() string {
720	switch i {
721	case LineCapButt:
722		return "LineCapButt"
723	case LineCapRound:
724		return "LineCapRound"
725	case LineCapSquare:
726		return "LineCapSquare"
727	default:
728		return fmt.Sprintf("LineCap(%d)", i)
729	}
730}
731
732// See cairo_set_line_cap().
733//
734// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-line-cap
735func (cr *Context) SetLineCap(lineCap LineCap) {
736	C.cairo_set_line_cap(cr.Ptr, C.cairo_line_cap_t(lineCap))
737	if err := cr.status(); err != nil {
738		panic(err)
739	}
740}
741
742// See cairo_line_join_t.
743//
744// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-line-join-t
745type LineJoin int
746
747const (
748	LineJoinMiter LineJoin = C.CAIRO_LINE_JOIN_MITER
749	LineJoinRound LineJoin = C.CAIRO_LINE_JOIN_ROUND
750	LineJoinBevel LineJoin = C.CAIRO_LINE_JOIN_BEVEL
751)
752
753// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
754func (i LineJoin) String() string {
755	switch i {
756	case LineJoinMiter:
757		return "LineJoinMiter"
758	case LineJoinRound:
759		return "LineJoinRound"
760	case LineJoinBevel:
761		return "LineJoinBevel"
762	default:
763		return fmt.Sprintf("LineJoin(%d)", i)
764	}
765}
766
767// See cairo_set_line_join().
768//
769// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-line-join
770func (cr *Context) SetLineJoin(lineJoin LineJoin) {
771	C.cairo_set_line_join(cr.Ptr, C.cairo_line_join_t(lineJoin))
772	if err := cr.status(); err != nil {
773		panic(err)
774	}
775}
776
777// See cairo_set_dash().
778//
779// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-dash
780func (cr *Context) SetDash(dashes []float64, offset float64) {
781	C.cairo_set_dash(cr.Ptr, (*C.double)(sliceBytes(unsafe.Pointer(&dashes))), C.int(len(dashes)), C.double(offset))
782	if err := cr.status(); err != nil {
783		panic(err)
784	}
785}
786
787// See cairo_set_miter_limit().
788//
789// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-set-miter-limit
790func (cr *Context) SetMiterLimit(limit float64) {
791	C.cairo_set_miter_limit(cr.Ptr, C.double(limit))
792	if err := cr.status(); err != nil {
793		panic(err)
794	}
795}
796
797// See cairo_translate().
798//
799// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-translate
800func (cr *Context) Translate(tx, ty float64) {
801	C.cairo_translate(cr.Ptr, C.double(tx), C.double(ty))
802	if err := cr.status(); err != nil {
803		panic(err)
804	}
805}
806
807// See cairo_scale().
808//
809// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-scale
810func (cr *Context) Scale(sx, sy float64) {
811	C.cairo_scale(cr.Ptr, C.double(sx), C.double(sy))
812	if err := cr.status(); err != nil {
813		panic(err)
814	}
815}
816
817// See cairo_rotate().
818//
819// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-rotate
820func (cr *Context) Rotate(angle float64) {
821	C.cairo_rotate(cr.Ptr, C.double(angle))
822	if err := cr.status(); err != nil {
823		panic(err)
824	}
825}
826
827// See cairo_transform().
828//
829// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-transform
830func (cr *Context) Transform(matrix *Matrix) {
831	C.cairo_transform(cr.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(matrix)))
832	if err := cr.status(); err != nil {
833		panic(err)
834	}
835}
836
837// See cairo_set_matrix().
838//
839// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-set-matrix
840func (cr *Context) SetMatrix(matrix *Matrix) {
841	C.cairo_set_matrix(cr.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(matrix)))
842	if err := cr.status(); err != nil {
843		panic(err)
844	}
845}
846
847// See cairo_identity_matrix().
848//
849// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-identity-matrix
850func (cr *Context) IdentityMatrix() {
851	C.cairo_identity_matrix(cr.Ptr)
852	if err := cr.status(); err != nil {
853		panic(err)
854	}
855}
856
857// See cairo_user_to_device().
858//
859// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-user-to-device
860func (cr *Context) UserToDevice(x, y *float64) {
861	C.cairo_user_to_device(cr.Ptr, (*C.double)(unsafe.Pointer(x)), (*C.double)(unsafe.Pointer(y)))
862	if err := cr.status(); err != nil {
863		panic(err)
864	}
865}
866
867// See cairo_user_to_device_distance().
868//
869// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-user-to-device-distance
870func (cr *Context) UserToDeviceDistance(dx, dy *float64) {
871	C.cairo_user_to_device_distance(cr.Ptr, (*C.double)(unsafe.Pointer(dx)), (*C.double)(unsafe.Pointer(dy)))
872	if err := cr.status(); err != nil {
873		panic(err)
874	}
875}
876
877// See cairo_device_to_user().
878//
879// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-device-to-user
880func (cr *Context) DeviceToUser(x, y *float64) {
881	C.cairo_device_to_user(cr.Ptr, (*C.double)(unsafe.Pointer(x)), (*C.double)(unsafe.Pointer(y)))
882	if err := cr.status(); err != nil {
883		panic(err)
884	}
885}
886
887// See cairo_device_to_user_distance().
888//
889// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-device-to-user-distance
890func (cr *Context) DeviceToUserDistance(dx, dy *float64) {
891	C.cairo_device_to_user_distance(cr.Ptr, (*C.double)(unsafe.Pointer(dx)), (*C.double)(unsafe.Pointer(dy)))
892	if err := cr.status(); err != nil {
893		panic(err)
894	}
895}
896
897// See cairo_new_path().
898//
899// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-new-path
900func (cr *Context) NewPath() {
901	C.cairo_new_path(cr.Ptr)
902	if err := cr.status(); err != nil {
903		panic(err)
904	}
905}
906
907// See cairo_move_to().
908//
909// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-move-to
910func (cr *Context) MoveTo(x, y float64) {
911	C.cairo_move_to(cr.Ptr, C.double(x), C.double(y))
912	if err := cr.status(); err != nil {
913		panic(err)
914	}
915}
916
917// See cairo_new_sub_path().
918//
919// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-new-sub-path
920func (cr *Context) NewSubPath() {
921	C.cairo_new_sub_path(cr.Ptr)
922	if err := cr.status(); err != nil {
923		panic(err)
924	}
925}
926
927// See cairo_line_to().
928//
929// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-line-to
930func (cr *Context) LineTo(x, y float64) {
931	C.cairo_line_to(cr.Ptr, C.double(x), C.double(y))
932	if err := cr.status(); err != nil {
933		panic(err)
934	}
935}
936
937// See cairo_curve_to().
938//
939// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-curve-to
940func (cr *Context) CurveTo(x1, y1, x2, y2, x3, y3 float64) {
941	C.cairo_curve_to(cr.Ptr, C.double(x1), C.double(y1), C.double(x2), C.double(y2), C.double(x3), C.double(y3))
942	if err := cr.status(); err != nil {
943		panic(err)
944	}
945}
946
947// See cairo_arc().
948//
949// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-arc
950func (cr *Context) Arc(xc, yc, radius, angle1, angle2 float64) {
951	C.cairo_arc(cr.Ptr, C.double(xc), C.double(yc), C.double(radius), C.double(angle1), C.double(angle2))
952	if err := cr.status(); err != nil {
953		panic(err)
954	}
955}
956
957// See cairo_arc_negative().
958//
959// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-arc-negative
960func (cr *Context) ArcNegative(xc, yc, radius, angle1, angle2 float64) {
961	C.cairo_arc_negative(cr.Ptr, C.double(xc), C.double(yc), C.double(radius), C.double(angle1), C.double(angle2))
962	if err := cr.status(); err != nil {
963		panic(err)
964	}
965}
966
967// See cairo_rel_move_to().
968//
969// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-rel-move-to
970func (cr *Context) RelMoveTo(dx, dy float64) {
971	C.cairo_rel_move_to(cr.Ptr, C.double(dx), C.double(dy))
972	if err := cr.status(); err != nil {
973		panic(err)
974	}
975}
976
977// See cairo_rel_line_to().
978//
979// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-rel-line-to
980func (cr *Context) RelLineTo(dx, dy float64) {
981	C.cairo_rel_line_to(cr.Ptr, C.double(dx), C.double(dy))
982	if err := cr.status(); err != nil {
983		panic(err)
984	}
985}
986
987// See cairo_rel_curve_to().
988//
989// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-rel-curve-to
990func (cr *Context) RelCurveTo(dx1, dy1, dx2, dy2, dx3, dy3 float64) {
991	C.cairo_rel_curve_to(cr.Ptr, C.double(dx1), C.double(dy1), C.double(dx2), C.double(dy2), C.double(dx3), C.double(dy3))
992	if err := cr.status(); err != nil {
993		panic(err)
994	}
995}
996
997// See cairo_rectangle().
998//
999// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-rectangle
1000func (cr *Context) Rectangle(x, y, width, height float64) {
1001	C.cairo_rectangle(cr.Ptr, C.double(x), C.double(y), C.double(width), C.double(height))
1002	if err := cr.status(); err != nil {
1003		panic(err)
1004	}
1005}
1006
1007// See cairo_close_path().
1008//
1009// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-close-path
1010func (cr *Context) ClosePath() {
1011	C.cairo_close_path(cr.Ptr)
1012	if err := cr.status(); err != nil {
1013		panic(err)
1014	}
1015}
1016
1017// See cairo_path_extents().
1018//
1019// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-path-extents
1020func (cr *Context) PathExtents() (float64, float64, float64, float64) {
1021	var x1 C.double
1022	var y1 C.double
1023	var x2 C.double
1024	var y2 C.double
1025
1026	C.cairo_path_extents(cr.Ptr, &x1, &y1, &x2, &y2)
1027	if err := cr.status(); err != nil {
1028		panic(err)
1029	}
1030	return float64(x1), float64(y1), float64(x2), float64(y2)
1031}
1032
1033// See cairo_paint().
1034//
1035// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-paint
1036func (cr *Context) Paint() {
1037	C.cairo_paint(cr.Ptr)
1038	if err := cr.status(); err != nil {
1039		panic(err)
1040	}
1041}
1042
1043// See cairo_paint_with_alpha().
1044//
1045// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-paint-with-alpha
1046func (cr *Context) PaintWithAlpha(alpha float64) {
1047	C.cairo_paint_with_alpha(cr.Ptr, C.double(alpha))
1048	if err := cr.status(); err != nil {
1049		panic(err)
1050	}
1051}
1052
1053// See cairo_mask().
1054//
1055// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-mask
1056func (cr *Context) Mask(pattern *Pattern) {
1057	C.cairo_mask(cr.Ptr, pattern.Ptr)
1058	if err := cr.status(); err != nil {
1059		panic(err)
1060	}
1061}
1062
1063// See cairo_mask_surface().
1064//
1065// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-mask-surface
1066func (cr *Context) MaskSurface(surface *Surface, surfaceX, surfaceY float64) {
1067	C.cairo_mask_surface(cr.Ptr, surface.Ptr, C.double(surfaceX), C.double(surfaceY))
1068	if err := cr.status(); err != nil {
1069		panic(err)
1070	}
1071}
1072
1073// See cairo_stroke().
1074//
1075// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-stroke
1076func (cr *Context) Stroke() {
1077	C.cairo_stroke(cr.Ptr)
1078	if err := cr.status(); err != nil {
1079		panic(err)
1080	}
1081}
1082
1083// See cairo_stroke_preserve().
1084//
1085// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-stroke-preserve
1086func (cr *Context) StrokePreserve() {
1087	C.cairo_stroke_preserve(cr.Ptr)
1088	if err := cr.status(); err != nil {
1089		panic(err)
1090	}
1091}
1092
1093// See cairo_fill().
1094//
1095// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-fill
1096func (cr *Context) Fill() {
1097	C.cairo_fill(cr.Ptr)
1098	if err := cr.status(); err != nil {
1099		panic(err)
1100	}
1101}
1102
1103// See cairo_fill_preserve().
1104//
1105// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-fill-preserve
1106func (cr *Context) FillPreserve() {
1107	C.cairo_fill_preserve(cr.Ptr)
1108	if err := cr.status(); err != nil {
1109		panic(err)
1110	}
1111}
1112
1113// See cairo_copy_page().
1114//
1115// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-copy-page
1116func (cr *Context) CopyPage() {
1117	C.cairo_copy_page(cr.Ptr)
1118	if err := cr.status(); err != nil {
1119		panic(err)
1120	}
1121}
1122
1123// See cairo_show_page().
1124//
1125// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-show-page
1126func (cr *Context) ShowPage() {
1127	C.cairo_show_page(cr.Ptr)
1128	if err := cr.status(); err != nil {
1129		panic(err)
1130	}
1131}
1132
1133// See cairo_in_stroke().
1134//
1135// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-in-stroke
1136func (cr *Context) InStroke(x, y float64) bool {
1137	ret := C.cairo_in_stroke(cr.Ptr, C.double(x), C.double(y)) != 0
1138	if err := cr.status(); err != nil {
1139		panic(err)
1140	}
1141	return ret
1142}
1143
1144// See cairo_in_fill().
1145//
1146// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-in-fill
1147func (cr *Context) InFill(x, y float64) bool {
1148	ret := C.cairo_in_fill(cr.Ptr, C.double(x), C.double(y)) != 0
1149	if err := cr.status(); err != nil {
1150		panic(err)
1151	}
1152	return ret
1153}
1154
1155// See cairo_in_clip().
1156//
1157// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-in-clip
1158func (cr *Context) InClip(x, y float64) bool {
1159	ret := C.cairo_in_clip(cr.Ptr, C.double(x), C.double(y)) != 0
1160	if err := cr.status(); err != nil {
1161		panic(err)
1162	}
1163	return ret
1164}
1165
1166// See cairo_stroke_extents().
1167//
1168// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-stroke-extents
1169func (cr *Context) StrokeExtents() (float64, float64, float64, float64) {
1170	var x1 C.double
1171	var y1 C.double
1172	var x2 C.double
1173	var y2 C.double
1174
1175	C.cairo_stroke_extents(cr.Ptr, &x1, &y1, &x2, &y2)
1176	if err := cr.status(); err != nil {
1177		panic(err)
1178	}
1179	return float64(x1), float64(y1), float64(x2), float64(y2)
1180}
1181
1182// See cairo_fill_extents().
1183//
1184// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-fill-extents
1185func (cr *Context) FillExtents() (float64, float64, float64, float64) {
1186	var x1 C.double
1187	var y1 C.double
1188	var x2 C.double
1189	var y2 C.double
1190
1191	C.cairo_fill_extents(cr.Ptr, &x1, &y1, &x2, &y2)
1192	if err := cr.status(); err != nil {
1193		panic(err)
1194	}
1195	return float64(x1), float64(y1), float64(x2), float64(y2)
1196}
1197
1198// See cairo_reset_clip().
1199//
1200// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-reset-clip
1201func (cr *Context) ResetClip() {
1202	C.cairo_reset_clip(cr.Ptr)
1203	if err := cr.status(); err != nil {
1204		panic(err)
1205	}
1206}
1207
1208// See cairo_clip().
1209//
1210// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-clip
1211func (cr *Context) Clip() {
1212	C.cairo_clip(cr.Ptr)
1213	if err := cr.status(); err != nil {
1214		panic(err)
1215	}
1216}
1217
1218// See cairo_clip_preserve().
1219//
1220// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-clip-preserve
1221func (cr *Context) ClipPreserve() {
1222	C.cairo_clip_preserve(cr.Ptr)
1223	if err := cr.status(); err != nil {
1224		panic(err)
1225	}
1226}
1227
1228// See cairo_clip_extents().
1229//
1230// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-clip-extents
1231func (cr *Context) ClipExtents() (float64, float64, float64, float64) {
1232	var x1 C.double
1233	var y1 C.double
1234	var x2 C.double
1235	var y2 C.double
1236
1237	C.cairo_clip_extents(cr.Ptr, &x1, &y1, &x2, &y2)
1238	if err := cr.status(); err != nil {
1239		panic(err)
1240	}
1241	return float64(x1), float64(y1), float64(x2), float64(y2)
1242}
1243
1244// See cairo_rectangle_t.
1245//
1246// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-rectangle-t
1247type Rectangle struct {
1248	X      float64
1249	Y      float64
1250	Width  float64
1251	Height float64
1252}
1253
1254// See cairo_scaled_font_t.
1255//
1256// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-t
1257type ScaledFont struct {
1258	Ptr *C.cairo_scaled_font_t
1259}
1260
1261func freeScaledFont(obj *ScaledFont) {
1262	C.cairo_scaled_font_destroy(obj.Ptr)
1263}
1264func wrapScaledFont(p *C.cairo_scaled_font_t) *ScaledFont {
1265	ret := &ScaledFont{p}
1266	runtime.SetFinalizer(ret, freeScaledFont)
1267	return ret
1268}
1269
1270// Wrap a C cairo_scaled_font_t* found from some external source as a *ScaledFont.  The Go side will destroy the reference when it's no longer used.
1271func WrapScaledFont(p unsafe.Pointer) *ScaledFont {
1272	return wrapScaledFont((*C.cairo_scaled_font_t)(p))
1273}
1274
1275// Construct a ScaledFont from a C cairo_scaled_font_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
1276func BorrowScaledFont(p unsafe.Pointer) *ScaledFont {
1277	return &ScaledFont{(*C.cairo_scaled_font_t)(p)}
1278}
1279
1280// See cairo_font_face_t.
1281//
1282// C API documentation: http://cairographics.org/manual/cairo-cairo-font-face-t.html#cairo-font-face-t
1283type FontFace struct {
1284	Ptr *C.cairo_font_face_t
1285}
1286
1287func freeFontFace(obj *FontFace) {
1288	C.cairo_font_face_destroy(obj.Ptr)
1289}
1290func wrapFontFace(p *C.cairo_font_face_t) *FontFace {
1291	ret := &FontFace{p}
1292	runtime.SetFinalizer(ret, freeFontFace)
1293	return ret
1294}
1295
1296// Wrap a C cairo_font_face_t* found from some external source as a *FontFace.  The Go side will destroy the reference when it's no longer used.
1297func WrapFontFace(p unsafe.Pointer) *FontFace {
1298	return wrapFontFace((*C.cairo_font_face_t)(p))
1299}
1300
1301// Construct a FontFace from a C cairo_font_face_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
1302func BorrowFontFace(p unsafe.Pointer) *FontFace {
1303	return &FontFace{(*C.cairo_font_face_t)(p)}
1304}
1305
1306// See cairo_glyph_t.
1307//
1308// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-glyph-t
1309type Glyph struct {
1310	Index uint32
1311	X     float64
1312	Y     float64
1313}
1314
1315// See cairo_text_cluster_flags_t.
1316//
1317// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-text-cluster-flags-t
1318type TextClusterFlags int
1319
1320const (
1321	TextClusterFlagBackward TextClusterFlags = C.CAIRO_TEXT_CLUSTER_FLAG_BACKWARD
1322)
1323
1324// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
1325func (i TextClusterFlags) String() string {
1326	switch i {
1327	case TextClusterFlagBackward:
1328		return "TextClusterFlagBackward"
1329	default:
1330		return fmt.Sprintf("TextClusterFlags(%d)", i)
1331	}
1332}
1333
1334// See cairo_text_extents_t.
1335//
1336// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-text-extents-t
1337type TextExtents struct {
1338	XBearing float64
1339	YBearing float64
1340	Width    float64
1341	Height   float64
1342	XAdvance float64
1343	YAdvance float64
1344}
1345
1346// See cairo_font_extents_t.
1347//
1348// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-font-extents-t
1349type FontExtents struct {
1350	Ascent      float64
1351	Descent     float64
1352	Height      float64
1353	MaxXAdvance float64
1354	MaxYAdvance float64
1355}
1356
1357// See cairo_font_slant_t.
1358//
1359// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-font-slant-t
1360type FontSlant int
1361
1362const (
1363	FontSlantNormal  FontSlant = C.CAIRO_FONT_SLANT_NORMAL
1364	FontSlantItalic  FontSlant = C.CAIRO_FONT_SLANT_ITALIC
1365	FontSlantOblique FontSlant = C.CAIRO_FONT_SLANT_OBLIQUE
1366)
1367
1368// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
1369func (i FontSlant) String() string {
1370	switch i {
1371	case FontSlantNormal:
1372		return "FontSlantNormal"
1373	case FontSlantItalic:
1374		return "FontSlantItalic"
1375	case FontSlantOblique:
1376		return "FontSlantOblique"
1377	default:
1378		return fmt.Sprintf("FontSlant(%d)", i)
1379	}
1380}
1381
1382// See cairo_font_weight_t.
1383//
1384// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-font-weight-t
1385type FontWeight int
1386
1387const (
1388	FontWeightNormal FontWeight = C.CAIRO_FONT_WEIGHT_NORMAL
1389	FontWeightBold   FontWeight = C.CAIRO_FONT_WEIGHT_BOLD
1390)
1391
1392// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
1393func (i FontWeight) String() string {
1394	switch i {
1395	case FontWeightNormal:
1396		return "FontWeightNormal"
1397	case FontWeightBold:
1398		return "FontWeightBold"
1399	default:
1400		return fmt.Sprintf("FontWeight(%d)", i)
1401	}
1402}
1403
1404// See cairo_subpixel_order_t.
1405//
1406// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-subpixel-order-t
1407type SubpixelOrder int
1408
1409const (
1410	SubpixelOrderDefault SubpixelOrder = C.CAIRO_SUBPIXEL_ORDER_DEFAULT
1411	SubpixelOrderRGB     SubpixelOrder = C.CAIRO_SUBPIXEL_ORDER_RGB
1412	SubpixelOrderBGR     SubpixelOrder = C.CAIRO_SUBPIXEL_ORDER_BGR
1413	SubpixelOrderVRGB    SubpixelOrder = C.CAIRO_SUBPIXEL_ORDER_VRGB
1414	SubpixelOrderVBGR    SubpixelOrder = C.CAIRO_SUBPIXEL_ORDER_VBGR
1415)
1416
1417// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
1418func (i SubpixelOrder) String() string {
1419	switch i {
1420	case SubpixelOrderDefault:
1421		return "SubpixelOrderDefault"
1422	case SubpixelOrderRGB:
1423		return "SubpixelOrderRGB"
1424	case SubpixelOrderBGR:
1425		return "SubpixelOrderBGR"
1426	case SubpixelOrderVRGB:
1427		return "SubpixelOrderVRGB"
1428	case SubpixelOrderVBGR:
1429		return "SubpixelOrderVBGR"
1430	default:
1431		return fmt.Sprintf("SubpixelOrder(%d)", i)
1432	}
1433}
1434
1435// See cairo_hint_style_t.
1436//
1437// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-hint-style-t
1438type HintStyle int
1439
1440const (
1441	HintStyleDefault HintStyle = C.CAIRO_HINT_STYLE_DEFAULT
1442	HintStyleNone    HintStyle = C.CAIRO_HINT_STYLE_NONE
1443	HintStyleSlight  HintStyle = C.CAIRO_HINT_STYLE_SLIGHT
1444	HintStyleMedium  HintStyle = C.CAIRO_HINT_STYLE_MEDIUM
1445	HintStyleFull    HintStyle = C.CAIRO_HINT_STYLE_FULL
1446)
1447
1448// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
1449func (i HintStyle) String() string {
1450	switch i {
1451	case HintStyleDefault:
1452		return "HintStyleDefault"
1453	case HintStyleNone:
1454		return "HintStyleNone"
1455	case HintStyleSlight:
1456		return "HintStyleSlight"
1457	case HintStyleMedium:
1458		return "HintStyleMedium"
1459	case HintStyleFull:
1460		return "HintStyleFull"
1461	default:
1462		return fmt.Sprintf("HintStyle(%d)", i)
1463	}
1464}
1465
1466// See cairo_hint_metrics_t.
1467//
1468// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-hint-metrics-t
1469type HintMetrics int
1470
1471const (
1472	HintMetricsDefault HintMetrics = C.CAIRO_HINT_METRICS_DEFAULT
1473	HintMetricsOff     HintMetrics = C.CAIRO_HINT_METRICS_OFF
1474	HintMetricsOn      HintMetrics = C.CAIRO_HINT_METRICS_ON
1475)
1476
1477// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
1478func (i HintMetrics) String() string {
1479	switch i {
1480	case HintMetricsDefault:
1481		return "HintMetricsDefault"
1482	case HintMetricsOff:
1483		return "HintMetricsOff"
1484	case HintMetricsOn:
1485		return "HintMetricsOn"
1486	default:
1487		return fmt.Sprintf("HintMetrics(%d)", i)
1488	}
1489}
1490
1491// See cairo_font_options_t.
1492//
1493// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-t
1494type FontOptions struct {
1495	Ptr *C.cairo_font_options_t
1496}
1497
1498func freeFontOptions(obj *FontOptions) {
1499	C.cairo_font_options_destroy(obj.Ptr)
1500}
1501func wrapFontOptions(p *C.cairo_font_options_t) *FontOptions {
1502	ret := &FontOptions{p}
1503	runtime.SetFinalizer(ret, freeFontOptions)
1504	return ret
1505}
1506
1507// Wrap a C cairo_font_options_t* found from some external source as a *FontOptions.  The Go side will destroy the reference when it's no longer used.
1508func WrapFontOptions(p unsafe.Pointer) *FontOptions {
1509	return wrapFontOptions((*C.cairo_font_options_t)(p))
1510}
1511
1512// Construct a FontOptions from a C cairo_font_options_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
1513func BorrowFontOptions(p unsafe.Pointer) *FontOptions {
1514	return &FontOptions{(*C.cairo_font_options_t)(p)}
1515}
1516
1517// See cairo_font_options_create().
1518//
1519// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-create
1520func FontOptionsCreate() *FontOptions {
1521	ret := wrapFontOptions(C.cairo_font_options_create())
1522	if err := ret.status(); err != nil {
1523		panic(err)
1524	}
1525	return ret
1526}
1527
1528// See cairo_font_options_copy().
1529//
1530// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-copy
1531func (original *FontOptions) Copy() *FontOptions {
1532	ret := wrapFontOptions(C.cairo_font_options_copy(original.Ptr))
1533	if err := original.status(); err != nil {
1534		panic(err)
1535	}
1536	return ret
1537}
1538
1539// See cairo_font_options_status().
1540//
1541// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-status
1542func (options *FontOptions) status() error {
1543	ret := Status(C.cairo_font_options_status(options.Ptr)).toError()
1544	return ret
1545}
1546
1547// See cairo_font_options_merge().
1548//
1549// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-merge
1550func (options *FontOptions) Merge(other *FontOptions) {
1551	C.cairo_font_options_merge(options.Ptr, other.Ptr)
1552	if err := options.status(); err != nil {
1553		panic(err)
1554	}
1555}
1556
1557// See cairo_font_options_equal().
1558//
1559// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-equal
1560func (options *FontOptions) Equal(other *FontOptions) bool {
1561	ret := C.cairo_font_options_equal(options.Ptr, other.Ptr) != 0
1562	if err := options.status(); err != nil {
1563		panic(err)
1564	}
1565	return ret
1566}
1567
1568// See cairo_font_options_hash().
1569//
1570// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-hash
1571func (options *FontOptions) Hash() uint32 {
1572	ret := uint32(C.cairo_font_options_hash(options.Ptr))
1573	if err := options.status(); err != nil {
1574		panic(err)
1575	}
1576	return ret
1577}
1578
1579// See cairo_font_options_set_antialias().
1580//
1581// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-set-antialias
1582func (options *FontOptions) SetAntialias(antialias Antialias) {
1583	C.cairo_font_options_set_antialias(options.Ptr, C.cairo_antialias_t(antialias))
1584	if err := options.status(); err != nil {
1585		panic(err)
1586	}
1587}
1588
1589// See cairo_font_options_get_antialias().
1590//
1591// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-get-antialias
1592func (options *FontOptions) GetAntialias() Antialias {
1593	ret := Antialias(C.cairo_font_options_get_antialias(options.Ptr))
1594	if err := options.status(); err != nil {
1595		panic(err)
1596	}
1597	return ret
1598}
1599
1600// See cairo_font_options_set_subpixel_order().
1601//
1602// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-set-subpixel-order
1603func (options *FontOptions) SetSubpixelOrder(subpixelOrder SubpixelOrder) {
1604	C.cairo_font_options_set_subpixel_order(options.Ptr, C.cairo_subpixel_order_t(subpixelOrder))
1605	if err := options.status(); err != nil {
1606		panic(err)
1607	}
1608}
1609
1610// See cairo_font_options_get_subpixel_order().
1611//
1612// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-get-subpixel-order
1613func (options *FontOptions) GetSubpixelOrder() SubpixelOrder {
1614	ret := SubpixelOrder(C.cairo_font_options_get_subpixel_order(options.Ptr))
1615	if err := options.status(); err != nil {
1616		panic(err)
1617	}
1618	return ret
1619}
1620
1621// See cairo_font_options_set_hint_style().
1622//
1623// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-set-hint-style
1624func (options *FontOptions) SetHintStyle(hintStyle HintStyle) {
1625	C.cairo_font_options_set_hint_style(options.Ptr, C.cairo_hint_style_t(hintStyle))
1626	if err := options.status(); err != nil {
1627		panic(err)
1628	}
1629}
1630
1631// See cairo_font_options_get_hint_style().
1632//
1633// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-get-hint-style
1634func (options *FontOptions) GetHintStyle() HintStyle {
1635	ret := HintStyle(C.cairo_font_options_get_hint_style(options.Ptr))
1636	if err := options.status(); err != nil {
1637		panic(err)
1638	}
1639	return ret
1640}
1641
1642// See cairo_font_options_set_hint_metrics().
1643//
1644// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-set-hint-metrics
1645func (options *FontOptions) SetHintMetrics(hintMetrics HintMetrics) {
1646	C.cairo_font_options_set_hint_metrics(options.Ptr, C.cairo_hint_metrics_t(hintMetrics))
1647	if err := options.status(); err != nil {
1648		panic(err)
1649	}
1650}
1651
1652// See cairo_font_options_get_hint_metrics().
1653//
1654// C API documentation: http://cairographics.org/manual/cairo-cairo-font-options-t.html#cairo-font-options-get-hint-metrics
1655func (options *FontOptions) GetHintMetrics() HintMetrics {
1656	ret := HintMetrics(C.cairo_font_options_get_hint_metrics(options.Ptr))
1657	if err := options.status(); err != nil {
1658		panic(err)
1659	}
1660	return ret
1661}
1662
1663// See cairo_select_font_face().
1664//
1665// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-select-font-face
1666func (cr *Context) SelectFontFace(family string, slant FontSlant, weight FontWeight) {
1667	c_family := C.CString(family)
1668	defer C.free(unsafe.Pointer(c_family))
1669	C.cairo_select_font_face(cr.Ptr, c_family, C.cairo_font_slant_t(slant), C.cairo_font_weight_t(weight))
1670	if err := cr.status(); err != nil {
1671		panic(err)
1672	}
1673}
1674
1675// See cairo_set_font_size().
1676//
1677// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-set-font-size
1678func (cr *Context) SetFontSize(size float64) {
1679	C.cairo_set_font_size(cr.Ptr, C.double(size))
1680	if err := cr.status(); err != nil {
1681		panic(err)
1682	}
1683}
1684
1685// See cairo_set_font_matrix().
1686//
1687// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-set-font-matrix
1688func (cr *Context) SetFontMatrix(matrix *Matrix) {
1689	C.cairo_set_font_matrix(cr.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(matrix)))
1690	if err := cr.status(); err != nil {
1691		panic(err)
1692	}
1693}
1694
1695// See cairo_get_font_matrix().
1696//
1697// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-get-font-matrix
1698func (cr *Context) GetFontMatrix(matrix *Matrix) {
1699	C.cairo_get_font_matrix(cr.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(matrix)))
1700	if err := cr.status(); err != nil {
1701		panic(err)
1702	}
1703}
1704
1705// See cairo_set_font_options().
1706//
1707// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-set-font-options
1708func (cr *Context) SetFontOptions(options *FontOptions) {
1709	C.cairo_set_font_options(cr.Ptr, options.Ptr)
1710	if err := cr.status(); err != nil {
1711		panic(err)
1712	}
1713}
1714
1715// See cairo_get_font_options().
1716//
1717// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-get-font-options
1718func (cr *Context) GetFontOptions(options *FontOptions) {
1719	C.cairo_get_font_options(cr.Ptr, options.Ptr)
1720	if err := cr.status(); err != nil {
1721		panic(err)
1722	}
1723}
1724
1725// See cairo_set_font_face().
1726//
1727// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-set-font-face
1728func (cr *Context) SetFontFace(fontFace *FontFace) {
1729	C.cairo_set_font_face(cr.Ptr, fontFace.Ptr)
1730	if err := cr.status(); err != nil {
1731		panic(err)
1732	}
1733}
1734
1735// See cairo_get_font_face().
1736//
1737// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-get-font-face
1738func (cr *Context) GetFontFace() *FontFace {
1739	ret := wrapFontFace(C.cairo_get_font_face(cr.Ptr))
1740	if err := cr.status(); err != nil {
1741		panic(err)
1742	}
1743	return ret
1744}
1745
1746// See cairo_set_scaled_font().
1747//
1748// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-set-scaled-font
1749func (cr *Context) SetScaledFont(scaledFont *ScaledFont) {
1750	C.cairo_set_scaled_font(cr.Ptr, scaledFont.Ptr)
1751	if err := cr.status(); err != nil {
1752		panic(err)
1753	}
1754}
1755
1756// See cairo_get_scaled_font().
1757//
1758// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-get-scaled-font
1759func (cr *Context) GetScaledFont() *ScaledFont {
1760	ret := wrapScaledFont(C.cairo_get_scaled_font(cr.Ptr))
1761	if err := cr.status(); err != nil {
1762		panic(err)
1763	}
1764	return ret
1765}
1766
1767// See cairo_show_text().
1768//
1769// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-show-text
1770func (cr *Context) ShowText(utf8 string) {
1771	c_utf8 := C.CString(utf8)
1772	defer C.free(unsafe.Pointer(c_utf8))
1773	C.cairo_show_text(cr.Ptr, c_utf8)
1774	if err := cr.status(); err != nil {
1775		panic(err)
1776	}
1777}
1778
1779// See cairo_show_glyphs().
1780//
1781// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-show-glyphs
1782func (cr *Context) ShowGlyphs(glyphs []Glyph) {
1783	C.cairo_show_glyphs(cr.Ptr, (*C.cairo_glyph_t)(sliceBytes(unsafe.Pointer(&glyphs))), C.int(len(glyphs)))
1784	if err := cr.status(); err != nil {
1785		panic(err)
1786	}
1787}
1788
1789// See cairo_text_path().
1790//
1791// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-text-path
1792func (cr *Context) TextPath(utf8 string) {
1793	c_utf8 := C.CString(utf8)
1794	defer C.free(unsafe.Pointer(c_utf8))
1795	C.cairo_text_path(cr.Ptr, c_utf8)
1796	if err := cr.status(); err != nil {
1797		panic(err)
1798	}
1799}
1800
1801// See cairo_glyph_path().
1802//
1803// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-glyph-path
1804func (cr *Context) GlyphPath(glyphs []Glyph) {
1805	C.cairo_glyph_path(cr.Ptr, (*C.cairo_glyph_t)(sliceBytes(unsafe.Pointer(&glyphs))), C.int(len(glyphs)))
1806	if err := cr.status(); err != nil {
1807		panic(err)
1808	}
1809}
1810
1811// See cairo_text_extents().
1812//
1813// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-text-extents
1814func (cr *Context) TextExtents(utf8 string, extents *TextExtents) {
1815	c_utf8 := C.CString(utf8)
1816	defer C.free(unsafe.Pointer(c_utf8))
1817	C.cairo_text_extents(cr.Ptr, c_utf8, (*C.cairo_text_extents_t)(unsafe.Pointer(extents)))
1818	if err := cr.status(); err != nil {
1819		panic(err)
1820	}
1821}
1822
1823// See cairo_glyph_extents().
1824//
1825// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-glyph-extents
1826func (cr *Context) GlyphExtents(glyphs []Glyph, extents *TextExtents) {
1827	C.cairo_glyph_extents(cr.Ptr, (*C.cairo_glyph_t)(sliceBytes(unsafe.Pointer(&glyphs))), C.int(len(glyphs)), (*C.cairo_text_extents_t)(unsafe.Pointer(extents)))
1828	if err := cr.status(); err != nil {
1829		panic(err)
1830	}
1831}
1832
1833// See cairo_font_extents().
1834//
1835// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-font-extents
1836func (cr *Context) FontExtents(extents *FontExtents) {
1837	C.cairo_font_extents(cr.Ptr, (*C.cairo_font_extents_t)(unsafe.Pointer(extents)))
1838	if err := cr.status(); err != nil {
1839		panic(err)
1840	}
1841}
1842
1843// See cairo_font_face_status().
1844//
1845// C API documentation: http://cairographics.org/manual/cairo-cairo-font-face-t.html#cairo-font-face-status
1846func (fontFace *FontFace) status() error {
1847	ret := Status(C.cairo_font_face_status(fontFace.Ptr)).toError()
1848	return ret
1849}
1850
1851// See cairo_font_type_t.
1852//
1853// C API documentation: http://cairographics.org/manual/cairo-cairo-font-face-t.html#cairo-font-type-t
1854type FontType int
1855
1856const (
1857	FontTypeToy    FontType = C.CAIRO_FONT_TYPE_TOY
1858	FontTypeFt     FontType = C.CAIRO_FONT_TYPE_FT
1859	FontTypeWin32  FontType = C.CAIRO_FONT_TYPE_WIN32
1860	FontTypeQuartz FontType = C.CAIRO_FONT_TYPE_QUARTZ
1861	FontTypeUser   FontType = C.CAIRO_FONT_TYPE_USER
1862)
1863
1864// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
1865func (i FontType) String() string {
1866	switch i {
1867	case FontTypeToy:
1868		return "FontTypeToy"
1869	case FontTypeFt:
1870		return "FontTypeFt"
1871	case FontTypeWin32:
1872		return "FontTypeWin32"
1873	case FontTypeQuartz:
1874		return "FontTypeQuartz"
1875	case FontTypeUser:
1876		return "FontTypeUser"
1877	default:
1878		return fmt.Sprintf("FontType(%d)", i)
1879	}
1880}
1881
1882// See cairo_font_face_get_type().
1883//
1884// C API documentation: http://cairographics.org/manual/cairo-cairo-font-face-t.html#cairo-font-face-get-type
1885func (fontFace *FontFace) GetType() FontType {
1886	ret := FontType(C.cairo_font_face_get_type(fontFace.Ptr))
1887	if err := fontFace.status(); err != nil {
1888		panic(err)
1889	}
1890	return ret
1891}
1892
1893// See cairo_scaled_font_create().
1894//
1895// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-create
1896func ScaledFontCreate(fontFace *FontFace, fontMatrix, ctm *Matrix, options *FontOptions) *ScaledFont {
1897	ret := wrapScaledFont(C.cairo_scaled_font_create(fontFace.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(fontMatrix)), (*C.cairo_matrix_t)(unsafe.Pointer(ctm)), options.Ptr))
1898	if err := ret.status(); err != nil {
1899		panic(err)
1900	}
1901	return ret
1902}
1903
1904// See cairo_scaled_font_status().
1905//
1906// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-status
1907func (scaledFont *ScaledFont) status() error {
1908	ret := Status(C.cairo_scaled_font_status(scaledFont.Ptr)).toError()
1909	return ret
1910}
1911
1912// See cairo_scaled_font_get_type().
1913//
1914// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-get-type
1915func (scaledFont *ScaledFont) GetType() FontType {
1916	ret := FontType(C.cairo_scaled_font_get_type(scaledFont.Ptr))
1917	if err := scaledFont.status(); err != nil {
1918		panic(err)
1919	}
1920	return ret
1921}
1922
1923// See cairo_scaled_font_extents().
1924//
1925// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-extents
1926func (scaledFont *ScaledFont) Extents(extents *FontExtents) {
1927	C.cairo_scaled_font_extents(scaledFont.Ptr, (*C.cairo_font_extents_t)(unsafe.Pointer(extents)))
1928	if err := scaledFont.status(); err != nil {
1929		panic(err)
1930	}
1931}
1932
1933// See cairo_scaled_font_text_extents().
1934//
1935// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-text-extents
1936func (scaledFont *ScaledFont) TextExtents(utf8 string, extents *TextExtents) {
1937	c_utf8 := C.CString(utf8)
1938	defer C.free(unsafe.Pointer(c_utf8))
1939	C.cairo_scaled_font_text_extents(scaledFont.Ptr, c_utf8, (*C.cairo_text_extents_t)(unsafe.Pointer(extents)))
1940	if err := scaledFont.status(); err != nil {
1941		panic(err)
1942	}
1943}
1944
1945// See cairo_scaled_font_glyph_extents().
1946//
1947// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-glyph-extents
1948func (scaledFont *ScaledFont) GlyphExtents(glyphs []Glyph, extents *TextExtents) {
1949	C.cairo_scaled_font_glyph_extents(scaledFont.Ptr, (*C.cairo_glyph_t)(sliceBytes(unsafe.Pointer(&glyphs))), C.int(len(glyphs)), (*C.cairo_text_extents_t)(unsafe.Pointer(extents)))
1950	if err := scaledFont.status(); err != nil {
1951		panic(err)
1952	}
1953}
1954
1955// See cairo_scaled_font_get_font_face().
1956//
1957// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-get-font-face
1958func (scaledFont *ScaledFont) GetFontFace() *FontFace {
1959	ret := wrapFontFace(C.cairo_scaled_font_get_font_face(scaledFont.Ptr))
1960	if err := scaledFont.status(); err != nil {
1961		panic(err)
1962	}
1963	return ret
1964}
1965
1966// See cairo_scaled_font_get_font_matrix().
1967//
1968// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-get-font-matrix
1969func (scaledFont *ScaledFont) GetFontMatrix(fontMatrix *Matrix) {
1970	C.cairo_scaled_font_get_font_matrix(scaledFont.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(fontMatrix)))
1971	if err := scaledFont.status(); err != nil {
1972		panic(err)
1973	}
1974}
1975
1976// See cairo_scaled_font_get_ctm().
1977//
1978// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-get-ctm
1979func (scaledFont *ScaledFont) GetCTM(ctm *Matrix) {
1980	C.cairo_scaled_font_get_ctm(scaledFont.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(ctm)))
1981	if err := scaledFont.status(); err != nil {
1982		panic(err)
1983	}
1984}
1985
1986// See cairo_scaled_font_get_scale_matrix().
1987//
1988// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-get-scale-matrix
1989func (scaledFont *ScaledFont) GetScaleMatrix(scaleMatrix *Matrix) {
1990	C.cairo_scaled_font_get_scale_matrix(scaledFont.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(scaleMatrix)))
1991	if err := scaledFont.status(); err != nil {
1992		panic(err)
1993	}
1994}
1995
1996// See cairo_scaled_font_get_font_options().
1997//
1998// C API documentation: http://cairographics.org/manual/cairo-cairo-scaled-font-t.html#cairo-scaled-font-get-font-options
1999func (scaledFont *ScaledFont) GetFontOptions(options *FontOptions) {
2000	C.cairo_scaled_font_get_font_options(scaledFont.Ptr, options.Ptr)
2001	if err := scaledFont.status(); err != nil {
2002		panic(err)
2003	}
2004}
2005
2006// See cairo_toy_font_face_create().
2007//
2008// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-toy-font-face-create
2009func ToyFontFaceCreate(family string, slant FontSlant, weight FontWeight) *ToyFontFace {
2010	c_family := C.CString(family)
2011	defer C.free(unsafe.Pointer(c_family))
2012	ret := &ToyFontFace{wrapFontFace(C.cairo_toy_font_face_create(c_family, C.cairo_font_slant_t(slant), C.cairo_font_weight_t(weight)))}
2013	if err := ret.status(); err != nil {
2014		panic(err)
2015	}
2016	return ret
2017}
2018
2019// See cairo_toy_font_face_get_family().
2020//
2021// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-toy-font-face-get-family
2022func (fontFace *ToyFontFace) GetFamily() string {
2023	ret := C.GoString(C.cairo_toy_font_face_get_family(fontFace.Ptr))
2024	if err := fontFace.status(); err != nil {
2025		panic(err)
2026	}
2027	return ret
2028}
2029
2030// See cairo_toy_font_face_get_slant().
2031//
2032// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-toy-font-face-get-slant
2033func (fontFace *ToyFontFace) GetSlant() FontSlant {
2034	ret := FontSlant(C.cairo_toy_font_face_get_slant(fontFace.Ptr))
2035	if err := fontFace.status(); err != nil {
2036		panic(err)
2037	}
2038	return ret
2039}
2040
2041// See cairo_toy_font_face_get_weight().
2042//
2043// C API documentation: http://cairographics.org/manual/cairo-text.html#cairo-toy-font-face-get-weight
2044func (fontFace *ToyFontFace) GetWeight() FontWeight {
2045	ret := FontWeight(C.cairo_toy_font_face_get_weight(fontFace.Ptr))
2046	if err := fontFace.status(); err != nil {
2047		panic(err)
2048	}
2049	return ret
2050}
2051
2052// See cairo_user_font_face_create().
2053//
2054// C API documentation: http://cairographics.org/manual/cairo-User-Fonts.html#cairo-user-font-face-create
2055func UserFontFaceCreate() *FontFace {
2056	ret := wrapFontFace(C.cairo_user_font_face_create())
2057	if err := ret.status(); err != nil {
2058		panic(err)
2059	}
2060	return ret
2061}
2062
2063// See cairo_get_operator().
2064//
2065// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-operator
2066func (cr *Context) GetOperator() Operator {
2067	ret := Operator(C.cairo_get_operator(cr.Ptr))
2068	if err := cr.status(); err != nil {
2069		panic(err)
2070	}
2071	return ret
2072}
2073
2074// See cairo_get_source().
2075//
2076// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-source
2077func (cr *Context) GetSource() *Pattern {
2078	ret := wrapPattern(C.cairo_get_source(cr.Ptr))
2079	if err := cr.status(); err != nil {
2080		panic(err)
2081	}
2082	return ret
2083}
2084
2085// See cairo_get_tolerance().
2086//
2087// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-tolerance
2088func (cr *Context) GetTolerance() float64 {
2089	ret := float64(C.cairo_get_tolerance(cr.Ptr))
2090	if err := cr.status(); err != nil {
2091		panic(err)
2092	}
2093	return ret
2094}
2095
2096// See cairo_get_antialias().
2097//
2098// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-antialias
2099func (cr *Context) GetAntialias() Antialias {
2100	ret := Antialias(C.cairo_get_antialias(cr.Ptr))
2101	if err := cr.status(); err != nil {
2102		panic(err)
2103	}
2104	return ret
2105}
2106
2107// See cairo_has_current_point().
2108//
2109// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-has-current-point
2110func (cr *Context) HasCurrentPoint() bool {
2111	ret := C.cairo_has_current_point(cr.Ptr) != 0
2112	if err := cr.status(); err != nil {
2113		panic(err)
2114	}
2115	return ret
2116}
2117
2118// See cairo_get_current_point().
2119//
2120// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-get-current-point
2121func (cr *Context) GetCurrentPoint() (float64, float64) {
2122	var x C.double
2123	var y C.double
2124
2125	C.cairo_get_current_point(cr.Ptr, &x, &y)
2126	if err := cr.status(); err != nil {
2127		panic(err)
2128	}
2129	return float64(x), float64(y)
2130}
2131
2132// See cairo_get_fill_rule().
2133//
2134// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-fill-rule
2135func (cr *Context) GetFillRule() FillRule {
2136	ret := FillRule(C.cairo_get_fill_rule(cr.Ptr))
2137	if err := cr.status(); err != nil {
2138		panic(err)
2139	}
2140	return ret
2141}
2142
2143// See cairo_get_line_width().
2144//
2145// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-line-width
2146func (cr *Context) GetLineWidth() float64 {
2147	ret := float64(C.cairo_get_line_width(cr.Ptr))
2148	if err := cr.status(); err != nil {
2149		panic(err)
2150	}
2151	return ret
2152}
2153
2154// See cairo_get_line_cap().
2155//
2156// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-line-cap
2157func (cr *Context) GetLineCap() LineCap {
2158	ret := LineCap(C.cairo_get_line_cap(cr.Ptr))
2159	if err := cr.status(); err != nil {
2160		panic(err)
2161	}
2162	return ret
2163}
2164
2165// See cairo_get_line_join().
2166//
2167// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-line-join
2168func (cr *Context) GetLineJoin() LineJoin {
2169	ret := LineJoin(C.cairo_get_line_join(cr.Ptr))
2170	if err := cr.status(); err != nil {
2171		panic(err)
2172	}
2173	return ret
2174}
2175
2176// See cairo_get_miter_limit().
2177//
2178// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-miter-limit
2179func (cr *Context) GetMiterLimit() float64 {
2180	ret := float64(C.cairo_get_miter_limit(cr.Ptr))
2181	if err := cr.status(); err != nil {
2182		panic(err)
2183	}
2184	return ret
2185}
2186
2187// See cairo_get_dash_count().
2188//
2189// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-dash-count
2190func (cr *Context) GetDashCount() int {
2191	ret := int(C.cairo_get_dash_count(cr.Ptr))
2192	if err := cr.status(); err != nil {
2193		panic(err)
2194	}
2195	return ret
2196}
2197
2198// See cairo_get_dash().
2199//
2200// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-dash
2201func (cr *Context) GetDash(dashes, offset *float64) {
2202	C.cairo_get_dash(cr.Ptr, (*C.double)(unsafe.Pointer(dashes)), (*C.double)(unsafe.Pointer(offset)))
2203	if err := cr.status(); err != nil {
2204		panic(err)
2205	}
2206}
2207
2208// See cairo_get_matrix().
2209//
2210// C API documentation: http://cairographics.org/manual/cairo-Transformations.html#cairo-get-matrix
2211func (cr *Context) GetMatrix(matrix *Matrix) {
2212	C.cairo_get_matrix(cr.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(matrix)))
2213	if err := cr.status(); err != nil {
2214		panic(err)
2215	}
2216}
2217
2218// See cairo_get_target().
2219//
2220// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-target
2221func (cr *Context) GetTarget() *Surface {
2222	ret := wrapSurface(C.cairo_get_target(cr.Ptr))
2223	if err := cr.status(); err != nil {
2224		panic(err)
2225	}
2226	return ret
2227}
2228
2229// See cairo_get_group_target().
2230//
2231// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-get-group-target
2232func (cr *Context) GetGroupTarget() *Surface {
2233	ret := wrapSurface(C.cairo_get_group_target(cr.Ptr))
2234	if err := cr.status(); err != nil {
2235		panic(err)
2236	}
2237	return ret
2238}
2239
2240// See cairo_path_data_type_t.
2241//
2242// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-path-data-type-t
2243type PathDataType int
2244
2245const (
2246	PathMoveTo    PathDataType = C.CAIRO_PATH_MOVE_TO
2247	PathLineTo    PathDataType = C.CAIRO_PATH_LINE_TO
2248	PathCurveTo   PathDataType = C.CAIRO_PATH_CURVE_TO
2249	PathClosePath PathDataType = C.CAIRO_PATH_CLOSE_PATH
2250)
2251
2252// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
2253func (i PathDataType) String() string {
2254	switch i {
2255	case PathMoveTo:
2256		return "PathMoveTo"
2257	case PathLineTo:
2258		return "PathLineTo"
2259	case PathCurveTo:
2260		return "PathCurveTo"
2261	case PathClosePath:
2262		return "PathClosePath"
2263	default:
2264		return fmt.Sprintf("PathDataType(%d)", i)
2265	}
2266}
2267
2268// See cairo_path_t.
2269//
2270// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-path-t
2271type Path struct {
2272	Ptr *C.cairo_path_t
2273}
2274
2275func freePath(obj *Path) {
2276	C.cairo_path_destroy(obj.Ptr)
2277}
2278func wrapPath(p *C.cairo_path_t) *Path {
2279	ret := &Path{p}
2280	runtime.SetFinalizer(ret, freePath)
2281	return ret
2282}
2283
2284// Wrap a C cairo_path_t* found from some external source as a *Path.  The Go side will destroy the reference when it's no longer used.
2285func WrapPath(p unsafe.Pointer) *Path {
2286	return wrapPath((*C.cairo_path_t)(p))
2287}
2288
2289// Construct a Path from a C cairo_path_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
2290func BorrowPath(p unsafe.Pointer) *Path {
2291	return &Path{(*C.cairo_path_t)(p)}
2292}
2293
2294// See cairo_copy_path().
2295//
2296// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-copy-path
2297func (cr *Context) CopyPath() *Path {
2298	ret := wrapPath(C.cairo_copy_path(cr.Ptr))
2299	if err := cr.status(); err != nil {
2300		panic(err)
2301	}
2302	return ret
2303}
2304
2305// See cairo_copy_path_flat().
2306//
2307// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-copy-path-flat
2308func (cr *Context) CopyPathFlat() *Path {
2309	ret := wrapPath(C.cairo_copy_path_flat(cr.Ptr))
2310	if err := cr.status(); err != nil {
2311		panic(err)
2312	}
2313	return ret
2314}
2315
2316// See cairo_append_path().
2317//
2318// C API documentation: http://cairographics.org/manual/cairo-Paths.html#cairo-append-path
2319func (cr *Context) AppendPath(path *Path) {
2320	C.cairo_append_path(cr.Ptr, path.Ptr)
2321	if err := cr.status(); err != nil {
2322		panic(err)
2323	}
2324}
2325
2326// See cairo_status().
2327//
2328// C API documentation: http://cairographics.org/manual/cairo-cairo-t.html#cairo-status
2329func (cr *Context) status() error {
2330	ret := Status(C.cairo_status(cr.Ptr)).toError()
2331	return ret
2332}
2333
2334// See cairo_device_type_t.
2335//
2336// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-type-t
2337type DeviceType int
2338
2339const (
2340	DeviceTypeDRM     DeviceType = C.CAIRO_DEVICE_TYPE_DRM
2341	DeviceTypeGL      DeviceType = C.CAIRO_DEVICE_TYPE_GL
2342	DeviceTypeScript  DeviceType = C.CAIRO_DEVICE_TYPE_SCRIPT
2343	DeviceTypeXCB     DeviceType = C.CAIRO_DEVICE_TYPE_XCB
2344	DeviceTypeXlib    DeviceType = C.CAIRO_DEVICE_TYPE_XLIB
2345	DeviceTypeXML     DeviceType = C.CAIRO_DEVICE_TYPE_XML
2346	DeviceTypeCOGL    DeviceType = C.CAIRO_DEVICE_TYPE_COGL
2347	DeviceTypeWin32   DeviceType = C.CAIRO_DEVICE_TYPE_WIN32
2348	DeviceTypeInvalid DeviceType = C.CAIRO_DEVICE_TYPE_INVALID
2349)
2350
2351// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
2352func (i DeviceType) String() string {
2353	switch i {
2354	case DeviceTypeDRM:
2355		return "DeviceTypeDRM"
2356	case DeviceTypeGL:
2357		return "DeviceTypeGL"
2358	case DeviceTypeScript:
2359		return "DeviceTypeScript"
2360	case DeviceTypeXCB:
2361		return "DeviceTypeXCB"
2362	case DeviceTypeXlib:
2363		return "DeviceTypeXlib"
2364	case DeviceTypeXML:
2365		return "DeviceTypeXML"
2366	case DeviceTypeCOGL:
2367		return "DeviceTypeCOGL"
2368	case DeviceTypeWin32:
2369		return "DeviceTypeWin32"
2370	case DeviceTypeInvalid:
2371		return "DeviceTypeInvalid"
2372	default:
2373		return fmt.Sprintf("DeviceType(%d)", i)
2374	}
2375}
2376
2377// See cairo_device_get_type().
2378//
2379// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-get-type
2380func (device *Device) GetType() DeviceType {
2381	ret := DeviceType(C.cairo_device_get_type(device.Ptr))
2382	if err := device.status(); err != nil {
2383		panic(err)
2384	}
2385	return ret
2386}
2387
2388// See cairo_device_status().
2389//
2390// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-status
2391func (device *Device) status() error {
2392	ret := Status(C.cairo_device_status(device.Ptr)).toError()
2393	return ret
2394}
2395
2396// See cairo_device_acquire().
2397//
2398// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-acquire
2399func (device *Device) Acquire() error {
2400	ret := Status(C.cairo_device_acquire(device.Ptr)).toError()
2401	if err := device.status(); err != nil {
2402		panic(err)
2403	}
2404	return ret
2405}
2406
2407// See cairo_device_release().
2408//
2409// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-release
2410func (device *Device) Release() {
2411	C.cairo_device_release(device.Ptr)
2412	if err := device.status(); err != nil {
2413		panic(err)
2414	}
2415}
2416
2417// See cairo_device_flush().
2418//
2419// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-flush
2420func (device *Device) Flush() {
2421	C.cairo_device_flush(device.Ptr)
2422	if err := device.status(); err != nil {
2423		panic(err)
2424	}
2425}
2426
2427// See cairo_device_finish().
2428//
2429// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-finish
2430func (device *Device) Finish() {
2431	C.cairo_device_finish(device.Ptr)
2432	if err := device.status(); err != nil {
2433		panic(err)
2434	}
2435}
2436
2437// See cairo_surface_create_similar().
2438//
2439// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-create-similar
2440func (other *Surface) CreateSimilar(content Content, width, height int) *Surface {
2441	ret := wrapSurface(C.cairo_surface_create_similar(other.Ptr, C.cairo_content_t(content), C.int(width), C.int(height)))
2442	if err := other.status(); err != nil {
2443		panic(err)
2444	}
2445	return ret
2446}
2447
2448// See cairo_surface_create_similar_image().
2449//
2450// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-create-similar-image
2451func (other *Surface) CreateSimilarImage(format Format, width, height int) *Surface {
2452	ret := wrapSurface(C.cairo_surface_create_similar_image(other.Ptr, C.cairo_format_t(format), C.int(width), C.int(height)))
2453	if err := other.status(); err != nil {
2454		panic(err)
2455	}
2456	return ret
2457}
2458
2459// See cairo_surface_unmap_image().
2460//
2461// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-unmap-image
2462func (surface *Surface) UnmapImage(image *Surface) {
2463	C.cairo_surface_unmap_image(surface.Ptr, image.Ptr)
2464	if err := surface.status(); err != nil {
2465		panic(err)
2466	}
2467}
2468
2469// See cairo_surface_create_for_rectangle().
2470//
2471// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-create-for-rectangle
2472func (target *Surface) CreateForRectangle(x, y, width, height float64) *Surface {
2473	ret := wrapSurface(C.cairo_surface_create_for_rectangle(target.Ptr, C.double(x), C.double(y), C.double(width), C.double(height)))
2474	if err := target.status(); err != nil {
2475		panic(err)
2476	}
2477	return ret
2478}
2479
2480// See cairo_surface_observer_mode_t.
2481type SurfaceObserverMode int
2482
2483const (
2484	SurfaceObserverNormal           SurfaceObserverMode = C.CAIRO_SURFACE_OBSERVER_NORMAL
2485	SurfaceObserverRecordOperations SurfaceObserverMode = C.CAIRO_SURFACE_OBSERVER_RECORD_OPERATIONS
2486)
2487
2488// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
2489func (i SurfaceObserverMode) String() string {
2490	switch i {
2491	case SurfaceObserverNormal:
2492		return "SurfaceObserverNormal"
2493	case SurfaceObserverRecordOperations:
2494		return "SurfaceObserverRecordOperations"
2495	default:
2496		return fmt.Sprintf("SurfaceObserverMode(%d)", i)
2497	}
2498}
2499
2500// See cairo_surface_create_observer().
2501func (target *Surface) CreateObserver(mode SurfaceObserverMode) *SurfaceObserver {
2502	ret := &SurfaceObserver{wrapSurface(C.cairo_surface_create_observer(target.Ptr, C.cairo_surface_observer_mode_t(mode)))}
2503	if err := target.status(); err != nil {
2504		panic(err)
2505	}
2506	return ret
2507}
2508
2509// See cairo_surface_observer_elapsed().
2510func (surface *SurfaceObserver) Elapsed() float64 {
2511	ret := float64(C.cairo_surface_observer_elapsed(surface.Ptr))
2512	if err := surface.status(); err != nil {
2513		panic(err)
2514	}
2515	return ret
2516}
2517
2518// See cairo_device_observer_elapsed().
2519//
2520// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-observer-elapsed
2521func (device *Device) ObserverElapsed() float64 {
2522	ret := float64(C.cairo_device_observer_elapsed(device.Ptr))
2523	if err := device.status(); err != nil {
2524		panic(err)
2525	}
2526	return ret
2527}
2528
2529// See cairo_device_observer_paint_elapsed().
2530//
2531// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-observer-paint-elapsed
2532func (device *Device) ObserverPaintElapsed() float64 {
2533	ret := float64(C.cairo_device_observer_paint_elapsed(device.Ptr))
2534	if err := device.status(); err != nil {
2535		panic(err)
2536	}
2537	return ret
2538}
2539
2540// See cairo_device_observer_mask_elapsed().
2541//
2542// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-observer-mask-elapsed
2543func (device *Device) ObserverMaskElapsed() float64 {
2544	ret := float64(C.cairo_device_observer_mask_elapsed(device.Ptr))
2545	if err := device.status(); err != nil {
2546		panic(err)
2547	}
2548	return ret
2549}
2550
2551// See cairo_device_observer_fill_elapsed().
2552//
2553// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-observer-fill-elapsed
2554func (device *Device) ObserverFillElapsed() float64 {
2555	ret := float64(C.cairo_device_observer_fill_elapsed(device.Ptr))
2556	if err := device.status(); err != nil {
2557		panic(err)
2558	}
2559	return ret
2560}
2561
2562// See cairo_device_observer_stroke_elapsed().
2563//
2564// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-observer-stroke-elapsed
2565func (device *Device) ObserverStrokeElapsed() float64 {
2566	ret := float64(C.cairo_device_observer_stroke_elapsed(device.Ptr))
2567	if err := device.status(); err != nil {
2568		panic(err)
2569	}
2570	return ret
2571}
2572
2573// See cairo_device_observer_glyphs_elapsed().
2574//
2575// C API documentation: http://cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-observer-glyphs-elapsed
2576func (device *Device) ObserverGlyphsElapsed() float64 {
2577	ret := float64(C.cairo_device_observer_glyphs_elapsed(device.Ptr))
2578	if err := device.status(); err != nil {
2579		panic(err)
2580	}
2581	return ret
2582}
2583
2584// See cairo_surface_finish().
2585//
2586// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-finish
2587func (surface *Surface) Finish() {
2588	C.cairo_surface_finish(surface.Ptr)
2589	if err := surface.status(); err != nil {
2590		panic(err)
2591	}
2592}
2593
2594// See cairo_surface_get_device().
2595//
2596// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-get-device
2597func (surface *Surface) GetDevice() *Device {
2598	ret := wrapDevice(C.cairo_surface_get_device(surface.Ptr))
2599	if err := surface.status(); err != nil {
2600		panic(err)
2601	}
2602	return ret
2603}
2604
2605// See cairo_surface_status().
2606//
2607// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-status
2608func (surface *Surface) status() error {
2609	ret := Status(C.cairo_surface_status(surface.Ptr)).toError()
2610	return ret
2611}
2612
2613// See cairo_surface_type_t.
2614//
2615// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-type-t
2616type SurfaceType int
2617
2618const (
2619	SurfaceTypeImage         SurfaceType = C.CAIRO_SURFACE_TYPE_IMAGE
2620	SurfaceTypePDF           SurfaceType = C.CAIRO_SURFACE_TYPE_PDF
2621	SurfaceTypePS            SurfaceType = C.CAIRO_SURFACE_TYPE_PS
2622	SurfaceTypeXlib          SurfaceType = C.CAIRO_SURFACE_TYPE_XLIB
2623	SurfaceTypeXCB           SurfaceType = C.CAIRO_SURFACE_TYPE_XCB
2624	SurfaceTypeGlitz         SurfaceType = C.CAIRO_SURFACE_TYPE_GLITZ
2625	SurfaceTypeQuartz        SurfaceType = C.CAIRO_SURFACE_TYPE_QUARTZ
2626	SurfaceTypeWin32         SurfaceType = C.CAIRO_SURFACE_TYPE_WIN32
2627	SurfaceTypeBeos          SurfaceType = C.CAIRO_SURFACE_TYPE_BEOS
2628	SurfaceTypeDirectfb      SurfaceType = C.CAIRO_SURFACE_TYPE_DIRECTFB
2629	SurfaceTypeSVG           SurfaceType = C.CAIRO_SURFACE_TYPE_SVG
2630	SurfaceTypeOS2           SurfaceType = C.CAIRO_SURFACE_TYPE_OS2
2631	SurfaceTypeWin32Printing SurfaceType = C.CAIRO_SURFACE_TYPE_WIN32_PRINTING
2632	SurfaceTypeQuartzImage   SurfaceType = C.CAIRO_SURFACE_TYPE_QUARTZ_IMAGE
2633	SurfaceTypeScript        SurfaceType = C.CAIRO_SURFACE_TYPE_SCRIPT
2634	SurfaceTypeQt            SurfaceType = C.CAIRO_SURFACE_TYPE_QT
2635	SurfaceTypeRecording     SurfaceType = C.CAIRO_SURFACE_TYPE_RECORDING
2636	SurfaceTypeVG            SurfaceType = C.CAIRO_SURFACE_TYPE_VG
2637	SurfaceTypeGL            SurfaceType = C.CAIRO_SURFACE_TYPE_GL
2638	SurfaceTypeDRM           SurfaceType = C.CAIRO_SURFACE_TYPE_DRM
2639	SurfaceTypeTee           SurfaceType = C.CAIRO_SURFACE_TYPE_TEE
2640	SurfaceTypeXML           SurfaceType = C.CAIRO_SURFACE_TYPE_XML
2641	SurfaceTypeSkia          SurfaceType = C.CAIRO_SURFACE_TYPE_SKIA
2642	SurfaceTypeSubsurface    SurfaceType = C.CAIRO_SURFACE_TYPE_SUBSURFACE
2643	SurfaceTypeCOGL          SurfaceType = C.CAIRO_SURFACE_TYPE_COGL
2644)
2645
2646// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
2647func (i SurfaceType) String() string {
2648	switch i {
2649	case SurfaceTypeImage:
2650		return "SurfaceTypeImage"
2651	case SurfaceTypePDF:
2652		return "SurfaceTypePDF"
2653	case SurfaceTypePS:
2654		return "SurfaceTypePS"
2655	case SurfaceTypeXlib:
2656		return "SurfaceTypeXlib"
2657	case SurfaceTypeXCB:
2658		return "SurfaceTypeXCB"
2659	case SurfaceTypeGlitz:
2660		return "SurfaceTypeGlitz"
2661	case SurfaceTypeQuartz:
2662		return "SurfaceTypeQuartz"
2663	case SurfaceTypeWin32:
2664		return "SurfaceTypeWin32"
2665	case SurfaceTypeBeos:
2666		return "SurfaceTypeBeos"
2667	case SurfaceTypeDirectfb:
2668		return "SurfaceTypeDirectfb"
2669	case SurfaceTypeSVG:
2670		return "SurfaceTypeSVG"
2671	case SurfaceTypeOS2:
2672		return "SurfaceTypeOS2"
2673	case SurfaceTypeWin32Printing:
2674		return "SurfaceTypeWin32Printing"
2675	case SurfaceTypeQuartzImage:
2676		return "SurfaceTypeQuartzImage"
2677	case SurfaceTypeScript:
2678		return "SurfaceTypeScript"
2679	case SurfaceTypeQt:
2680		return "SurfaceTypeQt"
2681	case SurfaceTypeRecording:
2682		return "SurfaceTypeRecording"
2683	case SurfaceTypeVG:
2684		return "SurfaceTypeVG"
2685	case SurfaceTypeGL:
2686		return "SurfaceTypeGL"
2687	case SurfaceTypeDRM:
2688		return "SurfaceTypeDRM"
2689	case SurfaceTypeTee:
2690		return "SurfaceTypeTee"
2691	case SurfaceTypeXML:
2692		return "SurfaceTypeXML"
2693	case SurfaceTypeSkia:
2694		return "SurfaceTypeSkia"
2695	case SurfaceTypeSubsurface:
2696		return "SurfaceTypeSubsurface"
2697	case SurfaceTypeCOGL:
2698		return "SurfaceTypeCOGL"
2699	default:
2700		return fmt.Sprintf("SurfaceType(%d)", i)
2701	}
2702}
2703
2704// See cairo_surface_get_type().
2705//
2706// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-get-type
2707func (surface *Surface) GetType() SurfaceType {
2708	ret := SurfaceType(C.cairo_surface_get_type(surface.Ptr))
2709	if err := surface.status(); err != nil {
2710		panic(err)
2711	}
2712	return ret
2713}
2714
2715// See cairo_surface_get_content().
2716//
2717// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-get-content
2718func (surface *Surface) GetContent() Content {
2719	ret := Content(C.cairo_surface_get_content(surface.Ptr))
2720	if err := surface.status(); err != nil {
2721		panic(err)
2722	}
2723	return ret
2724}
2725
2726// See cairo_surface_supports_mime_type().
2727//
2728// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-supports-mime-type
2729func (surface *Surface) SupportsMimeType(mimeType string) bool {
2730	c_mimeType := C.CString(mimeType)
2731	defer C.free(unsafe.Pointer(c_mimeType))
2732	ret := C.cairo_surface_supports_mime_type(surface.Ptr, c_mimeType) != 0
2733	if err := surface.status(); err != nil {
2734		panic(err)
2735	}
2736	return ret
2737}
2738
2739// See cairo_surface_get_font_options().
2740//
2741// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-get-font-options
2742func (surface *Surface) GetFontOptions(options *FontOptions) {
2743	C.cairo_surface_get_font_options(surface.Ptr, options.Ptr)
2744	if err := surface.status(); err != nil {
2745		panic(err)
2746	}
2747}
2748
2749// See cairo_surface_flush().
2750//
2751// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-flush
2752func (surface *Surface) Flush() {
2753	C.cairo_surface_flush(surface.Ptr)
2754	if err := surface.status(); err != nil {
2755		panic(err)
2756	}
2757}
2758
2759// See cairo_surface_mark_dirty().
2760//
2761// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-mark-dirty
2762func (surface *Surface) MarkDirty() {
2763	C.cairo_surface_mark_dirty(surface.Ptr)
2764	if err := surface.status(); err != nil {
2765		panic(err)
2766	}
2767}
2768
2769// See cairo_surface_mark_dirty_rectangle().
2770//
2771// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-mark-dirty-rectangle
2772func (surface *Surface) MarkDirtyRectangle(x, y, width, height int) {
2773	C.cairo_surface_mark_dirty_rectangle(surface.Ptr, C.int(x), C.int(y), C.int(width), C.int(height))
2774	if err := surface.status(); err != nil {
2775		panic(err)
2776	}
2777}
2778
2779// See cairo_surface_set_device_scale().
2780//
2781// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-set-device-scale
2782func (surface *Surface) SetDeviceScale(xScale, yScale float64) {
2783	C.cairo_surface_set_device_scale(surface.Ptr, C.double(xScale), C.double(yScale))
2784	if err := surface.status(); err != nil {
2785		panic(err)
2786	}
2787}
2788
2789// See cairo_surface_get_device_scale().
2790//
2791// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-get-device-scale
2792func (surface *Surface) GetDeviceScale() (float64, float64) {
2793	var xScale C.double
2794	var yScale C.double
2795
2796	C.cairo_surface_get_device_scale(surface.Ptr, &xScale, &yScale)
2797	if err := surface.status(); err != nil {
2798		panic(err)
2799	}
2800	return float64(xScale), float64(yScale)
2801}
2802
2803// See cairo_surface_set_device_offset().
2804//
2805// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-set-device-offset
2806func (surface *Surface) SetDeviceOffset(xOffset, yOffset float64) {
2807	C.cairo_surface_set_device_offset(surface.Ptr, C.double(xOffset), C.double(yOffset))
2808	if err := surface.status(); err != nil {
2809		panic(err)
2810	}
2811}
2812
2813// See cairo_surface_get_device_offset().
2814//
2815// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-get-device-offset
2816func (surface *Surface) GetDeviceOffset() (float64, float64) {
2817	var xOffset C.double
2818	var yOffset C.double
2819
2820	C.cairo_surface_get_device_offset(surface.Ptr, &xOffset, &yOffset)
2821	if err := surface.status(); err != nil {
2822		panic(err)
2823	}
2824	return float64(xOffset), float64(yOffset)
2825}
2826
2827// See cairo_surface_set_fallback_resolution().
2828//
2829// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-set-fallback-resolution
2830func (surface *Surface) SetFallbackResolution(xPixelsPerInch, yPixelsPerInch float64) {
2831	C.cairo_surface_set_fallback_resolution(surface.Ptr, C.double(xPixelsPerInch), C.double(yPixelsPerInch))
2832	if err := surface.status(); err != nil {
2833		panic(err)
2834	}
2835}
2836
2837// See cairo_surface_get_fallback_resolution().
2838//
2839// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-get-fallback-resolution
2840func (surface *Surface) GetFallbackResolution() (float64, float64) {
2841	var xPixelsPerInch C.double
2842	var yPixelsPerInch C.double
2843
2844	C.cairo_surface_get_fallback_resolution(surface.Ptr, &xPixelsPerInch, &yPixelsPerInch)
2845	if err := surface.status(); err != nil {
2846		panic(err)
2847	}
2848	return float64(xPixelsPerInch), float64(yPixelsPerInch)
2849}
2850
2851// See cairo_surface_copy_page().
2852//
2853// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-copy-page
2854func (surface *Surface) CopyPage() {
2855	C.cairo_surface_copy_page(surface.Ptr)
2856	if err := surface.status(); err != nil {
2857		panic(err)
2858	}
2859}
2860
2861// See cairo_surface_show_page().
2862//
2863// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-show-page
2864func (surface *Surface) ShowPage() {
2865	C.cairo_surface_show_page(surface.Ptr)
2866	if err := surface.status(); err != nil {
2867		panic(err)
2868	}
2869}
2870
2871// See cairo_surface_has_show_text_glyphs().
2872//
2873// C API documentation: http://cairographics.org/manual/cairo-cairo-surface-t.html#cairo-surface-has-show-text-glyphs
2874func (surface *Surface) HasShowTextGlyphs() bool {
2875	ret := C.cairo_surface_has_show_text_glyphs(surface.Ptr) != 0
2876	if err := surface.status(); err != nil {
2877		panic(err)
2878	}
2879	return ret
2880}
2881
2882// See cairo_image_surface_create().
2883//
2884// C API documentation: http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-create
2885func ImageSurfaceCreate(format Format, width, height int) *ImageSurface {
2886	ret := &ImageSurface{wrapSurface(C.cairo_image_surface_create(C.cairo_format_t(format), C.int(width), C.int(height)))}
2887	if err := ret.status(); err != nil {
2888		panic(err)
2889	}
2890	return ret
2891}
2892
2893// See cairo_format_stride_for_width().
2894//
2895// C API documentation: http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-format-stride-for-width
2896func (format Format) StrideForWidth(width int) int {
2897	ret := int(C.cairo_format_stride_for_width(C.cairo_format_t(format), C.int(width)))
2898	return ret
2899}
2900
2901// See cairo_image_surface_get_data().
2902//
2903// C API documentation: http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-get-data
2904func (i *ImageSurface) Data() []byte {
2905	buf := C.cairo_image_surface_get_data(i.Ptr)
2906	return C.GoBytes(unsafe.Pointer(buf), C.int(i.GetStride()*i.GetHeight()))
2907}
2908
2909// See cairo_image_surface_get_format().
2910//
2911// C API documentation: http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-get-format
2912func (surface *ImageSurface) GetFormat() Format {
2913	ret := Format(C.cairo_image_surface_get_format(surface.Ptr))
2914	if err := surface.status(); err != nil {
2915		panic(err)
2916	}
2917	return ret
2918}
2919
2920// See cairo_image_surface_get_width().
2921//
2922// C API documentation: http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-get-width
2923func (surface *ImageSurface) GetWidth() int {
2924	ret := int(C.cairo_image_surface_get_width(surface.Ptr))
2925	if err := surface.status(); err != nil {
2926		panic(err)
2927	}
2928	return ret
2929}
2930
2931// See cairo_image_surface_get_height().
2932//
2933// C API documentation: http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-get-height
2934func (surface *ImageSurface) GetHeight() int {
2935	ret := int(C.cairo_image_surface_get_height(surface.Ptr))
2936	if err := surface.status(); err != nil {
2937		panic(err)
2938	}
2939	return ret
2940}
2941
2942// See cairo_image_surface_get_stride().
2943//
2944// C API documentation: http://cairographics.org/manual/cairo-Image-Surfaces.html#cairo-image-surface-get-stride
2945func (surface *ImageSurface) GetStride() int {
2946	ret := int(C.cairo_image_surface_get_stride(surface.Ptr))
2947	if err := surface.status(); err != nil {
2948		panic(err)
2949	}
2950	return ret
2951}
2952
2953// See cairo_recording_surface_create().
2954//
2955// C API documentation: http://cairographics.org/manual/cairo-Recording-Surfaces.html#cairo-recording-surface-create
2956func RecordingSurfaceCreate(content Content, extents *Rectangle) *RecordingSurface {
2957	ret := &RecordingSurface{wrapSurface(C.cairo_recording_surface_create(C.cairo_content_t(content), (*C.cairo_rectangle_t)(unsafe.Pointer(extents))))}
2958	if err := ret.status(); err != nil {
2959		panic(err)
2960	}
2961	return ret
2962}
2963
2964// See cairo_recording_surface_ink_extents().
2965//
2966// C API documentation: http://cairographics.org/manual/cairo-Recording-Surfaces.html#cairo-recording-surface-ink-extents
2967func (surface *RecordingSurface) InkExtents() (float64, float64, float64, float64) {
2968	var x0 C.double
2969	var y0 C.double
2970	var width C.double
2971	var height C.double
2972
2973	C.cairo_recording_surface_ink_extents(surface.Ptr, &x0, &y0, &width, &height)
2974	if err := surface.status(); err != nil {
2975		panic(err)
2976	}
2977	return float64(x0), float64(y0), float64(width), float64(height)
2978}
2979
2980// See cairo_recording_surface_get_extents().
2981//
2982// C API documentation: http://cairographics.org/manual/cairo-Recording-Surfaces.html#cairo-recording-surface-get-extents
2983func (surface *RecordingSurface) GetExtents(extents *Rectangle) bool {
2984	ret := C.cairo_recording_surface_get_extents(surface.Ptr, (*C.cairo_rectangle_t)(unsafe.Pointer(extents))) != 0
2985	if err := surface.status(); err != nil {
2986		panic(err)
2987	}
2988	return ret
2989}
2990
2991// See cairo_pattern_create_rgb().
2992//
2993// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-create-rgb
2994func PatternCreateRGB(red, green, blue float64) *Pattern {
2995	ret := wrapPattern(C.cairo_pattern_create_rgb(C.double(red), C.double(green), C.double(blue)))
2996	if err := ret.status(); err != nil {
2997		panic(err)
2998	}
2999	return ret
3000}
3001
3002// See cairo_pattern_create_rgba().
3003//
3004// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-create-rgba
3005func PatternCreateRGBA(red, green, blue, alpha float64) *Pattern {
3006	ret := wrapPattern(C.cairo_pattern_create_rgba(C.double(red), C.double(green), C.double(blue), C.double(alpha)))
3007	if err := ret.status(); err != nil {
3008		panic(err)
3009	}
3010	return ret
3011}
3012
3013// See cairo_pattern_create_for_surface().
3014//
3015// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-create-for-surface
3016func PatternCreateForSurface(surface *Surface) *Pattern {
3017	ret := wrapPattern(C.cairo_pattern_create_for_surface(surface.Ptr))
3018	if err := ret.status(); err != nil {
3019		panic(err)
3020	}
3021	return ret
3022}
3023
3024// See cairo_pattern_create_linear().
3025//
3026// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-create-linear
3027func PatternCreateLinear(x0, y0, x1, y1 float64) *Pattern {
3028	ret := wrapPattern(C.cairo_pattern_create_linear(C.double(x0), C.double(y0), C.double(x1), C.double(y1)))
3029	if err := ret.status(); err != nil {
3030		panic(err)
3031	}
3032	return ret
3033}
3034
3035// See cairo_pattern_create_radial().
3036//
3037// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-create-radial
3038func PatternCreateRadial(cx0, cy0, radius0, cx1, cy1, radius1 float64) *Pattern {
3039	ret := wrapPattern(C.cairo_pattern_create_radial(C.double(cx0), C.double(cy0), C.double(radius0), C.double(cx1), C.double(cy1), C.double(radius1)))
3040	if err := ret.status(); err != nil {
3041		panic(err)
3042	}
3043	return ret
3044}
3045
3046// See cairo_pattern_create_mesh().
3047//
3048// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-create-mesh
3049func PatternCreateMesh() *Pattern {
3050	ret := wrapPattern(C.cairo_pattern_create_mesh())
3051	if err := ret.status(); err != nil {
3052		panic(err)
3053	}
3054	return ret
3055}
3056
3057// See cairo_pattern_status().
3058//
3059// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-status
3060func (pattern *Pattern) status() error {
3061	ret := Status(C.cairo_pattern_status(pattern.Ptr)).toError()
3062	return ret
3063}
3064
3065// See cairo_pattern_type_t.
3066//
3067// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-type-t
3068type PatternType int
3069
3070const (
3071	PatternTypeSolid        PatternType = C.CAIRO_PATTERN_TYPE_SOLID
3072	PatternTypeSurface      PatternType = C.CAIRO_PATTERN_TYPE_SURFACE
3073	PatternTypeLinear       PatternType = C.CAIRO_PATTERN_TYPE_LINEAR
3074	PatternTypeRadial       PatternType = C.CAIRO_PATTERN_TYPE_RADIAL
3075	PatternTypeMesh         PatternType = C.CAIRO_PATTERN_TYPE_MESH
3076	PatternTypeRasterSource PatternType = C.CAIRO_PATTERN_TYPE_RASTER_SOURCE
3077)
3078
3079// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
3080func (i PatternType) String() string {
3081	switch i {
3082	case PatternTypeSolid:
3083		return "PatternTypeSolid"
3084	case PatternTypeSurface:
3085		return "PatternTypeSurface"
3086	case PatternTypeLinear:
3087		return "PatternTypeLinear"
3088	case PatternTypeRadial:
3089		return "PatternTypeRadial"
3090	case PatternTypeMesh:
3091		return "PatternTypeMesh"
3092	case PatternTypeRasterSource:
3093		return "PatternTypeRasterSource"
3094	default:
3095		return fmt.Sprintf("PatternType(%d)", i)
3096	}
3097}
3098
3099// See cairo_pattern_get_type().
3100//
3101// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-get-type
3102func (pattern *Pattern) GetType() PatternType {
3103	ret := PatternType(C.cairo_pattern_get_type(pattern.Ptr))
3104	if err := pattern.status(); err != nil {
3105		panic(err)
3106	}
3107	return ret
3108}
3109
3110// See cairo_pattern_add_color_stop_rgb().
3111//
3112// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-add-color-stop-rgb
3113func (pattern *Pattern) AddColorStopRGB(offset, red, green, blue float64) {
3114	C.cairo_pattern_add_color_stop_rgb(pattern.Ptr, C.double(offset), C.double(red), C.double(green), C.double(blue))
3115	if err := pattern.status(); err != nil {
3116		panic(err)
3117	}
3118}
3119
3120// See cairo_pattern_add_color_stop_rgba().
3121//
3122// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-add-color-stop-rgba
3123func (pattern *Pattern) AddColorStopRGBA(offset, red, green, blue, alpha float64) {
3124	C.cairo_pattern_add_color_stop_rgba(pattern.Ptr, C.double(offset), C.double(red), C.double(green), C.double(blue), C.double(alpha))
3125	if err := pattern.status(); err != nil {
3126		panic(err)
3127	}
3128}
3129
3130// See cairo_mesh_pattern_begin_patch().
3131//
3132// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-begin-patch
3133func (pattern *MeshPattern) BeginPatch() {
3134	C.cairo_mesh_pattern_begin_patch(pattern.Ptr)
3135	if err := pattern.status(); err != nil {
3136		panic(err)
3137	}
3138}
3139
3140// See cairo_mesh_pattern_end_patch().
3141//
3142// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-end-patch
3143func (pattern *MeshPattern) EndPatch() {
3144	C.cairo_mesh_pattern_end_patch(pattern.Ptr)
3145	if err := pattern.status(); err != nil {
3146		panic(err)
3147	}
3148}
3149
3150// See cairo_mesh_pattern_curve_to().
3151//
3152// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-curve-to
3153func (pattern *MeshPattern) CurveTo(x1, y1, x2, y2, x3, y3 float64) {
3154	C.cairo_mesh_pattern_curve_to(pattern.Ptr, C.double(x1), C.double(y1), C.double(x2), C.double(y2), C.double(x3), C.double(y3))
3155	if err := pattern.status(); err != nil {
3156		panic(err)
3157	}
3158}
3159
3160// See cairo_mesh_pattern_line_to().
3161//
3162// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-line-to
3163func (pattern *MeshPattern) LineTo(x, y float64) {
3164	C.cairo_mesh_pattern_line_to(pattern.Ptr, C.double(x), C.double(y))
3165	if err := pattern.status(); err != nil {
3166		panic(err)
3167	}
3168}
3169
3170// See cairo_mesh_pattern_move_to().
3171//
3172// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-move-to
3173func (pattern *MeshPattern) MoveTo(x, y float64) {
3174	C.cairo_mesh_pattern_move_to(pattern.Ptr, C.double(x), C.double(y))
3175	if err := pattern.status(); err != nil {
3176		panic(err)
3177	}
3178}
3179
3180// See cairo_mesh_pattern_set_control_point().
3181//
3182// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-set-control-point
3183func (pattern *MeshPattern) SetControlPoint(pointNum int, x, y float64) {
3184	C.cairo_mesh_pattern_set_control_point(pattern.Ptr, C.uint(pointNum), C.double(x), C.double(y))
3185	if err := pattern.status(); err != nil {
3186		panic(err)
3187	}
3188}
3189
3190// See cairo_mesh_pattern_set_corner_color_rgb().
3191//
3192// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-set-corner-color-rgb
3193func (pattern *MeshPattern) SetCornerColorRGB(cornerNum int, red, green, blue float64) {
3194	C.cairo_mesh_pattern_set_corner_color_rgb(pattern.Ptr, C.uint(cornerNum), C.double(red), C.double(green), C.double(blue))
3195	if err := pattern.status(); err != nil {
3196		panic(err)
3197	}
3198}
3199
3200// See cairo_mesh_pattern_set_corner_color_rgba().
3201//
3202// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-set-corner-color-rgba
3203func (pattern *MeshPattern) SetCornerColorRGBA(cornerNum int, red, green, blue, alpha float64) {
3204	C.cairo_mesh_pattern_set_corner_color_rgba(pattern.Ptr, C.uint(cornerNum), C.double(red), C.double(green), C.double(blue), C.double(alpha))
3205	if err := pattern.status(); err != nil {
3206		panic(err)
3207	}
3208}
3209
3210// See cairo_pattern_set_matrix().
3211//
3212// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-set-matrix
3213func (pattern *Pattern) SetMatrix(matrix *Matrix) {
3214	C.cairo_pattern_set_matrix(pattern.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(matrix)))
3215	if err := pattern.status(); err != nil {
3216		panic(err)
3217	}
3218}
3219
3220// See cairo_pattern_get_matrix().
3221//
3222// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-get-matrix
3223func (pattern *Pattern) GetMatrix(matrix *Matrix) {
3224	C.cairo_pattern_get_matrix(pattern.Ptr, (*C.cairo_matrix_t)(unsafe.Pointer(matrix)))
3225	if err := pattern.status(); err != nil {
3226		panic(err)
3227	}
3228}
3229
3230// See cairo_extend_t.
3231//
3232// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-extend-t
3233type Extend int
3234
3235const (
3236	ExtendNone    Extend = C.CAIRO_EXTEND_NONE
3237	ExtendRepeat  Extend = C.CAIRO_EXTEND_REPEAT
3238	ExtendReflect Extend = C.CAIRO_EXTEND_REFLECT
3239	ExtendPad     Extend = C.CAIRO_EXTEND_PAD
3240)
3241
3242// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
3243func (i Extend) String() string {
3244	switch i {
3245	case ExtendNone:
3246		return "ExtendNone"
3247	case ExtendRepeat:
3248		return "ExtendRepeat"
3249	case ExtendReflect:
3250		return "ExtendReflect"
3251	case ExtendPad:
3252		return "ExtendPad"
3253	default:
3254		return fmt.Sprintf("Extend(%d)", i)
3255	}
3256}
3257
3258// See cairo_pattern_set_extend().
3259//
3260// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-set-extend
3261func (pattern *Pattern) SetExtend(extend Extend) {
3262	C.cairo_pattern_set_extend(pattern.Ptr, C.cairo_extend_t(extend))
3263	if err := pattern.status(); err != nil {
3264		panic(err)
3265	}
3266}
3267
3268// See cairo_pattern_get_extend().
3269//
3270// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-get-extend
3271func (pattern *Pattern) GetExtend() Extend {
3272	ret := Extend(C.cairo_pattern_get_extend(pattern.Ptr))
3273	if err := pattern.status(); err != nil {
3274		panic(err)
3275	}
3276	return ret
3277}
3278
3279// See cairo_filter_t.
3280//
3281// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-filter-t
3282type Filter int
3283
3284const (
3285	FilterFast     Filter = C.CAIRO_FILTER_FAST
3286	FilterGood     Filter = C.CAIRO_FILTER_GOOD
3287	FilterBest     Filter = C.CAIRO_FILTER_BEST
3288	FilterNearest  Filter = C.CAIRO_FILTER_NEAREST
3289	FilterBilinear Filter = C.CAIRO_FILTER_BILINEAR
3290	FilterGaussian Filter = C.CAIRO_FILTER_GAUSSIAN
3291)
3292
3293// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
3294func (i Filter) String() string {
3295	switch i {
3296	case FilterFast:
3297		return "FilterFast"
3298	case FilterGood:
3299		return "FilterGood"
3300	case FilterBest:
3301		return "FilterBest"
3302	case FilterNearest:
3303		return "FilterNearest"
3304	case FilterBilinear:
3305		return "FilterBilinear"
3306	case FilterGaussian:
3307		return "FilterGaussian"
3308	default:
3309		return fmt.Sprintf("Filter(%d)", i)
3310	}
3311}
3312
3313// See cairo_pattern_set_filter().
3314//
3315// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-set-filter
3316func (pattern *Pattern) SetFilter(filter Filter) {
3317	C.cairo_pattern_set_filter(pattern.Ptr, C.cairo_filter_t(filter))
3318	if err := pattern.status(); err != nil {
3319		panic(err)
3320	}
3321}
3322
3323// See cairo_pattern_get_filter().
3324//
3325// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-get-filter
3326func (pattern *Pattern) GetFilter() Filter {
3327	ret := Filter(C.cairo_pattern_get_filter(pattern.Ptr))
3328	if err := pattern.status(); err != nil {
3329		panic(err)
3330	}
3331	return ret
3332}
3333
3334// See cairo_mesh_pattern_get_path().
3335//
3336// C API documentation: http://cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-mesh-pattern-get-path
3337func (pattern *MeshPattern) GetPath(patchNum int) *Path {
3338	ret := wrapPath(C.cairo_mesh_pattern_get_path(pattern.Ptr, C.uint(patchNum)))
3339	if err := pattern.status(); err != nil {
3340		panic(err)
3341	}
3342	return ret
3343}
3344
3345// See cairo_matrix_init_identity().
3346//
3347// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-init-identity
3348func (matrix *Matrix) InitIdentity() {
3349	C.cairo_matrix_init_identity((*C.cairo_matrix_t)(unsafe.Pointer(matrix)))
3350}
3351
3352// See cairo_matrix_init_translate().
3353//
3354// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-init-translate
3355func (matrix *Matrix) InitTranslate(tx, ty float64) {
3356	C.cairo_matrix_init_translate((*C.cairo_matrix_t)(unsafe.Pointer(matrix)), C.double(tx), C.double(ty))
3357}
3358
3359// See cairo_matrix_init_scale().
3360//
3361// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-init-scale
3362func (matrix *Matrix) InitScale(sx, sy float64) {
3363	C.cairo_matrix_init_scale((*C.cairo_matrix_t)(unsafe.Pointer(matrix)), C.double(sx), C.double(sy))
3364}
3365
3366// See cairo_matrix_init_rotate().
3367//
3368// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-init-rotate
3369func (matrix *Matrix) InitRotate(radians float64) {
3370	C.cairo_matrix_init_rotate((*C.cairo_matrix_t)(unsafe.Pointer(matrix)), C.double(radians))
3371}
3372
3373// See cairo_matrix_translate().
3374//
3375// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-translate
3376func (matrix *Matrix) Translate(tx, ty float64) {
3377	C.cairo_matrix_translate((*C.cairo_matrix_t)(unsafe.Pointer(matrix)), C.double(tx), C.double(ty))
3378}
3379
3380// See cairo_matrix_scale().
3381//
3382// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-scale
3383func (matrix *Matrix) Scale(sx, sy float64) {
3384	C.cairo_matrix_scale((*C.cairo_matrix_t)(unsafe.Pointer(matrix)), C.double(sx), C.double(sy))
3385}
3386
3387// See cairo_matrix_rotate().
3388//
3389// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-rotate
3390func (matrix *Matrix) Rotate(radians float64) {
3391	C.cairo_matrix_rotate((*C.cairo_matrix_t)(unsafe.Pointer(matrix)), C.double(radians))
3392}
3393
3394// See cairo_matrix_invert().
3395//
3396// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-invert
3397func (matrix *Matrix) Invert() error {
3398	ret := Status(C.cairo_matrix_invert((*C.cairo_matrix_t)(unsafe.Pointer(matrix)))).toError()
3399	return ret
3400}
3401
3402// See cairo_matrix_multiply().
3403//
3404// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-multiply
3405func (result *Matrix) Multiply(a, b *Matrix) {
3406	C.cairo_matrix_multiply((*C.cairo_matrix_t)(unsafe.Pointer(result)), (*C.cairo_matrix_t)(unsafe.Pointer(a)), (*C.cairo_matrix_t)(unsafe.Pointer(b)))
3407}
3408
3409// See cairo_matrix_transform_distance().
3410//
3411// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-transform-distance
3412func (matrix *Matrix) TransformDistance(dx, dy *float64) {
3413	C.cairo_matrix_transform_distance((*C.cairo_matrix_t)(unsafe.Pointer(matrix)), (*C.double)(unsafe.Pointer(dx)), (*C.double)(unsafe.Pointer(dy)))
3414}
3415
3416// See cairo_matrix_transform_point().
3417//
3418// C API documentation: http://cairographics.org/manual/cairo-cairo-matrix-t.html#cairo-matrix-transform-point
3419func (matrix *Matrix) TransformPoint(x, y *float64) {
3420	C.cairo_matrix_transform_point((*C.cairo_matrix_t)(unsafe.Pointer(matrix)), (*C.double)(unsafe.Pointer(x)), (*C.double)(unsafe.Pointer(y)))
3421}
3422
3423// See cairo_region_t.
3424//
3425// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-t
3426type Region struct {
3427	Ptr *C.cairo_region_t
3428}
3429
3430func freeRegion(obj *Region) {
3431	C.cairo_region_destroy(obj.Ptr)
3432}
3433func wrapRegion(p *C.cairo_region_t) *Region {
3434	ret := &Region{p}
3435	runtime.SetFinalizer(ret, freeRegion)
3436	return ret
3437}
3438
3439// Wrap a C cairo_region_t* found from some external source as a *Region.  The Go side will destroy the reference when it's no longer used.
3440func WrapRegion(p unsafe.Pointer) *Region {
3441	return wrapRegion((*C.cairo_region_t)(p))
3442}
3443
3444// Construct a Region from a C cairo_region_t* found from some exernal source.  It is the caller's responsibility to ensure the pointer lives.
3445func BorrowRegion(p unsafe.Pointer) *Region {
3446	return &Region{(*C.cairo_region_t)(p)}
3447}
3448
3449// See cairo_region_overlap_t.
3450//
3451// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-overlap-t
3452type RegionOverlap int
3453
3454const (
3455	RegionOverlapIn   RegionOverlap = C.CAIRO_REGION_OVERLAP_IN
3456	RegionOverlapOut  RegionOverlap = C.CAIRO_REGION_OVERLAP_OUT
3457	RegionOverlapPart RegionOverlap = C.CAIRO_REGION_OVERLAP_PART
3458)
3459
3460// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
3461func (i RegionOverlap) String() string {
3462	switch i {
3463	case RegionOverlapIn:
3464		return "RegionOverlapIn"
3465	case RegionOverlapOut:
3466		return "RegionOverlapOut"
3467	case RegionOverlapPart:
3468		return "RegionOverlapPart"
3469	default:
3470		return fmt.Sprintf("RegionOverlap(%d)", i)
3471	}
3472}
3473
3474// See cairo_region_create().
3475//
3476// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-create
3477func RegionCreate() *Region {
3478	ret := wrapRegion(C.cairo_region_create())
3479	if err := ret.status(); err != nil {
3480		panic(err)
3481	}
3482	return ret
3483}
3484
3485// See cairo_region_copy().
3486//
3487// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-copy
3488func (original *Region) Copy() *Region {
3489	ret := wrapRegion(C.cairo_region_copy(original.Ptr))
3490	if err := original.status(); err != nil {
3491		panic(err)
3492	}
3493	return ret
3494}
3495
3496// See cairo_region_equal().
3497//
3498// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-equal
3499func (a *Region) Equal(b *Region) bool {
3500	ret := C.cairo_region_equal(a.Ptr, b.Ptr) != 0
3501	if err := a.status(); err != nil {
3502		panic(err)
3503	}
3504	return ret
3505}
3506
3507// See cairo_region_status().
3508//
3509// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-status
3510func (region *Region) status() error {
3511	ret := Status(C.cairo_region_status(region.Ptr)).toError()
3512	return ret
3513}
3514
3515// See cairo_region_num_rectangles().
3516//
3517// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-num-rectangles
3518func (region *Region) NumRectangles() int {
3519	ret := int(C.cairo_region_num_rectangles(region.Ptr))
3520	if err := region.status(); err != nil {
3521		panic(err)
3522	}
3523	return ret
3524}
3525
3526// See cairo_region_is_empty().
3527//
3528// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-is-empty
3529func (region *Region) IsEmpty() bool {
3530	ret := C.cairo_region_is_empty(region.Ptr) != 0
3531	if err := region.status(); err != nil {
3532		panic(err)
3533	}
3534	return ret
3535}
3536
3537// See cairo_region_contains_point().
3538//
3539// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-contains-point
3540func (region *Region) ContainsPoint(x, y int) bool {
3541	ret := C.cairo_region_contains_point(region.Ptr, C.int(x), C.int(y)) != 0
3542	if err := region.status(); err != nil {
3543		panic(err)
3544	}
3545	return ret
3546}
3547
3548// See cairo_region_translate().
3549//
3550// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-translate
3551func (region *Region) Translate(dx, dy int) {
3552	C.cairo_region_translate(region.Ptr, C.int(dx), C.int(dy))
3553	if err := region.status(); err != nil {
3554		panic(err)
3555	}
3556}
3557
3558// See cairo_region_subtract().
3559//
3560// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-subtract
3561func (dst *Region) Subtract(other *Region) error {
3562	ret := Status(C.cairo_region_subtract(dst.Ptr, other.Ptr)).toError()
3563	if err := dst.status(); err != nil {
3564		panic(err)
3565	}
3566	return ret
3567}
3568
3569// See cairo_region_intersect().
3570//
3571// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-intersect
3572func (dst *Region) Intersect(other *Region) error {
3573	ret := Status(C.cairo_region_intersect(dst.Ptr, other.Ptr)).toError()
3574	if err := dst.status(); err != nil {
3575		panic(err)
3576	}
3577	return ret
3578}
3579
3580// See cairo_region_union().
3581//
3582// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-union
3583func (dst *Region) Union(other *Region) error {
3584	ret := Status(C.cairo_region_union(dst.Ptr, other.Ptr)).toError()
3585	if err := dst.status(); err != nil {
3586		panic(err)
3587	}
3588	return ret
3589}
3590
3591// See cairo_region_xor().
3592//
3593// C API documentation: http://cairographics.org/manual/cairo-Regions.html#cairo-region-xor
3594func (dst *Region) XOR(other *Region) error {
3595	ret := Status(C.cairo_region_xor(dst.Ptr, other.Ptr)).toError()
3596	if err := dst.status(); err != nil {
3597		panic(err)
3598	}
3599	return ret
3600}
3601
3602// See cairo_svg_version_t.
3603//
3604// C API documentation: http://cairographics.org/manual/cairo-SVG-Surfaces.html#cairo-svg-version-t
3605type SVGVersion int
3606
3607const (
3608	SVGVersion11 SVGVersion = C.CAIRO_SVG_VERSION_1_1
3609	SVGVersion12 SVGVersion = C.CAIRO_SVG_VERSION_1_2
3610)
3611
3612// String implements the Stringer interface, which is used in places like fmt's %q.  For all enums like this it returns the Go name of the constant.
3613func (i SVGVersion) String() string {
3614	switch i {
3615	case SVGVersion11:
3616		return "SVGVersion11"
3617	case SVGVersion12:
3618		return "SVGVersion12"
3619	default:
3620		return fmt.Sprintf("SVGVersion(%d)", i)
3621	}
3622}
3623
3624// See cairo_svg_surface_create().
3625//
3626// C API documentation: http://cairographics.org/manual/cairo-SVG-Surfaces.html#cairo-svg-surface-create
3627func SVGSurfaceCreate(filename string, widthInPoints, heightInPoints float64) *SVGSurface {
3628	c_filename := C.CString(filename)
3629	defer C.free(unsafe.Pointer(c_filename))
3630	ret := &SVGSurface{wrapSurface(C.cairo_svg_surface_create(c_filename, C.double(widthInPoints), C.double(heightInPoints)))}
3631	if err := ret.status(); err != nil {
3632		panic(err)
3633	}
3634	return ret
3635}
3636
3637// See cairo_svg_surface_restrict_to_version().
3638//
3639// C API documentation: http://cairographics.org/manual/cairo-SVG-Surfaces.html#cairo-svg-surface-restrict-to-version
3640func (surface *SVGSurface) RestrictToVersion(version SVGVersion) {
3641	C.cairo_svg_surface_restrict_to_version(surface.Ptr, C.cairo_svg_version_t(version))
3642	if err := surface.status(); err != nil {
3643		panic(err)
3644	}
3645}
3646
3647// See cairo_svg_get_versions().
3648//
3649// C API documentation: http://cairographics.org/manual/cairo-SVG-Surfaces.html#cairo-svg-get-versions
3650func SVGGetVersions() []SVGVersion {
3651	var cVersionsPtr *C.cairo_svg_version_t
3652	var cNumVersions C.int
3653	C.cairo_svg_get_versions(&cVersionsPtr, &cNumVersions)
3654	slice := (*[1 << 30]C.cairo_svg_version_t)(unsafe.Pointer(cVersionsPtr))[:cNumVersions:cNumVersions]
3655	versions := make([]SVGVersion, cNumVersions)
3656	for i := 0; i < int(cNumVersions); i++ {
3657		versions[i] = SVGVersion(slice[i])
3658	}
3659	return versions
3660}
3661
3662// See cairo_svg_version_to_string().
3663//
3664// C API documentation: http://cairographics.org/manual/cairo-SVG-Surfaces.html#cairo-svg-version-to-string
3665func (version SVGVersion) ToString() string {
3666	ret := C.GoString(C.cairo_svg_version_to_string(C.cairo_svg_version_t(version)))
3667	return ret
3668}
3669
3670// See cairo_xlib_surface_create().
3671//
3672// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-create
3673func XlibSurfaceCreate(dpy unsafe.Pointer, drawable uint64, visual unsafe.Pointer, width, height int) *XlibSurface {
3674	ret := &XlibSurface{wrapSurface(C.cairo_xlib_surface_create((*C.Display)(dpy), C.Drawable(drawable), (*C.Visual)(visual), C.int(width), C.int(height)))}
3675	if err := ret.status(); err != nil {
3676		panic(err)
3677	}
3678	return ret
3679}
3680
3681// See cairo_xlib_surface_create_for_bitmap().
3682//
3683// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-create-for-bitmap
3684func XlibSurfaceCreateForBitmap(dpy unsafe.Pointer, bitmap uint64, screen unsafe.Pointer, width, height int) *XlibSurface {
3685	ret := &XlibSurface{wrapSurface(C.cairo_xlib_surface_create_for_bitmap((*C.Display)(dpy), C.Pixmap(bitmap), (*C.Screen)(screen), C.int(width), C.int(height)))}
3686	if err := ret.status(); err != nil {
3687		panic(err)
3688	}
3689	return ret
3690}
3691
3692// See cairo_xlib_surface_set_size().
3693//
3694// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-set-size
3695func (surface *XlibSurface) SetSize(width, height int) {
3696	C.cairo_xlib_surface_set_size(surface.Ptr, C.int(width), C.int(height))
3697	if err := surface.status(); err != nil {
3698		panic(err)
3699	}
3700}
3701
3702// See cairo_xlib_surface_set_drawable().
3703//
3704// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-set-drawable
3705func (surface *XlibSurface) SetDrawable(drawable uint64, width, height int) {
3706	C.cairo_xlib_surface_set_drawable(surface.Ptr, C.Drawable(drawable), C.int(width), C.int(height))
3707	if err := surface.status(); err != nil {
3708		panic(err)
3709	}
3710}
3711
3712// See cairo_xlib_surface_get_display().
3713//
3714// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-get-display
3715func (surface *XlibSurface) GetDisplay() unsafe.Pointer {
3716	ret := unsafe.Pointer(C.cairo_xlib_surface_get_display(surface.Ptr))
3717	if err := surface.status(); err != nil {
3718		panic(err)
3719	}
3720	return ret
3721}
3722
3723// See cairo_xlib_surface_get_drawable().
3724//
3725// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-get-drawable
3726func (surface *XlibSurface) GetDrawable() uint64 {
3727	ret := uint64(C.cairo_xlib_surface_get_drawable(surface.Ptr))
3728	if err := surface.status(); err != nil {
3729		panic(err)
3730	}
3731	return ret
3732}
3733
3734// See cairo_xlib_surface_get_screen().
3735//
3736// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-get-screen
3737func (surface *XlibSurface) GetScreen() unsafe.Pointer {
3738	ret := unsafe.Pointer(C.cairo_xlib_surface_get_screen(surface.Ptr))
3739	if err := surface.status(); err != nil {
3740		panic(err)
3741	}
3742	return ret
3743}
3744
3745// See cairo_xlib_surface_get_visual().
3746//
3747// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-get-visual
3748func (surface *XlibSurface) GetVisual() unsafe.Pointer {
3749	ret := unsafe.Pointer(C.cairo_xlib_surface_get_visual(surface.Ptr))
3750	if err := surface.status(); err != nil {
3751		panic(err)
3752	}
3753	return ret
3754}
3755
3756// See cairo_xlib_surface_get_depth().
3757//
3758// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-get-depth
3759func (surface *XlibSurface) GetDepth() int {
3760	ret := int(C.cairo_xlib_surface_get_depth(surface.Ptr))
3761	if err := surface.status(); err != nil {
3762		panic(err)
3763	}
3764	return ret
3765}
3766
3767// See cairo_xlib_surface_get_width().
3768//
3769// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-get-width
3770func (surface *XlibSurface) GetWidth() int {
3771	ret := int(C.cairo_xlib_surface_get_width(surface.Ptr))
3772	if err := surface.status(); err != nil {
3773		panic(err)
3774	}
3775	return ret
3776}
3777
3778// See cairo_xlib_surface_get_height().
3779//
3780// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-surface-get-height
3781func (surface *XlibSurface) GetHeight() int {
3782	ret := int(C.cairo_xlib_surface_get_height(surface.Ptr))
3783	if err := surface.status(); err != nil {
3784		panic(err)
3785	}
3786	return ret
3787}
3788
3789// See cairo_xlib_device_debug_cap_xrender_version().
3790//
3791// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-device-debug-cap-xrender-version
3792func (device *XlibDevice) DebugCapXrenderVersion(majorVersion, minorVersion int) {
3793	C.cairo_xlib_device_debug_cap_xrender_version(device.Ptr, C.int(majorVersion), C.int(minorVersion))
3794	if err := device.status(); err != nil {
3795		panic(err)
3796	}
3797}
3798
3799// See cairo_xlib_device_debug_set_precision().
3800//
3801// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-device-debug-set-precision
3802func (device *XlibDevice) DebugSetPrecision(precision int) {
3803	C.cairo_xlib_device_debug_set_precision(device.Ptr, C.int(precision))
3804	if err := device.status(); err != nil {
3805		panic(err)
3806	}
3807}
3808
3809// See cairo_xlib_device_debug_get_precision().
3810//
3811// C API documentation: http://cairographics.org/manual/cairo-XLib-Surfaces.html#cairo-xlib-device-debug-get-precision
3812func (device *XlibDevice) DebugGetPrecision() int {
3813	ret := int(C.cairo_xlib_device_debug_get_precision(device.Ptr))
3814	if err := device.status(); err != nil {
3815		panic(err)
3816	}
3817	return ret
3818}
3819