blob: 4b3c644ea29c78efb1215add41243e8ba8603ad9 [file] [log] [blame]
// 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 "styling.h"
#include <assert.h>
#include "core_c.h"
#include "spinel.h"
//
//
//
spn_result
spn_styling_retain(spn_styling_t styling)
{
styling->ref_count += 1;
return SPN_SUCCESS;
}
spn_result
spn_styling_release(spn_styling_t styling)
{
return styling->release(styling->impl);
}
spn_result
spn_styling_seal(spn_styling_t styling)
{
return styling->seal(styling->impl);
}
spn_result
spn_styling_unseal(spn_styling_t styling)
{
return styling->unseal(styling->impl);
}
spn_result
spn_styling_reset(spn_styling_t styling)
{
spn_result const res = styling->unseal(styling->impl);
if (res)
return res;
styling->dwords.next = styling->layers.count * SPN_STYLING_LAYER_COUNT_DWORDS;
return SPN_SUCCESS;
}
//
// FIXME -- various robustifications can be made to this builder but
// we don't want to make this heavyweight too soon
//
// - out of range layer_id is an error
// - extras[] overflow is an error
//
spn_result
spn_styling_group_alloc(spn_styling_t styling, spn_group_id * const group_id)
{
spn_result const res = styling->unseal(styling->impl);
if (res)
return res;
*group_id = styling->dwords.next;
styling->dwords.next += SPN_STYLING_GROUP_COUNT_DWORDS;
return SPN_SUCCESS;
}
spn_result
spn_styling_group_enter(spn_styling_t styling,
spn_group_id const group_id,
uint32_t const n,
uint32_t ** const cmds)
{
assert(styling->dwords.next + n <= styling->dwords.count);
spn_result const res = styling->unseal(styling->impl);
if (res)
return res;
styling->extent[group_id + SPN_STYLING_GROUP_OFFSET_CMDS_ENTER] = styling->dwords.next;
*cmds = styling->extent + styling->dwords.next;
styling->dwords.next += n;
return SPN_SUCCESS;
}
spn_result
spn_styling_group_leave(spn_styling_t styling,
spn_group_id const group_id,
uint32_t const n,
uint32_t ** const cmds)
{
assert(styling->dwords.next + n <= styling->dwords.count);
spn_result const res = styling->unseal(styling->impl);
if (res)
return res;
styling->extent[group_id + SPN_STYLING_GROUP_OFFSET_CMDS_LEAVE] = styling->dwords.next;
*cmds = styling->extent + styling->dwords.next;
styling->dwords.next += n;
return SPN_SUCCESS;
}
spn_result
spn_styling_group_parents(spn_styling_t styling,
spn_group_id const group_id,
uint32_t const n,
uint32_t ** const parents)
{
assert(styling->dwords.next + n <= styling->dwords.count);
spn_result const res = styling->unseal(styling->impl);
if (res)
return res;
styling->extent[group_id + SPN_STYLING_GROUP_OFFSET_PARENTS_DEPTH] = n;
styling->extent[group_id + SPN_STYLING_GROUP_OFFSET_PARENTS_BASE] = styling->dwords.next;
*parents = styling->extent + styling->dwords.next;
styling->dwords.next += n;
return SPN_SUCCESS;
}
spn_result
spn_styling_group_range_lo(spn_styling_t styling,
spn_group_id const group_id,
spn_layer_id const layer_lo)
{
assert(layer_lo < styling->layers.count);
spn_result const res = styling->unseal(styling->impl);
if (res)
return res;
styling->extent[group_id + SPN_STYLING_GROUP_OFFSET_RANGE_LO] = layer_lo;
return SPN_SUCCESS;
}
spn_result
spn_styling_group_range_hi(spn_styling_t styling,
spn_group_id const group_id,
spn_layer_id const layer_hi)
{
assert(layer_hi < styling->layers.count);
spn_result const res = styling->unseal(styling->impl);
if (res)
return res;
styling->extent[group_id + SPN_STYLING_GROUP_OFFSET_RANGE_HI] = layer_hi;
return SPN_SUCCESS;
}
spn_result
spn_styling_group_layer(spn_styling_t styling,
spn_group_id const group_id,
spn_layer_id const layer_id,
uint32_t const n,
spn_styling_cmd_t ** const cmds)
{
assert(layer_id < styling->layers.count);
assert(styling->dwords.next + n <= styling->dwords.count);
spn_result const res = styling->unseal(styling->impl);
if (res)
return res;
styling->extent[layer_id * SPN_STYLING_LAYER_COUNT_DWORDS + SPN_STYLING_LAYER_OFFSET_CMDS] =
styling->dwords.next;
styling->extent[layer_id * SPN_STYLING_LAYER_COUNT_DWORDS + SPN_STYLING_LAYER_OFFSET_PARENT] =
group_id;
*cmds = styling->extent + styling->dwords.next;
styling->dwords.next += n;
return SPN_SUCCESS;
}
//
//
//