aboutsummaryrefslogtreecommitdiff
path: root/src/core_internal.h
blob: 951c6051220e399d49b1a20fac1a9fd3dba4ff99 (plain)
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
/*
 * Copyright (c) 2018-2019 Hanspeter Portner (dev@open-music-kontrollers.ch)
 *
 * This is free software: you can redistribute it and/or modify
 * it under the terms of the Artistic License 2.0 as published by
 * The Perl Foundation.
 *
 * This source is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * Artistic License 2.0 for more details.
 *
 * You should have received a copy of the Artistic License 2.0
 * along the source as a COPYING file. If not, obtain it from
 * http://www.perlfoundation.org/artistic_license_2_0.
 */

#ifndef _D2TK_CORE_INTERNAL_H
#define _D2TK_CORE_INTERNAL_H

#include <d2tk/core.h>

#ifdef __cplusplus
extern "C" {
#endif

#define D2TK_PAD_SIZE(size) ( ((size) + 7U) & (~7U) )

typedef struct _d2tk_clip_t d2tk_clip_t;
typedef struct _d2tk_com_t d2tk_com_t;

typedef void *(*d2tk_core_new_t)(const char *bundle_path, void *pctx);
typedef void (*d2tk_core_free_t)(void *data);
typedef void (*d2tk_core_pre_t)(void *data, d2tk_core_t *core,
	d2tk_coord_t w, d2tk_coord_t h, unsigned pass);
typedef bool (*d2tk_core_post_t)(void *data, d2tk_core_t *core,
	d2tk_coord_t w, d2tk_coord_t h, unsigned pass);
typedef void (*d2tk_core_process_t)(void *data, d2tk_core_t *core,
	const d2tk_com_t *com, d2tk_coord_t xo, d2tk_coord_t yo,
	const d2tk_clip_t *clip, unsigned pass);
typedef void (*d2tk_core_sprite_free_t)(void *data, uint8_t type, uintptr_t body);

typedef struct _d2tk_body_move_to_t d2tk_body_move_to_t;
typedef struct _d2tk_body_line_to_t d2tk_body_line_to_t;
typedef struct _d2tk_body_rect_t d2tk_body_rect_t;
typedef struct _d2tk_body_scissor_t d2tk_body_scissor_t;
typedef struct _d2tk_body_rounded_rect_t d2tk_body_rounded_rect_t;
typedef struct _d2tk_body_arc_t d2tk_body_arc_t;
typedef struct _d2tk_body_curve_to_t d2tk_body_curve_to_t;
typedef struct _d2tk_body_color_t d2tk_body_color_t;
typedef struct _d2tk_body_linear_gradient_t d2tk_body_linear_gradient_t;
typedef struct _d2tk_body_rotate_t d2tk_body_rotate_t;
typedef struct _d2tk_body_font_face_t d2tk_body_font_face_t;
typedef struct _d2tk_body_font_size_t d2tk_body_font_size_t;
typedef struct _d2tk_body_text_t d2tk_body_text_t;
typedef struct _d2tk_body_image_t d2tk_body_image_t;
typedef struct _d2tk_body_bitmap_surf_t d2tk_body_bitmap_surf_t;
typedef struct _d2tk_body_bitmap_t d2tk_body_bitmap_t;
typedef struct _d2tk_body_custom_t d2tk_body_custom_t;
typedef struct _d2tk_body_stroke_width_t d2tk_body_stroke_width_t;
typedef struct _d2tk_body_bbox_t d2tk_body_bbox_t;
typedef union _d2tk_body_t d2tk_body_t;

struct _d2tk_clip_t {
	d2tk_coord_t x0;
	d2tk_coord_t y0;
	d2tk_coord_t x1;
	d2tk_coord_t y1;
	d2tk_coord_t w;
	d2tk_coord_t h;
};

struct _d2tk_core_driver_t {
	d2tk_core_new_t new;
	d2tk_core_free_t free;
	d2tk_core_pre_t pre;
	d2tk_core_process_t process;
	d2tk_core_post_t post;
	d2tk_core_sprite_free_t sprite_free;
};

struct _d2tk_body_move_to_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
};

struct _d2tk_body_line_to_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
};

struct _d2tk_body_rect_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
	d2tk_coord_t w;
	d2tk_coord_t h;
};

struct _d2tk_body_scissor_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
	d2tk_coord_t w;
	d2tk_coord_t h;
};

struct _d2tk_body_rounded_rect_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
	d2tk_coord_t w;
	d2tk_coord_t h;
	d2tk_coord_t r;
};

struct _d2tk_body_arc_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
	d2tk_coord_t r;
	d2tk_coord_t a;
	d2tk_coord_t b;
	bool cw;
};

struct _d2tk_body_curve_to_t {
	d2tk_coord_t x1;
	d2tk_coord_t y1;
	d2tk_coord_t x2;
	d2tk_coord_t y2;
	d2tk_coord_t x3;
	d2tk_coord_t y3;
};

struct _d2tk_body_color_t {
	uint32_t rgba;
};

struct _d2tk_body_linear_gradient_t {
	d2tk_point_t p [2];
	uint32_t rgba [2];
};

struct _d2tk_body_rotate_t {
	d2tk_coord_t deg;
};

struct _d2tk_body_font_face_t {
	char face [1]; // at least zero-terminator
};

struct _d2tk_body_font_size_t {
	d2tk_coord_t size;
};

struct _d2tk_body_text_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
	d2tk_coord_t w;
	d2tk_coord_t h;
	d2tk_align_t align;
	char text [1]; // at least zero-terminator
};

struct _d2tk_body_image_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
	d2tk_coord_t w;
	d2tk_coord_t h;
	d2tk_align_t align;
	char path [1]; // at least zero-terminator
};

struct _d2tk_body_bitmap_surf_t {
	uint32_t w;
	uint32_t h;
	uint32_t stride;
	const uint32_t *argb;
	uint64_t rev;
};

struct _d2tk_body_bitmap_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
	d2tk_coord_t w;
	d2tk_coord_t h;
	d2tk_align_t align;
	d2tk_body_bitmap_surf_t surf;
};

struct _d2tk_body_custom_t {
	d2tk_coord_t x;
	d2tk_coord_t y;
	d2tk_coord_t w;
	d2tk_coord_t h;
	uint32_t size;
	const void *data;
	d2tk_core_custom_t custom;
};

struct _d2tk_body_stroke_width_t {
	d2tk_coord_t width;
};

struct _d2tk_body_bbox_t {
	bool dirty;
	bool cached;
	bool container;
	uint32_t hash;
	d2tk_clip_t clip;
};

union _d2tk_body_t {
	d2tk_body_move_to_t move_to;
	d2tk_body_line_to_t line_to;
	d2tk_body_rect_t rect;
	d2tk_body_rounded_rect_t rounded_rect;
	d2tk_body_arc_t arc;
	d2tk_body_curve_to_t curve_to;
	d2tk_body_color_t color;
	d2tk_body_linear_gradient_t linear_gradient;
	d2tk_body_rotate_t rotate;
	d2tk_body_scissor_t scissor;
	d2tk_body_font_face_t font_face;
	d2tk_body_font_size_t font_size;
	d2tk_body_text_t text;
	d2tk_body_image_t image;
	d2tk_body_custom_t custom;
	d2tk_body_bitmap_t bitmap;
	d2tk_body_stroke_width_t stroke_width;
	d2tk_body_bbox_t bbox;
};

typedef enum _d2tk_instr_t {
	D2TK_INSTR_LINE_TO,
	D2TK_INSTR_MOVE_TO,
	D2TK_INSTR_RECT,
	D2TK_INSTR_ROUNDED_RECT,
	D2TK_INSTR_ARC,
	D2TK_INSTR_CURVE_TO,
	D2TK_INSTR_COLOR,
	D2TK_INSTR_LINEAR_GRADIENT,
	D2TK_INSTR_ROTATE,
	D2TK_INSTR_STROKE,
	D2TK_INSTR_FILL,
	D2TK_INSTR_SAVE,
	D2TK_INSTR_RESTORE,
	D2TK_INSTR_BBOX,
	D2TK_INSTR_BEGIN_PATH,
	D2TK_INSTR_CLOSE_PATH,
	D2TK_INSTR_SCISSOR,
	D2TK_INSTR_RESET_SCISSOR,
	D2TK_INSTR_FONT_SIZE,
	D2TK_INSTR_FONT_FACE,
	D2TK_INSTR_TEXT,
	D2TK_INSTR_IMAGE,
	D2TK_INSTR_BITMAP,
	D2TK_INSTR_CUSTOM,
	D2TK_INSTR_STROKE_WIDTH
} d2tk_instr_t;

struct _d2tk_com_t {
	uint32_t size;
	uint32_t instr;
	d2tk_body_t body [] __attribute__((aligned(8)));
};

uintptr_t *
d2tk_core_get_sprite(d2tk_core_t *core, uint64_t hash, uint8_t type);

const d2tk_com_t *
d2tk_com_begin_const(const d2tk_com_t *com);

bool
d2tk_com_not_end_const(const d2tk_com_t *com, const d2tk_com_t *bbox);

const d2tk_com_t *
d2tk_com_next_const(const d2tk_com_t *bbox);

#define D2TK_COM_FOREACH_CONST(COM, BBOX) \
	for(const d2tk_com_t *(BBOX) = d2tk_com_begin_const((COM)); \
		d2tk_com_not_end_const((COM), (BBOX)); \
		(BBOX) = d2tk_com_next_const((BBOX)))

d2tk_com_t *
d2tk_com_begin(d2tk_com_t *com);

bool
d2tk_com_not_end(d2tk_com_t *com, d2tk_com_t *bbox);

d2tk_com_t *
d2tk_com_next(d2tk_com_t *bbox);

#define D2TK_COM_FOREACH(COM, BBOX) \
	for(d2tk_com_t *(BBOX) = d2tk_com_begin((COM)); \
		d2tk_com_not_end((COM), (BBOX)); \
		(BBOX) = d2tk_com_next((BBOX)))

#define D2TK_COM_FOREACH_FROM(COM, FROM, BBOX) \
	for(d2tk_com_t *(BBOX) = (FROM); \
		d2tk_com_not_end((COM), (BBOX)); \
		(BBOX) = d2tk_com_next((BBOX)))

uint32_t *
d2tk_core_get_pixels(d2tk_core_t *core, d2tk_rect_t *rect);

void
d2tk_core_set_bg_color(d2tk_core_t *core, uint32_t rgba);

uint32_t
d2tk_core_get_bg_color(d2tk_core_t *core);

#ifdef __cplusplus
}
#endif

#endif // _D2TK_CORE_INTERNAL_H