Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 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 | // |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 13 | // |
| 14 | // |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 15 | |
Allan MacKinnon | c110e79 | 2018-06-21 09:09:56 -0700 | [diff] [blame] | 16 | #include "skc_err.h" |
| 17 | #include "skc_types.h" |
| 18 | #include "skc_styling.h" |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 19 | |
| 20 | // |
| 21 | // CONTEXT |
| 22 | // |
| 23 | |
| 24 | skc_err |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 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 | // |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 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, |
Allan MacKinnon | ebf160f | 2018-06-24 08:31:14 -0700 | [diff] [blame] | 251 | skc_styling_cmd_t const * cmds); |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 252 | |
Allan MacKinnon | 6ddc959 | 2018-10-01 09:16:33 -0700 | [diff] [blame] | 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 | // |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 265 | skc_err |
| 266 | skc_styling_group_parents(skc_styling_t styling, |
| 267 | skc_group_id group_id, |
Allan MacKinnon | 6ddc959 | 2018-10-01 09:16:33 -0700 | [diff] [blame] | 268 | uint32_t n, |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 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, |
Allan MacKinnon | ebf160f | 2018-06-24 08:31:14 -0700 | [diff] [blame] | 286 | skc_styling_cmd_t const * cmds); |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 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 | |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 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 | |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 322 | // |
| 323 | // SURFACE RENDER |
| 324 | // |
| 325 | |
Allan MacKinnon | ebf160f | 2018-06-24 08:31:14 -0700 | [diff] [blame] | 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 | |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 332 | skc_err |
Allan MacKinnon | ebf160f | 2018-06-24 08:31:14 -0700 | [diff] [blame] | 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], |
Allan MacKinnon | 9e0d7e4 | 2018-07-16 15:57:05 -0700 | [diff] [blame] | 338 | int32_t const txty[2], |
Allan MacKinnon | ebf160f | 2018-06-24 08:31:14 -0700 | [diff] [blame] | 339 | skc_surface_render_notify notify, |
| 340 | void * data); |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 341 | |
| 342 | // |
Allan MacKinnon | c110e79 | 2018-06-21 09:09:56 -0700 | [diff] [blame] | 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 | // |
Allan MacKinnon | 4359d52 | 2018-06-19 13:57:04 -0700 | [diff] [blame] | 368 | // |
| 369 | // |
| 370 | |
| 371 | #endif |
| 372 | |
| 373 | // |
| 374 | // |
| 375 | // |