#include "Xlibint.h"
#include <X11/Xos.h>
#include "Xutil.h"
#include <stdio.h>
#define ERR_RETURN 0
static char *Format_Image(
XImage *image,
int *resultsize)
{
register int x, c, b;
register char *ptr;
int y;
char *data;
int width, height;
int bytes_per_line;
width = image->width;
height = image->height;
bytes_per_line = (width+7)/8;
*resultsize = bytes_per_line * height;
data = (char *) Xmalloc( *resultsize );
if (!data)
return(ERR_RETURN);
ptr = data;
c = 0; b=1;
for (y=0; y<height; y++) {
for (x=0; x<width;) {
if (XGetPixel(image, x, y))
c |= b;
b <<= 1;
if (!(++x & 7)) {
*(ptr++)=c;
c=0; b=1;
}
}
if (x & 7) {
*(ptr++)=c;
c=0; b=1;
}
}
return(data);
}
#define BYTES_PER_OUTPUT_LINE 12
int
XWriteBitmapFile(
Display *display,
_Xconst char *filename,
Pixmap bitmap,
unsigned int width,
unsigned int height,
int x_hot,
int y_hot)
{
char *data, *ptr;
int size, byte;
int c;
XImage *image;
FILE *stream;
char *name;
if (!(name = strrchr(filename, '/')))
name = (char *)filename;
else
name++;
#ifdef __UNIXOS2__
filename = (char*)__XOS2RedirRoot(filename);
#endif
if (!(stream = fopen(filename, "w")))
return(BitmapOpenFailed);
image = XGetImage(display, bitmap, 0,0,width, height, 1L, XYPixmap);
if (!image) {
fclose(stream);
return(4);
}
data = Format_Image(image, &size);
XDestroyImage(image);
if (!data) {
fclose(stream);
return(BitmapNoMemory);
}
fprintf(stream, "#define %s_width %d\n", name, width);
fprintf(stream, "#define %s_height %d\n", name, height);
if (x_hot != -1) {
fprintf(stream, "#define %s_x_hot %d\n", name, x_hot);
fprintf(stream, "#define %s_y_hot %d\n", name, y_hot);
}
fprintf(stream, "static unsigned char %s_bits[] = {", name);
for (byte=0, ptr=data; byte<size; byte++, ptr++) {
if (!byte)
fprintf(stream, "\n ");
else if (!(byte % BYTES_PER_OUTPUT_LINE))
fprintf(stream, ",\n ");
else
fprintf(stream, ", ");
c = *ptr;
if (c<0)
c += 256;
fprintf(stream, "0x%02x", c);
}
fprintf(stream, "};\n");
Xfree(data);
fclose(stream);
return(BitmapSuccess);
}