1 /*
2  * Copyright 2017 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can
5  * be found in the LICENSE file.
6  *
7  */
8 
9 #ifndef SKC_ONCE_SKC
10 #define SKC_ONCE_SKC
11 
12 //
13 //
14 //
15 
16 #include "skc_err.h"
17 #include "skc_types.h"
18 #include "skc_styling.h"
19 
20 //
21 // CONTEXT
22 //
23 
24 skc_err
25 skc_context_retain(skc_context_t context);
26 
27 skc_err
28 skc_context_release(skc_context_t context);
29 
30 skc_err
31 skc_context_reset(skc_context_t context);
32 
33 //
34 // PATH BUILDER
35 //
36 
37 skc_err
38 skc_path_builder_create(skc_context_t context, skc_path_builder_t * path_builder);
39 
40 skc_err
41 skc_path_builder_retain(skc_path_builder_t path_builder);
42 
43 skc_err
44 skc_path_builder_release(skc_path_builder_t path_builder);
45 
46 //
47 // PATH OPS
48 //
49 
50 skc_err
51 skc_path_begin(skc_path_builder_t path_builder);
52 
53 skc_err
54 skc_path_end(skc_path_builder_t path_builder, skc_path_t * path);
55 
56 skc_err
57 skc_path_retain(skc_context_t context, skc_path_t const * paths, uint32_t count);
58 
59 skc_err
60 skc_path_release(skc_context_t context, skc_path_t const * paths, uint32_t count);
61 
62 skc_err
63 skc_path_flush(skc_context_t context, skc_path_t const * paths, uint32_t count);
64 
65 //
66 // PATH SEGMENT OPS
67 //
68 
69 //
70 // FIXME -- we need a bulk/vectorized path segment operation
71 //
72 
73 skc_err
74 skc_path_move_to(skc_path_builder_t path_builder,
75                  float x0, float y0);
76 
77 skc_err
78 skc_path_close(skc_path_builder_t path_builder);
79 
80 skc_err
81 skc_path_line_to(skc_path_builder_t path_builder,
82                  float x1, float y1);
83 
84 skc_err
85 skc_path_cubic_to(skc_path_builder_t path_builder,
86                   float x1, float y1,
87                   float x2, float y2,
88                   float x3, float y3);
89 
90 skc_err
91 skc_path_cubic_smooth_to(skc_path_builder_t path_builder,
92                          float x2, float y2,
93                          float x3, float y3);
94 
95 skc_err
96 skc_path_quad_to(skc_path_builder_t path_builder,
97                  float x1, float y1,
98                  float x2, float y2);
99 
100 skc_err
101 skc_path_quad_smooth_to(skc_path_builder_t path_builder,
102                         float x2, float y2);
103 
104 skc_err
105 skc_path_ellipse(skc_path_builder_t path_builder,
106                  float cx, float cy,
107                  float rx, float ry);
108 
109 //
110 // RASTER BUILDER
111 //
112 
113 skc_err
114 skc_raster_builder_create(skc_context_t context, skc_raster_builder_t * raster_builder);
115 
116 skc_err
117 skc_raster_builder_retain(skc_raster_builder_t raster_builder);
118 
119 skc_err
120 skc_raster_builder_release(skc_raster_builder_t raster_builder);
121 
122 //
123 // RASTER OPS
124 //
125 
126 skc_err
127 skc_raster_begin(skc_raster_builder_t raster_builder);
128 
129 skc_err
130 skc_raster_end(skc_raster_builder_t raster_builder, skc_raster_t * raster);
131 
132 skc_err
133 skc_raster_retain(skc_context_t context, skc_raster_t const * rasters, uint32_t count);
134 
135 skc_err
136 skc_raster_release(skc_context_t context, skc_raster_t const * rasters, uint32_t count);
137 
138 skc_err
139 skc_raster_flush(skc_context_t context, skc_raster_t const * rasters, uint32_t count);
140 
141 //
142 // PATH-TO-RASTER OPS
143 //
144 
145 //
146 // FIXME -- do we need a bulk/vectorized "add filled" function?
147 //
148 
149 skc_err
150 skc_raster_add_filled(skc_raster_builder_t        raster_builder,
151                       skc_path_t                  path,
152                       skc_transform_weakref_t   * transform_weakref,
153                       float               const * transform,
154                       skc_raster_clip_weakref_t * raster_clip_weakref,
155                       float               const * raster_clip);
156 
157 //
158 // COMPOSITION STATE
159 //
160 
161 skc_err
162 skc_composition_create(skc_context_t context, skc_composition_t * composition);
163 
164 skc_err
165 skc_composition_retain(skc_composition_t composition);
166 
167 skc_err
168 skc_composition_release(skc_composition_t composition);
169 
170 skc_err
171 skc_composition_place(skc_composition_t    composition,
172                       skc_raster_t const * rasters,
173                       skc_layer_id const * layer_ids,
174                       float        const * txs,
175                       float        const * tys,
176                       uint32_t             count); // NOTE: A PER-PLACE CLIP IS POSSIBLE
177 
178 skc_err
179 skc_composition_seal(skc_composition_t composition);
180 
181 skc_err
182 skc_composition_unseal(skc_composition_t composition, bool reset);
183 
184 skc_err
185 skc_composition_get_bounds(skc_composition_t composition, int32_t bounds[4]);
186 
187 #if 0
188 // let's switch to a per place bounds using weakrefs -- clip 0 will be largest clip
189 skc_err
190 skc_composition_set_clip(skc_composition_t composition, int32_t const clip[4]);
191 #endif
192 
193 //
194 // TODO: COMPOSITION "SET ALGEBRA" OPERATIONS
195 //
196 // Produce a new composition from the union or intersection of two
197 // existing compositions
198 //
199 
200 //
201 // TODO: COMPOSITION "HIT DETECTION"
202 //
203 // Report which layers and tiles are intersected by one or more
204 // device-space (x,y) points
205 //
206 
207 //
208 // STYLING STATE
209 //
210 
211 skc_err
212 skc_styling_create(skc_context_t   context,
213                    skc_styling_t * styling,
214                    uint32_t        layers_count,
215                    uint32_t        groups_count,
216                    uint32_t        extras_count);
217 
218 skc_err
219 skc_styling_retain(skc_styling_t styling);
220 
221 skc_err
222 skc_styling_release(skc_styling_t styling);
223 
224 skc_err
225 skc_styling_seal(skc_styling_t styling);
226 
227 skc_err
228 skc_styling_unseal(skc_styling_t styling); // FIXME
229 
230 skc_err
231 skc_styling_reset(skc_styling_t styling); // FIXME -- make unseal reset
232 
233 //
234 // STYLING GROUPS AND LAYERS
235 //
236 
237 skc_err
238 skc_styling_group_alloc(skc_styling_t  styling,
239                         skc_group_id * group_id);
240 
241 skc_err
242 skc_styling_group_enter(skc_styling_t             styling,
243                         skc_group_id              group_id,
244                         uint32_t                  n,
245                         skc_styling_cmd_t const * cmds);
246 
247 skc_err
248 skc_styling_group_leave(skc_styling_t             styling,
249                         skc_group_id              group_id,
250                         uint32_t                  n,
251                         skc_styling_cmd_t const * cmds);
252 
253 //
254 // n:
255 //
256 //   The number of parent groups above this group. The top of the
257 //   hierarchy must start with a single enclosing group which has 0
258 //   parents.
259 //
260 // parents:
261 //
262 //   The sequence of parent group ids leading from the top of
263 //   hierarchy to the parent of 'group_id'.
264 //
265 skc_err
266 skc_styling_group_parents(skc_styling_t        styling,
267                           skc_group_id         group_id,
268                           uint32_t             n,
269                           skc_group_id const * parents);
270 
271 skc_err
272 skc_styling_group_range_lo(skc_styling_t styling,
273                            skc_group_id  group_id,
274                            skc_layer_id  layer_lo);
275 
276 skc_err
277 skc_styling_group_range_hi(skc_styling_t styling,
278                            skc_group_id  group_id,
279                            skc_layer_id  layer_hi);
280 
281 skc_err
282 skc_styling_group_layer(skc_styling_t             styling,
283                         skc_group_id              group_id,
284                         skc_layer_id              layer_id,
285                         uint32_t                  n,
286                         skc_styling_cmd_t const * cmds);
287 
288 //
289 // STYLING ENCODERS -- FIXME -- WILL EVENTUALLY BE OPAQUE
290 //
291 
292 void
293 skc_styling_layer_fill_rgba_encoder(skc_styling_cmd_t * cmds, float const rgba[4]);
294 
295 void
296 skc_styling_background_over_encoder(skc_styling_cmd_t * cmds, float const rgba[4]);
297 
298 void
299 skc_styling_layer_fill_gradient_encoder(skc_styling_cmd_t         * cmds,
300                                         float                       x0,
301                                         float                       y0,
302                                         float                       x1,
303                                         float                       y1,
304                                         skc_styling_gradient_type_e type,
305                                         uint32_t                    n,
306                                         float                 const stops[],
307                                         float                 const colors[]);
308 
309 //
310 // SURFACE
311 //
312 
313 skc_err
314 skc_surface_create(skc_context_t context, skc_surface_t * surface);
315 
316 skc_err
317 skc_surface_retain(skc_surface_t surface);
318 
319 skc_err
320 skc_surface_release(skc_surface_t surface);
321 
322 //
323 // SURFACE RENDER
324 //
325 
326 typedef void (*skc_surface_render_notify)(skc_surface_t     surface,
327                                           skc_styling_t     styling,
328                                           skc_composition_t composition,
329                                           skc_framebuffer_t fb,
330                                           void            * data);
331 
332 skc_err
333 skc_surface_render(skc_surface_t             surface,
334                    skc_styling_t             styling,
335                    skc_composition_t         composition,
336                    skc_framebuffer_t         fb,
337                    uint32_t            const clip[4],
338                    int32_t             const txty[2],
339                    skc_surface_render_notify notify,
340                    void                    * data);
341 
342 //
343 // COORDINATED EXTERNAL OPERATIONS
344 //
345 //  Examples include:
346 //
347 //  - Transforming an intermediate layer with a blur, sharpen, rotation or scaling kernel.
348 //  - Subpixel antialiasing using neighboring pixel color and coverage data.
349 //  - Performing a blit from one region to another region on a surface.
350 //  - Blitting from one surface to another.
351 //  - Loading and processing from one region and storing to another region.
352 //  - Rendezvousing with an external pipeline.
353 //
354 
355 // FORTHCOMING...
356 
357 //
358 // SCHEDULER
359 //
360 
361 bool
362 skc_context_yield(skc_context_t context);
363 
364 void
365 skc_context_wait(skc_context_t context);
366 
367 //
368 //
369 //
370 
371 #endif
372 
373 //
374 //
375 //
376