|
|
1.1 ! root 1: /* Copyright, 1987, Massachusetts Institute of Technology */ ! 2: ! 3: #include "copyright.h" ! 4: ! 5: #include "Xlib.h" ! 6: #include "Xutil.h" ! 7: #include "Xlibint.h" ! 8: #include <stdio.h> ! 9: #include <strings.h> ! 10: ! 11: #define ERR_RETURN 0 ! 12: ! 13: static char *Format_Image(image, resultsize) ! 14: XImage *image; ! 15: int *resultsize; ! 16: { ! 17: register int x, c, b; ! 18: register char *ptr; ! 19: int y; ! 20: char *data; ! 21: int width, height; ! 22: int bytes_per_line; ! 23: ! 24: width = image->width; ! 25: height = image->height; ! 26: ! 27: bytes_per_line = (width+7)/8; ! 28: *resultsize = bytes_per_line * height; /* Calculate size of data */ ! 29: ! 30: data = (char *) Xmalloc( *resultsize ); /* Get space for data */ ! 31: if (!data) ! 32: return(ERR_RETURN); ! 33: ! 34: /* ! 35: * The slow but robust brute force method of converting the image: ! 36: */ ! 37: ptr = data; ! 38: c = 0; b=1; ! 39: for (y=0; y<height; y++) { ! 40: for (x=0; x<width;) { ! 41: if (XGetPixel(image, x, y)) ! 42: c |= b; ! 43: b <<= 1; ! 44: if (!(++x & 7)) { ! 45: *(ptr++)=c; ! 46: c=0; b=1; ! 47: } ! 48: } ! 49: if (x & 7) { ! 50: *(ptr++)=c; ! 51: c=0; b=1; ! 52: } ! 53: } ! 54: ! 55: return(data); ! 56: } ! 57: ! 58: #define BYTES_PER_OUTPUT_LINE 12 ! 59: ! 60: int XWriteBitmapFile(display, filename, bitmap, width, height, x_hot, y_hot) ! 61: Display *display; ! 62: char *filename; ! 63: Pixmap bitmap; ! 64: int width, height; ! 65: int x_hot, y_hot; ! 66: { ! 67: char *data, *ptr; ! 68: int size, byte; ! 69: int c; ! 70: XImage *image; ! 71: FILE *stream; ! 72: char *name; ! 73: ! 74: if (!(name = rindex(filename, '/'))) ! 75: name = filename; ! 76: else ! 77: name++; ! 78: ! 79: if (!(stream = fopen(filename, "w"))) ! 80: return(BitmapOpenFailed); ! 81: ! 82: /* Convert bitmap to an image */ ! 83: image = XGetImage(display, bitmap, 0,0,width, height, 1L, XYPixmap); ! 84: ! 85: /* Get standard format for data */ ! 86: data = Format_Image(image, &size); ! 87: XDestroyImage(image); ! 88: if (!data) { ! 89: fclose(stream); ! 90: return(BitmapNoMemory); ! 91: } ! 92: ! 93: /* Write out standard header */ ! 94: fprintf(stream, "#define %s_width %d\n", name, image->width); ! 95: fprintf(stream, "#define %s_height %d\n", name, image->height); ! 96: if (x_hot != -1) { ! 97: fprintf(stream, "#define %s_x_hot %d\n", name, x_hot); ! 98: fprintf(stream, "#define %s_y_hot %d\n", name, y_hot); ! 99: } ! 100: ! 101: /* Print out the data itself */ ! 102: fprintf(stream, "static char %s_bits[] = {", name); ! 103: for (byte=0, ptr=data; byte<size; byte++, ptr++) { ! 104: if (!byte) ! 105: fprintf(stream, "\n "); ! 106: else if (!(byte % BYTES_PER_OUTPUT_LINE)) ! 107: fprintf(stream, ",\n "); ! 108: else ! 109: fprintf(stream, ", "); ! 110: c = *ptr; ! 111: if (c<0) ! 112: c += 256; ! 113: fprintf(stream, "0x%02x", c); ! 114: } ! 115: fprintf(stream, "};\n"); ! 116: ! 117: Xfree(data); ! 118: fclose(stream); ! 119: return(BitmapSuccess); ! 120: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.