-/* $OpenBSD: rasops24.c,v 1.10 2014/12/19 22:44:59 guenther Exp $ */
+/* $OpenBSD: rasops24.c,v 1.11 2018/12/26 11:33:57 fcambus Exp $ */
/* $NetBSD: rasops24.c,v 1.12 2000/04/12 14:22:29 pk Exp $ */
/*-
#include <dev/wscons/wsconsio.h>
#include <dev/rasops/rasops.h>
-int rasops24_erasecols(void *, int, int, int, long);
-int rasops24_eraserows(void *, int, int, long);
int rasops24_putchar(void *, int, int, u_int, long attr);
#ifndef RASOPS_SMALL
int rasops24_putchar8(void *, int, int, u_int, long attr);
ri->ri_bnum = 8;
ri->ri_bpos = 16;
}
-
- ri->ri_ops.erasecols = rasops24_erasecols;
- ri->ri_ops.eraserows = rasops24_eraserows;
}
/*
return 0;
}
#endif /* !RASOPS_SMALL */
-
-/*
- * Erase rows. This is nice and easy due to alignment.
- */
-int
-rasops24_eraserows(void *cookie, int row, int num, long attr)
-{
- int n9, n3, n1, cnt, stride, delta;
- u_int32_t *dp, clr, stamp[3];
- struct rasops_info *ri;
-
- /*
- * If the color is gray, we can cheat and use the generic routines
- * (which are faster, hopefully) since the r,g,b values are the same.
- */
- if ((attr & 4) != 0)
- return rasops_eraserows(cookie, row, num, attr);
-
- ri = (struct rasops_info *)cookie;
-
-#ifdef RASOPS_CLIPPING
- if (row < 0) {
- num += row;
- row = 0;
- }
-
- if ((row + num) > ri->ri_rows)
- num = ri->ri_rows - row;
-
- if (num <= 0)
- return 0;
-#endif
-
- clr = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xffffff;
- stamp[0] = (clr << 8) | (clr >> 16);
- stamp[1] = (clr << 16) | (clr >> 8);
- stamp[2] = (clr << 24) | clr;
-
-#if BYTE_ORDER == LITTLE_ENDIAN
- if ((ri->ri_flg & RI_BSWAP) == 0) {
-#else
- if ((ri->ri_flg & RI_BSWAP) != 0) {
-#endif
- stamp[0] = swap32(stamp[0]);
- stamp[1] = swap32(stamp[1]);
- stamp[2] = swap32(stamp[2]);
- }
-
- /*
- * XXX the wsdisplay_emulops interface seems a little deficient in
- * that there is no way to clear the *entire* screen. We provide a
- * workaround here: if the entire console area is being cleared, and
- * the RI_FULLCLEAR flag is set, clear the entire display.
- */
- if (num == ri->ri_rows && (ri->ri_flg & RI_FULLCLEAR) != 0) {
- stride = ri->ri_stride;
- num = ri->ri_height;
- dp = (int32_t *)ri->ri_origbits;
- delta = 0;
- } else {
- stride = ri->ri_emustride;
- num *= ri->ri_font->fontheight;
- dp = (int32_t *)(ri->ri_bits + row * ri->ri_yscale);
- delta = ri->ri_delta;
- }
-
- n9 = stride / 36;
- cnt = (n9 << 5) + (n9 << 2); /* (32*n9) + (4*n9) */
- n3 = (stride - cnt) / 12;
- cnt += (n3 << 3) + (n3 << 2); /* (8*n3) + (4*n3) */
- n1 = (stride - cnt) >> 2;
-
- while (num--) {
- for (cnt = n9; cnt; cnt--) {
- dp[0] = stamp[0];
- dp[1] = stamp[1];
- dp[2] = stamp[2];
- dp[3] = stamp[0];
- dp[4] = stamp[1];
- dp[5] = stamp[2];
- dp[6] = stamp[0];
- dp[7] = stamp[1];
- dp[8] = stamp[2];
- dp += 9;
- }
-
- for (cnt = n3; cnt; cnt--) {
- dp[0] = stamp[0];
- dp[1] = stamp[1];
- dp[2] = stamp[2];
- dp += 3;
- }
-
- for (cnt = 0; cnt < n1; cnt++)
- *dp++ = stamp[cnt];
-
- DELTA(dp, delta, int32_t *);
- }
-
- return 0;
-}
-
-/*
- * Erase columns.
- */
-int
-rasops24_erasecols(void *cookie, int row, int col, int num, long attr)
-{
- int n12, n4, height, cnt, slop, clr, stamp[3];
- struct rasops_info *ri;
- int32_t *dp, *rp;
- u_char *dbp;
-
- /*
- * If the color is gray, we can cheat and use the generic routines
- * (which are faster, hopefully) since the r,g,b values are the same.
- */
- if ((attr & 4) != 0)
- return rasops_erasecols(cookie, row, col, num, attr);
-
- ri = (struct rasops_info *)cookie;
-
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows)
- return 0;
-
- if (col < 0) {
- num += col;
- col = 0;
- }
-
- if ((col + num) > ri->ri_cols)
- num = ri->ri_cols - col;
-
- if (num <= 0)
- return 0;
-#endif
-
- rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
- num *= ri->ri_font->fontwidth;
- height = ri->ri_font->fontheight;
-
- clr = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xffffff;
- stamp[0] = (clr << 8) | (clr >> 16);
- stamp[1] = (clr << 16) | (clr >> 8);
- stamp[2] = (clr << 24) | clr;
-
-#if BYTE_ORDER == LITTLE_ENDIAN
- if ((ri->ri_flg & RI_BSWAP) == 0) {
-#else
- if ((ri->ri_flg & RI_BSWAP) != 0) {
-#endif
- stamp[0] = swap32(stamp[0]);
- stamp[1] = swap32(stamp[1]);
- stamp[2] = swap32(stamp[2]);
- }
-
- /*
- * The current byte offset mod 4 tells us the number of 24-bit pels
- * we need to write for alignment to 32-bits. Once we're aligned on
- * a 32-bit boundary, we're also aligned on a 4 pixel boundary, so
- * the stamp does not need to be rotated. The following shows the
- * layout of 4 pels in a 3 word region and illustrates this:
- *
- * aaab bbcc cddd
- */
- slop = (long)rp & 3; num -= slop;
- n12 = num / 12; num -= (n12 << 3) + (n12 << 2);
- n4 = num >> 2; num &= 3;
-
- while (height--) {
- dbp = (u_char *)rp;
- DELTA(rp, ri->ri_stride, int32_t *);
-
- /* Align to 4 bytes */
- /* XXX handle with masks, bring under control of RI_BSWAP */
- for (cnt = slop; cnt; cnt--) {
- *dbp++ = (clr >> 16);
- *dbp++ = (clr >> 8);
- *dbp++ = clr;
- }
-
- dp = (int32_t *)dbp;
-
- /* 12 pels per loop */
- for (cnt = n12; cnt; cnt--) {
- dp[0] = stamp[0];
- dp[1] = stamp[1];
- dp[2] = stamp[2];
- dp[3] = stamp[0];
- dp[4] = stamp[1];
- dp[5] = stamp[2];
- dp[6] = stamp[0];
- dp[7] = stamp[1];
- dp[8] = stamp[2];
- dp += 9;
- }
-
- /* 4 pels per loop */
- for (cnt = n4; cnt; cnt--) {
- dp[0] = stamp[0];
- dp[1] = stamp[1];
- dp[2] = stamp[2];
- dp += 3;
- }
-
- /* Trailing slop */
- /* XXX handle with masks, bring under control of RI_BSWAP */
- dbp = (u_char *)dp;
- for (cnt = num; cnt; cnt--) {
- *dbp++ = (clr >> 16);
- *dbp++ = (clr >> 8);
- *dbp++ = clr;
- }
- }
-
- return 0;
-}