+ ximage->bytes_per_line = stride ? stride : bytes_per_line(w * ximage->bits_per_pixel, 32);
+ ximage->data = data;
+
+ if (pdp->shminfo.shmid >= 0) {
+ ximage->width = ximage->bytes_per_line / ((ximage->bits_per_pixel + 7)/ 8);
+ ximage->height = h;
+ XShmPutImage(dpy, drawable, gc, ximage, srcx, srcy, x, y, w, h, False);
+ XSync(dpy, False);
+ } else {
+ ximage->width = w;
+ ximage->height = h;
+ XPutImage(dpy, drawable, gc, ximage, srcx, srcy, x, y, w, h);
+ }
+ ximage->data = NULL;
+}
+
+static void
+swrastPutImageShm(__DRIdrawable * draw, int op,
+ int x, int y, int w, int h, int stride,
+ int shmid, char *shmaddr, unsigned offset,
+ void *loaderPrivate)
+{
+ struct drisw_drawable *pdp = loaderPrivate;
+
+ pdp->shminfo.shmaddr = shmaddr;
+ swrastXPutImage(draw, op, 0, 0, x, y, w, h, stride, shmid,
+ shmaddr + offset, loaderPrivate);
+}
+
+static void
+swrastPutImageShm2(__DRIdrawable * draw, int op,
+ int x, int y,
+ int w, int h, int stride,
+ int shmid, char *shmaddr, unsigned offset,
+ void *loaderPrivate)
+{
+ struct drisw_drawable *pdp = loaderPrivate;
+
+ pdp->shminfo.shmaddr = shmaddr;
+ swrastXPutImage(draw, op, x, 0, x, y, w, h, stride, shmid,
+ shmaddr + offset, loaderPrivate);
+}
+
+static void
+swrastPutImage2(__DRIdrawable * draw, int op,
+ int x, int y, int w, int h, int stride,
+ char *data, void *loaderPrivate)
+{
+ swrastXPutImage(draw, op, 0, 0, x, y, w, h, stride, -1,
+ data, loaderPrivate);
+}
+
+static void
+swrastPutImage(__DRIdrawable * draw, int op,
+ int x, int y, int w, int h,
+ char *data, void *loaderPrivate)
+{
+ swrastXPutImage(draw, op, 0, 0, x, y, w, h, 0, -1,
+ data, loaderPrivate);
+}
+
+static void
+swrastGetImage2(__DRIdrawable * read,
+ int x, int y, int w, int h, int stride,
+ char *data, void *loaderPrivate)
+{
+ struct drisw_drawable *prp = loaderPrivate;
+ __GLXDRIdrawable *pread = &(prp->base);
+ Display *dpy = pread->psc->dpy;
+ Drawable readable;
+ XImage *ximage;
+
+ if (!prp->ximage || prp->shminfo.shmid >= 0) {
+ if (!XCreateDrawable(prp, -1, dpy))
+ return;
+ }
+
+ readable = pread->xDrawable;
+
+ ximage = prp->ximage;