xref: /netbsd-src/sys/arch/hp300/dev/diofb_mono.c (revision 5d7f465d18072e3a63bdb323e2b87a35c86fc4fd)
1 /*	$NetBSD: diofb_mono.c,v 1.2 2011/02/12 16:40:29 tsutsui Exp $	*/
2 /*	$OpenBSD: diofb_mono.c,v 1.3 2006/08/11 18:33:13 miod Exp $	*/
3 
4 /*
5  * Copyright (c) 2005, Miodrag Vallat.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
21  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  *
29  */
30 /*-
31  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
32  * All rights reserved.
33  *
34  * This code is derived from software contributed to The NetBSD Foundation
35  * by Jason R. Thorpe.
36  *
37  * Redistribution and use in source and binary forms, with or without
38  * modification, are permitted provided that the following conditions
39  * are met:
40  * 1. Redistributions of source code must retain the above copyright
41  *    notice, this list of conditions and the following disclaimer.
42  * 2. Redistributions in binary form must reproduce the above copyright
43  *    notice, this list of conditions and the following disclaimer in the
44  *    documentation and/or other materials provided with the distribution.
45  *
46  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
47  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
48  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
49  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
50  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
51  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
52  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
53  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
54  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
55  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
56  * POSSIBILITY OF SUCH DAMAGE.
57  */
58 
59 /*
60  * Copyright (c) 1991 University of Utah.
61  * Copyright (c) 1990, 1993
62  *	The Regents of the University of California.  All rights reserved.
63  *
64  * This code is derived from software contributed to Berkeley by
65  * the Systems Programming Group of the University of Utah Computer
66  * Science Department and Mark Davies of the Department of Computer
67  * Science, Victoria University of Wellington, New Zealand.
68  *
69  * Redistribution and use in source and binary forms, with or without
70  * modification, are permitted provided that the following conditions
71  * are met:
72  * 1. Redistributions of source code must retain the above copyright
73  *    notice, this list of conditions and the following disclaimer.
74  * 2. Redistributions in binary form must reproduce the above copyright
75  *    notice, this list of conditions and the following disclaimer in the
76  *    documentation and/or other materials provided with the distribution.
77  * 3. Neither the name of the University nor the names of its contributors
78  *    may be used to endorse or promote products derived from this software
79  *    without specific prior written permission.
80  *
81  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
82  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
83  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
84  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
85  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
86  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
87  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
88  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
89  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
90  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
91  * SUCH DAMAGE.
92  *
93  * from: Utah $Hdr: grf_hy.c 1.2 93/08/13$
94  *
95  *	@(#)grf_hy.c	8.4 (Berkeley) 1/12/94
96  */
97 
98 /*
99  * Graphics routines for real 1bpp frame buffers (i.e. pixels not being
100  * byte-addressed)
101  */
102 
103 #include <sys/param.h>
104 #include <sys/systm.h>
105 #include <sys/bus.h>
106 
107 #include <dev/wscons/wsconsio.h>
108 #include <dev/wscons/wsdisplayvar.h>
109 #include <dev/rasops/rasops.h>
110 
111 #include <hp300/dev/diofbreg.h>
112 #include <hp300/dev/diofbvar.h>
113 
114 #include <dev/rasops/rasops_masks.h>
115 #include <hp300/dev/maskbits.h>
116 
117 int
diofb_mono_windowmove(struct diofb * fb,uint16_t sx,uint16_t sy,uint16_t dx,uint16_t dy,uint16_t cx,uint16_t cy,int16_t rop,int16_t planemask)118 diofb_mono_windowmove(struct diofb *fb, uint16_t sx, uint16_t sy,
119     uint16_t dx, uint16_t dy, uint16_t cx, uint16_t cy, int16_t rop,
120     int16_t planemask /* ignored */)
121 {
122 	int width;		/* add to get to same position in next line */
123 
124 	unsigned int *psrcLine, *pdstLine;
125 				/* pointers to line with current src and dst */
126 	unsigned int *psrc;	/* pointer to current src longword */
127 	unsigned int *pdst;	/* pointer to current dst longword */
128 
129 				/* following used for looping through a line */
130 	unsigned int startmask, endmask;  /* masks for writing ends of dst */
131 	int nlMiddle;		/* whole longwords in dst */
132 	int nl;			/* temp copy of nlMiddle */
133 	int xoffSrc;		/* offset (>= 0, < 32) from which to
134 				   fetch whole longwords fetched in src */
135 	int nstart;		/* number of ragged bits at start of dst */
136 	int nend;		/* number of ragged bits at end of dst */
137 	int srcStartOver;	/* pulling nstart bits from src
138 				   overflows into the next word? */
139 
140 	width = fb->fbwidth >> 5;
141 
142 	if (sy < dy) {	/* start at last scanline of rectangle */
143 		psrcLine = ((u_int *)fb->fbkva) + ((sy + cy - 1) * width);
144 		pdstLine = ((u_int *)fb->fbkva) + ((dy + cy - 1) * width);
145 		width = -width;
146 	} else {	/* start at first scanline */
147 		psrcLine = ((u_int *)fb->fbkva) + (sy * width);
148 		pdstLine = ((u_int *)fb->fbkva) + (dy * width);
149 	}
150 
151 	/* x direction doesn't matter for < 1 longword */
152 	if (cx <= 32) {
153 		int srcBit, dstBit;	/* bit offset of src and dst */
154 
155 		pdstLine += (dx >> 5);
156 		psrcLine += (sx >> 5);
157 		psrc = psrcLine;
158 		pdst = pdstLine;
159 
160 		srcBit = sx & 0x1f;
161 		dstBit = dx & 0x1f;
162 
163 		while (cy--) {
164 			getandputrop(psrc, srcBit, dstBit, cx, pdst, rop);
165 			pdst += width;
166 			psrc += width;
167 		}
168 	} else {
169 		maskbits(dx, cx, startmask, endmask, nlMiddle);
170 		if (startmask)
171 			nstart = 32 - (dx & 0x1f);
172 		else
173 			nstart = 0;
174 		if (endmask)
175 			nend = (dx + cx) & 0x1f;
176 		else
177 			nend = 0;
178 
179 		xoffSrc = ((sx & 0x1f) + nstart) & 0x1f;
180 		srcStartOver = ((sx & 0x1f) + nstart) > 31;
181 
182 		if (sx >= dx) {	/* move left to right */
183 			pdstLine += (dx >> 5);
184 			psrcLine += (sx >> 5);
185 
186 			while (cy--) {
187 				psrc = psrcLine;
188 				pdst = pdstLine;
189 
190 				if (startmask) {
191 					getandputrop(psrc, (sx & 0x1f),
192 					    (dx & 0x1f), nstart, pdst, rop);
193 					pdst++;
194 					if (srcStartOver)
195 						psrc++;
196 				}
197 
198 				/* special case for aligned operations */
199 				if (xoffSrc == 0) {
200 					nl = nlMiddle;
201 					while (nl--) {
202 						if (rop == RR_CLEAR)
203 							*pdst = 0;
204 						else
205 							*pdst = *psrc;
206 						psrc++;
207 						pdst++;
208 					}
209 				} else {
210 					nl = nlMiddle + 1;
211 					while (--nl) {
212 						if (rop == RR_CLEAR)
213 							*pdst = 0;
214 						else
215 							getunalignedword(psrc,
216 							    xoffSrc, *pdst);
217 						pdst++;
218 						psrc++;
219 					}
220 				}
221 
222 				if (endmask) {
223 					getandputrop(psrc, xoffSrc, 0, nend,
224 					    pdst, rop);
225 				}
226 
227 				pdstLine += width;
228 				psrcLine += width;
229 			}
230 		} else {	/* move right to left */
231 			pdstLine += ((dx + cx) >> 5);
232 			psrcLine += ((sx + cx) >> 5);
233 			/*
234 			 * If fetch of last partial bits from source crosses
235 			 * a longword boundary, start at the previous longword
236 			 */
237 			if (xoffSrc + nend >= 32)
238 				--psrcLine;
239 
240 			while (cy--) {
241 				psrc = psrcLine;
242 				pdst = pdstLine;
243 
244 				if (endmask) {
245 					getandputrop(psrc, xoffSrc, 0, nend,
246 					    pdst, rop);
247 				}
248 
249 				nl = nlMiddle + 1;
250 				while (--nl) {
251 					--psrc;
252 					--pdst;
253 					if (rop == RR_CLEAR)
254 						*pdst = 0;
255 					else
256 						getunalignedword(psrc, xoffSrc,
257 						    *pdst);
258 				}
259 
260 				if (startmask) {
261 					if (srcStartOver)
262 						--psrc;
263 					--pdst;
264 					getandputrop(psrc, (sx & 0x1f),
265 					    (dx & 0x1f), nstart, pdst, rop);
266 				}
267 
268 				pdstLine += width;
269 				psrcLine += width;
270 			}
271 		}
272 	}
273 
274 	return 0;
275 }
276