kolibrios/programs/demos/life2/bmp2h.cpp

194 lines
4.1 KiB
C++
Raw Normal View History

#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;
}