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