|
|
1.1 root 1: /***********************************************************
2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
4:
5: All Rights Reserved
6:
7: Permission to use, copy, modify, and distribute this software and its
8: documentation for any purpose and without fee is hereby granted,
9: provided that the above copyright notice appear in all copies and that
10: both that copyright notice and this permission notice appear in
11: supporting documentation, and that the names of Digital or MIT not be
12: used in advertising or publicity pertaining to distribution of the
13: software without specific, written prior permission.
14:
15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
21: SOFTWARE.
22:
23: ******************************************************************/
24: /* $Header: mfbhrzvert.c,v 1.8 87/09/11 07:48:42 toddb Exp $ */
25: #include "X.h"
26:
27: #include "gc.h"
28: #include "window.h"
29: #include "pixmap.h"
30: #include "region.h"
31:
32: #include "mfb.h"
33: #include "maskbits.h"
34:
35: /* horizontal solid line
36: abs(len) > 1
37: */
38: mfbHorzS(rop, addrl, nlwidth, x1, y1, len)
39: int rop; /* a reduced rasterop */
40: register int *addrl; /* pointer to base of bitmap */
41: register int nlwidth; /* width in longwords of bitmap */
42: int x1; /* initial point */
43: int y1;
44: int len; /* length of line */
45: {
46: register int startmask;
47: register int endmask;
48: register int nlmiddle;
49:
50:
51: /* force the line to go left to right
52: but don't draw the last point
53: */
54: if (len < 0)
55: {
56: x1 += len;
57: x1 += 1;
58: len = -len;
59: }
60:
61: addrl = addrl + (y1 * nlwidth) + (x1 >> 5);
62:
63: /* all bits inside same longword */
64: if ( ((x1 & 0x1f) + len) < 32)
65: {
66: maskpartialbits(x1, len, startmask);
67: if (rop == RROP_BLACK)
68: {
69: *addrl &= ~startmask;
70: }
71: else if (rop == RROP_WHITE)
72: {
73: *addrl |= startmask;
74: }
75: else if (rop == RROP_INVERT)
76: {
77: *addrl ^= startmask;
78: }
79: }
80: else
81: {
82: maskbits(x1, len, startmask, endmask, nlmiddle);
83: if (rop == RROP_BLACK)
84: {
85: if (startmask)
86: *addrl++ &= ~startmask;
87: while (nlmiddle--)
88: *addrl++ = 0x0;
89: if (endmask)
90: *addrl &= ~endmask;
91: }
92: else if (rop == RROP_WHITE)
93: {
94: if (startmask)
95: *addrl++ |= startmask;
96: while (nlmiddle--)
97: *addrl++ = 0xffffffff;
98: if (endmask)
99: *addrl |= endmask;
100: }
101: else if (rop == RROP_INVERT)
102: {
103: if (startmask)
104: *addrl++ ^= startmask;
105: while (nlmiddle--)
106: *addrl++ ^= 0xffffffff;
107: if (endmask)
108: *addrl ^= endmask;
109: }
110: }
111: }
112:
113: /* vertical solid line
114: this uses do loops because pcc (Ultrix 1.2, bsd 4.2) generates
115: better code. sigh. we know that len will never be 0 or 1, so
116: it's OK to use it.
117: */
118:
119: mfbVertS(rop, addrl, nlwidth, x1, y1, len)
120: int rop; /* a reduced rasterop */
121: register int *addrl; /* pointer to base of bitmap */
122: register int nlwidth; /* width in longwords of bitmap */
123: int x1, y1; /* initial point */
124: register int len; /* length of line */
125: {
126: register int bitmask;
127:
128: addrl = addrl + (y1 * nlwidth) + (x1 >> 5);
129:
130: if (len < 0)
131: {
132: nlwidth = -nlwidth;
133: len = -len;
134: }
135:
136: if (rop == RROP_BLACK)
137: {
138: bitmask = rmask[x1&0x1f];
139: do
140: {
141: *addrl &= bitmask;
142: addrl += nlwidth;
143: }
144: while (--len);
145: }
146: else if (rop == RROP_WHITE)
147: {
148: bitmask = mask[x1&0x1f];
149: do
150: {
151: *addrl |= bitmask;
152: addrl += nlwidth;
153: }
154: while (--len);
155: }
156: else if (rop == RROP_INVERT)
157: {
158: bitmask = mask[x1&0x1f];
159: do
160: {
161: *addrl ^= bitmask;
162: addrl += nlwidth;
163: }
164: while (--len);
165: }
166: }
167:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.