#pragma once #include "pxl8_types.h" typedef struct pxl8_atlas pxl8_atlas; typedef struct pxl8_atlas_entry { bool active; i32 h, w, x, y; u8 log2_h, log2_w; u32 texture_id; u32 tiled_base; } pxl8_atlas_entry; static inline u32 pxl8_tile_addr(u32 u, u32 v, u8 log2_w) { u32 tile_y = v >> 3; u32 tile_x = u >> 3; u32 local_y = v & 7; u32 local_x = u & 7; return (tile_y << (log2_w + 3)) | (tile_x << 6) | (local_y << 3) | local_x; } static inline u8 pxl8_log2(u32 v) { u8 r = 0; while (v >>= 1) r++; return r; } #ifdef __cplusplus extern "C" { #endif u32 pxl8_atlas_add_texture(pxl8_atlas* atlas, const u8* pixels, u32 w, u32 h, pxl8_pixel_mode pixel_mode); void pxl8_atlas_clear(pxl8_atlas* atlas, u32 preserve_count); pxl8_atlas* pxl8_atlas_create(u32 width, u32 height, pxl8_pixel_mode pixel_mode); void pxl8_atlas_destroy(pxl8_atlas* atlas); bool pxl8_atlas_expand(pxl8_atlas* atlas, pxl8_pixel_mode pixel_mode); const pxl8_atlas_entry* pxl8_atlas_get_entry(const pxl8_atlas* atlas, u32 id); u32 pxl8_atlas_get_entry_count(const pxl8_atlas* atlas); u32 pxl8_atlas_get_height(const pxl8_atlas* atlas); const u8* pxl8_atlas_get_pixels(const pxl8_atlas* atlas); const u8* pxl8_atlas_get_pixels_tiled(const pxl8_atlas* atlas); u32 pxl8_atlas_get_width(const pxl8_atlas* atlas); bool pxl8_atlas_is_dirty(const pxl8_atlas* atlas); void pxl8_atlas_mark_clean(pxl8_atlas* atlas); #ifdef __cplusplus } #endif