#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "picture.h"

char str[1000], name[1000], *s;
int type;

int mx = 0, my = 0, slen;
BYTE *tex = 0;

inline void out_uc(unsigned char c, int &k)
{
	if (k < 0) {printf("\n\""); k = 0;}
	printf("\\x%02X", c);
	k++;
	if (k >= 20) {printf("\""); k = -1;}
}

inline void out_cl(int &k)
{
	if (k >= 0) {printf("\""); k = -1;}
}

inline void out_end(int &k)
{
	if (k == -10) return;
	if (type == 0) {out_uc(0, k); out_uc(255, k);}
	out_cl(k);
	printf(";\n\n");
	k = -10;
}

void del_last_space(char *s0)
{
	char *s1;
	for (s1 = s0; *s1; s1++)
	{
		if (!isspace(*s1)) s0 = s1 + 1;
	}
	*s0 = 0;
}

int main()
{
	BYTE *t0;
	int i, j, k, m, t, v;
//	randomize();
	srand(time(NULL));
	i = rand() + (rand() << 16);
	j = rand() + (rand() << 16);
	k = rand() + (rand() << 16);
	printf("#ifndef _INCLUDE_BITMAP_%08X_%08X_%08X__PICTURE_\n", i, j, k);
	printf("#define _INCLUDE_BITMAP_%08X_%08X_%08X__PICTURE_\n", i, j, k);
	strcpy(name, "bitmap_pictures");
	type = 0;
	k = -10;
	while (!feof(stdin))
	{
		memset(str, 0, sizeof(str));
		fgets(str, sizeof(str)-1, stdin);
		s = str;
		while (*s && isspace(*s)) s++;
		if (strncmp(s, "rem", 3) != 0) continue;
		s += 3;
		if (!isspace(*s)) continue;
		while (*s && isspace(*s)) s++;
		if (strncmp(s, "<array", 6) == 0)
		{
			s += 6;
			if (strncmp(s, ":bmp>", 5) == 0) {s += 5; v = 0;}
			else if (strncmp(s, ":set>", 5) == 0) {s += 5; v = 1;}
			else if (strncmp(s, ":life>", 6) == 0) {s += 6; v = 2;}
			else continue;
			if (!isspace(*s)) continue;
			while (*s && isspace(*s)) s++;
			if (!*s) continue;
			del_last_space(s);
			strcpy(name, s);
			out_end(k);
			type = v;
			continue;
		}
		else if (strncmp(s, "<skip>", 6) == 0)
		{
			s += 6;
			if (!isspace(*s)) continue;
			while (*s && isspace(*s)) s++;
			if (!*s) continue;
			i = 2*atoi(s);
			while (--i >= 0) out_uc(0, k);
			continue;
		}
		else if (strncmp(s, "<bitmap", 7) == 0)
		{
			s += 7; v = 0;
			for (;;)
			{
				if (strncmp(s, ":inv", 4) == 0) {s += 4; v ^= 1;}
				else break;
			}
			if (s[0] == '>') s++;
			else continue;
		}
		else continue;
		if (!isspace(*s)) continue;
		while (*s && isspace(*s)) s++;
		if (!*s) continue;
		del_last_space(s);
		if ((PictureFileOpen(mx, my, tex, s) & PFO_MASK_ERROR) != 0) continue;
		if (!tex || mx <= 0 || my <= 0) continue;
		if (type == 0 || type == 1)
		{
			if (mx >= 256 || my >= 256) continue;
		}
		else if (type == 2)
		{
			if (mx >= 65536 || my >= 65536) continue;
		}
		slen = GetStringPictLenght(mx);
		if (k == -10)
		{
			printf("\nconst unsigned char %s[] = \"", name);
			if (type == 2) printf("#LifeBin 2.0\\n");
			printf("\"");
			k = -1;
		}
		if (v & 1)
		{
			for (i = 0; i < my; i++)
			{
				t0 = tex + slen * i;
				for (j = 3*mx; j > 0; j--)
				{
					t0[0] = (unsigned char)~t0[0];
					t0++;
				}
			}
		}
		m = 0; t = 0;
		if (type == 0 || type == 1)
		{
			out_uc((unsigned char)mx, k); out_uc((unsigned char)my, k);
		}
		else if (type == 2)
		{
			out_uc((unsigned char)mx, k); out_uc((unsigned char)(mx >> 8), k);
			out_uc((unsigned char)my, k); out_uc((unsigned char)(my >> 8), k);
		}
		for (i = 0; i < my; i++)
		{
			t0 = tex + slen * i;
			for (j = mx; j > 0; j--)
			{
				if (type == 0)
				{
					out_uc(t0[2], k); out_uc(t0[1], k); out_uc(t0[0], k);
				}
				else if (type == 1)
				{
					m |= ((int)t0[0] + (int)t0[1] + (int)t0[2] >= 384) << t;
					if (++t >= 8) {out_uc((unsigned char)m, k); m = 0; t = 0;}
				}
				else if (type == 2)
				{
					if ((int)t0[0] + (int)t0[1] + (int)t0[2] >= 384)
					{
						if (m) {out_uc((unsigned char)m, k); m = 0;}
						out_uc(0, k);
					}
					else
					{
						if (m == 255) {out_uc((unsigned char)m, k); m = 0;}
						m++;
					}
				}
				t0 += 3;
			}
		}
		if (type == 1)
		{
			if (t) out_uc((unsigned char)m, k);
		}
		else if (type == 2)
		{
			if (m) out_uc((unsigned char)m, k);
		}
	}
	if (tex) delete[] tex;
	out_end(k);
	printf("#endif\n");
	return 0;
}