|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_prim_c = "$Header: prim.c,v 10.1 86/11/29 13:52:30 jg Rel $";
3: #endif lint
4: /*
5:
6: Copyright 1986 by the University of Utah
7:
8: Permission to use, copy, modify, and distribute this
9: software and its documentation for any purpose and without
10: fee is hereby granted, provided that the above copyright
11: notice appear in all copies and that both that copyright
12: notice and this permission notice appear in supporting
13: documentation, and that the name of the University of Utah
14: not be used in advertising or publicity pertaining to
15: distribution of the software without specific, written
16: prior permission. The University of Utah makes no
17: representations about the suitability of this software for
18: any purpose. It is provided "as is" without express or
19: implied warranty.
20:
21: */
22:
23: #include "Xapollo.h"
24: #include "/sys/ins/smdu.ins.c"
25:
26: extern boolean borrow_flag;
27: extern gpr_$plane_t plane;
28: extern int old_op;
29: status_$t status;
30:
31: BITMAP *
32: make_bitmap( area, width, height, invert )
33: short * area; /* the bits of the image or NULL */
34: int width;
35: int height;
36: boolean invert; /* true->the image bits need to inverted */
37: {
38:
39: BITMAP * bm;
40: gpr_$bitmap_desc_t bitmap;
41: static gpr_$attribute_desc_t attr;
42: gpr_$offset_t size;
43:
44: short * pointer; /* pointer to Apollo bitmap */
45: short bwid; /* Apollo bitmap line width */
46: int rowwid; /* image bits row width */
47: int i;
48:
49: if( (bm = (BITMAP *)Xalloc(sizeof(BITMAP))) == NULL )
50: return( NULL );
51:
52: bm->refcnt = 1;
53: bm->kind = (int)apollo_bitmap;
54:
55: size.x_size = bm->width = width;
56: size.y_size = bm->height = height;
57:
58: gpr_$allocate_attribute_block( attr, status );
59: if (check_status(status, "make_bitmap:"))
60: return( NULL );
61: gpr_$allocate_bitmap_nc( size, (gpr_$plane_t)(Screen.depth-1), attr, bitmap, status );
62: if (check_status(status, "make_bitmap:"))
63: return( NULL );
64:
65: bm->data = (caddr_t)bitmap;
66: if (!(area == NULL)) {
67: gpr_$inq_bitmap_pointer( bitmap, pointer, bwid, status );
68: rowwid = ((width+15)>>4);
69: for( i=0; i<height; i++ ) {
70: bcopy( area, pointer, rowwid*2 );
71: if (invert)
72: InvertPixelOrder((short *) pointer, rowwid);
73: pointer += bwid;
74: area += rowwid;
75: }
76: }
77: return( bm );
78: }
79:
80: FONT *
81: make_fontmap( fd )
82: FONT *fd;
83: {
84:
85: int width;
86: int height;
87: BITMAP * bm;
88: gpr_$bitmap_desc_t bitmap;
89: static gpr_$attribute_desc_t attr = -1;
90: gpr_$window_t window;
91: gpr_$position_t dest;
92: static int got_attr = 0;
93: gpr_$offset_t size;
94: FontPriv *fpriv;
95:
96: short col, row;
97: short left, oldleft, wid, oldwid;
98: int start, stop;
99:
100: int i;
101:
102: fpriv = (FontPriv *)fd->data;
103: bm = fpriv->strike;
104: width = fd->last * fd->avg_width;
105: height = (width / 224) + 1;
106: height = height * fd->height;
107: /* should check for height > 224 */
108: size.x_size = 224;
109: size.y_size = height;
110:
111: if( !got_attr )
112: {
113: gpr_$allocate_attribute_block( attr, status );
114: if (check_status( status, "make_fontmap:"))
115: return( NULL );
116: got_attr = 1;
117: }
118: gpr_$allocate_bitmap( size, (gpr_$plane_t)0, attr, bitmap, status );
119: if (check_status( status, "make_fontmap:"))
120: return( NULL );
121:
122: row = start = 0;
123: gpr_$set_bitmap( bitmap, status);
124: for (i=0; i<=fd->last; i++) {
125: left = fpriv->leftarray[i];
126: wid = fpriv->widths[i];
127: if ((left + wid) > (start + 224)) {
128: stop = oldleft + oldwid;
129: window.x_coord = start;
130: window.y_coord = 0;
131: window.x_size = stop - start;
132: window.y_size = fd->height;
133: dest.x_coord = 0;
134: dest.y_coord = row * fd->height;
135: gpr_$bit_blt(bm->data, window, (short)0, dest, (short)0, status);
136: start = stop;
137: row++;
138: col = 0;
139: }
140: oldleft = left;
141: oldwid = wid;
142: fpriv->leftarray[i] = col + (row << 10);
143: col += fpriv->widths[i];
144: }
145: if (start != (oldleft + oldwid)) {
146: window.x_coord = start;
147: window.x_size = (left + wid) - start;
148: window.y_size = fd->height;
149: dest.y_coord = row * fd->height;
150: gpr_$bit_blt(bm->data, window, (short)0, dest, (short)0, status);
151: }
152: bm->width = 224;
153: bm->height = height;
154: bm->refcnt = 1;
155: bm->kind = (int)apollo_bitmap;
156:
157: bm->data = (caddr_t)bitmap;
158: gpr_$set_bitmap( Screen.bm, status);
159: return( fd );
160:
161: }
162:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.