|
|
1.1 root 1: #ifndef lint
2: static char *rcsid_bitblt_aed_c = "$Header: bitblt_aed.c,v 10.1 86/11/19 10:50:45 jg Exp $";
3: #endif lint
4: /* aed.c - AED display dependent routines
5: *
6: * aed_echo_rect Echos rectangular areas of shared memory to AED
7: * aed_screen_copy Does screen to screen copy
8: * aed_draw_line Draws lines directly on screen
9: * UnionOfRects Finds the union of two rectangles
10: * AreaOfRect ` Computes the area of a rectangle
11: *
12: * Author:
13: * Scott Bates
14: * Brown University
15: * IRIS, Box 1946
16: * Providence, RI 02912
17: *
18: *
19: * Copyright (c) 1986 Brown University
20: *
21: * Permission to use, copy, modify and distribute this software and its
22: * documentation for any purpose and without fee is hereby granted, provided
23: * that the above copyright notice appear in all copies, and that both
24: * that copyright notice and this permission notice appear in supporting
25: * documentation, and that the name of Brown University not be used in
26: * advertising or publicity pertaining to distribution of the software
27: * without specific, written prior permission. Brown University makes no
28: * representations about the suitability of this software for any purpose.
29: * It is provided "as-is" without express or implied warranty.
30: */
31:
32: #include "bitblt_int.h"
33: #include "bitblt_aed.h"
34:
35: /*
36: * Build echo rect command and place it on
37: * on command queue
38: */
39:
40: aed_echo_rect(new_area)
41: register Blt_Rectangle *new_area;
42: {
43: register i;
44: Blt_Rectangle merge_area;
45: register struct aed_cmd *cmd_queue = &AED_CMDQ[0];
46:
47: AED_CMDQ_SEMA = 1;
48:
49: for (i = AED_CMDQ_INDEX - 1; i >= 0; i--) {
50: if (cmd_queue[i].cmd == AED_ECHO_RECT) {
51: UnionOfRects(new_area,(Blt_Rectangle *)&cmd_queue[i].ECHO_RECT,
52: &merge_area);
53: if (AreaOfRect(&merge_area) <= (AreaOfRect(new_area) +
54: AreaOfRect((Blt_Rectangle *) &cmd_queue[i].ECHO_RECT)) * 2)
55: {
56: cmd_queue[i].ECHO_RECT =
57: *((struct aed_echo_rect *) &merge_area);
58: goto reset_sema;
59: }
60: } else {
61: break;
62: }
63: }
64:
65: while (AED_CMDQ_INDEX == AED_MAX_CMDS) {
66: AED_CMDQ_SEMA = 0;
67: }
68: AED_CMDQ_SEMA = 1;
69:
70: cmd_queue[AED_CMDQ_INDEX].cmd = AED_ECHO_RECT;
71: cmd_queue[AED_CMDQ_INDEX].ECHO_RECT =
72: *((struct aed_echo_rect *) new_area);
73: AED_CMDQ_INDEX++;
74:
75: reset_sema:
76: AED_CMDQ_SEMA = 0;
77: }
78:
79: /*
80: * Build screen to screen copy command and
81: * place it on command queue
82: */
83:
84: aed_screen_copy(from_x, from_y, to_x, to_y, width, height, rule)
85: short from_x, from_y, to_x, to_y, width, height, rule;
86: {
87: register struct aed_cmd *cmd_queue = &AED_CMDQ[0];
88: register struct aed_screen_copy *cmd;
89: register i;
90:
91: if (AED_CMDQ_INDEX != 0) {
92: for (i = 0; i < AED_CMDQ_INDEX; i++) {
93: if (cmd_queue[i].cmd == AED_ECHO_RECT) {
94: while (AED_CMDQ_INDEX != 0);
95: break;
96: }
97: }
98: while (AED_CMDQ_INDEX == AED_MAX_CMDS);
99: }
100:
101: AED_CMDQ_SEMA = 1;
102:
103: cmd_queue[AED_CMDQ_INDEX].cmd = AED_SCREEN_COPY;
104: cmd = &cmd_queue[AED_CMDQ_INDEX].SCREEN_COPY;
105: cmd->from_x = from_x;
106: cmd->from_y = from_y;
107: cmd->to_x = to_x;
108: cmd->to_y = to_y;
109: cmd->width = width;
110: cmd->height = height;
111: cmd->rule = AED_RULE(rule);
112: AED_CMDQ_INDEX++;
113:
114: AED_CMDQ_SEMA = 0;
115: }
116:
117: /*
118: * Build command to draw a line and place
119: * it on command queue
120: */
121:
122: aed_draw_line(from_x, from_y, to_x, to_y, rule, width, color, pat, patlen, clip)
123: short from_x, from_y, to_x, to_y;
124: short rule, width, color;
125: u_short pat;
126: register short patlen;
127: Blt_Rectangle *clip;
128: {
129: register struct aed_cmd *cmd_queue = &AED_CMDQ[0];
130: register struct aed_draw_line *cmd;
131: register u_short aed_pattern;
132: register i;
133:
134: if(patlen > 0 && patlen < 16) {
135:
136: /*
137: * pattern must be left justified for AED microcode
138: */
139:
140: aed_pattern = (pat <<= (16 - patlen));
141:
142: /*
143: * make all patterns 16 bits long.
144: * This is to get around microcode bug
145: * (bug happens when pattern length < 16)
146: */
147:
148: for(i = patlen; i < 16; i += patlen)
149: pat |= (aed_pattern >> i);
150: patlen = 16;
151: }
152:
153: if (AED_CMDQ_INDEX != 0) {
154: for (i = 0; i < AED_CMDQ_INDEX; i++) {
155: if (cmd_queue[i].cmd == AED_ECHO_RECT) {
156: while (AED_CMDQ_INDEX != 0);
157: break;
158: }
159: }
160: while (AED_CMDQ_INDEX == AED_MAX_CMDS);
161: }
162:
163: AED_CMDQ_SEMA = 1;
164:
165: cmd_queue[AED_CMDQ_INDEX].cmd = AED_DRAW_LINE;
166: cmd = &cmd_queue[AED_CMDQ_INDEX].DRAW_LINE;
167: cmd->from_x = from_x;
168: cmd->from_y = from_y;
169: cmd->to_x = to_x;
170: cmd->to_y = to_y;
171: cmd->rule = AED_RULE(rule);
172: cmd->width = width;
173: cmd->color = color;
174: cmd->pat = pat;
175: cmd->patlen = patlen;
176: cmd->top = clip->origin_y;
177: cmd->left = clip->origin_x;
178: cmd->bottom = clip->corner_y - 1;
179: cmd->right = clip->corner_x - 1;
180: AED_CMDQ_INDEX++;
181:
182: AED_CMDQ_SEMA = 0;
183: }
184:
185: /*
186: * Find union to two rectangles
187: */
188:
189: static
190: UnionOfRects(rectA,rectB,dstrect)
191: register Blt_Rectangle *rectA, *rectB, *dstrect;
192: {
193: if (rectA->origin_y >= rectA->corner_y ||
194: rectA->origin_x >= rectA->corner_x)
195: *dstrect = *rectB;
196: else if (rectB->origin_y >= rectB->corner_y ||
197: rectB->origin_x >= rectB->corner_x)
198: *dstrect = *rectA;
199: else {
200: dstrect->origin_y = MIN(rectA->origin_y, rectB->origin_y);
201: dstrect->corner_y = MAX(rectA->corner_y, rectB->corner_y);
202: dstrect->origin_x = MIN(rectA->origin_x, rectB->origin_x);
203: dstrect->corner_x = MAX(rectA->corner_x, rectB->corner_x);
204: }
205: }
206:
207: /*
208: * Compute area of a rectangle
209: */
210:
211: static
212: AreaOfRect(r)
213: register Blt_Rectangle *r;
214: {
215: return ((r->corner_x - r->origin_x) * (r->corner_y - r->origin_y));
216: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.