rasops8.c revision 1.2 1 1.2 ad /* $NetBSD: rasops8.c,v 1.2 1999/04/13 00:40:09 ad Exp $ */
2 1.1 ad
3 1.2 ad /*
4 1.2 ad * Copyright (c) 1999 Andy Doran <ad (at) NetBSD.org>
5 1.1 ad * All rights reserved.
6 1.1 ad *
7 1.1 ad * Redistribution and use in source and binary forms, with or without
8 1.1 ad * modification, are permitted provided that the following conditions
9 1.1 ad * are met:
10 1.1 ad * 1. Redistributions of source code must retain the above copyright
11 1.1 ad * notice, this list of conditions and the following disclaimer.
12 1.1 ad * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 ad * notice, this list of conditions and the following disclaimer in the
14 1.1 ad * documentation and/or other materials provided with the distribution.
15 1.1 ad *
16 1.2 ad * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 1.2 ad * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 1.2 ad * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 1.2 ad * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 1.2 ad * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 1.2 ad * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 1.2 ad * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 1.2 ad * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 1.2 ad * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 1.2 ad * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 1.2 ad * SUCH DAMAGE.
27 1.2 ad *
28 1.1 ad */
29 1.2 ad
30 1.1 ad #include "opt_rasops.h"
31 1.1 ad #ifdef RASOPS8
32 1.1 ad
33 1.1 ad #include <sys/cdefs.h>
34 1.2 ad __KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.2 1999/04/13 00:40:09 ad Exp $");
35 1.1 ad
36 1.1 ad #include <sys/types.h>
37 1.1 ad #include <sys/param.h>
38 1.1 ad #include <sys/systm.h>
39 1.1 ad #include <sys/time.h>
40 1.1 ad
41 1.1 ad #include <dev/wscons/wsdisplayvar.h>
42 1.1 ad #include <dev/wscons/wsconsio.h>
43 1.1 ad #include <dev/rasops/rasops.h>
44 1.1 ad
45 1.1 ad static void rasops8_putchar __P((void *, int, int, u_int, long attr));
46 1.1 ad static void rasops8_putchar8 __P((void *, int, int, u_int, long attr));
47 1.1 ad static void rasops8_putchar12 __P((void *, int, int, u_int, long attr));
48 1.1 ad static void rasops8_putchar16 __P((void *, int, int, u_int, long attr));
49 1.1 ad static void rasops8_erasecols __P((void *, int, int, int, long));
50 1.1 ad static void rasops8_eraserows __P((void *, int, int, long));
51 1.1 ad static void rasops8_makestamp __P((long));
52 1.1 ad static int32_t rasops8_bg_color __P((long));
53 1.1 ad static void rasops8_do_cursor __P((struct rasops_info *));
54 1.1 ad void rasops8_init __P((struct rasops_info *ri));
55 1.1 ad
56 1.1 ad /*
57 1.1 ad * 4x1 stamp for optimized character blitting
58 1.1 ad */
59 1.1 ad static int32_t stamp[16];
60 1.1 ad static long stamp_attr;
61 1.1 ad static int stamp_mutex; /* XXX see note in README */
62 1.1 ad
63 1.1 ad /*
64 1.1 ad * XXX this confuses the hell out of gcc2 (not egcs) which always insists
65 1.1 ad * that the shift count is negative.
66 1.1 ad *
67 1.1 ad * offset = STAMP_SHIFT(fontbits, nibble #) & STAMP_MASK
68 1.1 ad * destination = STAMP_READ(offset)
69 1.1 ad */
70 1.1 ad #define STAMP_SHIFT(fb,n) ((n*4-2) >= 0 ? (fb)>>(n*4-2):(fb)<<-(n*4-2))
71 1.1 ad #define STAMP_MASK (15 << 2)
72 1.1 ad #define STAMP_READ(o) (*(int32_t *)((caddr_t)stamp + (o)))
73 1.1 ad
74 1.1 ad
75 1.1 ad /*
76 1.1 ad * Initalize a 'rasops_info' descriptor for this depth.
77 1.1 ad */
78 1.1 ad void
79 1.1 ad rasops8_init(ri)
80 1.1 ad struct rasops_info *ri;
81 1.1 ad {
82 1.1 ad
83 1.1 ad switch (ri->ri_font->fontwidth) {
84 1.1 ad case 8:
85 1.1 ad ri->ri_ops.putchar = rasops8_putchar8;
86 1.1 ad break;
87 1.1 ad
88 1.1 ad case 12:
89 1.1 ad ri->ri_ops.putchar = rasops8_putchar12;
90 1.1 ad break;
91 1.1 ad
92 1.1 ad case 16:
93 1.1 ad ri->ri_ops.putchar = rasops8_putchar16;
94 1.1 ad break;
95 1.1 ad
96 1.1 ad default:
97 1.1 ad ri->ri_ops.putchar = rasops8_putchar;
98 1.1 ad break;
99 1.1 ad }
100 1.1 ad
101 1.1 ad ri->ri_ops.erasecols = rasops8_erasecols;
102 1.1 ad ri->ri_ops.eraserows = rasops8_eraserows;
103 1.1 ad ri->ri_do_cursor = rasops8_do_cursor;
104 1.1 ad }
105 1.1 ad
106 1.1 ad
107 1.1 ad /*
108 1.1 ad * Get background color from attribute and copy across all 4 bytes
109 1.1 ad * of an int32_t.
110 1.1 ad */
111 1.1 ad static __inline__ int32_t
112 1.1 ad rasops8_bg_color(attr)
113 1.1 ad long attr;
114 1.1 ad {
115 1.1 ad int32_t bg;
116 1.1 ad
117 1.1 ad bg = ((int32_t)attr >> 16) & 15;
118 1.1 ad return bg | (bg << 8) | (bg << 16) | (bg << 24);
119 1.1 ad }
120 1.1 ad
121 1.1 ad
122 1.1 ad /*
123 1.1 ad * Actually turn the cursor on or off. This does the dirty work for
124 1.1 ad * rasops_cursor().
125 1.1 ad */
126 1.1 ad static void
127 1.1 ad rasops8_do_cursor(ri)
128 1.1 ad struct rasops_info *ri;
129 1.1 ad {
130 1.1 ad u_char *dp, *rp;
131 1.1 ad int full1, height, cnt, slop1, slop2, row, col;
132 1.1 ad
133 1.1 ad row = ri->ri_crow;
134 1.1 ad col = ri->ri_ccol;
135 1.1 ad
136 1.1 ad rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
137 1.1 ad height = ri->ri_font->fontheight;
138 1.1 ad
139 1.1 ad slop1 = (int)rp & 3;
140 1.1 ad slop2 = (ri->ri_xscale - slop1) & 3;
141 1.1 ad full1 = (ri->ri_xscale - slop1 - slop2) >> 2;
142 1.1 ad
143 1.1 ad while (height--) {
144 1.1 ad dp = rp;
145 1.1 ad rp += ri->ri_stride;
146 1.1 ad
147 1.1 ad for (cnt = slop1; cnt; cnt--)
148 1.1 ad *dp++ ^= 0xff;
149 1.1 ad
150 1.1 ad for (cnt = full1; cnt; cnt--) {
151 1.1 ad *(int32_t *)dp ^= 0xffffffff;
152 1.1 ad dp += 4;
153 1.1 ad }
154 1.1 ad
155 1.1 ad for (cnt = slop2; cnt; cnt--)
156 1.1 ad *dp++ ^= 0xff;
157 1.1 ad }
158 1.1 ad }
159 1.1 ad
160 1.1 ad
161 1.1 ad /*
162 1.1 ad * Paint a single character.
163 1.1 ad */
164 1.1 ad static void
165 1.1 ad rasops8_putchar(cookie, row, col, uc, attr)
166 1.1 ad void *cookie;
167 1.1 ad int row, col;
168 1.1 ad u_int uc;
169 1.1 ad long attr;
170 1.1 ad {
171 1.1 ad struct rasops_info *ri;
172 1.1 ad u_char *dp, *rp, *fr, clr[2];
173 1.1 ad int width, height, cnt, fs, fb;
174 1.1 ad
175 1.1 ad ri = (struct rasops_info *)cookie;
176 1.1 ad
177 1.1 ad #ifdef RASOPS_CLIPPING
178 1.1 ad /* Catches 'row < 0' case too */
179 1.1 ad if ((unsigned)row >= (unsigned)ri->ri_rows)
180 1.1 ad return;
181 1.1 ad
182 1.1 ad if ((unsigned)col >= (unsigned)ri->ri_cols)
183 1.1 ad return;
184 1.1 ad #endif
185 1.1 ad rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
186 1.1 ad
187 1.1 ad height = ri->ri_font->fontheight;
188 1.1 ad width = ri->ri_font->fontwidth;
189 1.1 ad clr[0] = (u_char)(attr >> 16);
190 1.1 ad clr[1] = (u_char)(attr >> 24);
191 1.1 ad
192 1.1 ad if (uc == ' ') {
193 1.1 ad while (height--) {
194 1.1 ad dp = rp;
195 1.1 ad rp += ri->ri_stride;
196 1.1 ad
197 1.1 ad for (cnt = width; cnt; cnt--)
198 1.1 ad *dp++ = clr[0];
199 1.1 ad }
200 1.1 ad } else {
201 1.1 ad uc -= ri->ri_font->firstchar;
202 1.1 ad fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
203 1.1 ad fs = ri->ri_font->stride;
204 1.1 ad
205 1.1 ad while (height--) {
206 1.1 ad dp = rp;
207 1.1 ad fb = fr[3] | (fr[2] << 8) | (fr[1] << 16) | (fr[0] << 24);
208 1.1 ad fr += fs;
209 1.1 ad rp += ri->ri_stride;
210 1.1 ad
211 1.1 ad for (cnt = width; cnt; cnt--) {
212 1.1 ad *dp++ = clr[(fb >> 31) & 1];
213 1.1 ad fb <<= 1;
214 1.1 ad }
215 1.1 ad }
216 1.1 ad }
217 1.1 ad
218 1.1 ad /* Do underline */
219 1.1 ad if (attr & 1) {
220 1.1 ad rp -= (ri->ri_stride << 1);
221 1.1 ad
222 1.1 ad while (width--)
223 1.1 ad *rp++ = clr[1];
224 1.1 ad }
225 1.1 ad
226 1.1 ad }
227 1.1 ad
228 1.1 ad
229 1.1 ad /*
230 1.1 ad * Recompute the 4x1 blitting stamp.
231 1.1 ad */
232 1.1 ad static void
233 1.1 ad rasops8_makestamp(long attr)
234 1.1 ad {
235 1.1 ad int i;
236 1.1 ad int32_t fg, bg;
237 1.1 ad
238 1.1 ad fg = (attr >> 24) & 15;
239 1.1 ad bg = (attr >> 16) & 15;
240 1.1 ad stamp_attr = attr;
241 1.1 ad
242 1.1 ad for (i = 0; i < 16; i++) {
243 1.1 ad #if BYTE_ORDER == LITTLE_ENDIAN
244 1.1 ad stamp[i] = (i & 8 ? fg : bg);
245 1.1 ad stamp[i] |= ((i & 4 ? fg : bg) << 8);
246 1.1 ad stamp[i] |= ((i & 2 ? fg : bg) << 16);
247 1.1 ad stamp[i] |= ((i & 1 ? fg : bg) << 24);
248 1.1 ad #else
249 1.1 ad stamp[i] = (i & 1 ? fg : bg);
250 1.1 ad stamp[i] |= ((i & 2 ? fg : bg) << 8);
251 1.1 ad stamp[i] |= ((i & 4 ? fg : bg) << 16);
252 1.1 ad stamp[i] |= ((i & 8 ? fg : bg) << 24);
253 1.1 ad #endif
254 1.1 ad }
255 1.1 ad }
256 1.1 ad
257 1.1 ad
258 1.1 ad /*
259 1.1 ad * Paint a single character. This is for 8-pixel wide fonts.
260 1.1 ad */
261 1.1 ad static void
262 1.1 ad rasops8_putchar8(cookie, row, col, uc, attr)
263 1.1 ad void *cookie;
264 1.1 ad int row, col;
265 1.1 ad u_int uc;
266 1.1 ad long attr;
267 1.1 ad {
268 1.1 ad struct rasops_info *ri;
269 1.1 ad int height, fs;
270 1.1 ad int32_t *rp;
271 1.1 ad u_char *fr;
272 1.1 ad
273 1.1 ad /* Can't risk remaking the stamp if it's already in use */
274 1.1 ad if (stamp_mutex++) {
275 1.1 ad stamp_mutex--;
276 1.1 ad rasops8_putchar(cookie, row, col, uc, attr);
277 1.1 ad return;
278 1.1 ad }
279 1.1 ad
280 1.1 ad ri = (struct rasops_info *)cookie;
281 1.1 ad
282 1.1 ad #ifdef RASOPS_CLIPPING
283 1.1 ad if ((unsigned)row >= (unsigned)ri->ri_rows) {
284 1.1 ad stamp_mutex--;
285 1.1 ad return;
286 1.1 ad }
287 1.1 ad
288 1.1 ad if ((unsigned)col >= (unsigned)ri->ri_cols) {
289 1.1 ad stamp_mutex--;
290 1.1 ad return;
291 1.1 ad }
292 1.1 ad #endif
293 1.1 ad
294 1.1 ad /* Recompute stamp? */
295 1.1 ad if (attr != stamp_attr)
296 1.1 ad rasops8_makestamp(attr);
297 1.1 ad
298 1.1 ad rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
299 1.1 ad height = ri->ri_font->fontheight;
300 1.1 ad
301 1.1 ad if (uc == ' ') {
302 1.1 ad while (height--) {
303 1.1 ad rp[0] = stamp[0];
304 1.1 ad rp[1] = stamp[0];
305 1.1 ad DELTA(rp, ri->ri_stride, int32_t *);
306 1.1 ad }
307 1.1 ad } else {
308 1.1 ad uc -= ri->ri_font->firstchar;
309 1.1 ad fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
310 1.1 ad fs = ri->ri_font->stride;
311 1.1 ad
312 1.1 ad while (height--) {
313 1.1 ad rp[0] = STAMP_READ(STAMP_SHIFT(fr[0], 1) & STAMP_MASK);
314 1.1 ad rp[1] = STAMP_READ(STAMP_SHIFT(fr[0], 0) & STAMP_MASK);
315 1.1 ad
316 1.1 ad fr += fs;
317 1.1 ad DELTA(rp, ri->ri_stride, int32_t *);
318 1.1 ad }
319 1.1 ad }
320 1.1 ad
321 1.1 ad /* Do underline */
322 1.1 ad if (attr & 1) {
323 1.1 ad DELTA(rp, -(ri->ri_stride << 1), int32_t *);
324 1.1 ad rp[0] = stamp[15];
325 1.1 ad rp[1] = stamp[15];
326 1.1 ad }
327 1.1 ad
328 1.1 ad stamp_mutex--;
329 1.1 ad }
330 1.1 ad
331 1.1 ad
332 1.1 ad /*
333 1.1 ad * Paint a single character. This is for 12-pixel wide fonts.
334 1.1 ad */
335 1.1 ad static void
336 1.1 ad rasops8_putchar12(cookie, row, col, uc, attr)
337 1.1 ad void *cookie;
338 1.1 ad int row, col;
339 1.1 ad u_int uc;
340 1.1 ad long attr;
341 1.1 ad {
342 1.1 ad struct rasops_info *ri;
343 1.1 ad int height, fs;
344 1.1 ad int32_t *rp;
345 1.1 ad u_char *fr;
346 1.1 ad
347 1.1 ad /* Can't risk remaking the stamp if it's already in use */
348 1.1 ad if (stamp_mutex++) {
349 1.1 ad stamp_mutex--;
350 1.1 ad rasops8_putchar(cookie, row, col, uc, attr);
351 1.1 ad return;
352 1.1 ad }
353 1.1 ad
354 1.1 ad ri = (struct rasops_info *)cookie;
355 1.1 ad
356 1.1 ad #ifdef RASOPS_CLIPPING
357 1.1 ad if ((unsigned)row >= (unsigned)ri->ri_rows) {
358 1.1 ad stamp_mutex--;
359 1.1 ad return;
360 1.1 ad }
361 1.1 ad
362 1.1 ad if ((unsigned)col >= (unsigned)ri->ri_cols) {
363 1.1 ad stamp_mutex--;
364 1.1 ad return;
365 1.1 ad }
366 1.1 ad #endif
367 1.1 ad
368 1.1 ad /* Recompute stamp? */
369 1.1 ad if (attr != stamp_attr)
370 1.1 ad rasops8_makestamp(attr);
371 1.1 ad
372 1.1 ad rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
373 1.1 ad height = ri->ri_font->fontheight;
374 1.1 ad
375 1.1 ad if (uc == ' ') {
376 1.1 ad while (height--) {
377 1.1 ad rp[0] = stamp[0];
378 1.1 ad rp[1] = stamp[0];
379 1.1 ad rp[2] = stamp[0];
380 1.1 ad DELTA(rp, ri->ri_stride, int32_t *);
381 1.1 ad }
382 1.1 ad } else {
383 1.1 ad uc -= ri->ri_font->firstchar;
384 1.1 ad fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
385 1.1 ad fs = ri->ri_font->stride;
386 1.1 ad
387 1.1 ad while (height--) {
388 1.1 ad rp[0] = STAMP_READ(STAMP_SHIFT(fr[0], 1) & STAMP_MASK);
389 1.1 ad rp[1] = STAMP_READ(STAMP_SHIFT(fr[0], 0) & STAMP_MASK);
390 1.1 ad rp[2] = STAMP_READ(STAMP_SHIFT(fr[1], 1) & STAMP_MASK);
391 1.1 ad
392 1.1 ad fr += fs;
393 1.1 ad DELTA(rp, ri->ri_stride, int32_t *);
394 1.1 ad }
395 1.1 ad }
396 1.1 ad
397 1.1 ad /* Do underline */
398 1.1 ad if (attr & 1) {
399 1.1 ad DELTA(rp, -(ri->ri_stride << 1), int32_t *);
400 1.1 ad rp[0] = stamp[15];
401 1.1 ad rp[1] = stamp[15];
402 1.1 ad rp[2] = stamp[15];
403 1.1 ad }
404 1.1 ad
405 1.1 ad stamp_mutex--;
406 1.1 ad }
407 1.1 ad
408 1.1 ad
409 1.1 ad /*
410 1.1 ad * Paint a single character. This is for 16-pixel wide fonts.
411 1.1 ad */
412 1.1 ad static void
413 1.1 ad rasops8_putchar16(cookie, row, col, uc, attr)
414 1.1 ad void *cookie;
415 1.1 ad int row, col;
416 1.1 ad u_int uc;
417 1.1 ad long attr;
418 1.1 ad {
419 1.1 ad struct rasops_info *ri;
420 1.1 ad int height, fs;
421 1.1 ad int32_t *rp;
422 1.1 ad u_char *fr;
423 1.1 ad
424 1.1 ad /* Can't risk remaking the stamp if it's already in use */
425 1.1 ad if (stamp_mutex++) {
426 1.1 ad stamp_mutex--;
427 1.1 ad rasops8_putchar(cookie, row, col, uc, attr);
428 1.1 ad return;
429 1.1 ad }
430 1.1 ad
431 1.1 ad ri = (struct rasops_info *)cookie;
432 1.1 ad
433 1.1 ad #ifdef RASOPS_CLIPPING
434 1.1 ad if ((unsigned)row >= (unsigned)ri->ri_rows) {
435 1.1 ad stamp_mutex--;
436 1.1 ad return;
437 1.1 ad }
438 1.1 ad
439 1.1 ad if ((unsigned)col >= (unsigned)ri->ri_cols) {
440 1.1 ad stamp_mutex--;
441 1.1 ad return;
442 1.1 ad }
443 1.1 ad #endif
444 1.1 ad
445 1.1 ad /* Recompute stamp? */
446 1.1 ad if (attr != stamp_attr)
447 1.1 ad rasops8_makestamp(attr);
448 1.1 ad
449 1.1 ad rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
450 1.1 ad height = ri->ri_font->fontheight;
451 1.1 ad
452 1.1 ad if (uc == ' ') {
453 1.1 ad while (height--) {
454 1.1 ad rp[0] = stamp[0];
455 1.1 ad rp[1] = stamp[0];
456 1.1 ad rp[2] = stamp[0];
457 1.1 ad rp[3] = stamp[0];
458 1.1 ad DELTA(rp, ri->ri_stride, int32_t *);
459 1.1 ad }
460 1.1 ad } else {
461 1.1 ad uc -= ri->ri_font->firstchar;
462 1.1 ad fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
463 1.1 ad fs = ri->ri_font->stride;
464 1.1 ad
465 1.1 ad while (height--) {
466 1.1 ad rp[0] = STAMP_READ(STAMP_SHIFT(fr[0], 1) & STAMP_MASK);
467 1.1 ad rp[1] = STAMP_READ(STAMP_SHIFT(fr[0], 0) & STAMP_MASK);
468 1.1 ad rp[2] = STAMP_READ(STAMP_SHIFT(fr[1], 1) & STAMP_MASK);
469 1.1 ad rp[3] = STAMP_READ(STAMP_SHIFT(fr[1], 0) & STAMP_MASK);
470 1.1 ad
471 1.1 ad fr += fs;
472 1.1 ad DELTA(rp, ri->ri_stride, int32_t *);
473 1.1 ad }
474 1.1 ad }
475 1.1 ad
476 1.1 ad /* Do underline */
477 1.1 ad if (attr & 1) {
478 1.1 ad DELTA(rp, -(ri->ri_stride << 1), int32_t *);
479 1.1 ad rp[0] = stamp[15];
480 1.1 ad rp[1] = stamp[15];
481 1.1 ad rp[2] = stamp[15];
482 1.1 ad rp[3] = stamp[15];
483 1.1 ad }
484 1.1 ad
485 1.1 ad stamp_mutex--;
486 1.1 ad }
487 1.1 ad
488 1.1 ad
489 1.1 ad /*
490 1.1 ad * Erase rows.
491 1.1 ad */
492 1.1 ad static void
493 1.1 ad rasops8_eraserows(cookie, row, num, attr)
494 1.1 ad void *cookie;
495 1.1 ad int row, num;
496 1.1 ad long attr;
497 1.1 ad {
498 1.1 ad struct rasops_info *ri;
499 1.1 ad int32_t *dp, clr;
500 1.1 ad int n8, n1, cnt;
501 1.1 ad
502 1.1 ad ri = (struct rasops_info *)cookie;
503 1.1 ad
504 1.1 ad #ifdef RASOPS_CLIPPING
505 1.1 ad if (row < 0) {
506 1.1 ad num += row;
507 1.1 ad row = 0;
508 1.1 ad }
509 1.1 ad
510 1.1 ad if ((row + num) > ri->ri_rows)
511 1.1 ad num = ri->ri_rows - row;
512 1.1 ad
513 1.1 ad if (num <= 0)
514 1.1 ad return;
515 1.1 ad #endif
516 1.1 ad
517 1.1 ad num *= ri->ri_font->fontheight;
518 1.1 ad dp = (int32_t *)(ri->ri_bits + row * ri->ri_yscale);
519 1.1 ad clr = rasops8_bg_color(attr);
520 1.1 ad
521 1.1 ad n8 = ri->ri_emustride >> 5;
522 1.1 ad n1 = (ri->ri_emustride >> 2) & 7;
523 1.1 ad
524 1.1 ad while (num--) {
525 1.1 ad for (cnt = n8; cnt; cnt--) {
526 1.1 ad dp[0] = clr;
527 1.1 ad dp[1] = clr;
528 1.1 ad dp[2] = clr;
529 1.1 ad dp[3] = clr;
530 1.1 ad dp[4] = clr;
531 1.1 ad dp[5] = clr;
532 1.1 ad dp[6] = clr;
533 1.1 ad dp[7] = clr;
534 1.1 ad dp += 8;
535 1.1 ad }
536 1.1 ad
537 1.1 ad for (cnt = n1; cnt; cnt--)
538 1.1 ad *dp++ = clr;
539 1.1 ad
540 1.1 ad DELTA(dp, ri->ri_delta, int32_t *);
541 1.1 ad }
542 1.1 ad }
543 1.1 ad
544 1.1 ad
545 1.1 ad /*
546 1.1 ad * Erase columns.
547 1.1 ad */
548 1.1 ad static void
549 1.1 ad rasops8_erasecols(cookie, row, col, num, attr)
550 1.1 ad void *cookie;
551 1.1 ad int row, col, num;
552 1.1 ad long attr;
553 1.1 ad {
554 1.1 ad int n8, clr, height, cnt, slop1, slop2;
555 1.1 ad struct rasops_info *ri;
556 1.1 ad int32_t *dst;
557 1.1 ad u_char *dstb, *rp;
558 1.1 ad
559 1.1 ad ri = (struct rasops_info *)cookie;
560 1.1 ad
561 1.1 ad #ifdef RASOPS_CLIPPING
562 1.1 ad if ((unsigned)row >= (unsigned)ri->ri_rows)
563 1.1 ad return;
564 1.1 ad
565 1.1 ad if (col < 0) {
566 1.1 ad num += col;
567 1.1 ad col = 0;
568 1.1 ad }
569 1.1 ad
570 1.1 ad if ((col + num) > ri->ri_cols)
571 1.1 ad num = ri->ri_cols - col;
572 1.1 ad
573 1.1 ad if (num <= 0)
574 1.1 ad return;
575 1.1 ad #endif
576 1.1 ad
577 1.1 ad num = num * ri->ri_xscale;
578 1.1 ad rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
579 1.1 ad clr = rasops8_bg_color(attr);
580 1.1 ad height = ri->ri_font->fontheight;
581 1.1 ad
582 1.1 ad slop1 = (int)rp & 3;
583 1.1 ad slop2 = (num - slop1) & 3;
584 1.1 ad num -= slop1 + slop2;
585 1.1 ad n8 = num >> 5;
586 1.1 ad num = (num >> 2) & 7;
587 1.1 ad
588 1.1 ad while (height--) {
589 1.1 ad dstb = rp;
590 1.1 ad rp += ri->ri_stride;
591 1.1 ad
592 1.1 ad /* Align span to 4 bytes */
593 1.1 ad for (cnt = slop1; cnt; cnt--)
594 1.1 ad *dstb++ = (u_char)clr;
595 1.1 ad
596 1.1 ad dst = (int32_t *)dstb;
597 1.1 ad
598 1.1 ad /* Write 32 bytes per loop */
599 1.1 ad for (cnt = n8; cnt; cnt--) {
600 1.1 ad dst[0] = clr;
601 1.1 ad dst[1] = clr;
602 1.1 ad dst[2] = clr;
603 1.1 ad dst[3] = clr;
604 1.1 ad dst[4] = clr;
605 1.1 ad dst[5] = clr;
606 1.1 ad dst[6] = clr;
607 1.1 ad dst[7] = clr;
608 1.1 ad dst += 8;
609 1.1 ad }
610 1.1 ad
611 1.1 ad /* Write 4 bytes per loop */
612 1.1 ad for (cnt = num; cnt; cnt--)
613 1.1 ad *dst++ = clr;
614 1.1 ad
615 1.1 ad /* Write unaligned trailing slop */
616 1.1 ad if (slop2 == 0)
617 1.1 ad continue;
618 1.1 ad
619 1.1 ad dstb = (u_char *)dst;
620 1.1 ad
621 1.1 ad for (cnt = slop2; cnt; cnt--)
622 1.1 ad *dstb++ = (u_char)clr;
623 1.1 ad }
624 1.1 ad }
625 1.1 ad
626 1.1 ad #endif /* RASOPS8 */
627