// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

//
//
//

#include "raster_builder.h"

#include "float.h"

//
// IDENTITY TRANSFORM
//

float const spn_transform_identity[8] = {
  1.0f,  // sx
  0.0f,  // shx
  0.0f,  // shy
  1.0f,  // sy
  0.0f,  // tx
  0.0f,  // ty
  0.0f,  // w0
  0.0f,  // w1
};

//
// DEFAULT CLIP
//

float const spn_clip_default[4] = {
  -FLT_MAX,  // lower left  corner of bounding box
  -FLT_MAX,
  +FLT_MAX,  // upper right corner of bounding box
  +FLT_MAX,
};

//
//
//

spn_result
spn_raster_builder_retain(spn_raster_builder_t raster_builder)
{
  raster_builder->refcount += 1;

  return SPN_SUCCESS;
}

spn_result
spn_raster_builder_release(spn_raster_builder_t raster_builder)
{
  SPN_ASSERT_STATE_ASSERT(SPN_RASTER_BUILDER_STATE_READY, raster_builder);

  raster_builder->release(raster_builder->impl);

  return SPN_SUCCESS;
}

//
//
//

spn_result
spn_raster_begin(spn_raster_builder_t raster_builder)
{
  SPN_ASSERT_STATE_TRANSITION(SPN_RASTER_BUILDER_STATE_READY,
                              SPN_RASTER_BUILDER_STATE_BUILDING,
                              raster_builder);

  return raster_builder->begin(raster_builder->impl);
}

spn_result
spn_raster_end(spn_raster_builder_t raster_builder, spn_raster_t * raster)
{
  SPN_ASSERT_STATE_TRANSITION(SPN_RASTER_BUILDER_STATE_BUILDING,
                              SPN_RASTER_BUILDER_STATE_READY,
                              raster_builder);

  return raster_builder->end(raster_builder->impl, raster);
}

//
//
//

spn_result
spn_raster_flush(spn_raster_builder_t raster_builder)
{
  //
  // it doesn't matter what the state is
  //
  return raster_builder->flush(raster_builder->impl);
}

//
//
//

spn_result
spn_raster_fill(spn_raster_builder_t      raster_builder,
                spn_path_t *              paths,
                spn_transform_weakref_t * transform_weakrefs,
                float const (*transforms)[8],
                spn_clip_weakref_t * clip_weakrefs,
                float const (*clips)[4],
                uint32_t count)
{
  SPN_ASSERT_STATE_ASSERT(SPN_RASTER_BUILDER_STATE_BUILDING, raster_builder);

  return raster_builder->fill(raster_builder->impl,
                              paths,
                              transform_weakrefs,
                              transforms,
                              clip_weakrefs,
                              clips,
                              count);
}

//
//
//
