clyde@ut-ngp.UUCP (03/03/87)
Here is a handy little tool I put together so that I could use all the icons I had already done for SunTools. Plus, the X bitmap editor is a real pain to use, so I didn't care to try to use it to draw new ones. ----- cut here ------ #include <stdio.h> /* * suntox - Convert SUN bitmap (icon) format to X bitmap format * * Usage: suntox [-h X bitmap height] [-w X bitmap width] * [-n X bitmap name] [filename] (stdin default) * * Author: Clyde Hoover * Computation Center, The University of Texas at Austin * clyde@ngp.utexas.edu */ unsigned short flip(); /* Bit flipper */ char *bitmapname(); FILE *ifile = stdin; /* Input file pointer */ char *Xname = 0; /* X bitmap name */ int Xwidth = 0, /* Width of X bitmap */ Xheight = 0, /* Height of X bitmap */ Xresize = 0; /* Force actual bitmap resize (NYI) */ char *options = "h:w:n:r"; /* Option string for getopt() */ main(argc, argv) int argc; char *argv[]; { int Iwidth = -1, /* SUN bitmap width */ Iheight = -1; /* SUN bitmap height */ register int i; /* Temp */ int argx; /* Option traverser */ char pb[8]; /* Temp */ extern char *optarg;/* From getopt() */ extern int optind; /* From getopt() */ /* * Process command line options */ while ((argx = getopt(argc, argv, options)) != EOF) { switch(argx) { case 'w': Xwidth = atoi(optarg); break; case 'h': Xheight = atoi(optarg); break; case 'n': Xname = optarg; break; /* case 'r': Xresize = 1; break; */ } } if (argv[optind]) { if ((ifile = fopen(argv[optind], "r")) == NULL) { fprintf(stderr, "Can't open %s\n", argv[optind]); exit(1); } if (Xname == (char *)0) Xname = bitmapname(argv[optind]); } /* * Dig out size information from SUN header */ do { i = fscanf(ifile, "%*[^HW*]"); if (i == EOF) break; switch(i = getc(ifile)) { case 'H': fscanf(ifile, "eight=%d", &Iheight); break; case 'W': fscanf(ifile, "idth=%d", &Iwidth); break; case '*': if ((i = getc(ifile)) == '/') i = 0; else ungetc(i, ifile); break; } } while (i != 0 && i != EOF); if (Iheight < 0 || Iwidth < 0) { fprintf(stderr, "Missing format info\n"); exit(1); } /* * Verify reasonableness of bitmap dimensions */ if (Xwidth == 0) Xwidth = Iwidth; if (Xheight == 0) Xheight = Iheight; if (Xname == (char *)0) Xname = "X"; if (Xwidth > Iwidth || Xheight > Iheight) { fprintf(stderr, "Bad sizing option(s) ignored\n"); if (Xwidth > Iwidth) Xwidth = Iwidth; if (Xheight > Iheight) Xheight = Iheight; } /* * Output X bitmap header */ printf("#define %s_width %d\n#define %s_height %d\n", Xname, Xwidth, Xname, Xheight); printf("static short %s_bits[] = {\n", Xname); /* * Convert image bytes */ i = 0; while (!feof(ifile)) { int x; unsigned int word; x = fscanf(ifile, " 0x%X,", &word); if (x == EOF) break; if (x == 0) continue; if ((i % 4) == 0) printf("\n"); sprintf(pb, "%04x", flip((unsigned short)word)); printf("0x%s,", pb); i++; } printf("};\n"); } /* * flip - Invert bit order in a short (16 bit) word */ unsigned short flip(this) register unsigned short this; { register unsigned short that = 0; /* Return value */ register int i = 0; /* Counter */ for (i = 1; i <= (sizeof(short) * 2); i++) { that <<= 4; if (this & 0x8) that |= 01; if (this & 0x4) that |= 02; if (this & 0x2) that |= 04; if (this & 0x1) that |= 08; this >>= 4; } return(that); } /* * bitmapname - make X bitmap name from input file name */ #include <ctype.h> char * bitmapname(filename) char *filename; /* Name of input file */ { register char *p; /* Temp */ static char xs[256]; /* Return value */ extern char *rindex(); if (p = rindex(filename, '/')) p++; else p = filename; (void) strcpy(xs, p); for (p = xs; *p; p++) { if (!isalnum(*p)) { *p = 0; break; } } return(xs); } /* --------- End ----------------- */ -- Shouter-To-Dead-Parrots @ Univ. of Texas Computation Center; Austin, Texas clyde@ngp.cc.utexas.edu; ...!ut-sally!ut-ngp!clyde "It's a sort of a threat, you see. I've never been very good at them myself, but I've told they can be very effective."