ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/x11raster.c
(Generate patch)

Comparing ray/src/px/x11raster.c (file contents):
Revision 1.2 by greg, Thu Mar 1 18:13:34 1990 UTC vs.
Revision 2.13 by schorsch, Sun Mar 28 20:33:14 2004 UTC

# Line 1 | Line 1
1 /* Copyright 1990 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * x11raster.c - routines to handle images for X windows.
6   *
# Line 14 | Line 11 | static char SCCSid[] = "$SunId$ LBL";
11   #include <X11/Xlib.h>
12   #include <X11/Xutil.h>
13  
14 + #include "color.h"
15   #include "x11raster.h"
16  
17  
18 < XRASTER *
19 < make_raster(disp, scrn, depth, data, width, height, bm_pad)
20 < Display *disp;
21 < int     scrn;
22 < int     depth;
23 < char    *data;
24 < int     width, height;
25 < int     bm_pad;
18 > extern XRASTER *
19 > make_raster(
20 >        Display *disp,
21 >        XVisualInfo     *vis,
22 >        int     npixbits,
23 >        char    *data,
24 >        int     width,
25 >        int height,
26 >        int     bm_pad
27 > )
28   {
29 +        static long     swaptest = 1;
30          register XRASTER        *xr;
31 <        XVisualInfo     ourvinfo;
31 <                                                /* Pick appropriate Visual */
32 <        if (depth == 1) {
33 <                ourvinfo.visual = DefaultVisual(disp,scrn);
34 <        } else if (depth == 8) {
35 <                if (!XMatchVisualInfo(disp,scrn,8,PseudoColor,&ourvinfo))
36 <                        return(NULL);
37 <        } else if (depth > 12) {
38 <                if (!XMatchVisualInfo(disp,scrn,24,TrueColor,&ourvinfo))
39 <                        return(NULL);
40 <        } else
41 <                return(NULL);
31 >
32          if ((xr = (XRASTER *)calloc(1, sizeof(XRASTER))) == NULL)
33                  return(NULL);
34          xr->disp = disp;
35 <        xr->screen = scrn;
36 <        xr->visual = ourvinfo.visual;
37 <        xr->image = XCreateImage(disp,ourvinfo.visual,depth,
38 <                        ZPixmap,0,data,width,height,bm_pad,0);
39 <        xr->gc = XCreateGC(disp, RootWindow(disp,scrn), 0, 0);
40 <        XSetState(disp, xr->gc, BlackPixel(disp,scrn), WhitePixel(disp,scrn),
41 <                        GXcopy, AllPlanes);
35 >        xr->screen = vis->screen;
36 >        xr->visual = vis->visual;
37 >        if (npixbits == 1)
38 >                xr->image = XCreateImage(disp,vis->visual,1,
39 >                                XYBitmap,0,data,width,height,bm_pad,0);
40 >        else
41 >                xr->image = XCreateImage(disp,vis->visual,vis->depth,
42 >                                ZPixmap,0,data,width,height,bm_pad,0);
43 >        xr->image->bitmap_bit_order = MSBFirst;
44 >        xr->image->bitmap_unit = bm_pad;
45 >        xr->image->byte_order = *(char *)&swaptest ? LSBFirst : MSBFirst;
46 >        if (vis->depth >= 24 && (xr->image->red_mask != 0xff ||
47 >                        xr->image->green_mask != 0xff00 ||
48 >                        xr->image->blue_mask != 0xff0000) &&
49 >                        (xr->image->red_mask != 0xff0000 ||
50 >                        xr->image->green_mask != 0xff00 ||
51 >                        xr->image->blue_mask != 0xff)) {
52 >                xr->image->red_mask = 0xff;
53 >                xr->image->green_mask = 0xff00;
54 >                xr->image->blue_mask = 0xff0000;
55 >        }
56 >        xr->gc = 0;
57          return(xr);
58   }
59  
60  
61 < int
62 < init_rcolors(xr, rmap, gmap, bmap)              /* initialize colors */
63 < register XRASTER        *xr;
64 < unsigned char   rmap[256], gmap[256], bmap[256];
61 > extern int
62 > init_rcolors(                   /* initialize colors */
63 >        register XRASTER        *xr,
64 >        BYTE    cmap[][3]
65 > )
66   {
67          register unsigned char  *p;
68          register int    i;
69  
70 <        if (xr->image->depth != 8 || xr->ncolors != 0)
70 >        if ((xr->image->depth > 8) | (xr->ncolors != 0))
71                  return(xr->ncolors);
72          xr->pmap = (short *)malloc(256*sizeof(short));
73          if (xr->pmap == NULL)
# Line 75 | Line 81 | unsigned char  rmap[256], gmap[256], bmap[256];
81                          i = xr->image->width*xr->image->height;
82                          i--; p++)
83                  if (xr->pmap[*p] == -1) {
84 <                        xr->cdefs[xr->ncolors].red = rmap[*p] << 8;
85 <                        xr->cdefs[xr->ncolors].green = gmap[*p] << 8;
86 <                        xr->cdefs[xr->ncolors].blue = bmap[*p] << 8;
84 >                        xr->cdefs[xr->ncolors].red = cmap[*p][RED] << 8;
85 >                        xr->cdefs[xr->ncolors].green = cmap[*p][GRN] << 8;
86 >                        xr->cdefs[xr->ncolors].blue = cmap[*p][BLU] << 8;
87                          xr->cdefs[xr->ncolors].pixel = *p;
88                          xr->cdefs[xr->ncolors].flags = DoRed|DoGreen|DoBlue;
89                          xr->pmap[*p] = xr->ncolors++;
90                  }
91 <        xr->cdefs = (XColor *)realloc((char *)xr->cdefs,
91 >        xr->cdefs = (XColor *)realloc((void *)xr->cdefs,
92                          xr->ncolors*sizeof(XColor));
93          if (xr->cdefs == NULL)
94                  return(0);
# Line 90 | Line 96 | unsigned char  rmap[256], gmap[256], bmap[256];
96   }
97  
98  
99 < unsigned long *
100 < map_rcolors(xr, w)                              /* get and assign pixels */
101 < register XRASTER        *xr;
102 < Window  w;
99 > extern Colormap
100 > newcmap(                /* get colormap and fix b & w */
101 >        Display *disp,
102 >        int     scrn,
103 >        Visual  *vis
104 > )
105   {
106 +        XColor  thiscolor;
107 +        unsigned long   *pixels;
108 +        Colormap        cmap;
109 +        int     n;
110 +        register int    i, j;
111 +
112 +        cmap = XCreateColormap(disp, RootWindow(disp,scrn), vis, AllocNone);
113 +        if (cmap == 0 || vis->class != PseudoColor)
114 +                return(cmap);
115 +        pixels=(unsigned long *)malloc(vis->map_entries*sizeof(unsigned long));
116 +        if (pixels == NULL)
117 +                return(0);
118 +        for (n = vis->map_entries; n > 0; n--)
119 +                if (XAllocColorCells(disp, cmap, 0, NULL, 0, pixels, n) != 0)
120 +                        break;
121 +        if (n == 0)
122 +                return(0);
123 +                                        /* reset black and white */
124 +        for (i = 0; i < n; i++) {
125 +                if (pixels[i] != BlackPixel(disp,scrn)
126 +                                && pixels[i] != WhitePixel(disp,scrn))
127 +                        continue;
128 +                thiscolor.pixel = pixels[i];
129 +                thiscolor.flags = DoRed|DoGreen|DoBlue;
130 +                XQueryColor(disp, DefaultColormap(disp,scrn), &thiscolor);
131 +                XStoreColor(disp, cmap, &thiscolor);
132 +                for (j = i; j+1 < n; j++)
133 +                        pixels[j] = pixels[j+1];
134 +                n--;
135 +                i--;
136 +        }
137 +        XFreeColors(disp, cmap, pixels, n, 0);
138 +        free((void *)pixels);
139 +        return(cmap);
140 + }
141 +
142 +
143 + extern unsigned long *
144 + map_rcolors(                    /* get and assign pixels */
145 +        register XRASTER        *xr,
146 +        Window  w
147 + )
148 + {
149          register int    i;
150          register unsigned char  *p;
100        int     j;
151  
152 <        if (xr->ncolors == 0 || xr->image->depth != 8)
152 >        if (xr->ncolors == 0 || xr->image->depth > 8)
153                  return(NULL);
154          if (xr->pixels != NULL)
155                  return(xr->pixels);
156          xr->pixels = (unsigned long *)malloc(xr->ncolors*sizeof(unsigned long));
157          if (xr->pixels == NULL)
158                  return(NULL);
159 <        if (xr->visual == DefaultVisual(xr->disp, xr->screen)) {
159 >        if (xr->visual == DefaultVisual(xr->disp, xr->screen))
160                  xr->cmap = DefaultColormap(xr->disp, xr->screen);
161 <                goto gotmap;
162 <        }
163 < getmap:
164 <        xr->cmap = XCreateColormap(xr->disp, w, xr->visual, AllocNone);
115 < gotmap:
116 <        if (XAllocColorCells(xr->disp, xr->cmap, 0,
117 <                        &j, 0, xr->pixels, xr->ncolors) == 0) {
161 >        else
162 >                xr->cmap = newcmap(xr->disp, xr->screen, xr->visual);
163 >        while (XAllocColorCells(xr->disp, xr->cmap, 0,
164 >                        NULL, 0, xr->pixels, xr->ncolors) == 0)
165                  if (xr->cmap == DefaultColormap(xr->disp, xr->screen))
166 <                        goto getmap;
167 <                free((char *)xr->pixels);
168 <                xr->pixels = NULL;
169 <                return(NULL);
170 <        }
166 >                        xr->cmap = newcmap(xr->disp, xr->screen, xr->visual);
167 >                else {
168 >                        free((void *)xr->pixels);
169 >                        xr->pixels = NULL;
170 >                        return(NULL);
171 >                }
172          for (i = 0; i < xr->ncolors; i++)
173                  if (xr->pmap[xr->pixels[i]] == -1)
174                          break;
# Line 143 | Line 191 | gotmap:
191   }
192  
193  
194 < Pixmap
195 < make_rpixmap(xr)                        /* make pixmap for raster */
196 < register XRASTER        *xr;
194 > extern Pixmap
195 > make_rpixmap(                   /* make pixmap for raster */
196 >        register XRASTER        *xr,
197 >        Window  w
198 > )
199   {
200 +        XWindowAttributes       xwattr;
201          Pixmap  pm;
202  
203          if (xr->pm != 0)
204                  return(xr->pm);
205 <        pm = XCreatePixmap(xr->disp, RootWindow(xr->disp, xr->screen),
206 <                        xr->image->width, xr->image->height, xr->image->depth);
205 >        XGetWindowAttributes(xr->disp, w, &xwattr);
206 >        pm = XCreatePixmap(xr->disp, w,
207 >                        xr->image->width, xr->image->height,
208 >                        xwattr.depth);
209          if (pm == 0)
210                  return(0);
211          put_raster(pm, 0, 0, xr);
212          return(xr->pm = pm);
213   }
214  
215 <
216 < patch_raster(d, xsrc, ysrc, xdst, ydst, width, height, xr)      /* redraw */
217 < Drawable        d;
218 < int     xsrc, ysrc, xdst, ydst;
219 < int     width, height;
220 < register XRASTER        *xr;
215 > extern void
216 > patch_raster(   /* redraw */
217 >        Drawable        d,
218 >        int     xsrc,
219 >        int     ysrc,
220 >        int     xdst,
221 >        int     ydst,
222 >        int     width,
223 >        int     height,
224 >        register XRASTER        *xr
225 > )
226   {
227          if (xsrc >= xr->image->width || ysrc >= xr->image->height)
228                  return;
# Line 183 | Line 241 | register XRASTER       *xr;
241          if (ysrc + height > xr->image->height)
242                  height = xr->image->height - ysrc;
243  
244 +        if (xr->gc == 0) {
245 +                xr->gc = XCreateGC(xr->disp, d, 0, 0);
246 +                XSetState(xr->disp, xr->gc, BlackPixel(xr->disp,xr->screen),
247 +                        WhitePixel(xr->disp,xr->screen), GXcopy, AllPlanes);
248 +        }
249          if (xr->pm == 0)
250                  XPutImage(xr->disp, d, xr->gc, xr->image, xsrc, ysrc,
251                                  xdst, ydst, width, height);
# Line 192 | Line 255 | register XRASTER       *xr;
255   }
256  
257  
258 < unmap_rcolors(xr)                       /* free colors */
259 < register XRASTER        *xr;
258 > extern void
259 > unmap_rcolors(                  /* free colors */
260 >        register XRASTER        *xr
261 > )
262   {
263          if (xr->pixels == NULL)
264                  return;
265          XFreeColors(xr->disp, xr->cmap, xr->pixels, xr->ncolors, 0);
266          if (xr->cmap != DefaultColormap(xr->disp, xr->screen))
267                  XFreeColormap(xr->disp, xr->cmap);
268 <        free((char *)xr->pixels);
268 >        free((void *)xr->pixels);
269          xr->pixels = NULL;
270   }
271  
272  
273 < free_rpixmap(xr)                        /* release Pixmap */
274 < register XRASTER        *xr;
273 > extern void
274 > free_rpixmap(                   /* release Pixmap */
275 >        register XRASTER        *xr
276 > )
277   {
278          if (xr->pm == 0)
279                  return;
# Line 215 | Line 282 | register XRASTER       *xr;
282   }
283  
284  
285 < free_raster(xr)                         /* free raster data */
286 < register XRASTER        *xr;
285 > extern void
286 > free_raster(                            /* free raster data */
287 >        register XRASTER        *xr
288 > )
289   {
290          free_rpixmap(xr);
291          if (xr->ncolors > 0) {
292                  unmap_rcolors(xr);
293 <                free((char *)xr->pmap);
294 <                free((char *)xr->cdefs);
293 >                free((void *)xr->pmap);
294 >                free((void *)xr->cdefs);
295          }
296          XDestroyImage(xr->image);
297 <        XFreeGC(xr->disp, xr->gc);
298 <        free((char *)xr);
297 >        if (xr->gc != 0)
298 >                XFreeGC(xr->disp, xr->gc);
299 >        free((void *)xr);
300   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines