|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_copybits_c = "$Header: copybits.c,v 10.1 86/11/19 10:40:50 jg Exp $";
3: #endif lint
4: /* copybits.c - Interface routine to bitblt()
5: *
6: * CopyBits Places "X" supplied data into blt structure before
7: * calling bitblt() ounce for each clipping rectangle
8: * in the cliplist.
9: *
10: * Author:
11: * Scott Bates
12: * Brown University
13: * IRIS, Box 1946
14: * Providence, RI 02912
15: *
16: *
17: * Copyright (c) 1986 Brown University
18: *
19: * Permission to use, copy, modify and distribute this software and its
20: * documentation for any purpose and without fee is hereby granted, provided
21: * that the above copyright notice appear in all copies, and that both
22: * that copyright notice and this permission notice appear in supporting
23: * documentation, and that the name of Brown University not be used in
24: * advertising or publicity pertaining to distribution of the software
25: * without specific, written prior permission. Brown University makes no
26: * representations about the suitability of this software for any purpose.
27: * It is provided "as-is" without express or implied warranty.
28: */
29:
30: #include "private.h"
31: #include "bitblt.h"
32:
33: /*
34: * General interface routine to bitblt()
35: */
36:
37: CopyBits (srcbits, srcwidth, srcheight, srcrect, dstbits, dstwidth,
38: dstheight, dstrect, maskbits, maskwidth, maskheight, rule,
39: clipcount, cliplist)
40: u_short *srcbits, *dstbits, *maskbits;
41: register Blt_Rectangle *srcrect, *dstrect;
42: int srcwidth, srcheight, dstwidth;
43: int maskwidth, maskheight;
44: int dstheight, rule;
45: register clipcount;
46: register CLIP *cliplist;
47: {
48: register Blt *blt = &bltdata;
49: register Blt_Bitmap *dstbitmap = &blt->dst_bitmap;
50: register Blt_Rectangle *cliprect = &blt->clp_rect;
51:
52: #ifdef FULL_TRACE_X
53: fprintf(stderr, "In CopyBits\n");
54: fflush(stderr);
55: #endif FULL_TRACE_X
56:
57: /*
58: * Clear blt structure
59: */
60:
61: bzero((char *) blt, sizeof(Blt));
62:
63: #ifdef AED
64: /*
65: * If this is the AED make sure this blt
66: * gets echoed
67: */
68:
69: blt->blt_flags |= BLT_ECHO;
70: #endif AED
71:
72: /*
73: * Set up source bitmap or tile
74: */
75:
76: if(IS_RULE_TILE(rule)) {
77: /*
78: * Srcbits is a tile
79: */
80:
81: blt->tile_ptr = (Blt_Tile *)srcbits;
82: } else {
83: register Blt_Bitmap *srcbitmap = &blt->src_bitmap;
84:
85: /*
86: * Srcbits is a bitimage. Convert bitimage to bitmap
87: */
88:
89: BitimageToBitmap(srcbits, 0, 0, srcwidth, srcheight, srcbitmap);
90:
91: /*
92: * Copy source rectangle to blt structure
93: */
94:
95: blt->src_rect = *srcrect;
96: }
97:
98: /*
99: * Convert destination bitimage to a bitmap
100: */
101:
102: BitimageToBitmap(dstbits, 0, 0, dstwidth, dstheight, dstbitmap);
103:
104: /*
105: * Copy destination rectangle to blt structure
106: */
107:
108: blt->dst_rect = *dstrect;
109:
110: /*
111: * Set combination rule in blt structure
112: */
113:
114: blt->comb_rule = rule;
115:
116: /*
117: * Is there a clipping mask ?
118: */
119:
120: if(maskbits) {
121: register Blt_Bitmap *mskbitmap = &blt->msk_bitmap;
122:
123: /*
124: * Indicate that there is a mask
125: */
126:
127: blt->blt_flags |= BLT_MASKON;
128:
129: /*
130: * Convert mask bitimage to bitmap
131: *
132: * NOTE: The clipping mask has the same origin
133: * as the destination rectangle but can
134: * be larger in width and height.
135: */
136:
137: BitimageToBitmap(maskbits, dstrect->origin_x, dstrect->origin_y, maskwidth, maskheight, mskbitmap);
138: }
139:
140: /*
141: * No X clips specified ?
142: */
143:
144: if(clipcount == 0) {
145: /*
146: * Turn clipping off during this blt
147: */
148:
149: blt->blt_flags &= ~BLT_CLIPON;
150:
151: /*
152: * No X clips so blt and run
153: */
154:
155: bitblt(blt);
156: return;
157: }
158:
159:
160: /*
161: * Perform same blt for each X clip
162: */
163:
164: for (;;) {
165:
166: /*
167: * Convert X clip to clipping rectangle
168: */
169:
170: ClipToRect(cliplist, cliprect);
171:
172: /*
173: * If destination lies inside of clipping rectangle
174: * turn off clipping flag during this blt otherwise
175: * turn it on.
176: */
177:
178: if(InsideBounds(dstrect, cliprect)) {
179: blt->blt_flags &= ~BLT_CLIPON;
180: } else {
181: blt->blt_flags |= BLT_CLIPON;
182: }
183:
184: /*
185: * Lets go do the blt
186: */
187:
188: bitblt(blt);
189:
190: /*
191: * Need to blt again ?
192: */
193:
194: if (--clipcount <= 0) {
195: /*
196: * No more clips so lets leave
197: */
198:
199: break;
200: }
201:
202: /*
203: * point to next X clip
204: */
205:
206: cliplist++;
207: }
208: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.