This source file includes following definitions.
- rasops24_init
- rasops24_putchar
- rasops24_makestamp
- rasops24_putchar8
- rasops24_putchar12
- rasops24_putchar16
- rasops24_eraserows
- rasops24_erasecols
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/time.h>
43
44 #include <machine/endian.h>
45
46 #include <dev/wscons/wsdisplayvar.h>
47 #include <dev/wscons/wsconsio.h>
48 #include <dev/rasops/rasops.h>
49
50 void rasops24_erasecols(void *, int, int, int, long);
51 void rasops24_eraserows(void *, int, int, long);
52 void rasops24_putchar(void *, int, int, u_int, long attr);
53 #ifndef RASOPS_SMALL
54 void rasops24_putchar8(void *, int, int, u_int, long attr);
55 void rasops24_putchar12(void *, int, int, u_int, long attr);
56 void rasops24_putchar16(void *, int, int, u_int, long attr);
57 void rasops24_makestamp(struct rasops_info *, long);
58
59
60
61
62 static int32_t stamp[64];
63 static long stamp_attr;
64 static int stamp_mutex;
65 #endif
66
67
68
69
70
71
72
73
74
75
76 #define STAMP_SHIFT(fb,n) ((n*4-4) >= 0 ? (fb)>>(n*4-4):(fb)<<-(n*4-4))
77 #define STAMP_MASK (0xf << 4)
78 #define STAMP_READ(o) (*(int32_t *)((caddr_t)stamp + (o)))
79
80
81
82
83 void
84 rasops24_init(ri)
85 struct rasops_info *ri;
86 {
87
88 switch (ri->ri_font->fontwidth) {
89 #ifndef RASOPS_SMALL
90 case 8:
91 ri->ri_ops.putchar = rasops24_putchar8;
92 break;
93 case 12:
94 ri->ri_ops.putchar = rasops24_putchar12;
95 break;
96 case 16:
97 ri->ri_ops.putchar = rasops24_putchar16;
98 break;
99 #endif
100 default:
101 ri->ri_ops.putchar = rasops24_putchar;
102 break;
103 }
104
105 if (ri->ri_rnum == 0) {
106 ri->ri_rnum = 8;
107 ri->ri_rpos = 0;
108 ri->ri_gnum = 8;
109 ri->ri_gpos = 8;
110 ri->ri_bnum = 8;
111 ri->ri_bpos = 16;
112 }
113
114 ri->ri_ops.erasecols = rasops24_erasecols;
115 ri->ri_ops.eraserows = rasops24_eraserows;
116 }
117
118
119
120
121
122 void
123 rasops24_putchar(cookie, row, col, uc, attr)
124 void *cookie;
125 int row, col;
126 u_int uc;
127 long attr;
128 {
129 int fb, width, height, cnt, clr[2];
130 struct rasops_info *ri;
131 u_char *dp, *rp, *fr;
132
133 ri = (struct rasops_info *)cookie;
134
135 #ifdef RASOPS_CLIPPING
136
137 if ((unsigned)row >= (unsigned)ri->ri_rows)
138 return;
139
140 if ((unsigned)col >= (unsigned)ri->ri_cols)
141 return;
142 #endif
143
144 rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
145 height = ri->ri_font->fontheight;
146 width = ri->ri_font->fontwidth;
147
148 clr[1] = ri->ri_devcmap[((u_int)attr >> 24) & 0xf];
149 clr[0] = ri->ri_devcmap[((u_int)attr >> 16) & 0xf];
150
151 if (uc == ' ') {
152 u_char c = clr[0];
153 while (height--) {
154 dp = rp;
155 rp += ri->ri_stride;
156
157 for (cnt = width; cnt; cnt--) {
158 *dp++ = c >> 16;
159 *dp++ = c >> 8;
160 *dp++ = c;
161 }
162 }
163 } else {
164 uc -= ri->ri_font->firstchar;
165 fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
166
167 while (height--) {
168 dp = rp;
169 fb = fr[3] | (fr[2] << 8) | (fr[1] << 16) |
170 (fr[0] << 24);
171 fr += ri->ri_font->stride;
172 rp += ri->ri_stride;
173
174 for (cnt = width; cnt; cnt--, fb <<= 1) {
175 if ((fb >> 31) & 1) {
176 *dp++ = clr[1] >> 16;
177 *dp++ = clr[1] >> 8;
178 *dp++ = clr[1];
179 } else {
180 *dp++ = clr[0] >> 16;
181 *dp++ = clr[0] >> 8;
182 *dp++ = clr[0];
183 }
184 }
185 }
186 }
187
188
189 if ((attr & 1) != 0) {
190 u_char c = clr[1];
191
192 rp -= ri->ri_stride << 1;
193
194 while (width--) {
195 *rp++ = c >> 16;
196 *rp++ = c >> 8;
197 *rp++ = c;
198 }
199 }
200 }
201
202 #ifndef RASOPS_SMALL
203
204
205
206 void
207 rasops24_makestamp(ri, attr)
208 struct rasops_info *ri;
209 long attr;
210 {
211 u_int fg, bg, c1, c2, c3, c4;
212 int i;
213
214 fg = ri->ri_devcmap[((u_int)attr >> 24) & 0xf] & 0xffffff;
215 bg = ri->ri_devcmap[((u_int)attr >> 16) & 0xf] & 0xffffff;
216 stamp_attr = attr;
217
218 for (i = 0; i < 64; i += 4) {
219 #if BYTE_ORDER == LITTLE_ENDIAN
220 c1 = (i & 32 ? fg : bg);
221 c2 = (i & 16 ? fg : bg);
222 c3 = (i & 8 ? fg : bg);
223 c4 = (i & 4 ? fg : bg);
224 #else
225 c1 = (i & 8 ? fg : bg);
226 c2 = (i & 4 ? fg : bg);
227 c3 = (i & 16 ? fg : bg);
228 c4 = (i & 32 ? fg : bg);
229 #endif
230 stamp[i+0] = (c1 << 8) | (c2 >> 16);
231 stamp[i+1] = (c2 << 16) | (c3 >> 8);
232 stamp[i+2] = (c3 << 24) | c4;
233
234 #if BYTE_ORDER == LITTLE_ENDIAN
235 if ((ri->ri_flg & RI_BSWAP) == 0) {
236 #else
237 if ((ri->ri_flg & RI_BSWAP) != 0) {
238 #endif
239 stamp[i+0] = swap32(stamp[i+0]);
240 stamp[i+1] = swap32(stamp[i+1]);
241 stamp[i+2] = swap32(stamp[i+2]);
242 }
243 }
244 }
245
246
247
248
249 void
250 rasops24_putchar8(cookie, row, col, uc, attr)
251 void *cookie;
252 int row, col;
253 u_int uc;
254 long attr;
255 {
256 struct rasops_info *ri;
257 int height, so, fs;
258 int32_t *rp;
259 u_char *fr;
260
261
262 if (stamp_mutex++) {
263 stamp_mutex--;
264 rasops24_putchar(cookie, row, col, uc, attr);
265 return;
266 }
267
268 ri = (struct rasops_info *)cookie;
269
270 #ifdef RASOPS_CLIPPING
271 if ((unsigned)row >= (unsigned)ri->ri_rows) {
272 stamp_mutex--;
273 return;
274 }
275
276 if ((unsigned)col >= (unsigned)ri->ri_cols) {
277 stamp_mutex--;
278 return;
279 }
280 #endif
281
282
283 if (attr != stamp_attr)
284 rasops24_makestamp(ri, attr);
285
286 rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
287 height = ri->ri_font->fontheight;
288
289 if (uc == (u_int)-1) {
290 int32_t c = stamp[0];
291 while (height--) {
292 rp[0] = rp[1] = rp[2] = rp[3] = rp[4] = rp[5] = c;
293 DELTA(rp, ri->ri_stride, int32_t *);
294 }
295 } else {
296 uc -= ri->ri_font->firstchar;
297 fr = (u_char *)ri->ri_font->data + uc*ri->ri_fontscale;
298 fs = ri->ri_font->stride;
299
300 while (height--) {
301 so = STAMP_SHIFT(fr[0], 1) & STAMP_MASK;
302 rp[0] = STAMP_READ(so);
303 rp[1] = STAMP_READ(so + 4);
304 rp[2] = STAMP_READ(so + 8);
305
306 so = STAMP_SHIFT(fr[0], 0) & STAMP_MASK;
307 rp[3] = STAMP_READ(so);
308 rp[4] = STAMP_READ(so + 4);
309 rp[5] = STAMP_READ(so + 8);
310
311 fr += fs;
312 DELTA(rp, ri->ri_stride, int32_t *);
313 }
314 }
315
316
317 if ((attr & 1) != 0) {
318 int32_t c = STAMP_READ(52);
319
320 DELTA(rp, -(ri->ri_stride << 1), int32_t *);
321 rp[0] = rp[1] = rp[2] = rp[3] = rp[4] = rp[5] = c;
322 }
323
324 stamp_mutex--;
325 }
326
327
328
329
330 void
331 rasops24_putchar12(cookie, row, col, uc, attr)
332 void *cookie;
333 int row, col;
334 u_int uc;
335 long attr;
336 {
337 struct rasops_info *ri;
338 int height, so, fs;
339 int32_t *rp;
340 u_char *fr;
341
342
343 if (stamp_mutex++) {
344 stamp_mutex--;
345 rasops24_putchar(cookie, row, col, uc, attr);
346 return;
347 }
348
349 ri = (struct rasops_info *)cookie;
350
351 #ifdef RASOPS_CLIPPING
352 if ((unsigned)row >= (unsigned)ri->ri_rows) {
353 stamp_mutex--;
354 return;
355 }
356
357 if ((unsigned)col >= (unsigned)ri->ri_cols) {
358 stamp_mutex--;
359 return;
360 }
361 #endif
362
363
364 if (attr != stamp_attr)
365 rasops24_makestamp(ri, attr);
366
367 rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
368 height = ri->ri_font->fontheight;
369
370 if (uc == (u_int)-1) {
371 int32_t c = stamp[0];
372 while (height--) {
373 rp[0] = rp[1] = rp[2] = rp[3] =
374 rp[4] = rp[5] = rp[6] = rp[7] = rp[8] = c;
375 DELTA(rp, ri->ri_stride, int32_t *);
376 }
377 } else {
378 uc -= ri->ri_font->firstchar;
379 fr = (u_char *)ri->ri_font->data + uc*ri->ri_fontscale;
380 fs = ri->ri_font->stride;
381
382 while (height--) {
383 so = STAMP_SHIFT(fr[0], 1) & STAMP_MASK;
384 rp[0] = STAMP_READ(so);
385 rp[1] = STAMP_READ(so + 4);
386 rp[2] = STAMP_READ(so + 8);
387
388 so = STAMP_SHIFT(fr[0], 0) & STAMP_MASK;
389 rp[3] = STAMP_READ(so);
390 rp[4] = STAMP_READ(so + 4);
391 rp[5] = STAMP_READ(so + 8);
392
393 so = STAMP_SHIFT(fr[1], 1) & STAMP_MASK;
394 rp[6] = STAMP_READ(so);
395 rp[7] = STAMP_READ(so + 4);
396 rp[8] = STAMP_READ(so + 8);
397
398 fr += fs;
399 DELTA(rp, ri->ri_stride, int32_t *);
400 }
401 }
402
403
404 if ((attr & 1) != 0) {
405 int32_t c = STAMP_READ(52);
406
407 DELTA(rp, -(ri->ri_stride << 1), int32_t *);
408 rp[0] = rp[1] = rp[2] = rp[3] =
409 rp[4] = rp[5] = rp[6] = rp[7] = rp[8] = c;
410 }
411
412 stamp_mutex--;
413 }
414
415
416
417
418 void
419 rasops24_putchar16(cookie, row, col, uc, attr)
420 void *cookie;
421 int row, col;
422 u_int uc;
423 long attr;
424 {
425 struct rasops_info *ri;
426 int height, so, fs;
427 int32_t *rp;
428 u_char *fr;
429
430
431 if (stamp_mutex++) {
432 stamp_mutex--;
433 rasops24_putchar(cookie, row, col, uc, attr);
434 return;
435 }
436
437 ri = (struct rasops_info *)cookie;
438
439 #ifdef RASOPS_CLIPPING
440 if ((unsigned)row >= (unsigned)ri->ri_rows) {
441 stamp_mutex--;
442 return;
443 }
444
445 if ((unsigned)col >= (unsigned)ri->ri_cols) {
446 stamp_mutex--;
447 return;
448 }
449 #endif
450
451
452 if (attr != stamp_attr)
453 rasops24_makestamp(ri, attr);
454
455 rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
456 height = ri->ri_font->fontheight;
457
458 if (uc == (u_int)-1) {
459 int32_t c = stamp[0];
460 while (height--) {
461 rp[0] = rp[1] = rp[2] = rp[3] =
462 rp[4] = rp[5] = rp[6] = rp[7] =
463 rp[8] = rp[9] = rp[10] = rp[11] = c;
464 DELTA(rp, ri->ri_stride, int32_t *);
465 }
466 } else {
467 uc -= ri->ri_font->firstchar;
468 fr = (u_char *)ri->ri_font->data + uc*ri->ri_fontscale;
469 fs = ri->ri_font->stride;
470
471 while (height--) {
472 so = STAMP_SHIFT(fr[0], 1) & STAMP_MASK;
473 rp[0] = STAMP_READ(so);
474 rp[1] = STAMP_READ(so + 4);
475 rp[2] = STAMP_READ(so + 8);
476
477 so = STAMP_SHIFT(fr[0], 0) & STAMP_MASK;
478 rp[3] = STAMP_READ(so);
479 rp[4] = STAMP_READ(so + 4);
480 rp[5] = STAMP_READ(so + 8);
481
482 so = STAMP_SHIFT(fr[1], 1) & STAMP_MASK;
483 rp[6] = STAMP_READ(so);
484 rp[7] = STAMP_READ(so + 4);
485 rp[8] = STAMP_READ(so + 8);
486
487 so = STAMP_SHIFT(fr[1], 0) & STAMP_MASK;
488 rp[9] = STAMP_READ(so);
489 rp[10] = STAMP_READ(so + 4);
490 rp[11] = STAMP_READ(so + 8);
491
492 DELTA(rp, ri->ri_stride, int32_t *);
493 fr += fs;
494 }
495 }
496
497
498 if ((attr & 1) != 0) {
499 int32_t c = STAMP_READ(52);
500
501 DELTA(rp, -(ri->ri_stride << 1), int32_t *);
502 rp[0] = rp[1] = rp[2] = rp[3] =
503 rp[4] = rp[5] = rp[6] = rp[7] =
504 rp[8] = rp[9] = rp[10] = rp[11] = c;
505 }
506
507 stamp_mutex--;
508 }
509 #endif
510
511
512
513
514 void
515 rasops24_eraserows(cookie, row, num, attr)
516 void *cookie;
517 int row, num;
518 long attr;
519 {
520 int n9, n3, n1, cnt, stride, delta;
521 u_int32_t *dp, clr, stamp[3];
522 struct rasops_info *ri;
523
524
525
526
527
528 if ((attr & 4) != 0) {
529 rasops_eraserows(cookie, row, num, attr);
530 return;
531 }
532
533 ri = (struct rasops_info *)cookie;
534
535 #ifdef RASOPS_CLIPPING
536 if (row < 0) {
537 num += row;
538 row = 0;
539 }
540
541 if ((row + num) > ri->ri_rows)
542 num = ri->ri_rows - row;
543
544 if (num <= 0)
545 return;
546 #endif
547
548 clr = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xffffff;
549 stamp[0] = (clr << 8) | (clr >> 16);
550 stamp[1] = (clr << 16) | (clr >> 8);
551 stamp[2] = (clr << 24) | clr;
552
553 #if BYTE_ORDER == LITTLE_ENDIAN
554 if ((ri->ri_flg & RI_BSWAP) == 0) {
555 #else
556 if ((ri->ri_flg & RI_BSWAP) != 0) {
557 #endif
558 stamp[0] = swap32(stamp[0]);
559 stamp[1] = swap32(stamp[1]);
560 stamp[2] = swap32(stamp[2]);
561 }
562
563
564
565
566
567
568
569 if (num == ri->ri_rows && (ri->ri_flg & RI_FULLCLEAR) != 0) {
570 stride = ri->ri_stride;
571 num = ri->ri_height;
572 dp = (int32_t *)ri->ri_origbits;
573 delta = 0;
574 } else {
575 stride = ri->ri_emustride;
576 num *= ri->ri_font->fontheight;
577 dp = (int32_t *)(ri->ri_bits + row * ri->ri_yscale);
578 delta = ri->ri_delta;
579 }
580
581 n9 = stride / 36;
582 cnt = (n9 << 5) + (n9 << 2);
583 n3 = (stride - cnt) / 12;
584 cnt += (n3 << 3) + (n3 << 2);
585 n1 = (stride - cnt) >> 2;
586
587 while (num--) {
588 for (cnt = n9; cnt; cnt--) {
589 dp[0] = stamp[0];
590 dp[1] = stamp[1];
591 dp[2] = stamp[2];
592 dp[3] = stamp[0];
593 dp[4] = stamp[1];
594 dp[5] = stamp[2];
595 dp[6] = stamp[0];
596 dp[7] = stamp[1];
597 dp[8] = stamp[2];
598 dp += 9;
599 }
600
601 for (cnt = n3; cnt; cnt--) {
602 dp[0] = stamp[0];
603 dp[1] = stamp[1];
604 dp[2] = stamp[2];
605 dp += 3;
606 }
607
608 for (cnt = 0; cnt < n1; cnt++)
609 *dp++ = stamp[cnt];
610
611 DELTA(dp, delta, int32_t *);
612 }
613 }
614
615
616
617
618 void
619 rasops24_erasecols(cookie, row, col, num, attr)
620 void *cookie;
621 int row, col, num;
622 long attr;
623 {
624 int n12, n4, height, cnt, slop, clr, stamp[3];
625 struct rasops_info *ri;
626 int32_t *dp, *rp;
627 u_char *dbp;
628
629
630
631
632
633 if ((attr & 4) != 0) {
634 rasops_erasecols(cookie, row, col, num, attr);
635 return;
636 }
637
638 ri = (struct rasops_info *)cookie;
639
640 #ifdef RASOPS_CLIPPING
641
642 if ((unsigned)row >= (unsigned)ri->ri_rows)
643 return;
644
645 if (col < 0) {
646 num += col;
647 col = 0;
648 }
649
650 if ((col + num) > ri->ri_cols)
651 num = ri->ri_cols - col;
652
653 if (num <= 0)
654 return;
655 #endif
656
657 rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
658 num *= ri->ri_font->fontwidth;
659 height = ri->ri_font->fontheight;
660
661 clr = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xffffff;
662 stamp[0] = (clr << 8) | (clr >> 16);
663 stamp[1] = (clr << 16) | (clr >> 8);
664 stamp[2] = (clr << 24) | clr;
665
666 #if BYTE_ORDER == LITTLE_ENDIAN
667 if ((ri->ri_flg & RI_BSWAP) == 0) {
668 #else
669 if ((ri->ri_flg & RI_BSWAP) != 0) {
670 #endif
671 stamp[0] = swap32(stamp[0]);
672 stamp[1] = swap32(stamp[1]);
673 stamp[2] = swap32(stamp[2]);
674 }
675
676
677
678
679
680
681
682
683
684
685 slop = (long)rp & 3; num -= slop;
686 n12 = num / 12; num -= (n12 << 3) + (n12 << 2);
687 n4 = num >> 2; num &= 3;
688
689 while (height--) {
690 dbp = (u_char *)rp;
691 DELTA(rp, ri->ri_stride, int32_t *);
692
693
694
695 for (cnt = slop; cnt; cnt--) {
696 *dbp++ = (clr >> 16);
697 *dbp++ = (clr >> 8);
698 *dbp++ = clr;
699 }
700
701 dp = (int32_t *)dbp;
702
703
704 for (cnt = n12; cnt; cnt--) {
705 dp[0] = stamp[0];
706 dp[1] = stamp[1];
707 dp[2] = stamp[2];
708 dp[3] = stamp[0];
709 dp[4] = stamp[1];
710 dp[5] = stamp[2];
711 dp[6] = stamp[0];
712 dp[7] = stamp[1];
713 dp[8] = stamp[2];
714 dp += 9;
715 }
716
717
718 for (cnt = n4; cnt; cnt--) {
719 dp[0] = stamp[0];
720 dp[1] = stamp[1];
721 dp[2] = stamp[2];
722 dp += 3;
723 }
724
725
726
727 dbp = (u_char *)dp;
728 for (cnt = num; cnt; cnt--) {
729 *dbp++ = (clr >> 16);
730 *dbp++ = (clr >> 8);
731 *dbp++ = clr;
732 }
733 }
734 }