1 /* $NetBSD: wscons_rops.c,v 1.11 2005/12/11 12:24:12 christos Exp $ */
2
3 /*
4 * Copyright (c) 1991, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * This software was developed by the Computer Systems Engineering group
8 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
9 * contributed to Berkeley.
10 *
11 * All advertising materials mentioning features or use of this software
12 * must display the following acknowledgement:
13 * This product includes software developed by the University of
14 * California, Lawrence Berkeley Laboratory.
15 *
16 * Redistribution and use in source and binary forms, with or without
17 * modification, are permitted provided that the following conditions
18 * are met:
19 * 1. Redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer.
21 * 2. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution.
24 * 3. Neither the name of the University nor the names of its contributors
25 * may be used to endorse or promote products derived from this software
26 * without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 * SUCH DAMAGE.
39 *
40 * @(#)rcons_subr.c 8.1 (Berkeley) 6/11/93
41 */
42
43 #include <sys/cdefs.h>
44 __KERNEL_RCSID(0, "$NetBSD: wscons_rops.c,v 1.11 2005/12/11 12:24:12 christos Exp $");
45
46 #include <sys/param.h>
47 #include <sys/device.h>
48
49 #include <dev/rcons/raster.h>
50 #include <dev/wscons/wscons_raster.h>
51 #include <dev/wscons/wsdisplayvar.h>
52
53 /*
54 * Paint (or unpaint) the cursor.
55 * Pays no lip service to hardware cursors.
56 */
57 void
rcons_cursor(void * id,int on,int row,int col)58 rcons_cursor(void *id, int on, int row, int col)
59 {
60 struct rcons *rc = id;
61 int x, y;
62
63 /* turn the cursor off */
64 if (!on) {
65 /* make sure it's on */
66 if ((rc->rc_bits & RC_CURSOR) == 0)
67 return;
68
69 row = *rc->rc_crowp;
70 col = *rc->rc_ccolp;
71 } else {
72 /* unpaint the old copy. */
73 *rc->rc_crowp = row;
74 *rc->rc_ccolp = col;
75 }
76
77 x = col * rc->rc_font->width + rc->rc_xorigin;
78 y = row * rc->rc_font->height + rc->rc_yorigin;
79
80 raster_op(rc->rc_sp, x, y,
81 #ifdef notdef
82 /* XXX This is the right way but too slow */
83 rc->rc_font->chars[(int)' '].r->width,
84 rc->rc_font->chars[(int)' '].r->height,
85 #else
86 rc->rc_font->width, rc->rc_font->height,
87 #endif
88 RAS_INVERT,
89 (struct raster *) 0, 0, 0);
90
91 rc->rc_bits ^= RC_CURSOR;
92 }
93
94 int
rcons_mapchar(void * id,int uni,unsigned int * index)95 rcons_mapchar(void *id, int uni, unsigned int *index)
96 {
97
98 if (uni < 128) {
99 *index = uni;
100 return (5);
101 }
102 *index = ' ';
103 return (0);
104 }
105
106 /*
107 * Actually write a string to the frame buffer.
108 */
109 void
rcons_putchar(void * id,int row,int col,u_int uc,long attr)110 rcons_putchar(void *id, int row, int col, u_int uc, long attr)
111 {
112 struct rcons *rc = id;
113 int x, y, op;
114 u_char help;
115
116 x = col * rc->rc_font->width + rc->rc_xorigin;
117 y = row * rc->rc_font->height + rc->rc_font_ascent + rc->rc_yorigin;
118
119 op = RAS_SRC;
120 if ((attr != 0) ^ ((rc->rc_bits & RC_INVERT) != 0))
121 op = RAS_NOT(op);
122 help = uc & 0xff;
123 raster_textn(rc->rc_sp, x, y, op, rc->rc_font, &help, 1);
124 }
125
126 /*
127 * Possibly change to white-on-black or black-on-white modes.
128 */
129 void
rcons_invert(void * id,int inverted)130 rcons_invert(void *id, int inverted)
131 {
132 struct rcons *rc = id;
133
134 if (((rc->rc_bits & RC_INVERT) != 0) ^ inverted) {
135 /* Invert the display */
136 raster_op(rc->rc_sp, 0, 0, rc->rc_sp->width, rc->rc_sp->height,
137 RAS_INVERT, (struct raster *) 0, 0, 0);
138
139 /* Swap things around */
140 rc->rc_bits ^= RC_INVERT;
141 }
142 }
143
144 /*
145 * Copy columns (characters) in a row (line).
146 */
147 void
rcons_copycols(void * id,int row,int srccol,int dstcol,int ncols)148 rcons_copycols(void *id, int row, int srccol, int dstcol, int ncols)
149 {
150 struct rcons *rc = id;
151 int y, srcx, dstx, nx;
152
153 y = rc->rc_yorigin + rc->rc_font->height * row;
154 srcx = rc->rc_xorigin + rc->rc_font->width * srccol;
155 dstx = rc->rc_xorigin + rc->rc_font->width * dstcol;
156 nx = rc->rc_font->width * ncols;
157
158 raster_op(rc->rc_sp, dstx, y,
159 nx, rc->rc_font->height, RAS_SRC,
160 rc->rc_sp, srcx, y);
161 }
162
163 /*
164 * Clear columns (characters) in a row (line).
165 */
166 void
rcons_erasecols(void * id,int row,int startcol,int ncols,long fillattr)167 rcons_erasecols(void *id, int row, int startcol, int ncols, long fillattr)
168 {
169 struct rcons *rc = id;
170 int y, startx, nx, op;
171
172 y = rc->rc_yorigin + rc->rc_font->height * row;
173 startx = rc->rc_xorigin + rc->rc_font->width * startcol;
174 nx = rc->rc_font->width * ncols;
175
176 op = RAS_CLEAR;
177 if ((fillattr != 0) ^ ((rc->rc_bits & RC_INVERT) != 0))
178 op = RAS_NOT(op);
179 raster_op(rc->rc_sp, startx, y,
180 nx, rc->rc_font->height, op,
181 (struct raster *) 0, 0, 0);
182 }
183
184 /*
185 * Copy rows (lines).
186 */
187 void
rcons_copyrows(void * id,int srcrow,int dstrow,int nrows)188 rcons_copyrows(void *id, int srcrow, int dstrow, int nrows)
189 {
190 struct rcons *rc = id;
191 int srcy, dsty, ny;
192
193 srcy = rc->rc_yorigin + rc->rc_font->height * srcrow;
194 dsty = rc->rc_yorigin + rc->rc_font->height * dstrow;
195 ny = rc->rc_font->height * nrows;
196
197 raster_op(rc->rc_sp, rc->rc_xorigin, dsty,
198 rc->rc_raswidth, ny, RAS_SRC,
199 rc->rc_sp, rc->rc_xorigin, srcy);
200 }
201
202 /*
203 * Erase rows (lines).
204 */
205 void
rcons_eraserows(void * id,int startrow,int nrows,long fillattr)206 rcons_eraserows(void *id, int startrow, int nrows, long fillattr)
207 {
208 struct rcons *rc = id;
209 int starty, ny, op;
210
211 starty = rc->rc_yorigin + rc->rc_font->height * startrow;
212 ny = rc->rc_font->height * nrows;
213
214 op = RAS_CLEAR;
215 if ((fillattr != 0) ^ ((rc->rc_bits & RC_INVERT) != 0))
216 op = RAS_NOT(op);
217 raster_op(rc->rc_sp, rc->rc_xorigin, starty,
218 rc->rc_raswidth, ny, op,
219 (struct raster *) 0, 0, 0);
220 }
221
222 int
rcons_allocattr(void * id,int fg,int bg,int flags,long * attrp)223 rcons_allocattr(void *id, int fg, int bg, int flags, long *attrp)
224 {
225 if (flags & (WSATTR_HILIT | WSATTR_BLINK |
226 WSATTR_UNDERLINE | WSATTR_WSCOLORS))
227 return (EINVAL);
228 if (flags & WSATTR_REVERSE)
229 *attrp = 1;
230 else
231 *attrp = 0;
232 return (0);
233 }
234