
4 changed files with 83 additions and 2 deletions
@ -0,0 +1,21 @@ |
|||
#include "mark.h" |
|||
|
|||
void markmap_init(Markmap* map) { |
|||
map->buffer = NULL; |
|||
map->capacity = 0; |
|||
} |
|||
|
|||
void markmap_ensure_capacity(Markmap* map, Usz capacity) { |
|||
if (map->capacity < capacity) { |
|||
map->buffer = realloc(map->buffer, capacity); |
|||
map->capacity = capacity; |
|||
} |
|||
} |
|||
|
|||
void markmap_clear(Markmap* map) { |
|||
memset(map->buffer, 0, map->capacity); |
|||
} |
|||
|
|||
void markmap_deinit(Markmap* map) { |
|||
free(map->buffer); |
|||
} |
@ -0,0 +1,49 @@ |
|||
#pragma once |
|||
#include "base.h" |
|||
|
|||
typedef enum { |
|||
Mark_flag_none = 0, |
|||
Mark_flag_haste_input = 1 << 0, |
|||
Mark_flag_input = 1 << 1, |
|||
Mark_flag_lock = 1 << 2, |
|||
Mark_flag_output = 1 << 3, |
|||
} Mark_flags; |
|||
|
|||
typedef struct { |
|||
U8* buffer; |
|||
Usz capacity; |
|||
} Markmap; |
|||
|
|||
void markmap_init(Markmap* map); |
|||
void markmap_ensure_capacity(Markmap* map, Usz capacity); |
|||
void markmap_clear(Markmap* map); |
|||
void markmap_deinit(Markmap* map); |
|||
|
|||
ORCA_FORCE_INLINE |
|||
Mark_flags markmap_peek_relative(Markmap* map, Usz map_height, Usz map_width, |
|||
Usz y, Usz x, Isz offs_y, Isz offs_x); |
|||
ORCA_FORCE_INLINE |
|||
void markmap_poke_relative(Markmap* map, Usz map_height, Usz map_width, Usz y, |
|||
Usz x, Isz offs_y, Isz offs_x, Mark_flags flags); |
|||
|
|||
// Inline implementation
|
|||
|
|||
ORCA_FORCE_INLINE |
|||
Mark_flags markmap_peek_relative(Markmap* map, Usz map_height, Usz map_width, |
|||
Usz y, Usz x, Isz offs_y, Isz offs_x) { |
|||
Isz y0 = (Isz)y + offs_y; |
|||
Isz x0 = (Isz)x + offs_x; |
|||
if (y0 >= (Isz)map_height || x0 >= (Isz)map_width || y0 < 0 || x0 < 0) |
|||
return Mark_flag_none; |
|||
return map->buffer[(Usz)y0 * map_width + (Usz)x0]; |
|||
} |
|||
|
|||
ORCA_FORCE_INLINE |
|||
void markmap_poke_relative(Markmap* map, Usz map_height, Usz map_width, Usz y, |
|||
Usz x, Isz offs_y, Isz offs_x, Mark_flags flags) { |
|||
Isz y0 = (Isz)y + offs_y; |
|||
Isz x0 = (Isz)x + offs_x; |
|||
if (y0 >= (Isz)map_height || x0 >= (Isz)map_width || y0 < 0 || x0 < 0) |
|||
return; |
|||
map->buffer[(Usz)y0 * map_width + (Usz)x0] = flags; |
|||
} |
Loading…
Reference in new issue