#define NEED_REPLIES
#include "Xlibint.h"
#include <X11/Xutil.h>
#include "ImUtil.h"
#define ROUNDUP(nbytes, pad) (((((nbytes) - 1) + (pad)) / (pad)) * (pad))
static unsigned int Ones(
unsigned long mask)
{
register unsigned long y;
y = (mask >> 1) &033333333333;
y = mask - y - ((y >>1) & 033333333333);
return ((unsigned int) (((y + (y >> 3)) & 030707070707) % 077));
}
XImage *XGetImage (dpy, d, x, y, width, height, plane_mask, format)
register Display *dpy;
Drawable d;
int x, y;
unsigned int width, height;
unsigned long plane_mask;
int format;
{
xGetImageReply rep;
register xGetImageReq *req;
char *data;
long nbytes;
XImage *image;
LockDisplay(dpy);
GetReq (GetImage, req);
req->drawable = d;
req->x = x;
req->y = y;
req->width = width;
req->height = height;
req->planeMask = plane_mask;
req->format = format;
if (_XReply (dpy, (xReply *) &rep, 0, xFalse) == 0 ||
rep.length == 0) {
UnlockDisplay(dpy);
SyncHandle();
return (XImage *)NULL;
}
nbytes = (long)rep.length << 2;
data = (char *) Xmalloc((unsigned) nbytes);
if (! data) {
_XEatData(dpy, (unsigned long) nbytes);
UnlockDisplay(dpy);
SyncHandle();
return (XImage *) NULL;
}
_XReadPad (dpy, data, nbytes);
if (format == XYPixmap)
image = XCreateImage(dpy, _XVIDtoVisual(dpy, rep.visual),
Ones (plane_mask &
(((unsigned long)0xFFFFFFFF) >> (32 - rep.depth))),
format, 0, data, width, height, dpy->bitmap_pad, 0);
else
image = XCreateImage (dpy, _XVIDtoVisual(dpy, rep.visual),
rep.depth, ZPixmap, 0, data, width, height,
_XGetScanlinePad(dpy, (int) rep.depth), 0);
if (!image)
Xfree(data);
UnlockDisplay(dpy);
SyncHandle();
return (image);
}
XImage *XGetSubImage(dpy, d, x, y, width, height, plane_mask, format,
dest_image, dest_x, dest_y)
register Display *dpy;
Drawable d;
int x, y;
unsigned int width, height;
unsigned long plane_mask;
int format;
XImage *dest_image;
int dest_x, dest_y;
{
XImage *temp_image;
temp_image = XGetImage(dpy, d, x, y, width, height,
plane_mask, format);
if (!temp_image)
return (XImage *)NULL;
_XSetImage(temp_image, dest_image, dest_x, dest_y);
XDestroyImage(temp_image);
return (dest_image);
}