11573Srgrimes/*	$NetBSD: diofb_mono.c,v 1.1 2011/02/06 18:26:51 tsutsui Exp $	*/
254999Sbde/*	$OpenBSD: diofb_mono.c,v 1.3 2006/08/11 18:33:13 miod Exp $	*/
31573Srgrimes
4298107Sgjb/*
5205146Sed * Copyright (c) 2005, Miodrag Vallat.
624640Sache * All rights reserved.
7139106Sru *
81573Srgrimes * Redistribution and use in source and binary forms, with or without
9204926Sed * modification, are permitted provided that the following conditions
10201381Sed * are met:
11205146Sed * 1. Redistributions of source code must retain the above copyright
121573Srgrimes *    notice, this list of conditions and the following disclaimer.
131573Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
14210958Sed *    notice, this list of conditions and the following disclaimer in the
151573Srgrimes *    documentation and/or other materials provided with the distribution.
16210958Sed *
171573Srgrimes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
181573Srgrimes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19210958Sed * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
201573Srgrimes * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
21210958Sed * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
221573Srgrimes * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
231573Srgrimes * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
241573Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
251573Srgrimes * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
261573Srgrimes * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27205146Sed * POSSIBILITY OF SUCH DAMAGE.
2874870Sru *
291573Srgrimes */
301573Srgrimes/*-
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
117int
118diofb_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