17#define MAXCOLORS 65535
19 uint32_t* rgba = (uint32_t*)calloc(leny * lenx,
sizeof(*rgba));
24 uint32_t* colors = (uint32_t*)calloc(
MAXCOLORS,
sizeof(*colors));
31 while(*sx !=
'#' && *sx !=
'-'){
33 logerror(
"expected octothorpe/hyphen, got eol");
44 STATE_WANT_COLORSPACE,
46 } state = STATE_WANT_HASH;
56 if(state == STATE_WANT_HASH){
61 state = STATE_WANT_COLOR;
63 logerror(
"expected octothorpe, got %u", *sx);
66 }
else if(state == STATE_WANT_COLOR){
68 logerror(
"expected digit, got %u", *sx);
80 state = STATE_WANT_COLORSEMI;
81 }
else if(state == STATE_WANT_COLORSEMI){
84 state = STATE_WANT_COLORSPACE;
86 state = STATE_WANT_DATA;
89 }
else if(state == STATE_WANT_COLORSPACE){
91 logerror(
"expected '2', got %u", *sx);
96 logerror(
"expected semicolon, got %u", *sx);
105 }
while(isdigit(*sx));
107 logerror(
"expected semicolon, got %u", *sx);
117 }
while(isdigit(*sx));
119 logerror(
"expected semicolon, got %u", *sx);
129 }
while(isdigit(*sx));
131 ncpixel_set_a(&colors[color], 0xff);
132 ncpixel_set_rgb8(&colors[color],
r, g, b);
137 state = STATE_WANT_HASH;
141 if(state == STATE_WANT_DATA){
144 state = STATE_WANT_HASH;
146 }
else if(*sx ==
'!'){
153 }
while(isdigit(*sx));
158 }
else if(*sx ==
'$'){
160 state = STATE_WANT_DATA;
161 }
else if(*sx ==
'-'){
164 state = STATE_WANT_DATA;
167 if(
y + 6 > (leny + 5) / 6 * 6){
168 logerror(
"too many rows %d + 6 > %d",
y, (leny + 5) / 6 * 6);
172 logerror(
"invalid rle %d + %d > %d",
x, rle, lenx);
175 for(
unsigned xpos =
x ; xpos <
x + rle ; ++xpos){
176 for(
unsigned ypos =
y ; ypos <
y + 6 ; ++ypos){
177 if((*sx - 63) & (1u << (ypos -
y))){
180 rgba[ypos * lenx + xpos] = colors[color];