forked from KolibriOS/kolibrios
2bf6bb3b5b
git-svn-id: svn://kolibrios.org@1769 a494cfbc-eb01-0410-851d-a64ba20cac60
195 lines
4.1 KiB
C++
195 lines
4.1 KiB
C++
#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;
|
|
} |