Module Name:    src
Committed By:   rin
Date:           Sat Aug 10 01:24:17 UTC 2019

Modified Files:
        src/sys/dev/rasops: rasops.c rasops.h rasops1-4_putchar.h rasops1.c
            rasops15.c rasops1_putchar_width.h rasops2.c rasops24.c rasops32.c
            rasops4.c rasops8.c rasops_bitops.h rasops_masks.c rasops_masks.h
            rasops_putchar.h rasops_putchar_width.h

Log Message:
Misc style clean up's.
- Introduce and use proper macros.
- Use not ambiguous variable names.
- Unify similar functions as possible as I can.
- G/C unused headers.
- Use #include <dev/rasops/foo.h> instead of "foo.h"
No particular functional changes intended.


To generate a diff of this commit:
cvs rdiff -u -r1.121 -r1.122 src/sys/dev/rasops/rasops.c
cvs rdiff -u -r1.46 -r1.47 src/sys/dev/rasops/rasops.h
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/rasops/rasops1-4_putchar.h
cvs rdiff -u -r1.36 -r1.37 src/sys/dev/rasops/rasops1.c
cvs rdiff -u -r1.37 -r1.38 src/sys/dev/rasops/rasops15.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/rasops/rasops1_putchar_width.h
cvs rdiff -u -r1.31 -r1.32 src/sys/dev/rasops/rasops2.c
cvs rdiff -u -r1.48 -r1.49 src/sys/dev/rasops/rasops24.c
cvs rdiff -u -r1.44 -r1.45 src/sys/dev/rasops/rasops32.c
cvs rdiff -u -r1.26 -r1.27 src/sys/dev/rasops/rasops4.c
cvs rdiff -u -r1.49 -r1.50 src/sys/dev/rasops/rasops8.c
cvs rdiff -u -r1.24 -r1.25 src/sys/dev/rasops/rasops_bitops.h
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/rasops/rasops_masks.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/rasops/rasops_masks.h
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/rasops/rasops_putchar.h
cvs rdiff -u -r1.13 -r1.14 src/sys/dev/rasops/rasops_putchar_width.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/rasops/rasops.c
diff -u src/sys/dev/rasops/rasops.c:1.121 src/sys/dev/rasops/rasops.c:1.122
--- src/sys/dev/rasops/rasops.c:1.121	Sat Aug 10 01:20:47 2019
+++ src/sys/dev/rasops/rasops.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/*	 $NetBSD: rasops.c,v 1.121 2019/08/10 01:20:47 rin Exp $	*/
+/*	 $NetBSD: rasops.c,v 1.122 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,20 +30,17 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.121 2019/08/10 01:20:47 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops.c,v 1.122 2019/08/10 01:24:17 rin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_rasops.h"
 #include "opt_wsmsgattrs.h"
-#endif
-
 #include "rasops_glue.h"
+#endif
 
 #include <sys/param.h>
 #include <sys/bswap.h>
 #include <sys/kmem.h>
-#include <sys/systm.h>
-#include <sys/time.h>
 
 #include <machine/endian.h>
 
@@ -202,6 +199,10 @@ static int	rasops_allocattr_color(void *
 static int	rasops_allocattr_mono(void *, int, int, int, long *);
 static void	rasops_do_cursor(struct rasops_info *);
 static void	rasops_init_devcmap(struct rasops_info *);
+static void	rasops_make_box_chars_8(struct rasops_info *);
+static void	rasops_make_box_chars_16(struct rasops_info *);
+static void	rasops_make_box_chars_32(struct rasops_info *);
+static void	rasops_make_box_chars_alpha(struct rasops_info *);
 
 #if NRASOPS_ROTATION > 0
 static void	rasops_rotate_font(int *, int);
@@ -233,11 +234,6 @@ struct rotatedfont {
 };
 #endif	/* NRASOPS_ROTATION > 0 */
 
-void	rasops_make_box_chars_8(struct rasops_info *);
-void	rasops_make_box_chars_16(struct rasops_info *);
-void	rasops_make_box_chars_32(struct rasops_info *);
-void	rasops_make_box_chars_alpha(struct rasops_info *);
-
 /*
  * Initialize a 'rasops_info' descriptor.
  */
@@ -623,6 +619,7 @@ rasops_allocattr_color(void *cookie, int
 	fg &= 7;
 	bg &= 7;
 #endif
+
 	if ((flg & WSATTR_BLINK) != 0)
 		return EINVAL;
 
@@ -691,8 +688,8 @@ static void
 rasops_copyrows(void *cookie, int src, int dst, int num)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
+	int stride;
 	uint8_t *sp, *dp, *hp;
-	int n, stride;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -720,12 +717,10 @@ rasops_copyrows(void *cookie, int src, i
 		return;
 #endif
 
-	num *= ri->ri_font->fontheight;
-	n = ri->ri_emustride;
-	stride = ri->ri_stride;
-
 	src *= ri->ri_yscale;
 	dst *= ri->ri_yscale;
+	num *= ri->ri_font->fontheight;
+	stride = ri->ri_stride;
 
 	if (src < dst) {
 		/* backward copy */
@@ -740,12 +735,12 @@ rasops_copyrows(void *cookie, int src, i
 		hp = ri->ri_hwbits + dst;
 
 	while (num--) {
-		memcpy(dp, sp, n);
-		sp += stride;
+		memcpy(dp, sp, ri->ri_emustride);
 		if (ri->ri_hwbits) {
-			memcpy(hp, dp, n);
+			memcpy(hp, dp, ri->ri_emustride);
 			hp += stride;
 		}
+		sp += stride;
 		dp += stride;
 	}
 }
@@ -760,8 +755,8 @@ static void
 rasops_copycols(void *cookie, int row, int src, int dst, int num)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	uint8_t *sp, *dp, *hp;
 	int height;
+	uint8_t *sp, *dp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -793,9 +788,9 @@ rasops_copycols(void *cookie, int row, i
 		return;
 #endif
 
-	num *= ri->ri_xscale;
-	row *= ri->ri_yscale;
 	height = ri->ri_font->fontheight;
+	row *= ri->ri_yscale;
+	num *= ri->ri_xscale;
 
 	sp = ri->ri_bits + row + src * ri->ri_xscale;
 	dp = ri->ri_bits + row + dst * ri->ri_xscale;
@@ -808,8 +803,8 @@ rasops_copycols(void *cookie, int row, i
 			memcpy(hp, dp, num);
 			hp += ri->ri_stride;
 		}
-		dp += ri->ri_stride;
 		sp += ri->ri_stride;
+		dp += ri->ri_stride;
 	}
 }
 
@@ -829,16 +824,16 @@ rasops_cursor(void *cookie, int on, int 
 			ri->ri_do_cursor(ri);
 
 	/* Select new cursor */
+	ri->ri_crow = row;
+	ri->ri_ccol = col;
+
 #ifdef RASOPS_CLIPPING
 	ri->ri_flg &= ~RI_CURSORCLIP;
-
 	if (row < 0 || row >= ri->ri_rows)
 		ri->ri_flg |= RI_CURSORCLIP;
 	else if (col < 0 || col >= ri->ri_cols)
 		ri->ri_flg |= RI_CURSORCLIP;
 #endif
-	ri->ri_crow = row;
-	ri->ri_ccol = col;
 
 	if (on) {
 		ri->ri_flg |= RI_CURSOR;
@@ -954,7 +949,6 @@ rasops_init_devcmap(struct rasops_info *
 				    (c & 0x00ff00) |
 				    (c & 0xff0000) >> 16;
 			}
-
 			/*
 			 * No worries, we use generic routines only for
 			 * gray colors, where all 3 bytes are same.
@@ -991,8 +985,8 @@ void
 rasops_eraserows(void *cookie, int row, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	uint32_t *rp, *hp, clr;
-	int stride;
+	int bytes;
+	uint32_t bg, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -1009,8 +1003,6 @@ rasops_eraserows(void *cookie, int row, 
 		return;
 #endif
 
-	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
-
 	/*
 	 * XXX The wsdisplay_emulops interface seems a little deficient in
 	 * that there is no way to clear the *entire* screen. We provide a
@@ -1018,23 +1010,25 @@ rasops_eraserows(void *cookie, int row, 
 	 * 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;
+		bytes = ri->ri_stride;
 		num = ri->ri_height;
 		rp = (uint32_t *)ri->ri_origbits;
 		if (ri->ri_hwbits)
 			hp = (uint32_t *)ri->ri_hworigbits;
 	} else {
-		stride = ri->ri_emustride;
+		bytes = ri->ri_emustride;
 		num *= ri->ri_font->fontheight;
 		rp = (uint32_t *)(ri->ri_bits + row * ri->ri_yscale);
 		if (ri->ri_hwbits)
 			hp = (uint32_t *)(ri->ri_hwbits + row * ri->ri_yscale);
 	}
 
+	bg = ATTR_BG(ri, attr);
+
 	while (num--) {
-		rasops_memset32(rp, clr, stride);
+		rasops_memset32(rp, bg, bytes);
 		if (ri->ri_hwbits) {
-			memcpy(hp, rp, stride);
+			memcpy(hp, rp, bytes);
 			DELTA(hp, ri->ri_stride, uint32_t *);
 		}
 		DELTA(rp, ri->ri_stride, uint32_t *);
@@ -1048,9 +1042,9 @@ rasops_eraserows(void *cookie, int row, 
 static void
 rasops_do_cursor(struct rasops_info *ri)
 {
-	int full, height, cnt, slop1, slop2, row, col;
+	int row, col, height, slop1, slop2, full, cnt;
 	uint32_t mask1, mask2, *dp;
-	uint8_t tmp8, *rp, *hp;
+	uint8_t tmp, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -1075,11 +1069,12 @@ rasops_do_cursor(struct rasops_info *ri)
 		col = ri->ri_ccol;
 	}
 
-	rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
-	if (ri->ri_hwbits)
-		hp = ri->ri_hwbits + row * ri->ri_yscale + col * ri->ri_xscale;
 	height = ri->ri_font->fontheight;
 
+	rp = ri->ri_bits + FBOFFSET(ri, row, col);
+	if (ri->ri_hwbits)
+		hp = ri->ri_hwbits + FBOFFSET(ri, row, col);
+
 	/*
 	 * For ri_xscale = 1:
 	 *
@@ -1088,15 +1083,13 @@ rasops_do_cursor(struct rasops_info *ri)
 	 */
 	if (ri->ri_xscale == 1) {
 		while (height--) {
-			tmp8 = ~*rp;
-
-			*rp = tmp8;
-			rp += ri->ri_stride;
-
+			tmp = ~*rp;
+			*rp = tmp;
 			if (ri->ri_hwbits) {
-				*hp = tmp8;
+				*hp = tmp;
 				hp += ri->ri_stride;
 			}
+			rp += ri->ri_stride;
 		}
 		return;
 	}
@@ -1149,8 +1142,8 @@ void
 rasops_erasecols(void *cookie, int row, int col, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	int height, clr;
-	uint32_t *rp, *hp;
+	int height;
+	uint32_t bg, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -1170,16 +1163,17 @@ rasops_erasecols(void *cookie, int row, 
 		return;
 #endif
 
+	height = ri->ri_font->fontheight;
 	num *= ri->ri_xscale;
-	rp = (uint32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
+
+	rp = (uint32_t *)(ri->ri_bits + FBOFFSET(ri, row, col));
 	if (ri->ri_hwbits)
-		hp = (uint32_t *)(ri->ri_hwbits + row*ri->ri_yscale +
-		    col*ri->ri_xscale);
-	height = ri->ri_font->fontheight;
-	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+		hp = (uint32_t *)(ri->ri_hwbits + FBOFFSET(ri, row, col));
+
+	bg = ATTR_BG(ri, attr);
 
 	while (height--) {
-		rasops_memset32(rp, clr, num);
+		rasops_memset32(rp, bg, num);
 		if (ri->ri_hwbits) {
 			memcpy(hp, rp, num);
 			DELTA(hp, ri->ri_stride, uint32_t *);
@@ -1188,6 +1182,218 @@ rasops_erasecols(void *cookie, int row, 
 	}
 }
 
+void
+rasops_make_box_chars_16(struct rasops_info *ri)
+{
+	int c, i, mid;
+	uint16_t vert_mask, hmask_left, hmask_right;
+	uint16_t *data = (uint16_t *)ri->ri_optfont.data;
+
+	vert_mask = 0xc000U >> ((ri->ri_font->fontwidth >> 1) - 1);
+	hmask_left = 0xff00U << (8 - (ri->ri_font->fontwidth >> 1));
+	hmask_right = hmask_left >> ((ri->ri_font->fontwidth + 1) >> 1);
+	mid = (ri->ri_font->fontheight + 1) >> 1;
+
+	/* 0x00 would be empty anyway so don't bother */
+	for (c = 1; c < 16; c++) {
+		data += ri->ri_font->fontheight;
+		if (c & 1) {
+			/* upper segment */
+			for (i = 0; i < mid; i++)
+				data[i] = vert_mask;
+		}
+		if (c & 4) {
+			/* lower segment */
+			for (i = mid; i < ri->ri_font->fontheight; i++)
+				data[i] = vert_mask;
+		}
+		if (c & 2) {
+			/* right segment */
+			i = ri->ri_font->fontheight >> 1;
+			data[mid - 1] |= hmask_right;
+			data[mid] |= hmask_right;
+		}
+		if (c & 8) {
+			/* left segment */
+			data[mid - 1] |= hmask_left;
+			data[mid] |= hmask_left;
+		}
+	}
+}
+
+void
+rasops_make_box_chars_8(struct rasops_info *ri)
+{
+	int c, i, mid;
+	uint8_t vert_mask, hmask_left, hmask_right;
+	uint8_t *data = (uint8_t *)ri->ri_optfont.data;
+
+	vert_mask = 0xc0U >> ((ri->ri_font->fontwidth >> 1) - 1);
+	hmask_left = 0xf0U << (4 - (ri->ri_font->fontwidth >> 1));
+	hmask_right = hmask_left >> ((ri->ri_font->fontwidth + 1) >> 1);
+	mid = (ri->ri_font->fontheight + 1) >> 1;
+
+	/* 0x00 would be empty anyway so don't bother */
+	for (c = 1; c < 16; c++) {
+		data += ri->ri_font->fontheight;
+		if (c & 1) {
+			/* upper segment */
+			for (i = 0; i < mid; i++)
+				data[i] = vert_mask;
+		}
+		if (c & 4) {
+			/* lower segment */
+			for (i = mid; i < ri->ri_font->fontheight; i++)
+				data[i] = vert_mask;
+		}
+		if (c & 2) {
+			/* right segment */
+			i = ri->ri_font->fontheight >> 1;
+			data[mid - 1] |= hmask_right;
+			data[mid] |= hmask_right;
+		}
+		if (c & 8) {
+			/* left segment */
+			data[mid - 1] |= hmask_left;
+			data[mid] |= hmask_left;
+		}
+	}
+}
+
+void
+rasops_make_box_chars_32(struct rasops_info *ri)
+{
+	int c, i, mid;
+	uint32_t vert_mask, hmask_left, hmask_right;
+	uint32_t *data = (uint32_t *)ri->ri_optfont.data;
+
+	vert_mask = 0xc0000000U >> ((ri->ri_font->fontwidth >> 1) - 1);
+	hmask_left = 0xffff0000U << (16 - (ri->ri_font->fontwidth >> 1));
+	hmask_right = hmask_left >> ((ri->ri_font->fontwidth + 1) >> 1);
+	mid = (ri->ri_font->fontheight + 1) >> 1;
+
+	/* 0x00 would be empty anyway so don't bother */
+	for (c = 1; c < 16; c++) {
+		data += ri->ri_font->fontheight;
+		if (c & 1) {
+			/* upper segment */
+			for (i = 0; i < mid; i++)
+				data[i] = vert_mask;
+		}
+		if (c & 4) {
+			/* lower segment */
+			for (i = mid; i < ri->ri_font->fontheight; i++)
+				data[i] = vert_mask;
+		}
+		if (c & 2) {
+			/* right segment */
+			i = ri->ri_font->fontheight >> 1;
+			data[mid - 1] |= hmask_right;
+			data[mid] |= hmask_right;
+		}
+		if (c & 8) {
+			/* left segment */
+			data[mid - 1] |= hmask_left;
+			data[mid] |= hmask_left;
+		}
+	}
+}
+
+void
+rasops_make_box_chars_alpha(struct rasops_info *ri)
+{
+	int c, i, hmid, vmid, wi, he;
+	uint8_t *data = (uint8_t *)ri->ri_optfont.data;
+	uint8_t *ddata;
+
+	he = ri->ri_font->fontheight;
+	wi = ri->ri_font->fontwidth;
+	
+	vmid = (he + 1) >> 1;
+	hmid = (wi + 1) >> 1;
+
+	/* 0x00 would be empty anyway so don't bother */
+	for (c = 1; c < 16; c++) {
+		data += ri->ri_fontscale;
+		if (c & 1) {
+			/* upper segment */
+			ddata = data + hmid;
+			for (i = 0; i <= vmid; i++) {
+				*ddata = 0xff;
+				ddata += wi;
+			}
+		}
+		if (c & 4) {
+			/* lower segment */
+			ddata = data + wi * vmid + hmid;
+			for (i = vmid; i < he; i++) {
+				*ddata = 0xff;
+				ddata += wi;
+			}
+		}
+		if (c & 2) {
+			/* right segment */
+			ddata = data + wi * vmid + hmid;
+			for (i = hmid; i < wi; i++) {
+				*ddata = 0xff;
+				ddata++;
+			}
+		}
+		if (c & 8) {
+			/* left segment */
+			ddata = data + wi * vmid;
+			for (i = 0; i <= hmid; i++) {
+				*ddata = 0xff;
+				ddata++;
+			}
+		}
+	}
+}
+ 
+/*
+ * Return a colour map appropriate for the given struct rasops_info in the
+ * same form used by rasops_cmap[]
+ * For now this is either a copy of rasops_cmap[] or an R3G3B2 map, it should
+ * probably be a linear ( or gamma corrected? ) ramp for higher depths.
+ */
+int
+rasops_get_cmap(struct rasops_info *ri, uint8_t *palette, size_t bytes)
+{
+
+	if ((ri->ri_depth == 8) && ((ri->ri_flg & RI_8BIT_IS_RGB) != 0)) {
+		/* generate an R3G3B2 palette */
+		int i, idx = 0;
+		uint8_t tmp;
+
+		if (bytes < 256 * 3)
+			return EINVAL;
+		for (i = 0; i < 256; i++) {
+			tmp = i & 0xe0;
+			/*
+			 * replicate bits so 0xe0 maps to a red value of 0xff
+			 * in order to make white look actually white
+			 */
+			tmp |= (tmp >> 3) | (tmp >> 6);
+			palette[idx] = tmp;
+			idx++;
+
+			tmp = (i & 0x1c) << 3;
+			tmp |= (tmp >> 3) | (tmp >> 6);
+			palette[idx] = tmp;
+			idx++;
+
+			tmp = (i & 0x03) << 6;
+			tmp |= tmp >> 2;
+			tmp |= tmp >> 4;
+			palette[idx] = tmp;
+			idx++;
+		}
+	} else
+		memcpy(palette, rasops_cmap, uimin(bytes, sizeof(rasops_cmap)));
+
+	return 0;
+}
+
 #if NRASOPS_ROTATION > 0
 /*
  * Quarter clockwise rotation routines (originally intended for the
@@ -1232,8 +1438,7 @@ static void
 rasops_copychar(void *cookie, int srcrow, int dstrow, int srccol, int dstcol)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	int height;
-	int r_srcrow, r_dstrow, r_srccol, r_dstcol;
+	int r_srcrow, r_dstrow, r_srccol, r_dstcol, height;
 	uint8_t *sp, *dp;
 
 	r_srcrow = srccol;
@@ -1260,7 +1465,7 @@ rasops_putchar_rotated_cw(void *cookie, 
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	int height;
-	uint8_t *rp;
+	uint16_t fg, *rp;
 
 	if (__predict_false((unsigned int)row > ri->ri_rows ||
 	    (unsigned int)col > ri->ri_cols))
@@ -1274,19 +1479,21 @@ rasops_putchar_rotated_cw(void *cookie, 
 	ri->ri_real_ops.putchar(cookie, col, ri->ri_rows - row - 1, uc,
 	    attr & ~WSATTR_UNDERLINE);
 
-	/* Do rotated underline */
-	rp = ri->ri_bits + col * ri->ri_yscale + (ri->ri_rows - row - 1) * 
-	    ri->ri_xscale;
-	height = ri->ri_font->fontheight;
-
-	/* XXX this assumes 16-bit color depth */
+	/*
+	 * Do rotated underline
+	 * XXX this assumes 16-bit color depth
+	 */
 	if ((attr & WSATTR_UNDERLINE) != 0) {
-		uint16_t c =
-		    (uint16_t)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
+		height = ri->ri_font->fontheight;
+
+		rp = (uint16_t *)(ri->ri_bits + col * ri->ri_yscale +
+		    (ri->ri_rows - row - 1) * ri->ri_xscale);
+
+		fg = (uint16_t)ATTR_FG(ri, attr);
 
 		while (height--) {
-			*(uint16_t *)rp = c;
-			rp += ri->ri_stride;
+			*rp = fg;
+			DELTA(rp, ri->ri_stride, uint16_t *);
 		}
 	}
 }
@@ -1355,7 +1562,7 @@ rasops_copychar_ccw(void *cookie, int sr
     int dstcol)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	int height, r_srcrow, r_dstrow, r_srccol, r_dstcol;
+	int r_srcrow, r_dstrow, r_srccol, r_dstcol, height;
 	uint8_t *sp, *dp;
 
 	r_srcrow = ri->ri_cols - srccol - 1;
@@ -1382,7 +1589,7 @@ rasops_putchar_rotated_ccw(void *cookie,
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	int height;
-	uint8_t *rp;
+	uint16_t fg, *rp;
 
 	if (__predict_false((unsigned int)row > ri->ri_rows ||
 	    (unsigned int)col > ri->ri_cols))
@@ -1396,20 +1603,23 @@ rasops_putchar_rotated_ccw(void *cookie,
 	ri->ri_real_ops.putchar(cookie, ri->ri_cols - col - 1, row, uc,
 	    attr & ~WSATTR_UNDERLINE);
 
-	/* Do rotated underline */
-	rp = ri->ri_bits + (ri->ri_cols - col - 1) * ri->ri_yscale +
-	    row * ri->ri_xscale +
-	    (ri->ri_font->fontwidth - 1) * ri->ri_pelbytes;
-	height = ri->ri_font->fontheight;
-
-	/* XXX this assumes 16-bit color depth */
+	/*
+	 * Do rotated underline
+	 * XXX this assumes 16-bit color depth
+	 */
 	if ((attr & WSATTR_UNDERLINE) != 0) {
-		uint16_t c =
-		    (uint16_t)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
+		height = ri->ri_font->fontheight;
+
+		rp = (uint16_t *)(ri->ri_bits +
+		    (ri->ri_cols - col - 1) * ri->ri_yscale +
+		    row * ri->ri_xscale +
+		    (ri->ri_font->fontwidth - 1) * ri->ri_pelbytes);
+
+		fg = (uint16_t)ATTR_FG(ri, attr);
 
 		while (height--) {
-			*(uint16_t *)rp = c;
-			rp += ri->ri_stride;
+			*rp = fg;
+			DELTA(rp, ri->ri_stride, uint16_t *);
 		}
 	}
 }
@@ -1448,214 +1658,3 @@ rasops_copycols_rotated_ccw(void *cookie
 			    src + coff, dst + coff);
 }
 #endif	/* NRASOPS_ROTATION */
-
-void
-rasops_make_box_chars_16(struct rasops_info *ri)
-{
-	int c, i, mid;
-	uint16_t vert_mask, hmask_left, hmask_right;
-	uint16_t *data = (uint16_t *)ri->ri_optfont.data;
-
-	vert_mask = 0xc000U >> ((ri->ri_font->fontwidth >> 1) - 1);
-	hmask_left = 0xff00U << (8 - (ri->ri_font->fontwidth >> 1));
-	hmask_right = hmask_left >> ((ri->ri_font->fontwidth + 1) >> 1);
-	mid = (ri->ri_font->fontheight + 1) >> 1;
-
-	/* 0x00 would be empty anyway so don't bother */
-	for (c = 1; c < 16; c++) {
-		data += ri->ri_font->fontheight;
-		if (c & 1) {
-			/* upper segment */
-			for (i = 0; i < mid; i++)
-				data[i] = vert_mask;
-		}
-		if (c & 4) {
-			/* lower segment */
-			for (i = mid; i < ri->ri_font->fontheight; i++)
-				data[i] = vert_mask;
-		}
-		if (c & 2) {
-			/* right segment */
-			i = ri->ri_font->fontheight >> 1;
-			data[mid - 1] |= hmask_right;
-			data[mid] |= hmask_right;
-		}
-		if (c & 8) {
-			/* left segment */
-			data[mid - 1] |= hmask_left;
-			data[mid] |= hmask_left;
-		}
-	}
-}
-
-void
-rasops_make_box_chars_8(struct rasops_info *ri)
-{
-	int c, i, mid;
-	uint8_t vert_mask, hmask_left, hmask_right;
-	uint8_t *data = (uint8_t *)ri->ri_optfont.data;
-
-	vert_mask = 0xc0U >> ((ri->ri_font->fontwidth >> 1) - 1);
-	hmask_left = 0xf0U << (4 - (ri->ri_font->fontwidth >> 1));
-	hmask_right = hmask_left >> ((ri->ri_font->fontwidth + 1) >> 1);
-	mid = (ri->ri_font->fontheight + 1) >> 1;
-
-	/* 0x00 would be empty anyway so don't bother */
-	for (c = 1; c < 16; c++) {
-		data += ri->ri_font->fontheight;
-		if (c & 1) {
-			/* upper segment */
-			for (i = 0; i < mid; i++)
-				data[i] = vert_mask;
-		}
-		if (c & 4) {
-			/* lower segment */
-			for (i = mid; i < ri->ri_font->fontheight; i++)
-				data[i] = vert_mask;
-		}
-		if (c & 2) {
-			/* right segment */
-			i = ri->ri_font->fontheight >> 1;
-			data[mid - 1] |= hmask_right;
-			data[mid] |= hmask_right;
-		}
-		if (c & 8) {
-			/* left segment */
-			data[mid - 1] |= hmask_left;
-			data[mid] |= hmask_left;
-		}
-	}
-}
-
-void
-rasops_make_box_chars_32(struct rasops_info *ri)
-{
-	int c, i, mid;
-	uint32_t vert_mask, hmask_left, hmask_right;
-	uint32_t *data = (uint32_t *)ri->ri_optfont.data;
-
-	vert_mask = 0xc0000000U >> ((ri->ri_font->fontwidth >> 1) - 1);
-	hmask_left = 0xffff0000U << (16 - (ri->ri_font->fontwidth >> 1));
-	hmask_right = hmask_left >> ((ri->ri_font->fontwidth + 1) >> 1);
-	mid = (ri->ri_font->fontheight + 1) >> 1;
-
-	/* 0x00 would be empty anyway so don't bother */
-	for (c = 1; c < 16; c++) {
-		data += ri->ri_font->fontheight;
-		if (c & 1) {
-			/* upper segment */
-			for (i = 0; i < mid; i++)
-				data[i] = vert_mask;
-		}
-		if (c & 4) {
-			/* lower segment */
-			for (i = mid; i < ri->ri_font->fontheight; i++)
-				data[i] = vert_mask;
-		}
-		if (c & 2) {
-			/* right segment */
-			i = ri->ri_font->fontheight >> 1;
-			data[mid - 1] |= hmask_right;
-			data[mid] |= hmask_right;
-		}
-		if (c & 8) {
-			/* left segment */
-			data[mid - 1] |= hmask_left;
-			data[mid] |= hmask_left;
-		}
-	}
-}
-
-void
-rasops_make_box_chars_alpha(struct rasops_info *ri)
-{
-	int c, i, hmid, vmid, wi, he;
-	uint8_t *data = (uint8_t *)ri->ri_optfont.data;
-	uint8_t *ddata;
-
-	he = ri->ri_font->fontheight;
-	wi = ri->ri_font->fontwidth;
-	
-	vmid = (he + 1) >> 1;
-	hmid = (wi + 1) >> 1;
-
-	/* 0x00 would be empty anyway so don't bother */
-	for (c = 1; c < 16; c++) {
-		data += ri->ri_fontscale;
-		if (c & 1) {
-			/* upper segment */
-			ddata = data + hmid;
-			for (i = 0; i <= vmid; i++) {
-				*ddata = 0xff;
-				ddata += wi;
-			}
-		}
-		if (c & 4) {
-			/* lower segment */
-			ddata = data + wi * vmid + hmid;
-			for (i = vmid; i < he; i++) {
-				*ddata = 0xff;
-				ddata += wi;
-			}
-		}
-		if (c & 2) {
-			/* right segment */
-			ddata = data + wi * vmid + hmid;
-			for (i = hmid; i < wi; i++) {
-				*ddata = 0xff;
-				ddata++;
-			}
-		}
-		if (c & 8) {
-			/* left segment */
-			ddata = data + wi * vmid;
-			for (i = 0; i <= hmid; i++) {
-				*ddata = 0xff;
-				ddata++;
-			}
-		}
-	}
-}
- 
-/*
- * Return a colour map appropriate for the given struct rasops_info in the
- * same form used by rasops_cmap[]
- * For now this is either a copy of rasops_cmap[] or an R3G3B2 map, it should
- * probably be a linear ( or gamma corrected? ) ramp for higher depths.
- */
-int
-rasops_get_cmap(struct rasops_info *ri, uint8_t *palette, size_t bytes)
-{
-
-	if ((ri->ri_depth == 8) && ((ri->ri_flg & RI_8BIT_IS_RGB) != 0)) {
-		/* generate an R3G3B2 palette */
-		int i, idx = 0;
-		uint8_t tmp;
-
-		if (bytes < 768)
-			return EINVAL;
-		for (i = 0; i < 256; i++) {
-			tmp = i & 0xe0;
-			/*
-			 * replicate bits so 0xe0 maps to a red value of 0xff
-			 * in order to make white look actually white
-			 */
-			tmp |= (tmp >> 3) | (tmp >> 6);
-			palette[idx] = tmp;
-			idx++;
-
-			tmp = (i & 0x1c) << 3;
-			tmp |= (tmp >> 3) | (tmp >> 6);
-			palette[idx] = tmp;
-			idx++;
-
-			tmp = (i & 0x03) << 6;
-			tmp |= tmp >> 2;
-			tmp |= tmp >> 4;
-			palette[idx] = tmp;
-			idx++;
-		}
-	} else
-		memcpy(palette, rasops_cmap, uimin(bytes, sizeof(rasops_cmap)));
-	return 0;
-}

Index: src/sys/dev/rasops/rasops.h
diff -u src/sys/dev/rasops/rasops.h:1.46 src/sys/dev/rasops/rasops.h:1.47
--- src/sys/dev/rasops/rasops.h:1.46	Wed Aug  7 16:14:51 2019
+++ src/sys/dev/rasops/rasops.h	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops.h,v 1.46 2019/08/07 16:14:51 rin Exp $ */
+/* 	$NetBSD: rasops.h,v 1.47 2019/08/10 01:24:17 rin Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -155,13 +155,14 @@ struct rasops_info {
 #endif
 };
 
-#define CHAR_IN_FONT(c,font) 					\
-       ((c) >= (font)->firstchar && 				\
-	((c) - (font)->firstchar) < (font)->numchars)
-
-#define PICK_FONT(ri, c) (((c & WSFONT_FLAGS_MASK) == WSFONT_FLAG_OPT) && \
-			  (ri->ri_optfont.data != NULL)) ? \
-			 &ri->ri_optfont : ri->ri_font
+#define CHAR_IN_FONT(c, font)						\
+	((c) >= (font)->firstchar &&					\
+	    (c) - (font)->firstchar < (font)->numchars)
+
+#define PICK_FONT(ri, c)						\
+	((((c) & WSFONT_FLAGS_MASK) == WSFONT_FLAG_OPT &&		\
+	    (ri)->ri_optfont.data != NULL) ?				\
+		&(ri)->ri_optfont : (ri)->ri_font)
 
 /*
  * rasops_init().
@@ -199,8 +200,14 @@ void	rasops15_init(struct rasops_info *)
 void	rasops24_init(struct rasops_info *);
 void	rasops32_init(struct rasops_info *);
 
+#define	ATTR_BG(ri, attr) ((ri)->ri_devcmap[((uint32_t)(attr) >> 16) & 0xf])
+#define	ATTR_FG(ri, attr) ((ri)->ri_devcmap[((uint32_t)(attr) >> 24) & 0xf])
+
 #define	DELTA(p, d, cast) ((p) = (cast)((uint8_t *)(p) + (d)))
 
+#define	FBOFFSET(ri, row, col)						\
+	((row) * (ri)->ri_yscale + (col) * (ri)->ri_xscale)
+
 #define	FONT_GLYPH(uc, font, ri)					\
 	((uint8_t *)(font)->data + ((uc) - ((font)->firstchar)) *	\
 	    (ri)->ri_fontscale)
@@ -245,7 +252,7 @@ rasops_memset32(void *p, uint32_t val, s
 }
 
 static __inline uint32_t
-be32uatoh(uint8_t *p)
+rasops_be32uatoh(uint8_t *p)
 {
 	uint32_t u;
 

Index: src/sys/dev/rasops/rasops1-4_putchar.h
diff -u src/sys/dev/rasops/rasops1-4_putchar.h:1.2 src/sys/dev/rasops/rasops1-4_putchar.h:1.3
--- src/sys/dev/rasops/rasops1-4_putchar.h:1.2	Fri Aug  9 12:05:51 2019
+++ src/sys/dev/rasops/rasops1-4_putchar.h	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops1-4_putchar.h,v 1.2 2019/08/09 12:05:51 rin Exp $ */
+/* $NetBSD: rasops1-4_putchar.h,v 1.3 2019/08/10 01:24:17 rin Exp $ */
 
 /* NetBSD: rasops_bitops.h,v 1.23 2019/08/02 04:39:09 rin Exp */
 /*-
@@ -61,13 +61,13 @@
 #else
 #define	PIXEL_OR(tmp)							\
 	do {								\
-		uint8_t c, av = *fr++;					\
-		if (av == 0xff)						\
+		uint8_t c, w = *fr++;					\
+		if (w == 0xff)						\
 			c = clr[1];					\
-		else if (av == 0)					\
+		else if (w == 0)					\
 			c = clr[0];					\
 		else							\
-			c = (av * clr[1] + (0xff - av) * clr[0]) >> 8;	\
+			c = (w * clr[1] + (0xff - w) * clr[0]) >> 8;	\
 		(tmp) |= c << (32 - PIXEL_BITS - bit);			\
 	} while (0 /* CONSTCOND */)
 #endif
@@ -88,10 +88,9 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, uc);
-	int full, cnt, bit;
-	uint32_t rs, bg, fg, lmask, rmask, lbg, rbg, clr[2];
-	uint32_t height, width;
-	uint32_t *rp, *bp, *hp, tmp;
+	int height, width, full, cnt, bit;
+	uint32_t bg, fg, lbg, rbg, clr[2], lmask, rmask, tmp;
+	uint32_t *rp, *bp, *hp;
 	uint8_t *fr;
 	bool space;
 
@@ -109,19 +108,20 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 		return;
 #endif
 
+	height = font->fontheight;
 	width = font->fontwidth << PIXEL_SHIFT;
 	col *= width;
-	height = font->fontheight;
+
 	rp = (uint32_t *)(ri->ri_bits + row * ri->ri_yscale +
 	    ((col >> 3) & ~3));
 	if (ri->ri_hwbits)
 		hp = (uint32_t *)(ri->ri_hwbits + row * ri->ri_yscale +
 		    ((col >> 3) & ~3));
+
 	col &= 31;
-	rs = ri->ri_stride;
 
-	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
-	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
+	bg = ATTR_BG(ri, attr);
+	fg = ATTR_FG(ri, attr);
 
 	/* If fg and bg match this becomes a space character */
 	if (uc == ' ' || __predict_false(fg == bg)) {
@@ -134,7 +134,6 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 
 	if (col + width <= 32) {
 		/* Single word, only one mask */
-
 		rmask = rasops_pmask[col][width & 31];
 		lmask = ~rmask;
 
@@ -143,18 +142,19 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 			while (height--) {
 				tmp = (*rp & lmask) | bg;
 				*rp = tmp;
-				DELTA(rp, rs, uint32_t *);
 				if (ri->ri_hwbits) {
 					*hp = tmp;
-					DELTA(hp, rs, uint32_t *);
+					DELTA(hp, ri->ri_stride, uint32_t *);
 				}
+				DELTA(rp, ri->ri_stride, uint32_t *);
 			}
 		} else {
 			clr[0] = bg & COLOR_MASK;
 			clr[1] = fg & COLOR_MASK;
+
 			while (height--) {
 #ifndef RASOPS_AA
-				uint32_t fb = be32uatoh(fr);
+				uint32_t fb = rasops_be32uatoh(fr);
 				fr += ri->ri_font->stride;
 #endif
 
@@ -167,10 +167,10 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 
 				if (ri->ri_hwbits) {
 					*hp = tmp;
-					DELTA(hp, rs, uint32_t *);
+					DELTA(hp, ri->ri_stride, uint32_t *);
 				}
 
-				DELTA(rp, rs, uint32_t *);
+				DELTA(rp, ri->ri_stride, uint32_t *);
 			}
 		}
 
@@ -196,12 +196,12 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 	}
 
 	/* Word boundary, two masks needed */
-
 	lmask = ~rasops_lmask[col];
 	rmask = ~rasops_rmask[(col + width) & 31];
 
 	if (lmask != -1)
 		width -= 32 - col;
+
 	full = width / 32;
 	width -= full * 32;
 
@@ -226,10 +226,10 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 			if (ri->ri_hwbits) {
 				memcpy(hp, rp, ((lmask != -1) + full +
 				    (rmask != -1)) << 2);
-				DELTA(hp, rs, uint32_t *);
+				DELTA(hp, ri->ri_stride, uint32_t *);
 			}
 
-			DELTA(rp, rs, uint32_t *);
+			DELTA(rp, ri->ri_stride, uint32_t *);
 		}
 	} else {
 		clr[0] = bg & COLOR_MASK;
@@ -239,7 +239,7 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 			bp = rp;
 
 #ifndef RASOPS_AA
-			uint32_t fb = be32uatoh(fr);
+			uint32_t fb = rasops_be32uatoh(fr);
 			fr += ri->ri_font->stride;
 #endif
 
@@ -268,10 +268,10 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 			if (ri->ri_hwbits) {
 				memcpy(hp, rp, ((lmask != -1) + full +
 				    (rmask != -1)) << 2);
-				DELTA(hp, rs, uint32_t *);
+				DELTA(hp, ri->ri_stride, uint32_t *);
 			}
 
-			DELTA(rp, rs, uint32_t *);
+			DELTA(rp, ri->ri_stride, uint32_t *);
 		}
 	}
 

Index: src/sys/dev/rasops/rasops1.c
diff -u src/sys/dev/rasops/rasops1.c:1.36 src/sys/dev/rasops/rasops1.c:1.37
--- src/sys/dev/rasops/rasops1.c:1.36	Fri Aug  9 12:05:51 2019
+++ src/sys/dev/rasops/rasops1.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops1.c,v 1.36 2019/08/09 12:05:51 rin Exp $	*/
+/* 	$NetBSD: rasops1.c,v 1.37 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,13 +30,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops1.c,v 1.36 2019/08/09 12:05:51 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops1.c,v 1.37 2019/08/10 01:24:17 rin Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_rasops.h"
+#endif
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
+
 #include <machine/endian.h>
 
 #include <dev/wscons/wsdisplayvar.h>
@@ -92,9 +93,9 @@ rasops1_putchar(void *cookie, int row, i
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, uc);
-	uint32_t fs, rs, fb, bg, fg, lmask, rmask;
-	uint32_t height, width;
-	uint32_t *rp, *hp, tmp, tmp0, tmp1;
+	int height, width;
+	uint32_t bg, fg, lbg, rbg, fb, lmask, rmask, tmp, tmp0, tmp1;
+	uint32_t *rp, *hp;
 	uint8_t *fr;
 	bool space;
 
@@ -112,34 +113,32 @@ rasops1_putchar(void *cookie, int row, i
 		return;
 #endif
 
-	col *= ri->ri_font->fontwidth;
+	height = font->fontheight;
+	width = font->fontwidth;
+	col *= width;
+
 	rp = (uint32_t *)(ri->ri_bits + row * ri->ri_yscale +
 	    ((col >> 3) & ~3));
 	if (ri->ri_hwbits)
 		hp = (uint32_t *)(ri->ri_hwbits + row * ri->ri_yscale +
 		    ((col >> 3) & ~3));
-	height = font->fontheight;
-	width = font->fontwidth;
+
 	col &= 31;
-	rs = ri->ri_stride;
 
-	bg = (attr & 0x000f0000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
-	fg = (attr & 0x0f000000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
+	bg = ATTR_BG(ri, attr);
+	fg = ATTR_FG(ri, attr);
 
 	/* If fg and bg match this becomes a space character */
-	if (uc == ' ' || fg == bg) {
+	if (uc == ' ' || __predict_false(fg == bg)) {
 		space = true;
 		fr = NULL;	/* XXX GCC */
-		fs = 0;		/* XXX GCC */
 	} else {
 		space = false;
 		fr = FONT_GLYPH(uc, font, ri);
-		fs = font->stride;
 	}
 
 	if (col + width <= 32) {
 		/* Single word, only one mask */
-
 		rmask = rasops_pmask[col][width & 31];
 		lmask = ~rmask;
 
@@ -148,26 +147,29 @@ rasops1_putchar(void *cookie, int row, i
 			while (height--) {
 				tmp = (*rp & lmask) | bg;
 				*rp = tmp;
-				DELTA(rp, rs, uint32_t *);
 				if (ri->ri_hwbits) {
 					*hp = tmp;
-					DELTA(hp, rs, uint32_t *);
+					DELTA(hp, ri->ri_stride, uint32_t *);
 				}
+				DELTA(rp, ri->ri_stride, uint32_t *);
 			}
 		} else {
 			while (height--) {
-				tmp = *rp & lmask;
-				fb = be32uatoh(fr);
-				fr += fs;
+				fb = rasops_be32uatoh(fr);
+				fr += font->stride;
 				if (bg)
 					fb = ~fb;
+
+				tmp = *rp & lmask;
 				tmp |= (MBE(fb >> col) & rmask);
 				*rp = tmp;
-				DELTA(rp, rs, uint32_t *);
+
 				if (ri->ri_hwbits) {
 					*hp = tmp;
-					DELTA(hp, rs, uint32_t *);
+					DELTA(hp, ri->ri_stride, uint32_t *);
 				}
+
+				DELTA(rp, ri->ri_stride, uint32_t *);
 			}
 		}
 
@@ -177,6 +179,7 @@ rasops1_putchar(void *cookie, int row, i
 			if (ri->ri_hwbits)
 				DELTA(hp, - ri->ri_stride * ri->ri_ul.off,
 				    uint32_t *);
+
 			for (height = ri->ri_ul.height; height; height--) {
 				DELTA(rp, - ri->ri_stride, uint32_t *);
 				tmp = (*rp & lmask) | (fg & rmask);
@@ -189,44 +192,53 @@ rasops1_putchar(void *cookie, int row, i
 		}
 	} else {
 		/* Word boundary, two masks needed */
-
 		lmask = ~rasops_lmask[col];
 		rmask = ~rasops_rmask[(col + width) & 31];
 
 		if (space) {
-			width = bg & ~rmask;
-			bg = bg & ~lmask;
+			lbg = bg & ~lmask;
+			rbg = bg & ~rmask;
+
 			while (height--) {
-				tmp0 = (rp[0] & lmask) | bg;
-				tmp1 = (rp[1] & rmask) | width;
+				tmp0 = (rp[0] & lmask) | lbg;
+				tmp1 = (rp[1] & rmask) | rbg;
+
 				rp[0] = tmp0;
 				rp[1] = tmp1;
-				DELTA(rp, rs, uint32_t *);
+
 				if (ri->ri_hwbits) {
 					hp[0] = tmp0;
 					hp[1] = tmp1;
-					DELTA(hp, rs, uint32_t *);
+					DELTA(hp, ri->ri_stride, uint32_t *);
 				}
+
+				DELTA(rp, ri->ri_stride, uint32_t *);
 			}
 		} else {
 			width = 32 - col;
+
 			while (height--) {
-				tmp0 = rp[0] & lmask;
-				tmp1 = rp[1] & rmask;
-				fb = be32uatoh(fr);
-				fr += fs;
+				fb = rasops_be32uatoh(fr);
+				fr += font->stride;
 				if (bg)
 					fb = ~fb;
+
+				tmp0 = rp[0] & lmask;
 				tmp0 |= MBE(fb >> col);
+
+				tmp1 = rp[1] & rmask;
 				tmp1 |= (MBE(fb << width) & ~rmask);
+
 				rp[0] = tmp0;
 				rp[1] = tmp1;
-				DELTA(rp, rs, uint32_t *);
+
 				if (ri->ri_hwbits) {
 					hp[0] = tmp0;
 					hp[1] = tmp1;
-					DELTA(hp, rs, uint32_t *);
+					DELTA(hp, ri->ri_stride, uint32_t *);
 				}
+
+				DELTA(rp, ri->ri_stride, uint32_t *);
 			}
 		}
 
@@ -236,6 +248,7 @@ rasops1_putchar(void *cookie, int row, i
 			if (ri->ri_hwbits)
 				DELTA(hp, - ri->ri_stride * ri->ri_ul.off,
 				    uint32_t *);
+
 			for (height = ri->ri_ul.height; height; height--) {
 				DELTA(rp, - ri->ri_stride, uint32_t *);
 				tmp0 = (rp[0] & lmask) | (fg & ~lmask);
@@ -253,13 +266,15 @@ rasops1_putchar(void *cookie, int row, i
 }
 
 #ifndef RASOPS_SMALL
-
+/*
+ * Width-optimized putchar functions
+ */
 #define	RASOPS_WIDTH	8
-#include "rasops1_putchar_width.h"
+#include <dev/rasops/rasops1_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	16
-#include "rasops1_putchar_width.h"
+#include <dev/rasops/rasops1_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #endif	/* !RASOPS_SMALL */

Index: src/sys/dev/rasops/rasops15.c
diff -u src/sys/dev/rasops/rasops15.c:1.37 src/sys/dev/rasops/rasops15.c:1.38
--- src/sys/dev/rasops/rasops15.c:1.37	Wed Aug  7 12:33:48 2019
+++ src/sys/dev/rasops/rasops15.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops15.c,v 1.37 2019/08/07 12:33:48 rin Exp $	*/
+/* 	$NetBSD: rasops15.c,v 1.38 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,13 +30,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops15.c,v 1.37 2019/08/07 12:33:48 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops15.c,v 1.38 2019/08/10 01:24:17 rin Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_rasops.h"
+#endif
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
 
 #include <dev/wscons/wsdisplayvar.h>
 #include <dev/wscons/wsconsio.h>
@@ -55,7 +55,7 @@ static void	rasops15_makestamp(struct ra
 #endif
 
 #ifndef RASOPS_SMALL
-/* 4x1 stamp for optimized character blitting */
+/* stamp for optimized character blitting */
 static uint32_t			stamp[32];
 static long			stamp_attr;
 static struct rasops_info	*stamp_ri;
@@ -114,11 +114,13 @@ rasops15_init(struct rasops_info *ri)
 #endif
 }
 
+/* rasops15_putchar */
 #undef	RASOPS_AA
-#include "rasops_putchar.h"
+#include <dev/rasops/rasops_putchar.h>
 
+/* rasops15_putchar_aa */
 #define	RASOPS_AA
-#include "rasops_putchar.h"
+#include <dev/rasops/rasops_putchar.h>
 #undef	RASOPS_AA
 
 #ifndef RASOPS_SMALL
@@ -128,14 +130,14 @@ rasops15_init(struct rasops_info *ri)
 static void
 rasops15_makestamp(struct rasops_info *ri, long attr)
 {
-	uint32_t fg, bg;
 	int i;
+	uint32_t bg, fg;
 
 	stamp_attr = attr;
 	stamp_ri = ri;
 
-	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xffff;
-	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffff;
+	bg = ATTR_BG(ri, attr) & 0xffff;
+	fg = ATTR_FG(ri, attr) & 0xffff;
 
 	for (i = 0; i < 32; i += 2) {
 #if BYTE_ORDER == LITTLE_ENDIAN
@@ -152,16 +154,19 @@ rasops15_makestamp(struct rasops_info *r
 	}
 }
 
+/*
+ * Width-optimized putchar functions
+ */
 #define	RASOPS_WIDTH	8
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	12
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	16
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #endif /* !RASOPS_SMALL */

Index: src/sys/dev/rasops/rasops1_putchar_width.h
diff -u src/sys/dev/rasops/rasops1_putchar_width.h:1.5 src/sys/dev/rasops/rasops1_putchar_width.h:1.6
--- src/sys/dev/rasops/rasops1_putchar_width.h:1.5	Fri Aug  9 12:05:51 2019
+++ src/sys/dev/rasops/rasops1_putchar_width.h	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops1_putchar_width.h,v 1.5 2019/08/09 12:05:51 rin Exp $ */
+/* $NetBSD: rasops1_putchar_width.h,v 1.6 2019/08/10 01:24:17 rin Exp $ */
 
 /* NetBSD: rasops1.c,v 1.28 2019/07/25 03:02:44 rin Exp */
 /*-
@@ -34,12 +34,9 @@
 #error "Width not supported"
 #endif
 
-#define	PUTCHAR_WIDTH1(width)	rasops1_putchar ## width
-#define	PUTCHAR_WIDTH(width)	PUTCHAR_WIDTH1(width)
-
 #if RASOPS_WIDTH == 8
-#define	COPY_UNIT	uint8_t
-#define	GET_GLYPH	tmp = fr[0]
+#define	SUBST_UNIT	uint8_t
+#define	GET_GLYPH(fr)	(fr)[0]
 #endif
 
 #if RASOPS_WIDTH == 16
@@ -47,25 +44,29 @@
  * rp and hp are always half-word aligned, whereas
  * fr may not be aligned in half-word boundary.
  */
-#define	COPY_UNIT	uint16_t
+#define	SUBST_UNIT	uint16_t
 #  if BYTE_ORDER == BIG_ENDIAN
-#define	GET_GLYPH	tmp = (fr[0] << 8) | fr[1]
+#define	GET_GLYPH(fr)	((fr)[0] << 8) | (fr)[1]
 #  else
-#define	GET_GLYPH	tmp = fr[0] | (fr[1] << 8)
+#define	GET_GLYPH(fr)	(fr)[0] | ((fr)[1] << 8)
 #  endif
 #endif /* RASOPS_WIDTH == 16 */
 
+#define	NAME(width)	NAME1(width)
+#define	NAME1(width)	rasops1_putchar ## width
+
 /*
  * Width-optimized putchar function.
  */
 static void
-PUTCHAR_WIDTH(RASOPS_WIDTH)(void *cookie, int row, int col, u_int uc, long attr)
+NAME(RASOPS_WIDTH)(void *cookie, int row, int col, u_int uc, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, uc);
-	int height, fs, rs, bg, fg;
+	int height;
+	uint32_t bg, fg;
 	uint8_t *fr;
-	COPY_UNIT *rp, *hp, tmp;
+	SUBST_UNIT tmp, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -81,63 +82,67 @@ PUTCHAR_WIDTH(RASOPS_WIDTH)(void *cookie
 		return;
 #endif
 
-	rp = (COPY_UNIT *)(ri->ri_bits + row * ri->ri_yscale +
-	    col * sizeof(COPY_UNIT));
-	if (ri->ri_hwbits)
-		hp = (COPY_UNIT *)(ri->ri_hwbits + row * ri->ri_yscale +
-		    col * sizeof(COPY_UNIT));
 	height = font->fontheight;
-	rs = ri->ri_stride;
 
-	bg = (attr & 0x000f0000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
-	fg = (attr & 0x0f000000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
+	rp = (SUBST_UNIT *)(ri->ri_bits + row * ri->ri_yscale +
+	    col * sizeof(SUBST_UNIT));
+	if (ri->ri_hwbits)
+		hp = (SUBST_UNIT *)(ri->ri_hwbits + row * ri->ri_yscale +
+		    col * sizeof(SUBST_UNIT));
+
+	bg = ATTR_BG(ri, attr);
+	fg = ATTR_FG(ri, attr);
 
 	/* If fg and bg match this becomes a space character */
-	if (uc == ' ' || fg == bg) {
+	if (uc == ' ' || __predict_false(fg == bg)) {
 		while (height--) {
 			*rp = bg;
-			DELTA(rp, rs, COPY_UNIT *);
 			if (ri->ri_hwbits) {
 				*hp = bg;
-				DELTA(hp, rs, COPY_UNIT *);
+				DELTA(hp, ri->ri_stride, SUBST_UNIT *);
 			}
+			DELTA(rp, ri->ri_stride, SUBST_UNIT *);
 		}
 	} else {
 		fr = FONT_GLYPH(uc, font, ri);
-		fs = font->stride;
 
 		while (height--) {
-			GET_GLYPH;
+			tmp = GET_GLYPH(fr);
+			fr += font->stride;
 			if (bg)
 				tmp = ~tmp;
+
 			*rp = tmp;
-			DELTA(rp, rs, COPY_UNIT *);
+
 			if (ri->ri_hwbits) {
 				*hp = tmp;
-				DELTA(hp, rs, COPY_UNIT *);
+				DELTA(hp, ri->ri_stride, SUBST_UNIT *);
 			}
-			fr += fs;
+
+			DELTA(rp, ri->ri_stride, SUBST_UNIT *);
 		}
 	}
 
 	/* Do underline */
 	if ((attr & WSATTR_UNDERLINE) != 0) {
-		DELTA(rp, - ri->ri_stride * ri->ri_ul.off, COPY_UNIT *);
+		DELTA(rp, - ri->ri_stride * ri->ri_ul.off, SUBST_UNIT *);
 		if (ri->ri_hwbits)
-			DELTA(hp, - ri->ri_stride * ri->ri_ul.off, COPY_UNIT *);
+			DELTA(hp, - ri->ri_stride * ri->ri_ul.off,
+			    SUBST_UNIT *);
+
 		for (height = ri->ri_ul.height; height; height--) {
-			DELTA(rp, - ri->ri_stride, COPY_UNIT *);
+			DELTA(rp, - ri->ri_stride, SUBST_UNIT *);
 			*rp = fg;
 			if (ri->ri_hwbits) {
-				DELTA(hp, - ri->ri_stride, COPY_UNIT *);
+				DELTA(hp, - ri->ri_stride, SUBST_UNIT *);
 				*hp = fg;
 			}
 		}
 	}
 }
 
-#undef	PUTCHAR_WIDTH1
-#undef	PUTCHAR_WIDTH
-
-#undef	COPY_UNIT
+#undef	SUBST_UNIT
 #undef	GET_GLYPH
+
+#undef	NAME
+#undef	NAME1

Index: src/sys/dev/rasops/rasops2.c
diff -u src/sys/dev/rasops/rasops2.c:1.31 src/sys/dev/rasops/rasops2.c:1.32
--- src/sys/dev/rasops/rasops2.c:1.31	Wed Aug  7 12:36:36 2019
+++ src/sys/dev/rasops/rasops2.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops2.c,v 1.31 2019/08/07 12:36:36 rin Exp $	*/
+/* 	$NetBSD: rasops2.c,v 1.32 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,13 +30,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops2.c,v 1.31 2019/08/07 12:36:36 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops2.c,v 1.32 2019/08/10 01:24:17 rin Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_rasops.h"
+#endif
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
+
 #include <machine/endian.h>
 
 #include <dev/wscons/wsdisplayvar.h>
@@ -60,7 +61,7 @@ static void	rasops2_makestamp(struct ras
 #endif
 
 #ifndef RASOPS_SMALL
-/* 4x1 stamp for optimized character blitting */
+/* stamp for optimized character blitting */
 static uint8_t			stamp[16];
 static long			stamp_attr;
 static struct rasops_info	*stamp_ri;
@@ -122,21 +123,22 @@ rasops2_init(struct rasops_info *ri)
 static void
 rasops2_makestamp(struct rasops_info *ri, long attr)
 {
-	int i, fg, bg;
+	int i;
+	uint32_t bg, fg;
 
 	stamp_attr = attr;
 	stamp_ri = ri;
 
-	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 3;
-	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 3;
+	bg = ATTR_BG(ri, attr) & 3;
+	fg = ATTR_FG(ri, attr) & 3;
 
 	for (i = 0; i < 16; i++) {
-#if BYTE_ORDER == BIG_ENDIAN
-#define NEED_LITTLE_ENDIAN_STAMP RI_BSWAP
+#if BYTE_ORDER == LITTLE_ENDIAN
+		if ((ri->ri_flg & RI_BSWAP) == 0)
 #else
-#define NEED_LITTLE_ENDIAN_STAMP 0
+		if ((ri->ri_flg & RI_BSWAP) != 0)
 #endif
-		if ((ri->ri_flg & RI_BSWAP) == NEED_LITTLE_ENDIAN_STAMP) {
+		{
 			/* littel endian */
 			stamp[i]  = (i & 8 ? fg : bg);
 			stamp[i] |= (i & 4 ? fg : bg) << 2;
@@ -152,28 +154,33 @@ rasops2_makestamp(struct rasops_info *ri
 	}
 }
 
+/*
+ * Width-optimized putchar functions
+ */
 #define	RASOPS_WIDTH	8
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	12
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	16
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #endif	/* !RASOPS_SMALL */
 
-/*
- * Grab routines common to depths where (bpp < 8)
- */
+/* rasops2_putchar */
 #undef	RASOPS_AA
-#include "rasops1-4_putchar.h"
+#include <dev/rasops/rasops1-4_putchar.h>
 
+/* rasops2_putchar_aa */
 #define	RASOPS_AA
-#include "rasops1-4_putchar.h"
+#include <dev/rasops/rasops1-4_putchar.h>
 #undef	RASOPS_AA
 
+/*
+ * Grab routines common to depths where (bpp < 8)
+ */
 #include <dev/rasops/rasops_bitops.h>

Index: src/sys/dev/rasops/rasops24.c
diff -u src/sys/dev/rasops/rasops24.c:1.48 src/sys/dev/rasops/rasops24.c:1.49
--- src/sys/dev/rasops/rasops24.c:1.48	Wed Aug  7 12:33:48 2019
+++ src/sys/dev/rasops/rasops24.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops24.c,v 1.48 2019/08/07 12:33:48 rin Exp $	*/
+/* 	$NetBSD: rasops24.c,v 1.49 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,16 +30,16 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.48 2019/08/07 12:33:48 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.49 2019/08/10 01:24:17 rin Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_rasops.h"
+#endif
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
+#include <sys/bswap.h>
 
 #include <machine/endian.h>
-#include <sys/bswap.h>
 
 #include <dev/wscons/wsdisplayvar.h>
 #include <dev/wscons/wsconsio.h>
@@ -63,7 +63,7 @@ static void	rasops24_makestamp(struct ra
 #endif
 
 #ifndef RASOPS_SMALL
-/* 4x1 stamp for optimized character blitting */
+/* stamp for optimized character blitting */
 static uint32_t			stamp[64];
 static long			stamp_attr;
 static struct rasops_info	*stamp_ri;
@@ -125,11 +125,13 @@ rasops24_init(struct rasops_info *ri)
 #endif
 }
 
+/* rasops24_putchar */
 #undef	RASOPS_AA
-#include "rasops_putchar.h"
+#include <dev/rasops/rasops_putchar.h>
 
+/* rasops24_putchar_aa */
 #define	RASOPS_AA
-#include "rasops_putchar.h"
+#include <dev/rasops/rasops_putchar.h>
 #undef	RASOPS_AA
 
 static __inline void
@@ -160,14 +162,14 @@ rasops24_makestamp1(struct rasops_info *
 static void
 rasops24_makestamp(struct rasops_info *ri, long attr)
 {
-	uint32_t fg, bg, c1, c2, c3, c4;
 	int i;
+	uint32_t bg, fg, c1, c2, c3, c4;
 
 	stamp_attr = attr;
 	stamp_ri = ri;
 
-	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xffffff;
-	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff;
+	bg = ATTR_BG(ri, attr) & 0xffffff;
+	fg = ATTR_FG(ri, attr) & 0xffffff;
 
 	for (i = 0; i < 64; i += 4) {
 #if BYTE_ORDER == LITTLE_ENDIAN
@@ -185,16 +187,19 @@ rasops24_makestamp(struct rasops_info *r
 	}
 }
 
+/*
+ * Width-optimized putchar functions
+ */
 #define	RASOPS_WIDTH	8
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	12
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	16
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #endif	/* !RASOPS_SMALL */
@@ -206,8 +211,9 @@ static void
 rasops24_eraserows(void *cookie, int row, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	int full, slop, cnt, stride;
-	uint32_t *rp, *dp, *hp, clr, xstamp[3];
+	int bytes, full, slop, cnt;
+	uint32_t bg, xstamp[3];
+	uint32_t *dp, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -233,8 +239,8 @@ rasops24_eraserows(void *cookie, int row
 		return;
 #endif
 
-	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff;
-	rasops24_makestamp1(ri, xstamp, clr, clr, clr, clr);
+	bg = ATTR_BG(ri, attr) & 0xffffff;
+	rasops24_makestamp1(ri, xstamp, bg, bg, bg, bg);
 
 	/*
 	 * XXX the wsdisplay_emulops interface seems a little deficient in
@@ -243,35 +249,37 @@ rasops24_eraserows(void *cookie, int row
 	 * 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;
+		bytes = ri->ri_stride;
 		num = ri->ri_height;
 		rp = (uint32_t *)ri->ri_origbits;
 		if (ri->ri_hwbits)
 			hp = (uint32_t *)ri->ri_hworigbits;
 	} else {
-		stride = ri->ri_emustride;
+		bytes = ri->ri_emustride;
 		num *= ri->ri_font->fontheight;
 		rp = (uint32_t *)(ri->ri_bits + row * ri->ri_yscale);
 		if (ri->ri_hwbits)
 			hp = (uint32_t *)(ri->ri_hwbits + row * ri->ri_yscale);
 	}
 
-	full = stride / (4 * 3);
-	slop = (stride - full * (4 * 3)) / 4;
+	full = bytes / (4 * 3);
+	slop = (bytes - full * (4 * 3)) / 4;
 
 	while (num--) {
 		dp = rp;
+
 		for (cnt = full; cnt; cnt--) {
 			dp[0] = xstamp[0];
 			dp[1] = xstamp[1];
 			dp[2] = xstamp[2];
 			dp += 3;
 		}
+
 		for (cnt = 0; cnt < slop; cnt++)
 			*dp++ = xstamp[cnt];
 
 		if (ri->ri_hwbits) {
-			memcpy(hp, rp, stride);
+			memcpy(hp, rp, bytes);
 			DELTA(hp, ri->ri_stride, uint32_t *);
 		}
 
@@ -286,9 +294,10 @@ static void
 rasops24_erasecols(void *cookie, int row, int col, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	int height, cnt, slop1, slop2, full;
-	uint32_t clr, xstamp[3], *dp;
-	uint8_t *rp, *hp, *dbp;
+	int height, slop1, slop2, full, cnt;
+	uint32_t bg, xstamp[3];
+	uint32_t *dp;
+	uint8_t *bp, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -318,15 +327,15 @@ rasops24_erasecols(void *cookie, int row
 		return;
 #endif
 
+	height = ri->ri_font->fontheight;
+	num *= ri->ri_xscale;
+
 	rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
 	if (ri->ri_hwbits)
 		hp = ri->ri_hwbits + row * ri->ri_yscale + col * ri->ri_xscale;
 
-	num *= ri->ri_xscale;
-	height = ri->ri_font->fontheight;
-
-	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xffffff;
-	rasops24_makestamp1(ri, xstamp, clr, clr, clr, clr);
+	bg = ATTR_BG(ri, attr) & 0xffffff;
+	rasops24_makestamp1(ri, xstamp, bg, bg, bg, bg);
 
 	/*
 	 * Align to word boundary by 24-bit-wise operations:
@@ -349,15 +358,15 @@ rasops24_erasecols(void *cookie, int row
 
 	while (height--) {
 		/* Align to word boundary */
-		dbp = rp;
+		bp = rp;
 		for (cnt = slop1; cnt; cnt -= 3) {
-			*dbp++ = (clr >> 16);
-			*dbp++ = (clr >> 8);
-			*dbp++ = clr;
+			*bp++ = (bg >> 16);
+			*bp++ = (bg >> 8);
+			*bp++ = bg;
 		}
 
 		/* 4 pels per loop */
-		dp = (uint32_t *)dbp;
+		dp = (uint32_t *)bp;
 		for (cnt = full; cnt; cnt--) {
 			dp[0] = xstamp[0];
 			dp[1] = xstamp[1];
@@ -366,11 +375,11 @@ rasops24_erasecols(void *cookie, int row
 		}
 
 		/* Trailing slop */
-		dbp = (uint8_t *)dp;
+		bp = (uint8_t *)dp;
 		for (cnt = slop2; cnt; cnt -= 3) {
-			*dbp++ = (clr >> 16);
-			*dbp++ = (clr >> 8);
-			*dbp++ = clr;
+			*bp++ = (bg >> 16);
+			*bp++ = (bg >> 8);
+			*bp++ = bg;
 		}
 
 		if (ri->ri_hwbits) {

Index: src/sys/dev/rasops/rasops32.c
diff -u src/sys/dev/rasops/rasops32.c:1.44 src/sys/dev/rasops/rasops32.c:1.45
--- src/sys/dev/rasops/rasops32.c:1.44	Wed Aug  7 12:33:48 2019
+++ src/sys/dev/rasops/rasops32.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/*	 $NetBSD: rasops32.c,v 1.44 2019/08/07 12:33:48 rin Exp $	*/
+/*	 $NetBSD: rasops32.c,v 1.45 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,13 +30,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.44 2019/08/07 12:33:48 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.45 2019/08/10 01:24:17 rin Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_rasops.h"
+#endif
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
 
 #include <dev/wscons/wsdisplayvar.h>
 #include <dev/wscons/wsconsio.h>
@@ -55,7 +55,7 @@ static void	rasops32_makestamp(struct ra
 #endif
 
 #ifndef RASOPS_SMALL
-/* 4x1 stamp for optimized character blitting */
+/* stamp for optimized character blitting */
 static uint32_t			stamp[64];
 static long			stamp_attr;
 static struct rasops_info	*stamp_ri;
@@ -115,11 +115,13 @@ rasops32_init(struct rasops_info *ri)
 #endif
 }
 
+/* rasops32_putchar */
 #undef	RASOPS_AA
-#include "rasops_putchar.h"
+#include <dev/rasops/rasops_putchar.h>
 
+/* rasops32_putchar_aa */
 #define	RASOPS_AA
-#include "rasops_putchar.h"
+#include <dev/rasops/rasops_putchar.h>
 #undef	RASOPS_AA
 
 #ifndef RASOPS_SMALL
@@ -135,8 +137,8 @@ rasops32_makestamp(struct rasops_info *r
 	stamp_attr = attr;
 	stamp_ri = ri;
 
-	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
-	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+	bg = ATTR_BG(ri, attr);
+	fg = ATTR_FG(ri, attr);
 
 	for (i = 0; i < 64; i += 4) {
 		stamp[i + 0] = i & 32 ? fg : bg;
@@ -146,16 +148,19 @@ rasops32_makestamp(struct rasops_info *r
 	}
 }
 
+/*
+ * Width-optimized putchar functions
+ */
 #define	RASOPS_WIDTH	8
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	12
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	16
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #endif /* !RASOPS_SMALL */

Index: src/sys/dev/rasops/rasops4.c
diff -u src/sys/dev/rasops/rasops4.c:1.26 src/sys/dev/rasops/rasops4.c:1.27
--- src/sys/dev/rasops/rasops4.c:1.26	Wed Aug  7 12:36:36 2019
+++ src/sys/dev/rasops/rasops4.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops4.c,v 1.26 2019/08/07 12:36:36 rin Exp $	*/
+/* 	$NetBSD: rasops4.c,v 1.27 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,13 +30,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops4.c,v 1.26 2019/08/07 12:36:36 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops4.c,v 1.27 2019/08/10 01:24:17 rin Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_rasops.h"
+#endif
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
+
 #include <machine/endian.h>
 
 #include <dev/wscons/wsdisplayvar.h>
@@ -59,7 +60,7 @@ static void	rasops4_makestamp(struct ras
 #endif
 
 #ifndef RASOPS_SMALL
-/* 4x1 stamp for optimized character blitting */
+/* stamp for optimized character blitting */
 static uint16_t			stamp[16];
 static long			stamp_attr;
 static struct rasops_info	*stamp_ri;
@@ -116,21 +117,22 @@ rasops4_init(struct rasops_info *ri)
 static void
 rasops4_makestamp(struct rasops_info *ri, long attr)
 {
-	int i, fg, bg;
+	int i;
+	uint32_t bg, fg;
 
 	stamp_attr = attr;
 	stamp_ri = ri;
 
-	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xf;
-	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xf;
+	bg = ATTR_BG(ri, attr) & 0xf;
+	fg = ATTR_FG(ri, attr) & 0xf;
 
 	for (i = 0; i < 16; i++) {
-#if BYTE_ORDER == BIG_ENDIAN
-#define NEED_LITTLE_ENDIAN_STAMP RI_BSWAP
+#if BYTE_ORDER == LITTLE_ENDIAN
+		if ((ri->ri_flg & RI_BSWAP) == 0)
 #else
-#define NEED_LITTLE_ENDIAN_STAMP 0
+		if ((ri->ri_flg & RI_BSWAP) != 0)
 #endif
-		if ((ri->ri_flg & RI_BSWAP) == NEED_LITTLE_ENDIAN_STAMP) {
+		{
 			/* little endian */
 			stamp[i]  = (i & 1 ? fg : bg) << 12;
 			stamp[i] |= (i & 2 ? fg : bg) << 8;
@@ -146,24 +148,28 @@ rasops4_makestamp(struct rasops_info *ri
 	}
 }
 
+/*
+ * Width-optimized putchar functions
+ */
 #define	RASOPS_WIDTH	8
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	12
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	16
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #endif	/* !RASOPS_SMALL */
 
+/* rasops4_putchar */
+#undef	RASOPS_AA
+#include <dev/rasops/rasops1-4_putchar.h>
+
 /*
  * Grab routines common to depths where (bpp < 8)
  */
-#undef	RASOPS_AA
-#include "rasops1-4_putchar.h"
-
 #include <dev/rasops/rasops_bitops.h>

Index: src/sys/dev/rasops/rasops8.c
diff -u src/sys/dev/rasops/rasops8.c:1.49 src/sys/dev/rasops/rasops8.c:1.50
--- src/sys/dev/rasops/rasops8.c:1.49	Wed Aug  7 12:33:48 2019
+++ src/sys/dev/rasops/rasops8.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops8.c,v 1.49 2019/08/07 12:33:48 rin Exp $	*/
+/* 	$NetBSD: rasops8.c,v 1.50 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,13 +30,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.49 2019/08/07 12:33:48 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.50 2019/08/10 01:24:17 rin Exp $");
 
+#ifdef _KERNEL_OPT
 #include "opt_rasops.h"
+#endif
 
 #include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/time.h>
 
 #include <dev/wscons/wsdisplayvar.h>
 #include <dev/wscons/wsconsio.h>
@@ -55,7 +55,7 @@ static void	rasops8_makestamp(struct ras
 #endif
 
 #ifndef RASOPS_SMALL
-/* 4x1 stamp for optimized character blitting */
+/* stamp for optimized character blitting */
 static uint32_t			stamp[16];
 static long			stamp_attr;
 static struct rasops_info	*stamp_ri;
@@ -113,36 +113,38 @@ rasops8_init(struct rasops_info *ri)
 #endif
 }
 
+/* rasops8_putchar */
 #undef	RASOPS_AA
-#include "rasops_putchar.h"
+#include <dev/rasops/rasops_putchar.h>
 
+/* rasops8_putchar_aa */
 #define	RASOPS_AA
-#include "rasops_putchar.h"
+#include <dev/rasops/rasops_putchar.h>
 #undef	RASOPS_AA
 
 #ifndef RASOPS_SMALL
 /*
- * Recompute the 4x1 blitting stamp.
+ * Recompute the blitting stamp.
  */
 static void
 rasops8_makestamp(struct rasops_info *ri, long attr)
 {
-	uint32_t fg, bg;
 	int i;
+	uint32_t bg, fg;
 
 	stamp_attr = attr;
 	stamp_ri = ri;
 
-	fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf] & 0xff;
-	bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf] & 0xff;
+	bg = ATTR_BG(ri, attr) & 0xff;
+	fg = ATTR_FG(ri, attr) & 0xff;
 
 	for (i = 0; i < 16; i++) {
-#if BYTE_ORDER == BIG_ENDIAN
-#define NEED_LITTLE_ENDIAN_STAMP RI_BSWAP
+#if BYTE_ORDER == LITTLE_ENDIAN
+		if ((ri->ri_flg & RI_BSWAP) == 0)
 #else
-#define NEED_LITTLE_ENDIAN_STAMP 0
+		if ((ri->ri_flg & RI_BSWAP) != 0)
 #endif
-		if ((ri->ri_flg & RI_BSWAP) == NEED_LITTLE_ENDIAN_STAMP) {
+		{
 			/* little endian */
 			stamp[i]  = (i & 8 ? fg : bg);
 			stamp[i] |= (i & 4 ? fg : bg) << 8;
@@ -158,16 +160,19 @@ rasops8_makestamp(struct rasops_info *ri
 	}
 }
 
+/*
+ * Width-optimized putchar functions
+ */
 #define	RASOPS_WIDTH	8
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	12
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
 #define	RASOPS_WIDTH	16
-#include "rasops_putchar_width.h"
+#include <dev/rasops/rasops_putchar_width.h>
 #undef	RASOPS_WIDTH
 
-#endif
+#endif /* !RASOPS_SMALL */

Index: src/sys/dev/rasops/rasops_bitops.h
diff -u src/sys/dev/rasops/rasops_bitops.h:1.24 src/sys/dev/rasops/rasops_bitops.h:1.25
--- src/sys/dev/rasops/rasops_bitops.h:1.24	Wed Aug  7 12:36:36 2019
+++ src/sys/dev/rasops/rasops_bitops.h	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops_bitops.h,v 1.24 2019/08/07 12:36:36 rin Exp $	*/
+/* 	$NetBSD: rasops_bitops.h,v 1.25 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -53,9 +53,9 @@ static void
 NAME(erasecols)(void *cookie, int row, int col, int num, long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	uint32_t lclr, rclr, clr;
-	uint32_t *dp, *rp, *hp, tmp, lmask, rmask;
 	int height, cnt;
+	uint32_t bg, lbg, rbg, lmask, rmask, tmp;
+	uint32_t *dp, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -75,30 +75,33 @@ NAME(erasecols)(void *cookie, int row, i
 		return;
 #endif
 
+	height = ri->ri_font->fontheight;
 	col *= ri->ri_font->fontwidth << PIXEL_SHIFT;
 	num *= ri->ri_font->fontwidth << PIXEL_SHIFT;
-	height = ri->ri_font->fontheight;
-	clr = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+
 	rp = (uint32_t *)(ri->ri_bits + row*ri->ri_yscale + ((col >> 3) & ~3));
 	if (ri->ri_hwbits)
 		hp = (uint32_t *)(ri->ri_hwbits + row*ri->ri_yscale +
 		    ((col >> 3) & ~3));
+
 	col &= 31;
 
+	bg = ATTR_BG(ri, attr);
+
 	if (col + num <= 32) {
 		lmask = ~rasops_pmask[col][num & 31];
-		lclr = clr & ~lmask;
+		bg &= ~lmask;
 
 		while (height--) {
-			dp = rp;
-			DELTA(rp, ri->ri_stride, uint32_t *);
+			tmp = (*rp & lmask) | bg;
+			*rp = tmp;
 
-			tmp = (*dp & lmask) | lclr;
-			*dp = tmp;
 			if (ri->ri_hwbits) {
 				*hp = tmp;
 				DELTA(hp, ri->ri_stride, uint32_t *);
 			}
+
+			DELTA(rp, ri->ri_stride, uint32_t *);
 		}
 	} else {
 		lmask = rasops_rmask[col];
@@ -109,28 +112,29 @@ NAME(erasecols)(void *cookie, int row, i
 		else
 			num = num >> 5;
 
-		lclr = clr & ~lmask;
-		rclr = clr & ~rmask;
+		lbg = bg & ~lmask;
+		rbg = bg & ~rmask;
 
 		while (height--) {
 			dp = rp;
 
 			if (lmask) {
-				*dp = (*dp & lmask) | lclr;
+				*dp = (*dp & lmask) | lbg;
 				dp++;
 			}
 
 			for (cnt = num; cnt > 0; cnt--)
-				*dp++ = clr;
+				*dp++ = bg;
 
 			if (rmask)
-				*dp = (*dp & rmask) | rclr;
+				*dp = (*dp & rmask) | rbg;
 
 			if (ri->ri_hwbits) {
 				memcpy(hp, rp, ((lmask != 0) + num +
 				    (rmask != 0)) << 2);
 				DELTA(hp, ri->ri_stride, uint32_t *);
 			}
+
 			DELTA(rp, ri->ri_stride, uint32_t *);
 		}
 	}
@@ -142,24 +146,28 @@ NAME(erasecols)(void *cookie, int row, i
 static void
 NAME(do_cursor)(struct rasops_info *ri)
 {
-	int height, row, col, num, cnt;
-	uint32_t *dp, *rp, *hp, tmp, lmask, rmask;
+	int row, col, height, width, cnt;
+	uint32_t lmask, rmask, tmp;
+	uint32_t *dp, *rp, *hp;
 
 	hp = NULL;	/* XXX GCC */
 
 	row = ri->ri_crow;
 	col = ri->ri_ccol * ri->ri_font->fontwidth << PIXEL_SHIFT;
+
 	height = ri->ri_font->fontheight;
-	num = ri->ri_font->fontwidth << PIXEL_SHIFT;
+	width = ri->ri_font->fontwidth << PIXEL_SHIFT;
+
 	rp = (uint32_t *)(ri->ri_bits + row * ri->ri_yscale +
 	    ((col >> 3) & ~3));
 	if (ri->ri_hwbits)
 		hp = (uint32_t *)(ri->ri_hwbits + row * ri->ri_yscale +
 		    ((col >> 3) & ~3));
+
 	col &= 31;
 
-	if (col + num <= 32) {
-		lmask = rasops_pmask[col][num & 31];
+	if (col + width <= 32) {
+		lmask = rasops_pmask[col][width & 31];
 
 		while (height--) {
 			tmp = *rp ^ lmask;
@@ -172,31 +180,29 @@ NAME(do_cursor)(struct rasops_info *ri)
 		}
 	} else {
 		lmask = ~rasops_rmask[col];
-		rmask = ~rasops_lmask[(col + num) & 31];
+		rmask = ~rasops_lmask[(col + width) & 31];
 
 		if (lmask != -1)
-			num = (num - (32 - col)) >> 5;
+			width = (width - (32 - col)) >> 5;
 		else
-			num = num >> 5;
+			width = width >> 5;
 
 		while (height--) {
 			dp = rp;
 
-			if (lmask != -1) {
-				*dp = *dp ^ lmask;
-				dp++;
-			}
+			if (lmask != -1)
+				*dp++ ^= lmask;
 
-			for (cnt = num; cnt; cnt--) {
+			for (cnt = width; cnt; cnt--) {
 				*dp = ~*dp;
 				dp++;
 			}
 
 			if (rmask != -1)
-				*dp = *dp ^ rmask;
+				*dp ^= rmask;
 
 			if (ri->ri_hwbits) {
-				memcpy(hp, rp, ((lmask != -1) + num +
+				memcpy(hp, rp, ((lmask != -1) + width +
 				    (rmask != -1)) << 2);
 				DELTA(hp, ri->ri_stride, uint32_t *);
 			}
@@ -213,16 +219,17 @@ static void
 NAME(copycols)(void *cookie, int row, int src, int dst, int num)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
-	int height, lnum, rnum, sb, db, cnt, full;
-	uint32_t tmp, lmask, rmask;
-	uint32_t *sp, *dp, *srp, *drp, *dhp, *hp;
+	int height, width, lnum, rnum, sb, db, full, cnt, sboff;
+	uint32_t lmask, rmask, tmp;
+	uint32_t *sp, *dp, *srp, *drp, *hp;
+	bool sbover;
 
-	dhp = hp = NULL;	/* XXX GCC */
+	hp = NULL;	/* XXX GCC */
 
-#ifdef RASOPS_CLIPPING
-	if (dst == src)
+	if (__predict_false(dst == src))
 		return;
 
+#ifdef RASOPS_CLIPPING
 	/* Catches < 0 case too */
 	if ((unsigned)row >= (unsigned)ri->ri_rows)
 		return;
@@ -247,12 +254,16 @@ NAME(copycols)(void *cookie, int row, in
 		return;
 #endif
 
-	cnt = ri->ri_font->fontwidth << PIXEL_SHIFT;
-	src *= cnt;
-	dst *= cnt;
-	num *= cnt;
-	row *= ri->ri_yscale;
 	height = ri->ri_font->fontheight;
+	width = ri->ri_font->fontwidth << PIXEL_SHIFT;
+
+	row *= ri->ri_yscale;
+
+	src *= width;
+	dst *= width;
+	num *= width;
+
+	sb = src & 31;
 	db = dst & 31;
 
 	if (db + num <= 32) {
@@ -260,16 +271,15 @@ NAME(copycols)(void *cookie, int row, in
 		srp = (uint32_t *)(ri->ri_bits + row + ((src >> 3) & ~3));
 		drp = (uint32_t *)(ri->ri_bits + row + ((dst >> 3) & ~3));
 		if (ri->ri_hwbits)
-			dhp = (uint32_t *)(ri->ri_hwbits + row +
+			hp = (uint32_t *)(ri->ri_hwbits + row +
 			    ((dst >> 3) & ~3));
-		sb = src & 31;
 
 		while (height--) {
 			GETBITS(srp, sb, num, tmp);
 			PUTBITS(tmp, db, num, drp);
 			if (ri->ri_hwbits) {
-				PUTBITS(tmp, db, num, dhp);
-				DELTA(dhp, ri->ri_stride, uint32_t *);
+				*hp = *drp;
+				DELTA(hp, ri->ri_stride, uint32_t *);
 			}	
 			DELTA(srp, ri->ri_stride, uint32_t *);
 			DELTA(drp, ri->ri_stride, uint32_t *);
@@ -283,27 +293,25 @@ NAME(copycols)(void *cookie, int row, in
 	lnum = (32 - db) & 31;
 	rnum = (dst + num) & 31;
 
-	if (lmask)
+	if (lmask != 0)
 		full = (num - lnum) >> 5;
 	else
 		full = num >> 5;
 
 	if (src < dst && src + num > dst) {
 		/* Copy right-to-left */
-		bool sbover;
-		int sboff;
-
 		srp = (uint32_t *)(ri->ri_bits + row +
 		    (((src + num) >> 3) & ~3));
 		drp = (uint32_t *)(ri->ri_bits + row +
 		    (((dst + num) >> 3) & ~3));
-		if (ri->ri_hwbits)
-			dhp = (uint32_t *)(ri->ri_hwbits + row +
+		if (ri->ri_hwbits) {
+			hp = (uint32_t *)(ri->ri_hwbits + row +
 			    (((dst + num) >> 3) & ~3));
+			hp -= (lmask != 0) + full;
+		}
 
-		sb = src & 31;
-		sbover = (sb + lnum) >= 32;
 		sboff = (src + num) & 31;
+		sbover = sb + lnum >= 32;
 		if ((sboff -= rnum) < 0) {
 			srp--;
 			sboff += 32;
@@ -313,7 +321,7 @@ NAME(copycols)(void *cookie, int row, in
 			sp = srp;
 			dp = drp;
 
-			if (rnum) {
+			if (rmask != 0) {
 				GETBITS(sp, sboff, rnum, tmp);
 				PUTBITS(tmp, 0, rnum, dp);
 			}
@@ -326,7 +334,7 @@ NAME(copycols)(void *cookie, int row, in
 				*dp = tmp;
 			}
 
-			if (lmask) {
+			if (lmask != 0) {
 				if (sbover)
 					--sp;
 				--dp;
@@ -335,11 +343,9 @@ NAME(copycols)(void *cookie, int row, in
  			}
 
 			if (ri->ri_hwbits) {
-				hp = dhp;
-				hp -= (lmask != 0) + full;
 				memcpy(hp, dp, ((lmask != 0) + full +
-				    (rnum != 0)) << 2);
-				DELTA(dhp, ri->ri_stride, uint32_t *);
+				    (rmask != 0)) << 2);
+				DELTA(hp, ri->ri_stride, uint32_t *);
 			}
 
 			DELTA(srp, ri->ri_stride, uint32_t *);
@@ -350,41 +356,41 @@ NAME(copycols)(void *cookie, int row, in
 		srp = (uint32_t *)(ri->ri_bits + row + ((src >> 3) & ~3));
 		drp = (uint32_t *)(ri->ri_bits + row + ((dst >> 3) & ~3));
 		if (ri->ri_hwbits)
-			dhp = (uint32_t *)(ri->ri_hwbits + row +
+			hp = (uint32_t *)(ri->ri_hwbits + row +
 			    ((dst >> 3) & ~3));
 
 		while (height--) {
-			sb = src & 31;
 			sp = srp;
 			dp = drp;
 
-			if (lmask) {
-				GETBITS(sp, sb, lnum, tmp);
+			sboff = sb;
+
+			if (lmask != 0) {
+				GETBITS(sp, sboff, lnum, tmp);
 				PUTBITS(tmp, db, lnum, dp);
 				dp++;
 
-				sb += lnum;
-				if (sb > 31) {
+				if ((sboff += lnum) > 31) {
 					sp++;
-					sb -= 32;
+					sboff -= 32;
 				}
 			}
 
 			/* Now aligned to 32-bits wrt dp */
 			for (cnt = full; cnt; cnt--, sp++) {
-				GETBITS(sp, sb, 32, tmp);
+				GETBITS(sp, sboff, 32, tmp);
 				*dp++ = tmp;
 			}
 
-			if (rmask) {
-				GETBITS(sp, sb, rnum, tmp);
+			if (rmask != 0) {
+				GETBITS(sp, sboff, rnum, tmp);
 				PUTBITS(tmp, 0, rnum, dp);
  			}
 
 			if (ri->ri_hwbits) {
-				memcpy(dhp, drp, ((lmask != 0) + full +
+				memcpy(hp, drp, ((lmask != 0) + full +
 				    (rmask != 0)) << 2);
-				DELTA(dhp, ri->ri_stride, uint32_t *);
+				DELTA(hp, ri->ri_stride, uint32_t *);
 			}
 
 			DELTA(srp, ri->ri_stride, uint32_t *);

Index: src/sys/dev/rasops/rasops_masks.c
diff -u src/sys/dev/rasops/rasops_masks.c:1.9 src/sys/dev/rasops/rasops_masks.c:1.10
--- src/sys/dev/rasops/rasops_masks.c:1.9	Mon Dec  2 14:05:51 2013
+++ src/sys/dev/rasops/rasops_masks.c	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops_masks.c,v 1.9 2013/12/02 14:05:51 tsutsui Exp $	*/
+/* 	$NetBSD: rasops_masks.c,v 1.10 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,12 +30,12 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops_masks.c,v 1.9 2013/12/02 14:05:51 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops_masks.c,v 1.10 2019/08/10 01:24:17 rin Exp $");
 
-#include "rasops_masks.h"
+#include <dev/rasops/rasops_masks.h>
 
 /* `ragged edge' bitmasks */
-const uint32_t rasops_lmask[32+1] = {
+const uint32_t rasops_lmask[32 + 1] = {
 	MBE(0x00000000), MBE(0x7fffffff), MBE(0x3fffffff), MBE(0x1fffffff),
 	MBE(0x0fffffff), MBE(0x07ffffff), MBE(0x03ffffff), MBE(0x01ffffff),
 	MBE(0x00ffffff), MBE(0x007fffff), MBE(0x003fffff), MBE(0x001fffff),
@@ -47,7 +47,7 @@ const uint32_t rasops_lmask[32+1] = {
 	MBE(0x00000000)
 };
 
-const uint32_t rasops_rmask[32+1] = {
+const uint32_t rasops_rmask[32 + 1] = {
 	MBE(0x00000000), MBE(0x80000000), MBE(0xc0000000), MBE(0xe0000000),
 	MBE(0xf0000000), MBE(0xf8000000), MBE(0xfc000000), MBE(0xfe000000),
 	MBE(0xff000000), MBE(0xff800000), MBE(0xffc00000), MBE(0xffe00000),

Index: src/sys/dev/rasops/rasops_masks.h
diff -u src/sys/dev/rasops/rasops_masks.h:1.8 src/sys/dev/rasops/rasops_masks.h:1.9
--- src/sys/dev/rasops/rasops_masks.h:1.8	Mon Dec  2 14:05:51 2013
+++ src/sys/dev/rasops/rasops_masks.h	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* 	$NetBSD: rasops_masks.h,v 1.8 2013/12/02 14:05:51 tsutsui Exp $	*/
+/* 	$NetBSD: rasops_masks.h,v 1.9 2019/08/10 01:24:17 rin Exp $	*/
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -33,6 +33,7 @@
 #define _RASOPS_MASKS_H_ 1
 
 #include <sys/types.h>
+
 #include <machine/endian.h>
 
 /*
@@ -71,25 +72,24 @@
 	dw = MBL(*(sp), (x));						\
 	if (((x) + (w)) > 32)						\
 		dw |= (MBR((sp)[1], 32 - (x))); 			\
-} while(0);
+} while (0 /* CONSTCOND */)
 
 /* Put a number of bits ( <= 32 ) from sw to *dp */
 #define PUTBITS(sw, x, w, dp) do {					\
 	int n = (x) + (w) - 32;						\
-									\
 	if (n <= 0) {							\
-		n = rasops_pmask[x & 31][w & 31];			\
-		*(dp) = (*(dp) & ~n) | (MBR(sw, x) & n);		\
+		uint32_t mask = rasops_pmask[(x) & 31][(w) & 31];	\
+		*(dp) = (*(dp) & ~mask) | (MBR(sw, x) & mask);		\
 	} else {							\
-		*(dp) = (*(dp) & rasops_rmask[x]) | (MBR((sw), x));	\
+		*(dp) = (*(dp) & rasops_rmask[x]) | (MBR(sw, x));	\
 		(dp)[1] = ((dp)[1] & rasops_rmask[n]) |			\
 			(MBL(sw, 32-(x)) & rasops_lmask[n]);		\
 	}								\
-} while(0);
+} while (0 /* CONSTCOND */)
 
 /* rasops_masks.c */
-extern const uint32_t	rasops_lmask[32+1];
-extern const uint32_t	rasops_rmask[32+1];
+extern const uint32_t	rasops_lmask[32 + 1];
+extern const uint32_t	rasops_rmask[32 + 1];
 extern const uint32_t	rasops_pmask[32][32];
 
 #endif /* _RASOPS_MASKS_H_ */

Index: src/sys/dev/rasops/rasops_putchar.h
diff -u src/sys/dev/rasops/rasops_putchar.h:1.7 src/sys/dev/rasops/rasops_putchar.h:1.8
--- src/sys/dev/rasops/rasops_putchar.h:1.7	Fri Aug  9 12:05:51 2019
+++ src/sys/dev/rasops/rasops_putchar.h	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops_putchar.h,v 1.7 2019/08/09 12:05:51 rin Exp $ */
+/* $NetBSD: rasops_putchar.h,v 1.8 2019/08/10 01:24:17 rin Exp $ */
 
 /* NetBSD: rasops8.c,v 1.41 2019/07/25 03:02:44 rin Exp  */
 /*-
@@ -46,7 +46,7 @@
 #if RASOPS_DEPTH != 24
 #define	PIXEL_TYPE		COLOR_TYPE
 #define	PIXEL_BYTES		sizeof(PIXEL_TYPE)
-#define	SET_PIXEL(p, index)	*(p)++ = clr[index]
+#define	SET_COLOR(p, index)	*(p)++ = clr[index]
 #define	SET_RGB(p, r, g, b)						\
 	*(p)++ = (((r) >> (8 - ri->ri_rnum)) << ri->ri_rpos) |		\
 		 (((g) >> (8 - ri->ri_gnum)) << ri->ri_gpos) |		\
@@ -56,7 +56,7 @@
 #if RASOPS_DEPTH == 24
 #define	PIXEL_TYPE		uint8_t
 #define	PIXEL_BYTES		3
-#define	SET_PIXEL(p, index)						\
+#define	SET_COLOR(p, index)						\
 	do {								\
 		COLOR_TYPE c = clr[index];				\
 		*(p)++ = c >> 16;					\
@@ -100,9 +100,9 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, uc);
 	int height, width, cnt;
+	uint8_t *fr;
 	COLOR_TYPE clr[2];
 	PIXEL_TYPE *dp, *rp, *hp;
-	uint8_t *fr;
 
 	hp = NULL;	/* XXX GCC */
 
@@ -118,23 +118,21 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 		return;
 #endif
 
-	rp = (PIXEL_TYPE *)(ri->ri_bits + row * ri->ri_yscale +
-	    col * ri->ri_xscale);
-	if (ri->ri_hwbits)
-		hp = (PIXEL_TYPE *)(ri->ri_hwbits + row * ri->ri_yscale +
-		    col * ri->ri_xscale);
-
 	height = font->fontheight;
 	width = font->fontwidth;
 
-	clr[0] = (COLOR_TYPE)ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
-	clr[1] = (COLOR_TYPE)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
+	rp = (PIXEL_TYPE *)(ri->ri_bits + FBOFFSET(ri, row, col));
+	if (ri->ri_hwbits)
+		hp = (PIXEL_TYPE *)(ri->ri_hwbits + FBOFFSET(ri, row, col));
+
+	clr[0] = (COLOR_TYPE)ATTR_BG(ri, attr);
+	clr[1] = (COLOR_TYPE)ATTR_FG(ri, attr);
 
 	if (uc == ' ') {
 		while (height--) {
 			dp = rp;
 			for (cnt = width; cnt; cnt--)
-				SET_PIXEL(dp, 0);
+				SET_COLOR(dp, 0);
 			if (ri->ri_hwbits) {
 				uint16_t bytes = width * PIXEL_BYTES;
 					/* XXX GCC */
@@ -168,23 +166,20 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 			dp = rp;
 
 #ifndef RASOPS_AA
-			uint32_t fb = be32uatoh(fr);
+			uint32_t fb = rasops_be32uatoh(fr);
 			fr += ri->ri_font->stride;
-#endif
 
-			for (cnt = width; cnt; cnt--)
-#ifndef	RASOPS_AA
-			{
-				SET_PIXEL(dp, (fb >> 31) & 1);
+			for (cnt = width; cnt; cnt--) {
+				SET_COLOR(dp, (fb >> 31) & 1);
 				fb <<= 1;
 			}
-#else
-			{
+#else /* RASOPS_AA */
+			for (cnt = width; cnt; cnt--) {
 				int w = *fr++;
 				if (w == 0xff)
-					SET_PIXEL(dp, 1);
+					SET_COLOR(dp, 1);
 				else if (w == 0)
-					SET_PIXEL(dp, 0);
+					SET_COLOR(dp, 0);
 				else
 					SET_RGB(dp,
 					    AV(r, w), AV(g, w), AV(b, w));
@@ -206,11 +201,12 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 		if (ri->ri_hwbits)
 			DELTA(hp, - ri->ri_stride * ri->ri_ul.off,
 			    PIXEL_TYPE *);
+
 		for (height = ri->ri_ul.height; height; height--) {
 			DELTA(rp, - ri->ri_stride, PIXEL_TYPE *);
 			dp = rp;
 			for (cnt = width; cnt; cnt--)
-				SET_PIXEL(dp, 1);
+				SET_COLOR(dp, 1);
 			if (ri->ri_hwbits) {
 				DELTA(hp, - ri->ri_stride, PIXEL_TYPE *);
 				uint16_t bytes = width * PIXEL_BYTES;
@@ -225,7 +221,7 @@ NAME(RASOPS_DEPTH)(void *cookie, int row
 
 #undef	PIXEL_TYPE
 #undef	PIXEL_BYTES
-#undef	SET_PIXEL
+#undef	SET_COLOR
 #undef	SET_RGB
 
 #undef	AV

Index: src/sys/dev/rasops/rasops_putchar_width.h
diff -u src/sys/dev/rasops/rasops_putchar_width.h:1.13 src/sys/dev/rasops/rasops_putchar_width.h:1.14
--- src/sys/dev/rasops/rasops_putchar_width.h:1.13	Fri Aug  9 12:05:51 2019
+++ src/sys/dev/rasops/rasops_putchar_width.h	Sat Aug 10 01:24:17 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops_putchar_width.h,v 1.13 2019/08/09 12:05:51 rin Exp $ */
+/* $NetBSD: rasops_putchar_width.h,v 1.14 2019/08/10 01:24:17 rin Exp $ */
 
 /* NetBSD: rasops8.c,v 1.41 2019/07/25 03:02:44 rin Exp  */
 /*-
@@ -39,15 +39,6 @@
 #error "Width not supported"
 #endif
 
-#define	PUTCHAR_WIDTH1(depth, width)	rasops ## depth ## _putchar ## width
-#define	PUTCHAR_WIDTH(depth, width)	PUTCHAR_WIDTH1(depth, width)
-
-#define	PUTCHAR1(depth)			rasops ## depth ## _putchar
-#define	PUTCHAR(depth)			PUTCHAR1(depth)
-
-#define	MAKESTAMP1(depth)		rasops ## depth ## _makestamp
-#define	MAKESTAMP(depth)		MAKESTAMP1(depth)
-
 #if   RASOPS_DEPTH == 2
 #define	STAMP_TYPE	uint8_t
 #elif RASOPS_DEPTH == 4
@@ -172,6 +163,8 @@
 	} while (0 /* CONSTCOND */)
 #endif
 
+/* ################################################################### */
+
 #if   RASOPS_WIDTH == 8
 #define	SUBST_GLYPH				\
 	do {					\
@@ -195,21 +188,36 @@
 	} while (0 /* CONSTCOND */)
 #endif
 
+/* ################################################################### */
+
+#define	NAME(depth, width)	NAME1(depth, width)
+#define	NAME1(depth, width)	rasops ## depth ## _putchar ## width
+
+#define	PUTCHAR(depth)		PUTCHAR1(depth)
+#define	PUTCHAR1(depth)		rasops ## depth ## _putchar
+
+#define	MAKESTAMP(depth)	MAKESTAMP1(depth)
+#define	MAKESTAMP1(depth)	rasops ## depth ## _makestamp
+
 /*
  * Width-optimized putchar function.
  */
 static void
-PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH)(void *cookie, int row, int col,
-    u_int uc, long attr)
+NAME(RASOPS_DEPTH, RASOPS_WIDTH)(void *cookie, int row, int col, u_int uc,
+    long attr)
 {
 	struct rasops_info *ri = (struct rasops_info *)cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, uc);
-	int height, fs;
+	int height;
 	uint8_t *fr;
 	STAMP_TYPE *rp, *hp;
 
 	hp = NULL; /* XXX GCC */
 
+	/* check if character fits into font limits */
+	if (__predict_false(!CHAR_IN_FONT(uc, font)))
+		return;
+
 #ifdef RASOPS_CLIPPING
 	/* Catches 'row < 0' case too */
 	if ((unsigned)row >= (unsigned)ri->ri_rows)
@@ -219,22 +227,16 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
 		return;
 #endif
 
-	/* check if character fits into font limits */
-	if (__predict_false(!CHAR_IN_FONT(uc, font)))
-		return;
-
 	/* Recompute stamp? */
 	if (attr != stamp_attr || __predict_false(ri != stamp_ri))
 		MAKESTAMP(RASOPS_DEPTH)(ri, attr);
 
-	rp = (STAMP_TYPE *)(ri->ri_bits + row * ri->ri_yscale +
-	    col * ri->ri_xscale);
-	if (ri->ri_hwbits)
-		hp = (STAMP_TYPE *)(ri->ri_hwbits + row * ri->ri_yscale +
-		    col * ri->ri_xscale);
-
 	height = font->fontheight;
 
+	rp = (STAMP_TYPE *)(ri->ri_bits + FBOFFSET(ri, row, col));
+	if (ri->ri_hwbits)
+		hp = (STAMP_TYPE *)(ri->ri_hwbits + FBOFFSET(ri, row, col));
+
 	if (uc == ' ') {
 		while (height--) {
 			SUBST_STAMP(0);
@@ -246,11 +248,9 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
 		}
 	} else {
 		fr = FONT_GLYPH(uc, font, ri);
-		fs = font->stride;
-
 		while (height--) {
 			SUBST_GLYPH;
-			fr += fs;
+			fr += font->stride;
 			if (ri->ri_hwbits) {
 				memcpy(hp, rp, SUBST_BYTES);
 				DELTA(hp, ri->ri_stride, STAMP_TYPE *);
@@ -265,6 +265,7 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
 		if (ri->ri_hwbits)
 			DELTA(hp, - ri->ri_stride * ri->ri_ul.off,
 			    STAMP_TYPE *);
+
 		for (height = ri->ri_ul.height; height; height--) {
 			DELTA(rp, - ri->ri_stride, STAMP_TYPE *);
 			SUBST_STAMP(FILLED_STAMP);
@@ -283,17 +284,17 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
 
 #undef	FILLED_STAMP
 
-#undef	PUTCHAR_WIDTH1
-#undef	PUTCHAR_WIDTH
-
-#undef	PUTCHAR1
-#undef	PUTCHAR
-
-#undef	MAKESTAMP1
-#undef	MAKESTAMP
-
 #undef	SUBST_STAMP1
 #undef	SUBST_STAMP
 
 #undef	SUBST_GLYPH1
 #undef	SUBST_GLYPH
+
+#undef	NAME
+#undef	NAME1
+
+#undef	PUTCHAR
+#undef	PUTCHAR1
+
+#undef	MAKESTAMP
+#undef	MAKESTAMP1

Reply via email to