make-gray50.c
author viric@llimona
Tue, 24 Oct 2006 10:18:01 +0200
changeset 4 f8ce867298a9
parent 0 2b12eedda295
permissions -rw-r--r--
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;
}