XImage *ReadRaw(Display *disp, char Name[], int width, int height) { FILE *f; XImage *Res = NULL; char *Data; int depth, i; f = fopen(Name, "r"); if (f != NULL) { depth = 4; Data = (char *)calloc(width * height * depth / 8, 1); if (Data != NULL) { Res = XCreateImage(disp, DefaultVisual(disp, DefaultScreen(disp)), depth, XYPixmap, 0, Data, width, height, 8, 0); if (Res != NULL) { for (i=0; i<4; i++) { fread(Data+(3-i)*(width*height/8), width>>3, height, f); } } else { free(Data); } } fclose(f); } return Res; } XImage *RemapColors(Display *disp, XImage *Im, unsigned long ColT[]) { XImage *Tmp = NULL; char *Data; int width, height, depth; int x, y; width = Im->width; height = Im->height; depth = DefaultDepth(disp, DefaultScreen(disp)); x = 1; y = (depth-1) >> 2; while (y>>=1) x<<=1; Data = (char *)malloc(width * height * x); if (Data != NULL) { Tmp = XCreateImage(disp, DefaultVisual(disp, DefaultScreen(disp)), depth, ZPixmap, 0, Data, width, height, 32, 0); if (Tmp != NULL) { for (y=0; ywidth; height1 = Im->height; width2 = ox * width1 / ix; height2 = oy * height1 / iy; Data = (char *)malloc(width2 * height2 * Im->bits_per_pixel / 8); Tmp = XCreateImage(disp, DefaultVisual(disp, DefaultScreen(disp)), Im->depth, ZPixmap, 0, Data, width2, height2, 32, 0); if (ix > ox) { px1 = &x1; px2 = &x2; dx1 = &ix; dx2 = &ox; } else { px1 = &x2; px2 = &x1; dx1 = &ox; dx2 = &ix; } if (iy > oy) { py1 = &y1; py2 = &y2; dy1 = &iy; dy2 = &oy; } else { py1 = &y2; py2 = &y1; dy1 = &oy; dy2 = &iy; } Ty = *dy1; for (y1=0, y2=0; (y1 < height1) && (y2 < height2); ) { Tx = *dx1; for (x1=0, x2=0; (x1 < width1) && (x2 < width2); ) { XPutPixel(Tmp, x2, y2, XGetPixel(Im, x1, y1)); (*px1)++; Tx -= *dx2; if (Tx < 0) { Tx += *dx1; (*px2)++; } } (*py1)++; Ty -= *dy2; if (Ty < 0) { Ty += *dy1; (*py2)++; } } return Tmp; }