prosperon/source/engine/thirdparty/bitmap-outliner/bitmap-outliner-print.c
2022-01-19 22:43:21 +00:00

78 lines
1.7 KiB
C

#include <stdio.h>
#include "bitmap-outliner.h"
/**
* Terminal colors.
*/
enum {
COLOR_RESET = 0,
COLOR_RED,
COLOR_GREEN,
COLOR_YELLOW,
};
/**
* Terminal color escape sequences.
*/
static char const* const colors[] = {
[COLOR_RESET] = "\033[0m",
[COLOR_RED] = "\033[31m",
[COLOR_GREEN] = "\033[32m",
[COLOR_YELLOW] = "\033[33m",
};
/**
* Print arrow grid.
*
* @param width Width of bitmap.
* @param height Height of bitmap.
* @param data The bitmap to print.
* @param grid The arrow grid to print.
*/
static void print_grid(int width, int height, uint8_t const data[height][width], bmol_arrow const grid[height * 2 + 3][width + 3]) {
static char const* arrows[] = {
[BMOL_ARR_NONE] = "",
[BMOL_ARR_RIGHT] = "",
[BMOL_ARR_LEFT] = "",
[BMOL_ARR_DOWN] = "",
[BMOL_ARR_UP] = "",
};
int gridWidth = width + 3;
int gridHeight = height * 2 + 3;
for (int y = 0; y < gridHeight; y++) {
if (y % 2 != 0) {
printf(" ");
}
for (int x = 0; x < gridWidth - (y % 2 != 0); x++) {
bmol_arrow a = grid[y][x];
int type = a.type;
char const* color = "";
if (type) {
color = colors[a.inner ? COLOR_RED : COLOR_GREEN];
}
printf("%s%s%s", color, arrows[(int)type], colors[COLOR_RESET]);
if (x > 0 && y >= 2 && x < gridWidth - 2 && y < gridHeight - 2 && (y % 2) == 0) {
printf(" %c ", data[(y - 2) / 2][x - 1] ? '#' : ' ');
}
else {
printf(" ");
}
}
printf("\n");
}
}
void bmol_print_grid(bmol_outliner const* outliner) {
int width = outliner->width;
int height = outliner->height;
print_grid(width, height, (uint8_t const (*)[width])outliner->data, (bmol_arrow (*)[width])outliner->arrow_grid);
}