0,0 → 1,195 |
#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; |
} |