diff --git a/kernel/inc/drivers/graphics/color.h b/kernel/inc/drivers/graphics/color.h index 2a17850..66f8add 100644 --- a/kernel/inc/drivers/graphics/color.h +++ b/kernel/inc/drivers/graphics/color.h @@ -42,14 +42,14 @@ typedef enum { } color_palette_E; typedef struct { - uint8_t alpha; uint8_t red; uint8_t green; uint8_t blue; -} color_argb_T; + uint8_t alpha; +} color_rgba_T; -extern color_argb_T g_color_palette[COLOR_PAL_ENUM_END]; +extern color_rgba_T g_color_palette[COLOR_PAL_ENUM_END]; -color_argb_T color_argb_blend_alpha(color_argb_T background, color_argb_T foreground); +color_rgba_T color_rgba_blend_alpha(color_rgba_T background, color_rgba_T foreground); #endif //NOX_COLOR_H diff --git a/kernel/inc/drivers/graphics/commands.h b/kernel/inc/drivers/graphics/commands.h new file mode 100644 index 0000000..0fa84c9 --- /dev/null +++ b/kernel/inc/drivers/graphics/commands.h @@ -0,0 +1,312 @@ +// +// Copyright (c) 2023 by The NOXOS Authors +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the “Software”), to deal in +// the Software without restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the +// Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +#include +#include + +typedef struct graphics_data_buffer graphics_data_buffer_T; +typedef struct graphics_command graphics_command_T; +typedef struct graphics_command_queue graphics_command_queue_T; + +// graphics_draw_pixel_T: A pixel struct that is meant to be for drawing on the screen +// through one of the functions. This could have more functionality, but not yet. +typedef struct { + + // The position is relative to the start point *of the pixel buffer*, + math_vector_2i_T position; + + // color: The actual layout of this depends on the state at the time of drawing. + uint64_t color; + +} graphics_draw_pixel_T; + +typedef struct { + + math_vector_2i_T start; + math_vector_2i_T end; + + uint64_t color; + +} graphics_draw_line_T; + +typedef struct { + + math_vector_2i_T start; + math_vector_2i_T size; + + uint64_t color; + +} graphics_draw_rectangle_T; + + + +typedef enum { + + GRAPHICS_COLOR_FORMAT_RGB = 0x0101, + GRAPHICS_COLOR_FORMAT_RGBA = 0x0102 + +} graphics_color_order_E; + +typedef enum { + + // Buffer Functions + + GRAPHICS_COMMAND_NEW_DATA_BUFFER = 0x0111, + GRAPHICS_COMMAND_FILL_BUFFER_DATA = 0x0112, + GRAPHICS_COMMAND_CLEAR_BUFFER_DATA = 0x0112, + GRAPHICS_COMMAND_MAP_BUFFER_DATA_MAPPING = 0x0113, + GRAPHICS_COMMAND_SYNC_BUFFER_DATA = 0x0114, + + GRAPHICS_COMMAND_NEW_PIXEL_BUFFER = 0x0121, + GRAPHICS_COMMAND_CLEAR_PIXEL_BUFFER = 0x0122, + GRAPHICS_COMMAND_MAP_PIXEL_BUFFER = 0x0123, + GRAPHICS_COMMAND_SYNC_PIXEL_BUFFER_MAPPING = 0x0124, + GRAPHICS_COMMAND_SHOW_PIXEL_BUFFER = 0x0125, + + // Basic Draws/Fills & Retrieves + + GRAPHICS_COMMAND_DRAW_PIXELS = 0x0211, + GRAPHICS_COMMAND_DRAW_LINES = 0x0212, + GRAPHICS_COMMAND_DRAW_PIXEL_BUFFER = 0x0213, // TODO + + GRAPHICS_COMMAND_OUTLINE_RECTANGLES = 0x0221, + GRAPHICS_COMMAND_FILL_RECTANGLES = 0x0222, + + GRAPHICS_COMMAND_RETRIEVE_PIXEL = 0x0231, + GRAPHICS_COMMAND_RETRIEVE_AREA = 0x0232, + + // Text Features + + GRAPHICS_COMMAND_DRAW_RUNE = 0x0311, + GRAPHICS_COMMAND_DRAW_TEXT = 0x0312, + + // Implementation-relative + + GRAPHICS_COMMAND_SWITCH_IMPLEMENTATION = 0x0411, + GRAPHICS_COMMAND_GET_IMPLEMENTATION_INFO = 0x0412, + GRAPHICS_COMMAND_SET_IMPLEMENTATION_INFO = 0x0413, + GRAPHICS_COMMAND_GET_SPECIFIC_FUNCTION = 0x0414 + +} graphics_command_E; + +union graphics_command_data { + + struct graphics_command_new_data_buffer { + + uint32_t related_state_id; + uint32_t wanted_buffer_id; + } new_data_buffer; + + struct graphics_command_fill_data_buffer { + + uint32_t related_state_id; + uint32_t buffer_id; + + uint32_t len_new_data; + void *new_data; + } fill_data_buffer; + + struct graphics_command_clear_data_buffer { + + uint32_t related_state_id; + uint32_t buffer_id; + + uint32_t first_output; + uint32_t num_bytes; + + uint32_t len_value; + void *value; + } clear_data_buffer; + + struct graphics_command_map_data_buffer { + + uint32_t related_state_id; + uint32_t buffer_id; + + uint32_t wanted_mapping_id; + + uint32_t len_buffer_area; + uint32_t first_buffer_byte; + void *virtual_map_address; + } map_data_buffer; + + struct graphics_command_sync_data_buffer_mapping { + + uint32_t related_state_id; + uint32_t buffer_id; + + uint32_t mapping_id; + + uint32_t len_sync_area; + uint32_t first_sync_byte; + } sync_data_buffer_mapping; + + + + struct graphics_command_new_pixel_buffer { + + uint32_t related_state_id; + uint32_t wanted_buffer_id; + + uint32_t start_x; + uint32_t start_y; + uint32_t width; + uint32_t height; + + graphics_color_order_E color_format; + + // The number of bits for depth can be 16 at most! + uint8_t red_bits; + uint8_t green_bits; + uint8_t blue_bits; + uint8_t alpha_bits; + } new_pixel_buffer; + + struct graphics_command_clear_pixel_buffer { + + uint32_t related_state_id; + uint32_t buffer_id; + + uint32_t first_output; + uint32_t num_bytes; + + uint32_t len_value; + void *value; + } clear_pixel_buffer; + + struct graphics_command_map_pixel_buffer { + + uint32_t related_state_id; + uint32_t buffer_id; + + uint32_t wanted_mapping_id; + + uint32_t len_buffer_area; + uint32_t first_buffer_byte; + void *virtual_map_address; + } map_pixel_buffer; + + struct graphics_command_sync_pixel_buffer_mapping { + + uint32_t related_state_id; + uint32_t buffer_id; + + uint32_t mapping_id; + + uint32_t len_sync_area; + uint32_t first_sync_byte; + } sync_pixel_buffer; + + + + struct graphics_command_draw_pixels { + + uint32_t related_state_id; + uint32_t used_pixel_buffer; + + uint32_t num_pixels; + graphics_draw_pixel_T *pixels; + } draw_pixels; + + struct graphics_command_draw_lines { + + uint32_t related_state_id; + uint32_t used_pixel_buffer; + + uint32_t num_pixels; + graphics_draw_pixel_T *pixels; + } draw_lines; + + struct graphics_command_draw_pixel_buffer { + + // TODO + + } draw_pixel_buffer; + + + + struct graphics_command_outline_rectangles { + + uint32_t related_state_id; + uint32_t used_pixel_buffer; + + uint32_t num_pixels; + graphics_draw_rectangle_T *pixels; + } outline_rectangles; + + struct graphics_command_fill_rectangles { + + uint32_t related_state_id; + uint32_t used_pixel_buffer; + + uint32_t num_pixels; + graphics_draw_rectangle_T *pixels; + } fill_rectangles; + + + + struct graphics_command_draw_rune { + + uint32_t related_state_id; + uint32_t used_pixel_buffer; + + uint32_t rune; + uint16_t height; + // If the width is 0, it is calculated from the aspect + // ratio defined in the font and the given height. + uint16_t width; + + uint64_t color; + } draw_rune; + + struct graphics_command_draw_text { + + uint32_t len_text; + // text: This should be encoded in UTF-8. + char *text; + + uint32_t rune; + uint16_t height; + // TODO: Width as bias from the defined one and maximum rendered length. + + uint64_t color; + } draw_text; +}; + + +struct graphics_command { + + graphics_command_T *next; + graphics_command_T *previous; + + graphics_command_E type; +}; + +struct graphics_command_queue { + uint64_t command_cap; + uint64_t num_commands; + graphics_command_T *command_pool; + + bool is_busy; +}; + diff --git a/kernel/inc/drivers/graphics/renderer.h b/kernel/inc/drivers/graphics/renderer.h index 6140213..d729dc4 100644 --- a/kernel/inc/drivers/graphics/renderer.h +++ b/kernel/inc/drivers/graphics/renderer.h @@ -32,51 +32,31 @@ #include "drivers/graphics/framebuffer.h" #include "boot/boot_info.h" -typedef enum { - GRAPHICS_BUFFER_STANDARD, - GRAPHICS_BUFFER_OVERLAY, +// TODO: Descriptions - GRAPHICS_BUFFER_ENUM_MAX -} graphics_buffer_layer_E; +typedef struct graphics_pixel_buffer graphics_pixel_buffer_T; +typedef struct graphics_implementation graphics_implementation_T; +typedef struct graphics_renderer graphics_renderer_T; -typedef struct graphics_buffer_T graphics_buffer_T; -struct graphics_buffer_T { - color_argb_T* buffer; - uint32_t width; - uint32_t height; - uint32_t pos_x; - uint32_t pos_y; - bool blocked; - bool render; - graphics_buffer_layer_E layer; - graphics_buffer_T* prev; - graphics_buffer_T* next; +typedef void (*graphics_fn_handle_command) + (graphics_driver *driver, graphics_command command); + +struct graphics_pixel_buffer { + + + }; -typedef struct { - framebuffer_T framebuffer; - uint32_t* back_buffer; - uint64_t buffer_size; - graphics_buffer_T** graphics_buffer_layers; - font_T font; - bool initialized; - bool blocked; -} graphics_renderer_T; +struct graphics_implementation { + + + +} -graphics_buffer_T* graphics_buffer_request (uint32_t pos_x, uint32_t pos_y, uint32_t width, uint32_t height, graphics_buffer_layer_E layer); -void graphics_buffer_show (graphics_buffer_T* graphics_buffer); -void graphics_buffer_hide (graphics_buffer_T* graphics_buffer); -void graphics_buffer_destruct (graphics_buffer_T* graphics_buffer); -void graphics_buffer_shift_up (graphics_buffer_T* graphics_buffer, uint16_t shift); -void graphics_buffer_set_pixel (graphics_buffer_T* graphics_buffer, uint32_t x, uint32_t y, color_argb_T color); -color_argb_T graphics_buffer_get_pixel (graphics_buffer_T* graphics_buffer, uint32_t x, uint32_t y); -void graphics_buffer_draw_char (graphics_buffer_T* graphics_buffer, uint32_t x, uint32_t y, color_argb_T color, char chr); -position_T graphics_buffer_draw_string (graphics_buffer_T* graphics_buffer, uint32_t x, uint32_t y, color_argb_T color, string_t string); - -void graphics_renderer_init (boot_info_T* boot_info); -void graphics_renderer_update (); -graphics_buffer_T* graphics_renderer_get_top_buffer (graphics_buffer_layer_E layer); -uint32_t graphics_renderer_get_width (); -uint32_t graphics_renderer_get_height (); +struct graphics_renderer { + + + +} #endif //NOX_RENDERER_H