1
0
Files
irix-657m-src/stand/arcs/scripts/xbmtohtpbm.c
2022-09-29 17:59:04 +03:00

102 lines
1.9 KiB
C

#include <stdio.h>
/*
* returns the hex digit with the bits reversed
*/
int
hextoi(char c)
{
switch (c) {
case '0': return 0x0;
case '1': return 0x8;
case '2': return 0x4;
case '3': return 0xc;
case '4': return 0x2;
case '5': return 0xa;
case '6': return 0x6;
case '7': return 0xe;
case '8': return 0x1;
case '9': return 0x9;
case 'a': return 0x5;
case 'b': return 0xd;
case 'c': return 0x3;
case 'd': return 0xb;
case 'e': return 0x7;
case 'f': return 0xf;
default:
fprintf(stderr, "xbmtohtpbm: bad hex number: %c\n", c);
return 0x0;
}
}
char
getbyte(FILE *in)
{
int c;
/* go to next zero (beginning of '0x') */
while ((c = fgetc(in)) != '0');
/* skip the x in '0x' */
fgetc(in);
c = hextoi(fgetc(in));
c |= hextoi(fgetc(in)) << 4;
return c;
}
main(int argc, char **argv)
{
FILE *in;
char line[80];
char name[32];
int width, height, shorts;
int sper, bper;
int x, y, i;
unsigned short *a;
if (argc == 2)
in = fopen(argv[1], "r");
else
in = stdin;
/* print #defines for width and height */
fputs(fgets(line, 80, in), stdout);
sscanf(line, "%*s%*s%d", &width);
fputs(fgets(line, 80, in), stdout);
sscanf(line, "%*s%*s%d", &height);
/* array definition */
fscanf(in, "%*s%*s%s%*s%*s", name);
printf("static unsigned short %s = {", name);
bper = (width + 7) / 8;
sper = (width + 15) / 16;
shorts = sper * height;
a = (unsigned short*)malloc(shorts*sizeof(short));
/* get data */
for (i = 0, y = 0; y < height; y++) {
for (x = bper; x > 0; x -= 2, i++) {
a[i] = getbyte(in) << 8;
if (x != 1)
a[i] |= getbyte(in);
}
}
/* print data */
printf("\n 0x%04x", a[(height-1)*sper]);
for (i = 1; i < sper; i++)
printf(", 0x%04x", a[(height-1)*sper+i]);
for (y = height-2; y >= 0; y--) {
for (x = 0; x < sper; x++, i++) {
printf(",");
printf((i % 8) ? " " : "\n ");
printf("0x%04x", a[y*sper+x]);
}
}
printf("};\n");
}