|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_bitpix_c = "$Header: bitpix.c,v 10.1 86/11/19 10:40:11 jg Exp $";
3: #endif lint
4: /* Copyright 1985 Massachusetts Institute of Technology */
5:
6: /* bitpix.c - Routines to cache bitmaps and pixmaps
7: *
8: * StoreBitmap Creates a bitmap
9: * FreeBitmap Frees the storage taken by a bitmap
10: * CharBitmap Creates a bitmap from a font character
11: * StorePixmap Creates a pixmap
12: * FreePixmap Frees the storage taken by a pixmap
13: * MakePixmap Create a pixmap from a bitmap
14: * PixmapSave Save a region of the screen
15: * PixmapGet Read a region of the screen
16: *
17: * Changes and additions by:
18: *
19: * Scott Bates
20: * Brown University
21: * IRIS, Box 1946
22: * Providence, RI 02912
23: *
24: *
25: * Copyright (c) 1986 Brown University
26: *
27: * Permission to use, copy, modify and distribute this software and its
28: * documentation for any purpose and without fee is hereby granted, provided
29: * that the above copyright notice appear in all copies, and that both
30: * that copyright notice and this permission notice appear in supporting
31: * documentation, and that the name of Brown University not be used in
32: * advertising or publicity pertaining to distribution of the software
33: * without specific, written prior permission. Brown University makes no
34: * representations about the suitability of this software for any purpose.
35: * It is provided "as-is" without express or implied warranty.
36: */
37:
38: #include "private.h"
39: #include "bitblt.h"
40:
41: /*
42: * Create bitmap from client supplied data
43: */
44:
45: BITMAP *StoreBitmap (width, height, data)
46: register width, height;
47: char *data;
48: {
49: register BITMAP *bm;
50: register size = BitmapSize(width, height);
51:
52: #ifdef TRACE_X
53: fprintf(stderr, "In StoreBitmap\n");
54: fflush(stderr);
55: #endif TRACE_X
56:
57: /*
58: * Allocate space for bitmap structure
59: */
60:
61: bm = (BITMAP *) Xalloc (sizeof (BITMAP));
62:
63: /*
64: * Fill in bitmap structure
65: */
66:
67: bm->width = width;
68: bm->height = height;
69: bm->refcnt = 1;
70:
71: /*
72: * Allocated space to hold bitimage data
73: */
74:
75: if ((bm->data = (caddr_t) malloc (size)) == NULL) {
76: free ((caddr_t) bm);
77: return (NULL);
78: }
79:
80: /*
81: * Copy image data to newly allocated area and reverse bits
82: * in each short of the image. The image data is in vax
83: * bit order and must be reversed for this hardware.
84: */
85:
86: bcopy (data, bm->data, size);
87: ReverseShortBits((u_short *) bm->data, size >> 1);
88:
89: /*
90: * Return pointer to bitmap
91: */
92:
93: return (bm);
94: }
95:
96: /*
97: * Free bitmap structure and bit image data
98: */
99:
100: FreeBitmap (bitmap)
101: register BITMAP *bitmap;
102: {
103:
104: #ifdef TRACE_X
105: fprintf(stderr, "In FreeBitmap\n");
106: fflush(stderr);
107: #endif TRACE_X
108:
109: free ((caddr_t) bitmap->data);
110: free ((caddr_t) bitmap);
111: }
112:
113: /*
114: * Create character bitmap from font character
115: */
116:
117: BITMAP *CharBitmap (c, font)
118: u_char c;
119: register FONT *font;
120: {
121: register width;
122: register size;
123: register BITMAP *bm;
124:
125: #ifdef TRACE_X
126: fprintf(stderr, "In CharBitmap\n");
127: fflush(stderr);
128: #endif TRACE_X
129:
130: /*
131: * Test for valid character
132: */
133:
134: if (c < font->first || c > font->last) {
135: errno = EINVAL;
136: return (NULL);
137: }
138:
139: /*
140: * Determine width of character
141: */
142:
143: if (font->fixed)
144: width = font->avg_width;
145: else
146: width = FDATA(font)->widths[c];
147:
148: /*
149: * Validate width
150: */
151:
152: if (width == 0) {
153: errno = EINVAL;
154: return (NULL);
155: }
156:
157: /*
158: * Allocate space for bitmap structure
159: */
160:
161: bm = (BITMAP *) Xalloc (sizeof (BITMAP));
162:
163: /*
164: * Fill in bitmap structure
165: */
166:
167: bm->width = width;
168: bm->height = font->height;
169: bm->refcnt = 1;
170:
171: /*
172: * Allocate space to hold bit image of character
173: */
174:
175: size = BitmapSize(width, bm->height);
176: if ((bm->data = (caddr_t) malloc (size)) == NULL) {
177: free ((caddr_t) bm);
178: errno = ENOMEM;
179: return (NULL);
180: }
181:
182: /*
183: * Copy bit image of character to newly allocated area
184: * and return pointer to character bitmap
185: */
186:
187: CopyText ((caddr_t) &c, 1, font, bm);
188: return (bm);
189: }
190:
191: /*
192: * Create pixmap from client supplied data
193: */
194:
195: /*ARGSUSED*/
196: PIXMAP *StorePixmap (width, height, format, data)
197: int width, height, format;
198: char *data;
199: {
200: register BITMAP *bm;
201: register PIXMAP *pm;
202:
203: #ifdef TRACE_X
204: fprintf(stderr, "In StorePixmap\n");
205: fflush(stderr);
206: #endif TRACE_X
207:
208: /*
209: * Create bitmap from the bit image data supplied.
210: */
211:
212: if ((bm = StoreBitmap (width, height, data)) == NULL) {
213: return (NULL);
214: }
215:
216: /*
217: * Reset reference count so bitmap will be deallocated
218: * correctly by FreePixmap
219: */
220:
221: bm->refcnt = 0;
222:
223: /*
224: * Make pixmap from bitmap
225: */
226:
227: if (pm = MakePixmap (bm, 1, 0))
228: return (pm);
229:
230: /*
231: * If unable to make pixmap free the bitmap
232: */
233:
234: FreeBitmap (bm);
235: return (NULL);
236: }
237:
238: /*
239: * Free pixmap resources
240: */
241:
242: FreePixmap (pm)
243: register PIXMAP *pm;
244: {
245: register BITMAP *bm;
246:
247: #ifdef TRACE_X
248: fprintf(stderr, "In FreePixmap\n");
249: fflush(stderr);
250: #endif TRACE_X
251:
252: /*
253: * If a bitmap is associated with this pixmap and its
254: * reference count is equal to zero free it. Otherwise
255: * decrement its reference count and return.
256: */
257:
258: if (pm->kind & BitmapPixmap) {
259: bm = PDATA(pm);
260: if (--bm->refcnt == 0)
261: FreeBitmap (bm);
262: }
263:
264: /*
265: * Free pixmap structure
266: */
267:
268: free ((caddr_t) pm);
269: }
270:
271: /*
272: * Make a pixmap from a bitmap
273: */
274:
275: PIXMAP *MakePixmap (xymask, fore, back)
276: register BITMAP *xymask;
277: register fore, back;
278: {
279: register PIXMAP *pm;
280:
281: #ifdef TRACE_X
282: fprintf(stderr, "In MakePixmap\n");
283: fflush(stderr);
284: #endif TRACE_X
285:
286: /*
287: * If no bitmap was supplied or the foreground and
288: * background colors are the same then pixmap is
289: * a constant pixmap (either all white or all black)
290: */
291:
292: if (xymask == NULL || !((fore ^ back) & 1)) {
293: if (fore & 1)
294: pm = &constpix1;
295: else
296: pm = &constpix0;
297: pm->refcnt++;
298: return (pm);
299: }
300:
301: /*
302: * Allocate space for pixmap structure
303: */
304:
305: pm = (PIXMAP *) Xalloc (sizeof (PIXMAP));
306:
307: /*
308: * Fill in pixmap structure. Indicate that a bitmap is
309: * associated with this pixmap (BitmapPixmap).
310: */
311:
312: pm->width = xymask->width;
313: pm->height = xymask->height;
314: pm->refcnt = 1;
315: pm->kind = BitmapPixmap;
316: pm->data = (caddr_t) xymask;
317:
318: /*
319: * Increment reference count of bitmap
320: */
321:
322: xymask->refcnt++;
323:
324: /*
325: * Indicate if pixmap can be used as a tile
326: */
327:
328: if (xymask->width == TILE_WIDTH && xymask->height == TILE_HEIGHT) {
329: pm->tile = CanBeTiled;
330: } else {
331: pm->tile = CannotBeTiled;
332: }
333:
334: /*
335: * Indicate if bit image needs to be inverted when displayed
336: */
337:
338: if (back & 1)
339: pm->kind |= InvertFlag;
340:
341: /*
342: * Return pointer to pixmap
343: */
344:
345: return (pm);
346: }
347:
348: /*
349: * Save rectangular screen image
350: */
351:
352: PIXMAP *PixmapSave (srcx, srcy, width, height)
353: register srcx, srcy, width, height;
354: {
355: register Blt_Rectangle *source = &SrcRect;
356: register Blt_Rectangle *dest = &DstRect;
357: register BITMAP *bm;
358: PIXMAP *pm;
359:
360: #ifdef TRACE_X
361: fprintf(stderr, "In PixmapSave\n");
362: fflush(stderr);
363: #endif TRACE_X
364:
365: /*
366: * Allocate space for bitmap structure
367: */
368:
369: bm = (BITMAP *) Xalloc (sizeof (BITMAP));
370:
371:
372: /*
373: * Fill in bitmap structure
374: */
375:
376: bm->width = width;
377: bm->height = height;
378: bm->refcnt = 0;
379:
380: /*
381: * Allocate space to hold screen image
382: */
383:
384: if ((bm->data =
385: (caddr_t) malloc (BitmapSize(width, height))) == NULL) {
386: free ((caddr_t) bm);
387: return (NULL);
388: }
389:
390: /*
391: * Fill in source and destination rectangles
392: */
393:
394: FillInRect(srcx, srcy, width, height, source);
395: FillInRect(0, 0, width, height, dest);
396:
397: /*
398: * Copy screen image to allocated area
399: */
400:
401: CopyBits ((u_short *) pbm.data, pbm.width, pbm.height, source,
402: (u_short *) bm->data, width, height, dest,
403: NILMASK, NIL, NIL, GXcopy, NIL, NILCLIP);
404:
405: /*
406: * Make pixmap from bitmap and return pointer to pixmap
407: */
408:
409: if (pm = MakePixmap (bm, 1, 0))
410: return (pm);
411:
412: /*
413: * If unable to make pixmap free bitmap
414: */
415:
416: FreeBitmap (bm);
417: return (NULL);
418: }
419:
420: /*
421: * Pass rectangular screen image to client
422: */
423:
424: /*ARGSUSED*/
425: PixmapGet (srcx, srcy, width, height, client, format, swapit)
426: int srcx, srcy, width, height, client, format;
427: {
428: register PIXMAP *pm;
429: register BITMAP *bm;
430: register size = BitmapSize(width, height);
431:
432: #ifdef TRACE_X
433: fprintf(stderr, "In PixmapGet\n");
434: fflush(stderr);
435: #endif TRACE_X
436:
437: /*
438: * Save screen image
439: */
440:
441: pm = PixmapSave (srcx, srcy, width, height);
442:
443: /*
444: * Reverse the bits in each short of the image. The image
445: * is in IBM bit order and needs to be in VAX bit order when
446: * given to clients.
447: */
448:
449: bm = (BITMAP *) pm->data;
450: ReverseShortBits((u_short *) bm->data, size >> 1);
451:
452: /*
453: * Swap shorts of image if required by client
454: */
455:
456: if (swapit)
457: Swap_shorts ((short *) bm->data, size >> 1 );
458:
459: /*
460: * Write screen image to client. Image size must be padded
461: * to 32 bit boundary.
462: */
463:
464: Write (client, bm->data, size);
465: if (size % 4) {
466: Write(client, bm->data, 4 - (size % 4));
467: }
468:
469: /*
470: * Free pixmap and return
471: */
472:
473: FreePixmap(pm);
474: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.