/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can
 * be found in the LICENSE file.
 *
 */

#ifndef SKC_ONCE_SKC
#define SKC_ONCE_SKC

//
//
//

#include "skc_err.h"
#include "skc_types.h"
#include "skc_styling.h"

//
// CONTEXT
//

skc_err
skc_context_retain(skc_context_t context);

skc_err
skc_context_release(skc_context_t context);

skc_err
skc_context_reset(skc_context_t context);

//
// PATH BUILDER
//

skc_err
skc_path_builder_create(skc_context_t context, skc_path_builder_t * path_builder);

skc_err
skc_path_builder_retain(skc_path_builder_t path_builder);

skc_err
skc_path_builder_release(skc_path_builder_t path_builder);

//
// PATH OPS
//

skc_err
skc_path_begin(skc_path_builder_t path_builder);

skc_err
skc_path_end(skc_path_builder_t path_builder, skc_path_t * path);

skc_err
skc_path_retain(skc_context_t context, skc_path_t const * paths, uint32_t count);

skc_err
skc_path_release(skc_context_t context, skc_path_t const * paths, uint32_t count);

skc_err
skc_path_flush(skc_context_t context, skc_path_t const * paths, uint32_t count);

//
// PATH SEGMENT OPS
//

//
// FIXME -- we need a bulk/vectorized path segment operation
//

skc_err
skc_path_move_to(skc_path_builder_t path_builder,
                 float x0, float y0);

skc_err
skc_path_close(skc_path_builder_t path_builder);

skc_err
skc_path_line_to(skc_path_builder_t path_builder,
                 float x1, float y1);

skc_err
skc_path_cubic_to(skc_path_builder_t path_builder,
                  float x1, float y1,
                  float x2, float y2,
                  float x3, float y3);

skc_err
skc_path_cubic_smooth_to(skc_path_builder_t path_builder,
                         float x2, float y2,
                         float x3, float y3);

skc_err
skc_path_quad_to(skc_path_builder_t path_builder,
                 float x1, float y1,
                 float x2, float y2);

skc_err
skc_path_quad_smooth_to(skc_path_builder_t path_builder,
                        float x2, float y2);

skc_err
skc_path_ellipse(skc_path_builder_t path_builder,
                 float cx, float cy,
                 float rx, float ry);

//
// RASTER BUILDER
//

skc_err
skc_raster_builder_create(skc_context_t context, skc_raster_builder_t * raster_builder);

skc_err
skc_raster_builder_retain(skc_raster_builder_t raster_builder);

skc_err
skc_raster_builder_release(skc_raster_builder_t raster_builder);

//
// RASTER OPS
//

skc_err
skc_raster_begin(skc_raster_builder_t raster_builder);

skc_err
skc_raster_end(skc_raster_builder_t raster_builder, skc_raster_t * raster);

skc_err
skc_raster_retain(skc_context_t context, skc_raster_t const * rasters, uint32_t count);

skc_err
skc_raster_release(skc_context_t context, skc_raster_t const * rasters, uint32_t count);

skc_err
skc_raster_flush(skc_context_t context, skc_raster_t const * rasters, uint32_t count);

//
// PATH-TO-RASTER OPS
//

//
// FIXME -- do we need a bulk/vectorized "add filled" function?
//

skc_err
skc_raster_add_filled(skc_raster_builder_t        raster_builder,
                      skc_path_t                  path,
                      skc_transform_weakref_t   * transform_weakref,
                      float               const * transform,
                      skc_raster_clip_weakref_t * raster_clip_weakref,
                      float               const * raster_clip);

//
// COMPOSITION STATE
//

skc_err
skc_composition_create(skc_context_t context, skc_composition_t * composition);

skc_err
skc_composition_retain(skc_composition_t composition);

skc_err
skc_composition_release(skc_composition_t composition);

skc_err
skc_composition_place(skc_composition_t    composition,
                      skc_raster_t const * rasters,
                      skc_layer_id const * layer_ids,
                      float        const * txs,
                      float        const * tys,
                      uint32_t             count); // NOTE: A PER-PLACE CLIP IS POSSIBLE

skc_err
skc_composition_seal(skc_composition_t composition);

skc_err
skc_composition_unseal(skc_composition_t composition, bool reset);

skc_err
skc_composition_get_bounds(skc_composition_t composition, int32_t bounds[4]);

#if 0
// let's switch to a per place bounds using weakrefs -- clip 0 will be largest clip
skc_err
skc_composition_set_clip(skc_composition_t composition, int32_t const clip[4]);
#endif

//
// TODO: COMPOSITION "SET ALGEBRA" OPERATIONS
//
// Produce a new composition from the union or intersection of two
// existing compositions
//

//
// TODO: COMPOSITION "HIT DETECTION"
//
// Report which layers and tiles are intersected by one or more
// device-space (x,y) points
//

//
// STYLING STATE
//

skc_err
skc_styling_create(skc_context_t   context,
                   skc_styling_t * styling,
                   uint32_t        layers_count,
                   uint32_t        groups_count,
                   uint32_t        extras_count);

skc_err
skc_styling_retain(skc_styling_t styling);

skc_err
skc_styling_release(skc_styling_t styling);

skc_err
skc_styling_seal(skc_styling_t styling);

skc_err
skc_styling_unseal(skc_styling_t styling); // FIXME

skc_err
skc_styling_reset(skc_styling_t styling); // FIXME -- make unseal reset

//
// STYLING GROUPS AND LAYERS
//

skc_err
skc_styling_group_alloc(skc_styling_t  styling,
                        skc_group_id * group_id);

skc_err
skc_styling_group_enter(skc_styling_t             styling,
                        skc_group_id              group_id,
                        uint32_t                  n,
                        skc_styling_cmd_t const * cmds);

skc_err
skc_styling_group_leave(skc_styling_t             styling,
                        skc_group_id              group_id,
                        uint32_t                  n,
                        skc_styling_cmd_t const * cmds);

//
// n:
//
//   The number of parent groups above this group. The top of the
//   hierarchy must start with a single enclosing group which has 0
//   parents.
//
// parents:
//
//   The sequence of parent group ids leading from the top of
//   hierarchy to the parent of 'group_id'.
//
skc_err
skc_styling_group_parents(skc_styling_t        styling,
                          skc_group_id         group_id,
                          uint32_t             n,
                          skc_group_id const * parents);

skc_err
skc_styling_group_range_lo(skc_styling_t styling,
                           skc_group_id  group_id,
                           skc_layer_id  layer_lo);

skc_err
skc_styling_group_range_hi(skc_styling_t styling,
                           skc_group_id  group_id,
                           skc_layer_id  layer_hi);

skc_err
skc_styling_group_layer(skc_styling_t             styling,
                        skc_group_id              group_id,
                        skc_layer_id              layer_id,
                        uint32_t                  n,
                        skc_styling_cmd_t const * cmds);

//
// STYLING ENCODERS -- FIXME -- WILL EVENTUALLY BE OPAQUE
//

void
skc_styling_layer_fill_rgba_encoder(skc_styling_cmd_t * cmds, float const rgba[4]);

void
skc_styling_background_over_encoder(skc_styling_cmd_t * cmds, float const rgba[4]);

void
skc_styling_layer_fill_gradient_encoder(skc_styling_cmd_t         * cmds,
                                        float                       x0,
                                        float                       y0,
                                        float                       x1,
                                        float                       y1,
                                        skc_styling_gradient_type_e type,
                                        uint32_t                    n,
                                        float                 const stops[],
                                        float                 const colors[]);

//
// SURFACE
//

skc_err
skc_surface_create(skc_context_t context, skc_surface_t * surface);

skc_err
skc_surface_retain(skc_surface_t surface);

skc_err
skc_surface_release(skc_surface_t surface);

//
// SURFACE RENDER
//

typedef void (*skc_surface_render_notify)(skc_surface_t     surface,
                                          skc_styling_t     styling,
                                          skc_composition_t composition,
                                          skc_framebuffer_t fb,
                                          void            * data);

skc_err
skc_surface_render(skc_surface_t             surface,
                   skc_styling_t             styling,
                   skc_composition_t         composition,
                   skc_framebuffer_t         fb,
                   uint32_t            const clip[4],
                   int32_t             const txty[2],
                   skc_surface_render_notify notify,
                   void                    * data);

//
// COORDINATED EXTERNAL OPERATIONS
//
//  Examples include:
//
//  - Transforming an intermediate layer with a blur, sharpen, rotation or scaling kernel.
//  - Subpixel antialiasing using neighboring pixel color and coverage data.
//  - Performing a blit from one region to another region on a surface.
//  - Blitting from one surface to another.
//  - Loading and processing from one region and storing to another region.
//  - Rendezvousing with an external pipeline.
//

// FORTHCOMING...

//
// SCHEDULER
//

bool
skc_context_yield(skc_context_t context);

void
skc_context_wait(skc_context_t context);

//
//
//

#endif

//
//
//
