Fixed the behaviour for refining the points.
#include <stdio.h>
#include <stdlib.h>
static int width, height;
static char bname[50] = "noname";
static int perline = 13;
static char mask[9] = { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
static char imask[9] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
void
parameters(const int argn, char **argc)
{
if (argn != 3)
{
fprintf(stderr, "usage: %s <width> <height>\n", argc[0]);
exit(1);
}
width = atoi(argc[1]);
height = atoi(argc[2]);
}
void
writesize(int w, int h)
{
printf("#define %s_width %i\n", bname, w);
printf("#define %s_height %i\n", bname, h);
}
char
cstart(int p, int n)
{
char c;
if (p==0)
c=0xaa;
else
c=0x55;
return c & mask[n];
}
char
cend(int p, int n)
{
char c;
if (p==0)
c=0xaa;
else
c=0x55;
return c & imask[n];
}
void
writebits(int w, int h)
{
int column;
int i;
int bits;
unsigned char c;
int pair; /* boolean */
int leftline;
printf("static char %s_bits[] = {\n", bname);
bits=w*h;
leftline=w;
i=0;
column=0;
pair=0;
while(i < bits)
{
if(column == 0)
putchar(' ');
/*fprintf(stderr, "leftline=%i\n", leftline);*/
if (leftline >= 8)
{
c = cstart(pair, 8);
printf("0x%2x", (unsigned int) c);
column++;
leftline -= 8;
i += 8;
}
else if (leftline > 0)
{
c = cend(pair, leftline);
pair ^= 1; /* 1->0, 0->1 */
c |= cstart(pair, 8 - leftline);
printf("0x%2x", (unsigned int) c);
i += leftline;
leftline = w;
column++;
}
else if (leftline == 0)
{
leftline = w;
pair ^= 1; /* 1->0, 0->1 */
}
if(i < bits && leftline != 0)
putchar(',');
if (column > perline && leftline != 0)
{
putchar('\n');
column = 0;
}
}
printf("};\n");
}
int main(int argn, char **argc)
{
parameters(argn, argc);
writesize(width, height);
writebits(width, height);
return 0;
}