pebble/src/fw/applib/graphics/gdraw_command_list.h
Josh Soref 8c57480b2a spelling: processed
Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
2025-01-29 00:03:27 -05:00

137 lines
6.1 KiB
C

/*
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "gdraw_command.h"
#include "applib/graphics/gtypes.h"
#include "applib/graphics/graphics.h"
#include <stdint.h>
#include <stdbool.h>
//! @file graphics/gdraw_command_list.h
//! Defines the functions to manipulate \ref GDrawCommandList objects
//! @addtogroup Graphics
//! @{
//! @addtogroup DrawCommand Draw Commands
//! @{
struct GDrawCommandList;
//! Draw command lists contain a list of commands that can be iterated over and drawn all at once
typedef struct GDrawCommandList GDrawCommandList;
typedef struct GDrawCommandProcessor GDrawCommandProcessor;
//! Callback for iterating over GDrawCommands
//! @param processor GDrawCommandProcessor that is currently iterating over the GDrawCommandList.
//! @param processed_command Copy of the current GDrawCommand that can be modified
//! @param processed_command_max_size Size of GDrawCommand being processed
//! @param list list of GDrawCommands that will be modified by the processor
//! @param command Current GDrawCommand being processed
typedef void (*GDrawCommandProcessCommand)(GDrawCommandProcessor *processor,
GDrawCommand *processed_command,
size_t processed_command_max_size,
const GDrawCommandList* list,
const GDrawCommand *command);
//! @internal
//! Data used by the processor
typedef struct GDrawCommandProcessor {
// TODO: PBL-23778 processors for image, sequence, frame
GDrawCommandProcessCommand command;
} GDrawCommandProcessor;
//! Callback for iterating over draw command list
//! @param command current \ref GDrawCommand in iteration
//! @param index index of the current command in the list
//! @param context context pointer for the iteration operation
//! @return true if the iteration should continue after this command is processed
typedef bool (*GDrawCommandListIteratorCb)(GDrawCommand *command, uint32_t index, void *context);
//! @internal
//! Use to validate a command list read from flash or copied from serialized data
//! @param size Size of the command list structure in memory, in bytes
bool gdraw_command_list_validate(GDrawCommandList *command_list, size_t size);
//! @internal
//! Iterate over all commands in a command list
//! @param command_list \ref GDrawCommandList over which to iterate
//! @param handle_command iterator callback
//! @param callback_context context pointer to be passed into the iterator callback
//! @returns pointer to the address immediately following the end of the command list
void *gdraw_command_list_iterate_private(GDrawCommandList *command_list,
GDrawCommandListIteratorCb handle_command,
void *callback_context);
//! Iterate over all commands in a command list
//! @param command_list \ref GDrawCommandList over which to iterate
//! @param handle_command iterator callback
//! @param callback_context context pointer to be passed into the iterator callback
void gdraw_command_list_iterate(GDrawCommandList *command_list,
GDrawCommandListIteratorCb handle_command, void *callback_context);
//! Draw all commands in a command list
//! @param ctx The destination graphics context in which to draw
//! @param command_list list of commands to draw
void gdraw_command_list_draw(GContext *ctx, GDrawCommandList *command_list);
//! Process and draw all commands in a command list
//! @param ctx The destination graphics context in which to draw
//! @param command_list list of commands to draw
//! @param processor Command processor required for drawing processed commands
void gdraw_command_list_draw_processed(GContext *ctx, GDrawCommandList *command_list,
GDrawCommandProcessor *processor);
//! Get the command at the specified index
//! @note the specified index must be less than the number of commands in the list
//! @param command_list \ref GDrawCommandList from which to get a command
//! @param command_idx index of the command to get
//! @return pointer to \ref GDrawCommand at the specified index
GDrawCommand *gdraw_command_list_get_command(GDrawCommandList *command_list, uint16_t command_idx);
//! Get the number of commands in the list
//! @param command_list \ref GDrawCommandList from which to get the number of commands
//! @return number of commands in command list
uint32_t gdraw_command_list_get_num_commands(GDrawCommandList *command_list);
//! @internal
//! Get the total number of points in the list among all GDrawCommands
size_t gdraw_command_list_get_num_points(GDrawCommandList *command_list);
//! @internal
//! Get the size of a list in memory
size_t gdraw_command_list_get_data_size(GDrawCommandList *command_list);
//! @internal
//! Collect all the points in the draw commands list into a newly allocated buffer
//! The order is guaranteed to be the definition order of the points
//! @param command_list \ref GDrawCommandList from which to collect points
//! @param is_precise true to convert to GPointPrecise, otherwise points are converted to GPoint
//! @param num_points_out Optional pointer to uint16_t to receive the num points
GPoint *gdraw_command_list_collect_points(GDrawCommandList *command_list, bool is_precise,
uint16_t *num_points_out);
bool gdraw_command_list_copy(void *buffer, size_t buffer_length, GDrawCommandList *src);
GDrawCommandList *gdraw_command_list_clone(GDrawCommandList *list);
void gdraw_command_list_destroy(GDrawCommandList *list);
//! @} // end addtogroup DrawCommand
//! @} // end addtogroup Graphics