Back to index

radiance  4R0+20100331
Functions | Variables
x11raster.c File Reference
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "color.h"
#include "x11raster.h"

Go to the source code of this file.

Functions

XRASTERmake_raster (Display *disp, XVisualInfo *vis, int npixbits, char *data, int width, int height, int bm_pad)
int init_rcolors (register XRASTER *xr, BYTE cmap[][3])
Colormap newcmap (Display *disp, int scrn, Visual *vis)
unsigned long * map_rcolors (register XRASTER *xr, Window w)
Pixmap make_rpixmap (register XRASTER *xr, Window w)
void patch_raster (Drawable d, int xsrc, int ysrc, int xdst, int ydst, int width, int height, register XRASTER *xr)
void unmap_rcolors (register XRASTER *xr)
void free_rpixmap (register XRASTER *xr)
void free_raster (register XRASTER *xr)

Variables

static const char RCSid [] = "$Id: x11raster.c,v 2.13 2004/03/28 20:33:14 schorsch Exp $"

Function Documentation

void free_raster ( register XRASTER xr)

Definition at line 286 of file x11raster.c.

{
       free_rpixmap(xr);
       if (xr->ncolors > 0) {
              unmap_rcolors(xr);
              free((void *)xr->pmap);
              free((void *)xr->cdefs);
       }
       XDestroyImage(xr->image);
       if (xr->gc != 0)
              XFreeGC(xr->disp, xr->gc);
       free((void *)xr);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void free_rpixmap ( register XRASTER xr)

Definition at line 274 of file x11raster.c.

{
       if (xr->pm == 0)
              return;
       XFreePixmap(xr->disp, xr->pm);
       xr->pm = 0;
}

Here is the caller graph for this function:

int init_rcolors ( register XRASTER xr,
BYTE  cmap[][3] 
)

Definition at line 62 of file x11raster.c.

{
       register unsigned char      *p;
       register int  i;

       if ((xr->image->depth > 8) | (xr->ncolors != 0))
              return(xr->ncolors);
       xr->pmap = (short *)malloc(256*sizeof(short));
       if (xr->pmap == NULL)
              return(0);
       xr->cdefs = (XColor *)malloc(256*sizeof(XColor));
       if (xr->cdefs == NULL)
              return(0);
       for (i = 0; i < 256; i++)
              xr->pmap[i] = -1;
       for (p = (unsigned char *)xr->image->data,
                     i = xr->image->width*xr->image->height;
                     i--; p++)
              if (xr->pmap[*p] == -1) {
                     xr->cdefs[xr->ncolors].red = cmap[*p][RED] << 8;
                     xr->cdefs[xr->ncolors].green = cmap[*p][GRN] << 8;
                     xr->cdefs[xr->ncolors].blue = cmap[*p][BLU] << 8;
                     xr->cdefs[xr->ncolors].pixel = *p;
                     xr->cdefs[xr->ncolors].flags = DoRed|DoGreen|DoBlue;
                     xr->pmap[*p] = xr->ncolors++;
              }
       xr->cdefs = (XColor *)realloc((void *)xr->cdefs,
                     xr->ncolors*sizeof(XColor));
       if (xr->cdefs == NULL)
              return(0);
       return(xr->ncolors);
}

Here is the caller graph for this function:

XRASTER* make_raster ( Display *  disp,
XVisualInfo *  vis,
int  npixbits,
char *  data,
int  width,
int  height,
int  bm_pad 
)

Definition at line 19 of file x11raster.c.

{
       static long   swaptest = 1;
       register XRASTER     *xr;

       if ((xr = (XRASTER *)calloc(1, sizeof(XRASTER))) == NULL)
              return(NULL);
       xr->disp = disp;
       xr->screen = vis->screen;
       xr->visual = vis->visual;
       if (npixbits == 1)
              xr->image = XCreateImage(disp,vis->visual,1,
                            XYBitmap,0,data,width,height,bm_pad,0);
       else
              xr->image = XCreateImage(disp,vis->visual,vis->depth,
                            ZPixmap,0,data,width,height,bm_pad,0);
       xr->image->bitmap_bit_order = MSBFirst;
       xr->image->bitmap_unit = bm_pad;
       xr->image->byte_order = *(char *)&swaptest ? LSBFirst : MSBFirst;
       if (vis->depth >= 24 && (xr->image->red_mask != 0xff ||
                     xr->image->green_mask != 0xff00 ||
                     xr->image->blue_mask != 0xff0000) &&
                     (xr->image->red_mask != 0xff0000 ||
                     xr->image->green_mask != 0xff00 ||
                     xr->image->blue_mask != 0xff)) {
              xr->image->red_mask = 0xff;
              xr->image->green_mask = 0xff00;
              xr->image->blue_mask = 0xff0000;
       }
       xr->gc = 0;
       return(xr);
}

Here is the caller graph for this function:

Pixmap make_rpixmap ( register XRASTER xr,
Window  w 
)

Definition at line 195 of file x11raster.c.

{
       XWindowAttributes    xwattr;
       Pixmap pm;

       if (xr->pm != 0)
              return(xr->pm);
       XGetWindowAttributes(xr->disp, w, &xwattr);
       pm = XCreatePixmap(xr->disp, w,
                     xr->image->width, xr->image->height,
                     xwattr.depth);
       if (pm == 0)
              return(0);
       put_raster(pm, 0, 0, xr);
       return(xr->pm = pm);
}

Here is the caller graph for this function:

unsigned long* map_rcolors ( register XRASTER xr,
Window  w 
)

Definition at line 144 of file x11raster.c.

{
       register int  i;
       register unsigned char      *p;

       if (xr->ncolors == 0 || xr->image->depth > 8)
              return(NULL);
       if (xr->pixels != NULL)
              return(xr->pixels);
       xr->pixels = (unsigned long *)malloc(xr->ncolors*sizeof(unsigned long));
       if (xr->pixels == NULL)
              return(NULL);
       if (xr->visual == DefaultVisual(xr->disp, xr->screen))
              xr->cmap = DefaultColormap(xr->disp, xr->screen);
       else
              xr->cmap = newcmap(xr->disp, xr->screen, xr->visual);
       while (XAllocColorCells(xr->disp, xr->cmap, 0,
                     NULL, 0, xr->pixels, xr->ncolors) == 0)
              if (xr->cmap == DefaultColormap(xr->disp, xr->screen))
                     xr->cmap = newcmap(xr->disp, xr->screen, xr->visual);
              else {
                     free((void *)xr->pixels);
                     xr->pixels = NULL;
                     return(NULL);
              }
       for (i = 0; i < xr->ncolors; i++)
              if (xr->pmap[xr->pixels[i]] == -1)
                     break;
       if (i < xr->ncolors) {                    /* different pixels */
              for (p = (unsigned char *)xr->image->data,
                            i = xr->image->width*xr->image->height;
                            i--; p++)
                     *p = xr->pixels[xr->pmap[*p]];
              for (i = 0; i < 256; i++)
                     xr->pmap[i] = -1;
              for (i = 0; i < xr->ncolors; i++) {
                     xr->cdefs[i].pixel = xr->pixels[i];
                     xr->pmap[xr->pixels[i]] = i;
              }
              free_rpixmap(xr);           /* Pixmap invalid */
       }
       XStoreColors(xr->disp, xr->cmap, xr->cdefs, xr->ncolors);
       XSetWindowColormap(xr->disp, w, xr->cmap);
       return(xr->pixels);
}

Here is the call graph for this function:

Here is the caller graph for this function:

Colormap newcmap ( Display *  disp,
int  scrn,
Visual *  vis 
)

Definition at line 100 of file x11raster.c.

{
       XColor thiscolor;
       unsigned long *pixels;
       Colormap      cmap;
       int    n;
       register int  i, j;

       cmap = XCreateColormap(disp, RootWindow(disp,scrn), vis, AllocNone);
       if (cmap == 0 || vis->class != PseudoColor)
              return(cmap);
       pixels=(unsigned long *)malloc(vis->map_entries*sizeof(unsigned long));
       if (pixels == NULL)
              return(0);
       for (n = vis->map_entries; n > 0; n--)
              if (XAllocColorCells(disp, cmap, 0, NULL, 0, pixels, n) != 0)
                     break;
       if (n == 0)
              return(0);
                                   /* reset black and white */
       for (i = 0; i < n; i++) {
              if (pixels[i] != BlackPixel(disp,scrn)
                            && pixels[i] != WhitePixel(disp,scrn))
                     continue;
              thiscolor.pixel = pixels[i];
              thiscolor.flags = DoRed|DoGreen|DoBlue;
              XQueryColor(disp, DefaultColormap(disp,scrn), &thiscolor);
              XStoreColor(disp, cmap, &thiscolor);
              for (j = i; j+1 < n; j++)
                     pixels[j] = pixels[j+1];
              n--;
              i--;
       }
       XFreeColors(disp, cmap, pixels, n, 0);
       free((void *)pixels);
       return(cmap);
}

Here is the caller graph for this function:

void patch_raster ( Drawable  d,
int  xsrc,
int  ysrc,
int  xdst,
int  ydst,
int  width,
int  height,
register XRASTER xr 
)

Definition at line 216 of file x11raster.c.

{
       if (xsrc >= xr->image->width || ysrc >= xr->image->height)
              return;
       if (xsrc < 0) {
              xdst -= xsrc; width += xsrc;
              xsrc = 0;
       }
       if (ysrc < 0) {
              ydst -= ysrc; height += ysrc;
              ysrc = 0;
       }
       if (width <= 0 || height <= 0)
              return;
       if (xsrc + width > xr->image->width)
              width = xr->image->width - xsrc;
       if (ysrc + height > xr->image->height)
              height = xr->image->height - ysrc;

       if (xr->gc == 0) {
              xr->gc = XCreateGC(xr->disp, d, 0, 0);
              XSetState(xr->disp, xr->gc, BlackPixel(xr->disp,xr->screen),
                     WhitePixel(xr->disp,xr->screen), GXcopy, AllPlanes);
       }
       if (xr->pm == 0)
              XPutImage(xr->disp, d, xr->gc, xr->image, xsrc, ysrc,
                            xdst, ydst, width, height);
       else
              XCopyArea(xr->disp, xr->pm, d, xr->gc, xsrc, ysrc,
                            width, height, xdst, ydst);
}
void unmap_rcolors ( register XRASTER xr)

Definition at line 259 of file x11raster.c.

{
       if (xr->pixels == NULL)
              return;
       XFreeColors(xr->disp, xr->cmap, xr->pixels, xr->ncolors, 0);
       if (xr->cmap != DefaultColormap(xr->disp, xr->screen))
              XFreeColormap(xr->disp, xr->cmap);
       free((void *)xr->pixels);
       xr->pixels = NULL;
}

Here is the caller graph for this function:


Variable Documentation

const char RCSid[] = "$Id: x11raster.c,v 2.13 2004/03/28 20:33:14 schorsch Exp $" [static]

Definition at line 2 of file x11raster.c.