1 /*
2 * Copyright (c) 2016 Hanspeter Portner (dev@open-music-kontrollers.ch)
3 *
4 * This is free software: you can redistribute it and/or modify
5 * it under the terms of the Artistic License 2.0 as published by
6 * The Perl Foundation.
7 *
8 * This source is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * Artistic License 2.0 for more details.
12 *
13 * You should have received a copy of the Artistic License 2.0
14 * along the source as a COPYING file. If not, obtain it from
15 * http://www.perlfoundation.org/artistic_license_2_0.
16 */
17
18 #ifndef _LV2_CANVAS_FORGE_H
19 #define _LV2_CANVAS_FORGE_H
20
21 #include <canvas.lv2/canvas.h>
22
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26
27 static inline LV2_Atom_Forge_Ref
_lv2_canvas_forge_simple(LV2_Atom_Forge * forge,LV2_URID otype)28 _lv2_canvas_forge_simple(LV2_Atom_Forge *forge, LV2_URID otype)
29 {
30 LV2_Atom_Forge_Ref ref;
31 LV2_Atom_Forge_Frame frame;
32
33 ref = lv2_atom_forge_object(forge, &frame, 0, otype);
34 if(ref)
35 lv2_atom_forge_pop(forge, &frame);
36
37 return ref;
38 }
39
40 static inline LV2_Atom_Forge_Ref
_lv2_canvas_forge_vec(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,LV2_URID otype,uint32_t n,const float * vec)41 _lv2_canvas_forge_vec(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
42 LV2_URID otype, uint32_t n, const float *vec)
43 {
44 LV2_Atom_Forge_Ref ref;
45 LV2_Atom_Forge_Frame frame;
46
47 ref = lv2_atom_forge_object(forge, &frame, 0, otype);
48 if(ref)
49 ref = lv2_atom_forge_key(forge, urid->Canvas_body);
50 if(ref)
51 ref = lv2_atom_forge_vector(forge, sizeof(float), forge->Float, n, vec);
52 if(ref)
53 lv2_atom_forge_pop(forge, &frame);
54
55 return ref;
56 }
57
58 static inline LV2_Atom_Forge_Ref
_lv2_canvas_forge_flt(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,LV2_URID otype,float flt)59 _lv2_canvas_forge_flt(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
60 LV2_URID otype, float flt)
61 {
62 LV2_Atom_Forge_Ref ref;
63 LV2_Atom_Forge_Frame frame;
64
65 ref = lv2_atom_forge_object(forge, &frame, 0, otype);
66 if(ref)
67 ref = lv2_atom_forge_key(forge, urid->Canvas_body);
68 if(ref)
69 ref = lv2_atom_forge_float(forge, flt);
70 if(ref)
71 lv2_atom_forge_pop(forge, &frame);
72
73 return ref;
74 }
75
76 static inline LV2_Atom_Forge_Ref
_lv2_canvas_forge_lng(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,LV2_URID otype,int64_t lng)77 _lv2_canvas_forge_lng(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
78 LV2_URID otype, int64_t lng)
79 {
80 LV2_Atom_Forge_Ref ref;
81 LV2_Atom_Forge_Frame frame;
82
83 ref = lv2_atom_forge_object(forge, &frame, 0, otype);
84 if(ref)
85 ref = lv2_atom_forge_key(forge, urid->Canvas_body);
86 if(ref)
87 ref = lv2_atom_forge_long(forge, lng);
88 if(ref)
89 lv2_atom_forge_pop(forge, &frame);
90
91 return ref;
92 }
93
94 static inline LV2_Atom_Forge_Ref
_lv2_canvas_forge_prp(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,LV2_URID otype,LV2_URID prop)95 _lv2_canvas_forge_prp(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
96 LV2_URID otype, LV2_URID prop)
97 {
98 LV2_Atom_Forge_Ref ref;
99 LV2_Atom_Forge_Frame frame;
100
101 ref = lv2_atom_forge_object(forge, &frame, 0, otype);
102 if(ref)
103 ref = lv2_atom_forge_key(forge, urid->Canvas_body);
104 if(ref)
105 ref = lv2_atom_forge_urid(forge, prop);
106 if(ref)
107 lv2_atom_forge_pop(forge, &frame);
108
109 return ref;
110 }
111
112 static inline LV2_Atom_Forge_Ref
_lv2_canvas_forge_str(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,LV2_URID otype,const char * text)113 _lv2_canvas_forge_str(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
114 LV2_URID otype, const char *text)
115 {
116 LV2_Atom_Forge_Ref ref;
117 LV2_Atom_Forge_Frame frame;
118
119 ref = lv2_atom_forge_object(forge, &frame, 0, otype);
120 if(ref)
121 ref = lv2_atom_forge_key(forge, urid->Canvas_body);
122 if(ref)
123 ref = lv2_atom_forge_string(forge, text, strlen(text));
124 if(ref)
125 lv2_atom_forge_pop(forge, &frame);
126
127 return ref;
128 }
129
130 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_beginPath(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid)131 lv2_canvas_forge_beginPath(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid)
132 {
133 return _lv2_canvas_forge_simple(forge, urid->Canvas_BeginPath);
134 }
135
136 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_closePath(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid)137 lv2_canvas_forge_closePath(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid)
138 {
139 return _lv2_canvas_forge_simple(forge, urid->Canvas_ClosePath);
140 }
141
142 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_arc(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float x,float y,float r,float a1,float a2)143 lv2_canvas_forge_arc(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
144 float x, float y, float r, float a1, float a2)
145 {
146 const float vec [5] = {x, y, r, a1, a2};
147
148 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_Arc, 5, vec);
149 }
150
151 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_curveTo(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float x1,float y1,float x2,float y2,float x3,float y3)152 lv2_canvas_forge_curveTo(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
153 float x1, float y1, float x2, float y2, float x3, float y3)
154 {
155 const float vec [6] = {x1, y1, x2, y2, x3, y3};
156
157 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_CurveTo, 6, vec);
158 }
159
160 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_lineTo(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float x,float y)161 lv2_canvas_forge_lineTo(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
162 float x, float y)
163 {
164 const float vec [2] = {x, y};
165
166 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_LineTo, 2, vec);
167 }
168
169 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_moveTo(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float x,float y)170 lv2_canvas_forge_moveTo(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
171 float x, float y)
172 {
173 const float vec [2] = {x, y};
174
175 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_MoveTo, 2, vec);
176 }
177
178 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_rectangle(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float x,float y,float w,float h)179 lv2_canvas_forge_rectangle(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
180 float x, float y, float w, float h)
181 {
182 const float vec [4] = {x, y, w, h};
183
184 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_Rectangle, 4, vec);
185 }
186
187 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_polyLine(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,uint32_t n,const float * vec)188 lv2_canvas_forge_polyLine(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
189 uint32_t n, const float *vec)
190 {
191 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_PolyLine, n, vec);
192 }
193
194 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_style(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,uint32_t style)195 lv2_canvas_forge_style(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
196 uint32_t style)
197 {
198 return _lv2_canvas_forge_lng(forge, urid, urid->Canvas_Style, style);
199 }
200
201 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_lineWidth(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float line_width)202 lv2_canvas_forge_lineWidth(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
203 float line_width)
204 {
205 return _lv2_canvas_forge_flt(forge, urid, urid->Canvas_LineWidth, line_width);
206 }
207
208 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_lineDash(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float dash_length,float separator_length)209 lv2_canvas_forge_lineDash(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
210 float dash_length, float separator_length)
211 {
212 const float vec [2] = {dash_length, separator_length};
213
214 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_LineDash, 2, vec);
215 }
216
217 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_lineCap(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,LV2_URID line_cap)218 lv2_canvas_forge_lineCap(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
219 LV2_URID line_cap)
220 {
221 return _lv2_canvas_forge_prp(forge, urid, urid->Canvas_LineCap, line_cap);
222 }
223
224 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_lineJoin(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,LV2_URID line_join)225 lv2_canvas_forge_lineJoin(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
226 LV2_URID line_join)
227 {
228 return _lv2_canvas_forge_prp(forge, urid, urid->Canvas_LineJoin, line_join);
229 }
230
231 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_miterLimit(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float miter_limit)232 lv2_canvas_forge_miterLimit(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
233 float miter_limit)
234 {
235 return _lv2_canvas_forge_flt(forge, urid, urid->Canvas_MiterLimit, miter_limit);
236 }
237
238 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_stroke(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid)239 lv2_canvas_forge_stroke(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid)
240 {
241 return _lv2_canvas_forge_simple(forge, urid->Canvas_Stroke);
242 }
243
244 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_fill(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid)245 lv2_canvas_forge_fill(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid)
246 {
247 return _lv2_canvas_forge_simple(forge, urid->Canvas_Fill);
248 }
249
250 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_clip(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid)251 lv2_canvas_forge_clip(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid)
252 {
253 return _lv2_canvas_forge_simple(forge, urid->Canvas_Clip);
254 }
255
256 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_save(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid)257 lv2_canvas_forge_save(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid)
258 {
259 return _lv2_canvas_forge_simple(forge, urid->Canvas_Save);
260 }
261
262 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_restore(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid)263 lv2_canvas_forge_restore(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid)
264 {
265 return _lv2_canvas_forge_simple(forge, urid->Canvas_Restore);
266 }
267
268 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_translate(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float x,float y)269 lv2_canvas_forge_translate(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
270 float x, float y)
271 {
272 const float vec [2] = {x, y};
273
274 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_Translate, 2, vec);
275 }
276
277 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_scale(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float w,float h)278 lv2_canvas_forge_scale(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
279 float w, float h)
280 {
281 const float vec [2] = {w, h};
282
283 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_Scale, 2, vec);
284 }
285
286 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_rotate(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float a)287 lv2_canvas_forge_rotate(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
288 float a)
289 {
290 return _lv2_canvas_forge_flt(forge, urid, urid->Canvas_Rotate, a);
291 }
292
293 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_transform(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float xx,float xy,float x0,float yy,float yx,float y0)294 lv2_canvas_forge_transform(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
295 float xx, float xy, float x0, float yy, float yx, float y0)
296 {
297 const float vec [6] = {xx, xy, x0, yy, yx, y0};
298
299 return _lv2_canvas_forge_vec(forge, urid, urid->Canvas_Transform, 6, vec);
300 }
301
302 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_reset(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid)303 lv2_canvas_forge_reset(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid)
304 {
305 return _lv2_canvas_forge_simple(forge, urid->Canvas_Reset);
306 }
307
308 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_fontSize(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,float size)309 lv2_canvas_forge_fontSize(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
310 float size)
311 {
312 return _lv2_canvas_forge_flt(forge, urid, urid->Canvas_FontSize, size);
313 }
314
315 static inline LV2_Atom_Forge_Ref
lv2_canvas_forge_fillText(LV2_Atom_Forge * forge,LV2_Canvas_URID * urid,const char * text)316 lv2_canvas_forge_fillText(LV2_Atom_Forge *forge, LV2_Canvas_URID *urid,
317 const char *text)
318 {
319 return _lv2_canvas_forge_str(forge, urid, urid->Canvas_FillText, text);
320 }
321
322 #ifdef __cplusplus
323 }
324 #endif
325
326 #endif // _LV2_CANVAS_FORGE_H
327