1package cairo
2
3// #include <stdlib.h>
4// #include <cairo.h>
5// #include <cairo-gobject.h>
6import "C"
7import (
8	"errors"
9	"strings"
10	"unsafe"
11)
12
13// Status is a representation of Cairo's cairo_status_t.
14type Status int
15
16const (
17	STATUS_SUCCESS                   Status = C.CAIRO_STATUS_SUCCESS
18	STATUS_NO_MEMORY                 Status = C.CAIRO_STATUS_NO_MEMORY
19	STATUS_INVALID_RESTORE           Status = C.CAIRO_STATUS_INVALID_RESTORE
20	STATUS_INVALID_POP_GROUP         Status = C.CAIRO_STATUS_INVALID_POP_GROUP
21	STATUS_NO_CURRENT_POINT          Status = C.CAIRO_STATUS_NO_CURRENT_POINT
22	STATUS_INVALID_MATRIX            Status = C.CAIRO_STATUS_INVALID_MATRIX
23	STATUS_INVALID_STATUS            Status = C.CAIRO_STATUS_INVALID_STATUS
24	STATUS_NULL_POINTER              Status = C.CAIRO_STATUS_NULL_POINTER
25	STATUS_INVALID_STRING            Status = C.CAIRO_STATUS_INVALID_STRING
26	STATUS_INVALID_PATH_DATA         Status = C.CAIRO_STATUS_INVALID_PATH_DATA
27	STATUS_READ_ERROR                Status = C.CAIRO_STATUS_READ_ERROR
28	STATUS_WRITE_ERROR               Status = C.CAIRO_STATUS_WRITE_ERROR
29	STATUS_SURFACE_FINISHED          Status = C.CAIRO_STATUS_SURFACE_FINISHED
30	STATUS_SURFACE_TYPE_MISMATCH     Status = C.CAIRO_STATUS_SURFACE_TYPE_MISMATCH
31	STATUS_PATTERN_TYPE_MISMATCH     Status = C.CAIRO_STATUS_PATTERN_TYPE_MISMATCH
32	STATUS_INVALID_CONTENT           Status = C.CAIRO_STATUS_INVALID_CONTENT
33	STATUS_INVALID_FORMAT            Status = C.CAIRO_STATUS_INVALID_FORMAT
34	STATUS_INVALID_VISUAL            Status = C.CAIRO_STATUS_INVALID_VISUAL
35	STATUS_FILE_NOT_FOUND            Status = C.CAIRO_STATUS_FILE_NOT_FOUND
36	STATUS_INVALID_DASH              Status = C.CAIRO_STATUS_INVALID_DASH
37	STATUS_INVALID_DSC_COMMENT       Status = C.CAIRO_STATUS_INVALID_DSC_COMMENT
38	STATUS_INVALID_INDEX             Status = C.CAIRO_STATUS_INVALID_INDEX
39	STATUS_CLIP_NOT_REPRESENTABLE    Status = C.CAIRO_STATUS_CLIP_NOT_REPRESENTABLE
40	STATUS_TEMP_FILE_ERROR           Status = C.CAIRO_STATUS_TEMP_FILE_ERROR
41	STATUS_INVALID_STRIDE            Status = C.CAIRO_STATUS_INVALID_STRIDE
42	STATUS_FONT_TYPE_MISMATCH        Status = C.CAIRO_STATUS_FONT_TYPE_MISMATCH
43	STATUS_USER_FONT_IMMUTABLE       Status = C.CAIRO_STATUS_USER_FONT_IMMUTABLE
44	STATUS_USER_FONT_ERROR           Status = C.CAIRO_STATUS_USER_FONT_ERROR
45	STATUS_NEGATIVE_COUNT            Status = C.CAIRO_STATUS_NEGATIVE_COUNT
46	STATUS_INVALID_CLUSTERS          Status = C.CAIRO_STATUS_INVALID_CLUSTERS
47	STATUS_INVALID_SLANT             Status = C.CAIRO_STATUS_INVALID_SLANT
48	STATUS_INVALID_WEIGHT            Status = C.CAIRO_STATUS_INVALID_WEIGHT
49	STATUS_INVALID_SIZE              Status = C.CAIRO_STATUS_INVALID_SIZE
50	STATUS_USER_FONT_NOT_IMPLEMENTED Status = C.CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED
51	STATUS_DEVICE_TYPE_MISMATCH      Status = C.CAIRO_STATUS_DEVICE_TYPE_MISMATCH
52	STATUS_DEVICE_ERROR              Status = C.CAIRO_STATUS_DEVICE_ERROR
53	// STATUS_INVALID_MESH_CONSTRUCTION Status = C.CAIRO_STATUS_INVALID_MESH_CONSTRUCTION (since 1.12)
54	// STATUS_DEVICE_FINISHED           Status = C.CAIRO_STATUS_DEVICE_FINISHED (since 1.12)
55)
56
57var key_Status = map[Status]string{
58
59	STATUS_SUCCESS:                   "CAIRO_STATUS_SUCCESS",
60	STATUS_NO_MEMORY:                 "CAIRO_STATUS_NO_MEMORY",
61	STATUS_INVALID_RESTORE:           "CAIRO_STATUS_INVALID_RESTORE",
62	STATUS_INVALID_POP_GROUP:         "CAIRO_STATUS_INVALID_POP_GROUP",
63	STATUS_NO_CURRENT_POINT:          "CAIRO_STATUS_NO_CURRENT_POINT",
64	STATUS_INVALID_MATRIX:            "CAIRO_STATUS_INVALID_MATRIX",
65	STATUS_INVALID_STATUS:            "CAIRO_STATUS_INVALID_STATUS",
66	STATUS_NULL_POINTER:              "CAIRO_STATUS_NULL_POINTER",
67	STATUS_INVALID_STRING:            "CAIRO_STATUS_INVALID_STRING",
68	STATUS_INVALID_PATH_DATA:         "CAIRO_STATUS_INVALID_PATH_DATA",
69	STATUS_READ_ERROR:                "CAIRO_STATUS_READ_ERROR",
70	STATUS_WRITE_ERROR:               "CAIRO_STATUS_WRITE_ERROR",
71	STATUS_SURFACE_FINISHED:          "CAIRO_STATUS_SURFACE_FINISHED",
72	STATUS_SURFACE_TYPE_MISMATCH:     "CAIRO_STATUS_SURFACE_TYPE_MISMATCH",
73	STATUS_PATTERN_TYPE_MISMATCH:     "CAIRO_STATUS_PATTERN_TYPE_MISMATCH",
74	STATUS_INVALID_CONTENT:           "CAIRO_STATUS_INVALID_CONTENT",
75	STATUS_INVALID_FORMAT:            "CAIRO_STATUS_INVALID_FORMAT",
76	STATUS_INVALID_VISUAL:            "CAIRO_STATUS_INVALID_VISUAL",
77	STATUS_FILE_NOT_FOUND:            "CAIRO_STATUS_FILE_NOT_FOUND",
78	STATUS_INVALID_DASH:              "CAIRO_STATUS_INVALID_DASH",
79	STATUS_INVALID_DSC_COMMENT:       "CAIRO_STATUS_INVALID_DSC_COMMENT",
80	STATUS_INVALID_INDEX:             "CAIRO_STATUS_INVALID_INDEX",
81	STATUS_CLIP_NOT_REPRESENTABLE:    "CAIRO_STATUS_CLIP_NOT_REPRESENTABLE",
82	STATUS_TEMP_FILE_ERROR:           "CAIRO_STATUS_TEMP_FILE_ERROR",
83	STATUS_INVALID_STRIDE:            "CAIRO_STATUS_INVALID_STRIDE",
84	STATUS_FONT_TYPE_MISMATCH:        "CAIRO_STATUS_FONT_TYPE_MISMATCH",
85	STATUS_USER_FONT_IMMUTABLE:       "CAIRO_STATUS_USER_FONT_IMMUTABLE",
86	STATUS_USER_FONT_ERROR:           "CAIRO_STATUS_USER_FONT_ERROR",
87	STATUS_NEGATIVE_COUNT:            "CAIRO_STATUS_NEGATIVE_COUNT",
88	STATUS_INVALID_CLUSTERS:          "CAIRO_STATUS_INVALID_CLUSTERS",
89	STATUS_INVALID_SLANT:             "CAIRO_STATUS_INVALID_SLANT",
90	STATUS_INVALID_WEIGHT:            "CAIRO_STATUS_INVALID_WEIGHT",
91	STATUS_INVALID_SIZE:              "CAIRO_STATUS_INVALID_SIZE",
92	STATUS_USER_FONT_NOT_IMPLEMENTED: "CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED",
93	STATUS_DEVICE_TYPE_MISMATCH:      "CAIRO_STATUS_DEVICE_TYPE_MISMATCH",
94	STATUS_DEVICE_ERROR:              "CAIRO_STATUS_DEVICE_ERROR",
95}
96
97func StatusToString(status Status) string {
98	s, ok := key_Status[status]
99	if !ok {
100		s = "CAIRO_STATUS_UNDEFINED"
101	}
102	return s
103}
104
105func marshalStatus(p uintptr) (interface{}, error) {
106	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
107	return Status(c), nil
108}
109
110// String returns a readable status messsage usable in texts.
111func (s Status) String() string {
112	str := StatusToString(s)
113	str = strings.Replace(str, "CAIRO_STATUS_", "", 1)
114	str = strings.Replace(str, "_", " ", 0)
115	return strings.ToLower(str)
116}
117
118// ToError returns the error for the status. Returns nil if success.
119func (s Status) ToError() error {
120	if s == STATUS_SUCCESS {
121		return nil
122	}
123	return errors.New(s.String())
124}
125