/
IoCairoGradient.c
103 lines (84 loc) · 2.97 KB
/
IoCairoGradient.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*#io
CairoGradient ioDoc(
docCopyright("Trevor Fancher", 2007)
docCopyright("Daniel Rosengren", 2007)
docLicense("BSD revised")
docCategory("Graphics")
*/
#include "IoCairoGradient.h"
#include "IoCairoPattern.h"
#include "IoCairoPattern_inline.h"
#include "IoNumber.h"
#include "tools.h"
static IoTag *IoCairoGradient_newTag(void *state)
{
IoTag *tag = IoTag_newWithName_("Gradient");
IoTag_state_(tag, state);
IoTag_cloneFunc_(tag, (IoTagCloneFunc *)IoCairoGradient_rawClone);
IoTag_freeFunc_(tag, (IoTagFreeFunc *)IoCairoPattern_free);
return tag;
}
IoCairoGradient *IoCairoGradient_proto(void *state)
{
IoObject *self = IoObject_new(state);
IoObject_tag_(self, IoCairoGradient_newTag(state));
IoState_registerProtoWithFunc_(state, self, IoCairoGradient_proto);
IoCairoGradient_addMethods(self);
return self;
}
void IoCairoGradient_addMethods(IoCairoGradient *self)
{
IoCairoPattern_addMethods(self);
{
IoMethodTable methodTable[] = {
{"addColorStopRGB", IoCairoGradient_addColorStopRGB},
{"addColorStopRGBA", IoCairoGradient_addColorStopRGBA},
{"getColorStopCount", IoCairoGradient_getColorStopCount},
{"getColorStopRGBA", IoCairoGradient_getColorStopRGBA},
{NULL, NULL},
};
IoObject_addMethodTable_(self, methodTable);
}
}
IoCairoGradient *IoCairoGradient_rawClone(IoCairoGradient *proto)
{
IoObject *self = IoObject_rawClonePrimitive(proto);
if (PATTERN(proto))
IoObject_setDataPointer_(self, cairo_pattern_reference(PATTERN(proto)));
return self;
}
/* ----------------------------------------------------------- */
IoObject *IoCairoGradient_addColorStopRGB(IoCairoGradient *self, IoObject *locals, IoMessage *m)
{
double o = IoMessage_locals_doubleArgAt_(m, locals, 0);
double r = IoMessage_locals_doubleArgAt_(m, locals, 1);
double g = IoMessage_locals_doubleArgAt_(m, locals, 2);
double b = IoMessage_locals_doubleArgAt_(m, locals, 3);
cairo_pattern_add_color_stop_rgb(PATTERN(self), o, r, g, b);
CHECK_STATUS(self);
return self;
}
IoObject *IoCairoGradient_addColorStopRGBA(IoCairoGradient *self, IoObject *locals, IoMessage *m)
{
double o = IoMessage_locals_doubleArgAt_(m, locals, 0);
double r = IoMessage_locals_doubleArgAt_(m, locals, 1);
double g = IoMessage_locals_doubleArgAt_(m, locals, 2);
double b = IoMessage_locals_doubleArgAt_(m, locals, 3);
double a = IoMessage_locals_doubleArgAt_(m, locals, 4);
cairo_pattern_add_color_stop_rgba(PATTERN(self), o, r, g, b, a);
CHECK_STATUS(self);
return self;
}
IoObject *IoCairoGradient_getColorStopCount(IoCairoGradient *self, IoObject *locals, IoMessage *m)
{
int count = 0;
cairo_pattern_get_color_stop_count(PATTERN(self), &count);
return IONUMBER(count);
}
IoObject *IoCairoGradient_getColorStopRGBA(IoCairoGradient *self, IoObject *locals, IoMessage *m)
{
int index = IoMessage_locals_intArgAt_(m, locals, 0);
double data[5];
cairo_pattern_get_color_stop_rgba(PATTERN(self), index, &data[0], &data[1], &data[2], &data[3], &data[4]);
return IoSeq_newWithDoubles_count_(IOSTATE, data, 5);
}