|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_bitpix_c = "$Header: bitpix.c,v 10.2 86/02/01 16:20:31 tony Rel $";
3: #endif lint
4: #ifdef sun
5: /*
6: * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided
7: * for unrestricted use provided that this legend is included on all tape
8: * media and as a part of the software program in whole or part. Users
9: * may copy or modify these drivers without charge, but are not authorized
10: * to license or distribute them to anyone else except as part of a product or
11: * program developed by the user.
12: *
13: * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
14: * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A
15: * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE
16: * PRACTICE.
17: *
18: * The Sun X Drivers are provided with no support and without any obligation
19: * on the part of Sun Microsystems, Inc. to assist in their use, correction,
20: * modification or enhancement.
21: *
22: * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
23: * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X
24: * DRIVERS OR ANY PART THEREOF.
25: *
26: * In no event will Sun Microsystems, Inc. be liable for any lost revenue
27: * or profits or other special, indirect and consequential damages, even if
28: * Sun has been advised of the possibility of such damages.
29: *
30: * Sun Microsystems, Inc.
31: * 2550 Garcia Avenue
32: * Mountain View, California 94043
33: */
34:
35: #ifndef lint
36: static char sccsid[] = "@(#)bitpix.c 2.1 86/01/28 Copyright 1986 Sun Micro";
37: #endif
38:
39: /*-
40: * Copyright (c) 1986 by Sun Microsystems, Inc.
41: */
42: /* Copyright 1985 Massachusetts Institute of Technology */
43:
44: /* Routines to cache bitmaps and pixmaps in the frame buffer memory:
45: *
46: * StoreBitmap Creates a bitmap
47: * FreeBitmap Frees the storage taken by a bitmap
48: * CharBitmap Creates a bitmap from a font character
49: * StorePixmap Creates a pixmap
50: * FreePixmap Frees the storage taken by a pixmap
51: * MakePixmap Create a pixmap from a bitmap
52: * PixmapSave Save a region of the screen
53: * PixmapGet Read a region of the screen
54: *
55: */
56:
57: #include "Xsun.h"
58: #include <errno.h>
59:
60: extern int errno;
61: extern struct pixrect *PixRect;
62:
63: char *Xalloc();
64: PIXMAP *MakePixmap();
65:
66: BITMAP *StoreBitmap (width, height, data)
67: int width, height;
68: char *data;
69: {
70: register BITMAP *bm;
71: int size;
72:
73: bm = (BITMAP *) Xalloc (sizeof (BITMAP));
74: bm->width = width;
75: bm->height = height;
76: bm->refcnt = 1;
77:
78: size = BitmapSize(width, height);
79: if ((bm->data = (caddr_t) malloc (size)) == NULL) {
80: free ((caddr_t) bm);
81: return (NULL);
82: }
83: bcopy (data, bm->data, size);
84: InvertPixelOrder((short *) bm->data, size>>1);
85:
86: return (bm);
87: }
88:
89: FreeBitmap (bitmap)
90: register BITMAP *bitmap;
91: {
92: free ((caddr_t) bitmap->data);
93: free ((caddr_t) bitmap);
94: }
95:
96: BITMAP *CharBitmap (c, font)
97: unsigned c;
98: register FONT *font;
99: {
100: int width;
101: register BITMAP *bm;
102:
103: if (c < font->first || c > font->last) {
104: errno = EINVAL;
105: return (NULL);
106: }
107: if (font->fixed)
108: width = font->avg_width;
109: else
110: width = ((struct pixfont *)font->data)->pf_char[c].pc_adv.x;
111: if (width == 0) {
112: errno = EINVAL;
113: return (NULL);
114: }
115: bm = (BITMAP *) Xalloc (sizeof (BITMAP));
116: bm->width = width;
117: bm->height = font->height;
118: bm->refcnt = 1;
119: if ((bm->data =
120: (caddr_t) malloc (BitmapSize(width, bm->height))) == NULL) {
121: free ((caddr_t) bm);
122: errno = ENOMEM;
123: return (NULL);
124: }
125:
126: CopyText ((caddr_t) &c, 1, font, bm);
127: return (bm);
128: }
129:
130: /*ARGSUSED*/
131: PIXMAP *StorePixmap (width, height, format, data)
132: int width, height, format;
133: char *data;
134: {
135: register PIXMAP *pm;
136:
137: if (PixRect->pr_depth == 1) {
138: register BITMAP *bm;
139:
140: bm = (BITMAP *) StoreBitmap(width, height, data);
141: if (bm == NULL)
142: return (NULL);
143: bm->refcnt = 0;
144: if ((pm = MakePixmap(bm, 1, 0)) == NULL) {
145: FreeBitmap(bm);
146: return (NULL);
147: }
148: }
149: else if (PixRect->pr_depth <= 8) {
150: char * newdata;
151: int size;
152:
153: pm = (PIXMAP *) Xalloc(sizeof(PIXMAP));
154: pm->width = width;
155: pm->height = height;
156: pm->refcnt = 1;
157: switch (format) {
158: case XYFormat:
159: size = XYPixmapSize(width, height, PixRect->pr_depth);
160: pm->kind = XYColorPixmap;
161: break;
162: case ZFormat:
163: size = BZPixmapSize(width, height);
164: if (width&1)
165: size += height;
166: pm->kind = ZColorPixmap;
167: break;
168: }
169: newdata = (char *) Xalloc(size);
170: if (width&1) {
171: register int i;
172: register char * old = data, *new = newdata;
173:
174: for (i = 0; i < height; i++) {
175: bcopy(old, new, width);
176: old += width;
177: new += width + 1;
178: }
179: } else
180: bcopy(data, newdata, size);
181: pm->data = newdata;
182: }
183: return (pm);
184: }
185:
186: FreePixmap (pixmap)
187: register PIXMAP *pixmap;
188: {
189: switch (pixmap->kind) {
190: case BitmapPixmap:
191: {
192: register BITMAP *bm;
193:
194: bm = PDATA(pixmap);
195: if (--bm->refcnt == 0)
196: FreeBitmap(bm);
197: }
198: break;
199: case ZColorPixmap:
200: case XYColorPixmap:
201: free((caddr_t)pixmap->data);
202: break;
203: case ConstantPixmap:
204: return;
205: }
206: free((caddr_t) pixmap);
207: }
208:
209: PIXMAP constpix0 = {1, 1, 1, 1, ConstantPixmap, (caddr_t) 0};
210: PIXMAP constpix1 = {1, 1, 1, 1, ConstantPixmap, (caddr_t) 1};
211:
212: PIXMAP *MakePixmap (xymask, fore, back)
213: register BITMAP *xymask;
214: int fore, back;
215: {
216: register PIXMAP *pm = NULL;
217:
218: if (xymask == NULL) {
219: if (PixRect->pr_depth == 1) {
220: if (fore & 1)
221: pm = &constpix1;
222: else
223: pm = &constpix0;
224: pm->refcnt++;
225: }
226: else if (PixRect->pr_depth <= 8) {
227: static PIXMAP *constpm[256];
228:
229: if (constpm[fore & 0xFF] == 0) {
230: constpm[fore & 0xFF] = pm = (PIXMAP *) Xalloc(sizeof(PIXMAP));
231: pm->width = 1;
232: pm->height = 1;
233: pm->refcnt = 1;
234: pm->tile = CanBeTiled;
235: pm->kind = ConstantPixmap;
236: pm->data = (caddr_t) fore;
237: }
238: else {
239: pm = constpm[fore & 0xFF];
240: pm->refcnt++;
241: }
242: }
243: return (pm);
244: }
245:
246: pm = (PIXMAP *) Xalloc(sizeof(PIXMAP));
247: pm->width = xymask->width;
248: pm->height = xymask->height;
249: pm->refcnt = 1;
250: xymask->refcnt++;
251: pm->kind = BitmapPixmap;
252: pm->data = (caddr_t) xymask;
253: pm->tile = CanBeTiled;
254: /* save a bit to indicate if we have to invert the source */
255:
256: if ((PixRect->pr_depth == 1) && (back & 1))
257: pm->kind |= InvertFlag;
258: return (pm);
259: }
260:
261: PIXMAP *PixmapSave (srcx, srcy, width, height)
262: int srcx, srcy, width, height;
263: {
264: PIXMAP *pm = NULL;
265:
266:
267: if (PixRect->pr_depth == 1) {
268: register BITMAP *bm;
269:
270: bm = (BITMAP *) Xalloc(sizeof(BITMAP));
271: bm->width = width;
272: bm->height = height;
273: bm->refcnt = 0;
274:
275: if ((bm->data =
276: (caddr_t) malloc(BitmapSize(width, height))) == NULL) {
277: free((caddr_t) bm);
278: return (NULL);
279: }
280: {
281: struct pixrect *dest;
282:
283: dest = mem_point(width, height, 1, bm->data);
284: CheckCursor(srcx, srcy, width, height);
285: pr_rop(dest, 0, 0, width, height, PIX_SRC | PIX_DONTCLIP, PixRect, srcx, srcy);
286: pr_destroy(dest);
287: RestoreCursor();
288: }
289: if ((pm = MakePixmap(bm, 1, 0)) == 0) {
290: FreeBitmap(bm);
291: return (NULL);
292: }
293: }
294: else if (PixRect->pr_depth <= 8) {
295: int sz = BZPixmapSize(width, height);
296:
297: if (width&1)
298: sz += height;
299: pm = (PIXMAP *) Xalloc(sizeof(PIXMAP));
300: pm->width = width;
301: pm->height = height;
302: pm->refcnt = 1;
303: pm->kind = ZColorPixmap;
304: if ((pm->data =
305: (caddr_t) malloc(sz)) == NULL) {
306: free((caddr_t) pm);
307: return (NULL);
308: }
309: {
310: struct pixrect *dest;
311:
312: dest = mem_point(width, height, PixRect->pr_depth, pm->data);
313: CheckCursor(srcx, srcy, width, height);
314: pr_rop(dest, 0, 0, width, height, PIX_SRC | PIX_DONTCLIP, PixRect, srcx, srcy);
315: pr_destroy(dest);
316: RestoreCursor();
317: }
318: }
319: return (pm);
320: }
321:
322: /*ARGSUSED*/
323: PixmapGet (srcx, srcy, width, height, client, format, swapit)
324: int srcx, srcy, width, height, client, format;
325: {
326: PIXMAP *pm;
327: BITMAP *bm;
328: pm = PixmapSave(srcx, srcy, width, height);
329: switch (pm->kind) {
330: case BitmapPixmap:{
331: int size = BitmapSize(width, height);
332:
333: bm = (BITMAP *) pm->data;
334: if (swapit)
335: Swap_shorts((short *) bm->data, size >> 1);
336: InvertPixelOrder((short *) bm->data, size >> 1);
337: Write(client, bm->data, size);
338: /* Pad amount written to 32-bit boundary - Ahem! */
339: if (size%4) {
340: Write(client, bm->data, 4 - (size%4));
341: }
342: }
343: break;
344: case ZColorPixmap:{
345: switch (format) {
346: case XYFormat:{
347: caddr_t newdata;
348: int size;
349:
350: size = XYPixmapSize(width, height, PixRect->pr_depth);
351: newdata = (caddr_t) malloc(size);
352: if (newdata) {
353: ZtoXY(width, height, PixRect->pr_depth, pm->data, newdata);
354: free(pm->data);
355: pm->data = newdata;
356: if (swapit)
357: Swap_shorts((short *) pm->data, size >> 1);
358: InvertPixelOrder((short *) pm->data, size >> 1);
359: }
360: Write(client, pm->data, size);
361: /* Pad amount written to 32-bit boundary - Ahem! */
362: if (size%4) {
363: Write(client, pm->data, 4 - (size%4));
364: }
365: }
366: break;
367: case ZFormat: {
368: int size = BZPixmapSize(width, height);
369:
370: if (width&1) {
371: register int i;
372: register char *old = pm->data;
373:
374: for (i = 0; i < height; i++) {
375: Write(client, old, width);
376: old += width + 1;
377: }
378: } else {
379: Write(client, pm->data, size);
380: }
381: /* Pad amount written to 32-bit boundary - Ahem! */
382: if (size%4) {
383: Write(client, pm->data, 4 - (size%4));
384: }
385: }
386: break;
387: }
388: break;
389: }
390: case XYColorPixmap:
391: /*NOTREACHED*/
392: break;
393: }
394: FreePixmap(pm);
395: }
396:
397: static ZtoXY(w, h, d, old, new)
398: int w, h, d;
399: caddr_t old;
400: u_char *new;
401: {
402: unsigned mask = 1;
403: struct pixrect *New, *Old;
404:
405: Old = mem_point(w, h, d, old);
406: while (d--) {
407: register int y;
408:
409: New = mem_point(w, h, 1, new);
410: new += BitmapSize(w, h);
411: for (y = 0; y < h; y++) {
412: register int x;
413:
414: for (x = 0; x < w; x++) {
415: pr_put(New, x, y, (pr_get(Old, x, y) & mask));
416: }
417: }
418: pr_destroy(New);
419: mask <<= 1;
420: }
421: }
422: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.