Module Name: src
Committed By: rin
Date: Mon Jul 29 03:01:09 UTC 2019
Modified Files:
src/sys/dev/rasops: rasops2.c rasops4.c rasops_putchar_width.h
Log Message:
Convert rasops2.c and rasops4.c to use rasops_putchar_width.h.
Style.
To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/rasops/rasops2.c
cvs rdiff -u -r1.19 -r1.20 src/sys/dev/rasops/rasops4.c
cvs rdiff -u -r1.6 -r1.7 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/rasops2.c
diff -u src/sys/dev/rasops/rasops2.c:1.25 src/sys/dev/rasops/rasops2.c:1.26
--- src/sys/dev/rasops/rasops2.c:1.25 Sun Jul 28 12:06:10 2019
+++ src/sys/dev/rasops/rasops2.c Mon Jul 29 03:01:09 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops2.c,v 1.25 2019/07/28 12:06:10 rin Exp $ */
+/* $NetBSD: rasops2.c,v 1.26 2019/07/29 03:01:09 rin Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops2.c,v 1.25 2019/07/28 12:06:10 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops2.c,v 1.26 2019/07/29 03:01:09 rin Exp $");
#include "opt_rasops.h"
@@ -63,6 +63,14 @@ static int stamp_mutex; /* XXX see note
#endif
/*
+ * offset = STAMP_SHIFT(fontbits, nibble #) & STAMP_MASK
+ * destination = STAMP_READ(offset)
+ */
+#define STAMP_SHIFT(fb, n) ((n) ? (fb) >> 4 : (fb))
+#define STAMP_MASK 0xf
+#define STAMP_READ(o) stamp[o]
+
+/*
* Initialize rasops_info struct for this colordepth.
*/
void
@@ -94,117 +102,6 @@ rasops2_init(struct rasops_info *ri)
}
}
-#ifdef notyet
-/*
- * Paint a single character. This is the generic version, this is ugly.
- */
-static void
-rasops2_putchar(void *cookie, int row, int col, u_int uc, long attr)
-{
- int height, width, fs, rs, fb, bg, fg, lmask, rmask;
- struct rasops_info *ri = (struct rasops_info *)cookie;
- struct wsdisplay_font *font = PICK_FONT(ri, uc);
- uint32_t *rp;
- uint8_t *fr;
-
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows)
- return;
-
- if ((unsigned)col >= (unsigned)ri->ri_cols)
- return;
-#endif
-
- width = font->fontwidth << 1;
- height = font->fontheight;
- col *= width;
- rp = (uint32_t *)(ri->ri_bits + row * ri->ri_yscale +
- ((col >> 3) & ~3));
- col = col & 31;
- rs = ri->ri_stride;
-
- bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
- fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
-
- /* If fg and bg match this becomes a space character */
- if (fg == bg || uc == ' ') {
- uc = (u_int)-1;
- fr = 0; /* shutup gcc */
- fs = 0; /* shutup gcc */
- } else {
- fr = FONT_GLYPH(uc, font, ri);
- fs = font->stride;
- }
-
- /* Single word, one mask */
- if ((col + width) <= 32) {
- rmask = rasops_pmask[col][width];
- lmask = ~rmask;
-
- if (uc == (u_int)-1) {
- bg &= rmask;
-
- while (height--) {
- *rp = (*rp & lmask) | bg;
- DELTA(rp, rs, uint32_t *);
- }
- } else {
- while (height--) {
- /* get bits, mask */
- /* compose sl */
- /* mask sl */
- /* put word */
- }
- }
-
- /* Do underline */
- if (attr & WSATTR_UNDERLINE) {
- DELTA(rp, -(ri->ri_stride << 1), uint32_t *);
- *rp = (*rp & lmask) | (fg & rmask);
- }
- } else {
- lmask = ~rasops_lmask[col];
- rmask = ~rasops_rmask[(col + width) & 31];
-
- if (uc == (u_int)-1) {
- bg = bg & ~lmask;
- width = bg & ~rmask;
-
- while (height--) {
- rp[0] = (rp[0] & lmask) | bg;
- rp[1] = (rp[1] & rmask) | width;
- DELTA(rp, rs, uint32_t *);
- }
- } else {
- width = 32 - col;
-
- /* NOT fontbits if bg is white */
- while (height--) {
- fb = ~(fr[3] | (fr[2] << 8) |
- (fr[1] << 16) | (fr[0] << 24));
-
- rp[0] = (rp[0] & lmask)
- | MBE((u_int)fb >> col);
-
- rp[1] = (rp[1] & rmask)
- | (MBE((u_int)fb << width) & ~rmask);
-
- fr += fs;
- DELTA(rp, rs, uint32_t *);
- }
- }
-
- /* Do underline */
- if (attr & WSATTR_UNDERLINE) {
- DELTA(rp, -(ri->ri_stride << 1), uint32_t *);
- rp[0] = (rp[0] & lmask) | (fg & ~lmask);
- rp[1] = (rp[1] & rmask) | (fg & ~rmask);
- }
- }
-}
-#endif
-
/*
* Put a single character. This is the generic version.
*/
@@ -236,13 +133,13 @@ rasops2_makestamp(struct rasops_info *ri
#endif
if ((ri->ri_flg & RI_BSWAP) == NEED_LITTLE_ENDIAN_STAMP) {
/* littel endian */
- stamp[i] = (i & 8 ? fg : bg);
+ stamp[i] = (i & 8 ? fg : bg);
stamp[i] |= (i & 4 ? fg : bg) << 2;
stamp[i] |= (i & 2 ? fg : bg) << 4;
stamp[i] |= (i & 1 ? fg : bg) << 6;
} else {
/* big endian */
- stamp[i] = (i & 1 ? fg : bg);
+ stamp[i] = (i & 1 ? fg : bg);
stamp[i] |= (i & 2 ? fg : bg) << 2;
stamp[i] |= (i & 4 ? fg : bg) << 4;
stamp[i] |= (i & 8 ? fg : bg) << 6;
@@ -250,203 +147,20 @@ rasops2_makestamp(struct rasops_info *ri
}
}
-/*
- * Put a single character. This is for 8-pixel wide fonts.
- */
-static void
-rasops2_putchar8(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;
- uint8_t *fr, *rp;
-
- /* Can't risk remaking the stamp if it's already in use */
- if (stamp_mutex++) {
- stamp_mutex--;
- rasops2_putchar(cookie, row, col, uc, attr);
- return;
- }
-
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows) {
- stamp_mutex--;
- return;
- }
-
- if ((unsigned)col >= (unsigned)ri->ri_cols) {
- stamp_mutex--;
- return;
- }
-#endif
-
- rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
- height = font->fontheight;
- rs = ri->ri_stride;
-
- /* Recompute stamp? */
- if (attr != stamp_attr)
- rasops2_makestamp(ri, attr);
-
- if (uc == ' ') {
- while (height--) {
- rp[0] = rp[1] = stamp[0];
- rp += rs;
- }
- } else {
- fr = FONT_GLYPH(uc, font, ri);
- fs = font->stride;
-
- while (height--) {
- rp[0] = stamp[(*fr >> 4) & 0xf];
- rp[1] = stamp[*fr & 0xf];
- fr += fs;
- rp += rs;
- }
- }
-
- /* Do underline */
- if ((attr & WSATTR_UNDERLINE) != 0) {
- rp -= ri->ri_stride << 1;
- rp[0] = rp[1] = stamp[15];
- }
-
- stamp_mutex--;
-}
-
-/*
- * Put a single character. This is for 12-pixel wide fonts.
- */
-static void
-rasops2_putchar12(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;
- uint8_t *fr, *rp;
-
- /* Can't risk remaking the stamp if it's already in use */
- if (stamp_mutex++) {
- stamp_mutex--;
- rasops2_putchar(cookie, row, col, uc, attr);
- return;
- }
-
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows) {
- stamp_mutex--;
- return;
- }
-
- if ((unsigned)col >= (unsigned)ri->ri_cols) {
- stamp_mutex--;
- return;
- }
-#endif
-
- rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
- height = font->fontheight;
- rs = ri->ri_stride;
-
- /* Recompute stamp? */
- if (attr != stamp_attr)
- rasops2_makestamp(ri, attr);
-
- if (uc == ' ') {
- while (height--) {
- rp[0] = rp[1] = rp[2] = stamp[0];
- rp += rs;
- }
- } else {
- fr = FONT_GLYPH(uc, font, ri);
- fs = font->stride;
-
- while (height--) {
- rp[0] = stamp[(fr[0] >> 4) & 0xf];
- rp[1] = stamp[fr[0] & 0xf];
- rp[2] = stamp[(fr[1] >> 4) & 0xf];
- fr += fs;
- rp += rs;
- }
- }
-
- /* Do underline */
- if ((attr & WSATTR_UNDERLINE) != 0) {
- rp -= ri->ri_stride << 1;
- rp[0] = rp[1] = rp[2] = stamp[15];
- }
-
- stamp_mutex--;
-}
-
-/*
- * Put a single character. This is for 16-pixel wide fonts.
- */
-static void
-rasops2_putchar16(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;
- uint8_t *fr, *rp;
-
- /* Can't risk remaking the stamp if it's already in use */
- if (stamp_mutex++) {
- stamp_mutex--;
- rasops2_putchar(cookie, row, col, uc, attr);
- return;
- }
-
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows) {
- stamp_mutex--;
- return;
- }
-
- if ((unsigned)col >= (unsigned)ri->ri_cols) {
- stamp_mutex--;
- return;
- }
-#endif
-
- rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
- height = font->fontheight;
- rs = ri->ri_stride;
-
- /* Recompute stamp? */
- if (attr != stamp_attr)
- rasops2_makestamp(ri, attr);
-
- if (uc == ' ') {
- while (height--) {
- rp[0] = rp[1] = rp[2] = rp[3] = stamp[0];
- rp += rs;
- }
- } else {
- fr = FONT_GLYPH(uc, font, ri);
- fs = font->stride;
-
- while (height--) {
- rp[0] = stamp[(fr[0] >> 4) & 0xf];
- rp[1] = stamp[fr[0] & 0xf];
- rp[2] = stamp[(fr[1] >> 4) & 0xf];
- rp[3] = stamp[fr[1] & 0xf];
- fr += fs;
- rp += rs;
- }
- }
+#define RASOPS_DEPTH 2
- /* Do underline */
- if ((attr & WSATTR_UNDERLINE) != 0) {
- rp -= ri->ri_stride << 1;
- rp[0] = rp[1] = stamp[15];
- }
+#define RASOPS_WIDTH 8
+#include "rasops_putchar_width.h"
+#undef RASOPS_WIDTH
+
+#define RASOPS_WIDTH 12
+#include "rasops_putchar_width.h"
+#undef RASOPS_WIDTH
+
+#define RASOPS_WIDTH 16
+#include "rasops_putchar_width.h"
+#undef RASOPS_WIDTH
- stamp_mutex--;
-}
#endif /* !RASOPS_SMALL */
/*
Index: src/sys/dev/rasops/rasops4.c
diff -u src/sys/dev/rasops/rasops4.c:1.19 src/sys/dev/rasops/rasops4.c:1.20
--- src/sys/dev/rasops/rasops4.c:1.19 Sun Jul 28 12:06:10 2019
+++ src/sys/dev/rasops/rasops4.c Mon Jul 29 03:01:09 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops4.c,v 1.19 2019/07/28 12:06:10 rin Exp $ */
+/* $NetBSD: rasops4.c,v 1.20 2019/07/29 03:01:09 rin Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops4.c,v 1.19 2019/07/28 12:06:10 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops4.c,v 1.20 2019/07/29 03:01:09 rin Exp $");
#include "opt_rasops.h"
@@ -63,12 +63,26 @@ static int stamp_mutex; /* XXX see note
#endif
/*
+ * offset = STAMP_SHIFT(fontbits, nibble #) & STAMP_MASK
+ * destination = STAMP_READ(offset)
+ */
+#define STAMP_SHIFT(fb, n) ((n) ? (fb) >> 4 : (fb))
+#define STAMP_MASK 0xf
+#define STAMP_READ(o) stamp[o]
+
+/*
* Initialize rasops_info struct for this colordepth.
*/
void
rasops4_init(struct rasops_info *ri)
{
+ if ((ri->ri_font->fontwidth & 1) != 0) {
+ ri->ri_ops.erasecols = rasops4_erasecols;
+ ri->ri_ops.copycols = rasops4_copycols;
+ ri->ri_do_cursor = rasops4_do_cursor;
+ }
+
switch (ri->ri_font->fontwidth) {
#ifndef RASOPS_SMALL
case 8:
@@ -86,124 +100,7 @@ rasops4_init(struct rasops_info *ri)
ri->ri_ops.putchar = rasops4_putchar;
break;
}
-
- if ((ri->ri_font->fontwidth & 1) != 0) {
- ri->ri_ops.erasecols = rasops4_erasecols;
- ri->ri_ops.copycols = rasops4_copycols;
- ri->ri_do_cursor = rasops4_do_cursor;
- }
-}
-
-#ifdef notyet
-/*
- * Paint a single character. This is the generic version, this is ugly.
- */
-static void
-rasops4_putchar(void *cookie, int row, int col, u_int uc, long attr)
-{
- int height, width, fs, rs, fb, bg, fg, lmask, rmask;
- struct rasops_info *ri = (struct rasops_info *)cookie;
- struct wsdisplay_font *font = PICK_FONT(ri, uc);
- uint32_t *rp;
- uint8_t *fr;
-
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows)
- return;
-
- if ((unsigned)col >= (unsigned)ri->ri_cols)
- return;
-#endif
-
- width = font->fontwidth << 1;
- height = font->fontheight;
- col *= width;
- rp = (uint32_t *)(ri->ri_bits + row * ri->ri_yscale +
- ((col >> 3) & ~3));
- col = col & 31;
- rs = ri->ri_stride;
-
- bg = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
- fg = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
-
- /* If fg and bg match this becomes a space character */
- if (fg == bg || uc == ' ') {
- uc = (u_int)-1;
- fr = 0; /* shutup gcc */
- fs = 0; /* shutup gcc */
- } else {
- fr = FONT_GLYPH(uc, font, ri);
- fs = font->stride;
- }
-
- /* Single word, one mask */
- if ((col + width) <= 32) {
- rmask = rasops_pmask[col][width];
- lmask = ~rmask;
-
- if (uc == (u_int)-1) {
- bg &= rmask;
-
- while (height--) {
- *rp = (*rp & lmask) | bg;
- DELTA(rp, rs, uint32_t *);
- }
- } else {
- while (height--) {
- /* get bits, mask */
- /* compose sl */
- /* mask sl */
- /* put word */
- }
- }
-
- /* Do underline */
- if (attr & WSATTR_UNDERLINE) {
- DELTA(rp, -(ri->ri_stride << 1), uint32_t *);
- *rp = (*rp & lmask) | (fg & rmask);
- }
- } else {
- lmask = ~rasops_lmask[col];
- rmask = ~rasops_rmask[(col + width) & 31];
-
- if (uc == (u_int)-1) {
- bg = bg & ~lmask;
- width = bg & ~rmask;
-
- while (height--) {
- rp[0] = (rp[0] & lmask) | bg;
- rp[1] = (rp[1] & rmask) | width;
- DELTA(rp, rs, uint32_t *);
- }
- } else {
- width = 32 - col;
-
- /* NOT fontbits if bg is white */
- while (height--) {
- fb = ~(fr[3] | (fr[2] << 8) |
- (fr[1] << 16) | (fr[0] << 24));
-
- rp[0] = (rp[0] & lmask)
- | MBE((u_int)fb >> col);
-
- rp[1] = (rp[1] & rmask)
- | (MBE((u_int)fb << width) & ~rmask);
-
- fr += fs;
- DELTA(rp, rs, uint32_t *);
- }
- }
-
- /* Do underline */
- if (attr & WSATTR_UNDERLINE) {
- DELTA(rp, -(ri->ri_stride << 1), uint32_t *);
- rp[0] = (rp[0] & lmask) | (fg & ~lmask);
- rp[1] = (rp[1] & rmask) | (fg & ~rmask);
- }
- }
}
-#endif
/*
* Put a single character. This is the generic version.
@@ -236,13 +133,13 @@ rasops4_makestamp(struct rasops_info *ri
#endif
if ((ri->ri_flg & RI_BSWAP) == NEED_LITTLE_ENDIAN_STAMP) {
/* little endian */
- stamp[i] = (i & 1 ? fg : bg) << 12;
+ stamp[i] = (i & 1 ? fg : bg) << 12;
stamp[i] |= (i & 2 ? fg : bg) << 8;
stamp[i] |= (i & 4 ? fg : bg) << 4;
stamp[i] |= (i & 8 ? fg : bg) << 0;
} else {
/* big endian */
- stamp[i] = (i & 1 ? fg : bg) << 0;
+ stamp[i] = (i & 1 ? fg : bg) << 0;
stamp[i] |= (i & 2 ? fg : bg) << 4;
stamp[i] |= (i & 4 ? fg : bg) << 8;
stamp[i] |= (i & 8 ? fg : bg) << 12;
@@ -250,209 +147,20 @@ rasops4_makestamp(struct rasops_info *ri
}
}
-/*
- * Put a single character. This is for 8-pixel wide fonts.
- */
-static void
-rasops4_putchar8(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;
- uint8_t *fr;
- uint16_t *rp;
-
- /* Can't risk remaking the stamp if it's already in use */
- if (stamp_mutex++) {
- stamp_mutex--;
- rasops4_putchar(cookie, row, col, uc, attr);
- return;
- }
-
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows) {
- stamp_mutex--;
- return;
- }
-
- if ((unsigned)col >= (unsigned)ri->ri_cols) {
- stamp_mutex--;
- return;
- }
-#endif
-
- rp = (uint16_t *)(ri->ri_bits + row * ri->ri_yscale +
- col * ri->ri_xscale);
- height = font->fontheight;
- rs = ri->ri_stride / sizeof(*rp);
-
- /* Recompute stamp? */
- if (attr != stamp_attr)
- rasops4_makestamp(ri, attr);
-
- if (uc == ' ') {
- while (height--) {
- rp[0] = rp[1] = stamp[0];
- rp += rs;
- }
- } else {
- fr = FONT_GLYPH(uc, font, ri);
- fs = font->stride;
-
- while (height--) {
- rp[0] = stamp[(*fr >> 4) & 0xf];
- rp[1] = stamp[*fr & 0xf];
- fr += fs;
- rp += rs;
- }
- }
-
- /* Do underline */
- if ((attr & WSATTR_UNDERLINE) != 0) {
- rp -= (rs << 1);
- rp[0] = rp[1] = stamp[15];
- }
-
- stamp_mutex--;
-}
-
-/*
- * Put a single character. This is for 12-pixel wide fonts.
- */
-static void
-rasops4_putchar12(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;
- uint8_t *fr;
- uint16_t *rp;
-
- /* Can't risk remaking the stamp if it's already in use */
- if (stamp_mutex++) {
- stamp_mutex--;
- rasops4_putchar(cookie, row, col, uc, attr);
- return;
- }
-
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows) {
- stamp_mutex--;
- return;
- }
-
- if ((unsigned)col >= (unsigned)ri->ri_cols) {
- stamp_mutex--;
- return;
- }
-#endif
-
- rp = (uint16_t *)(ri->ri_bits + row * ri->ri_yscale +
- col * ri->ri_xscale);
- height = font->fontheight;
- rs = ri->ri_stride / sizeof(*rp);
-
- /* Recompute stamp? */
- if (attr != stamp_attr)
- rasops4_makestamp(ri, attr);
-
- if (uc == ' ') {
- while (height--) {
- rp[0] = rp[1] = rp[2] = stamp[0];
- rp += rs;
- }
- } else {
- fr = FONT_GLYPH(uc, font, ri);
- fs = font->stride;
-
- while (height--) {
- rp[0] = stamp[(fr[0] >> 4) & 0xf];
- rp[1] = stamp[fr[0] & 0xf];
- rp[2] = stamp[(fr[1] >> 4) & 0xf];
- fr += fs;
- rp += rs;
- }
- }
-
- /* Do underline */
- if ((attr & WSATTR_UNDERLINE) != 0) {
- rp -= (rs << 1);
- rp[0] = rp[1] = rp[2] = stamp[15];
- }
-
- stamp_mutex--;
-}
-
-/*
- * Put a single character. This is for 16-pixel wide fonts.
- */
-static void
-rasops4_putchar16(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;
- uint8_t *fr;
- uint16_t *rp;
-
- /* Can't risk remaking the stamp if it's already in use */
- if (stamp_mutex++) {
- stamp_mutex--;
- rasops4_putchar(cookie, row, col, uc, attr);
- return;
- }
+#define RASOPS_DEPTH 4
-#ifdef RASOPS_CLIPPING
- /* Catches 'row < 0' case too */
- if ((unsigned)row >= (unsigned)ri->ri_rows) {
- stamp_mutex--;
- return;
- }
-
- if ((unsigned)col >= (unsigned)ri->ri_cols) {
- stamp_mutex--;
- return;
- }
-#endif
+#define RASOPS_WIDTH 8
+#include "rasops_putchar_width.h"
+#undef RASOPS_WIDTH
+
+#define RASOPS_WIDTH 12
+#include "rasops_putchar_width.h"
+#undef RASOPS_WIDTH
+
+#define RASOPS_WIDTH 16
+#include "rasops_putchar_width.h"
+#undef RASOPS_WIDTH
- rp = (uint16_t *)(ri->ri_bits + row * ri->ri_yscale +
- col * ri->ri_xscale);
- height = font->fontheight;
- rs = ri->ri_stride / sizeof(*rp);
-
- /* Recompute stamp? */
- if (attr != stamp_attr)
- rasops4_makestamp(ri, attr);
-
- if (uc == ' ') {
- while (height--) {
- rp[0] = rp[1] = rp[2] = rp[3] = stamp[0];
- rp += rs;
- }
- } else {
- fr = FONT_GLYPH(uc, font, ri);
- fs = font->stride;
-
- while (height--) {
- rp[0] = stamp[(fr[0] >> 4) & 0xf];
- rp[1] = stamp[fr[0] & 0xf];
- rp[2] = stamp[(fr[1] >> 4) & 0xf];
- rp[3] = stamp[fr[1] & 0xf];
- fr += fs;
- rp += rs;
- }
- }
-
- /* Do underline */
- if ((attr & WSATTR_UNDERLINE) != 0) {
- rp -= (rs << 1);
- rp[0] = rp[1] = rp[2] = rp[3] = stamp[15];
- }
-
- stamp_mutex--;
-}
#endif /* !RASOPS_SMALL */
/*
Index: src/sys/dev/rasops/rasops_putchar_width.h
diff -u src/sys/dev/rasops/rasops_putchar_width.h:1.6 src/sys/dev/rasops/rasops_putchar_width.h:1.7
--- src/sys/dev/rasops/rasops_putchar_width.h:1.6 Sun Jul 28 12:06:10 2019
+++ src/sys/dev/rasops/rasops_putchar_width.h Mon Jul 29 03:01:09 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops_putchar_width.h,v 1.6 2019/07/28 12:06:10 rin Exp $ */
+/* $NetBSD: rasops_putchar_width.h,v 1.7 2019/07/29 03:01:09 rin Exp $ */
/* NetBSD: rasops8.c,v 1.41 2019/07/25 03:02:44 rin Exp */
/*-
@@ -30,8 +30,8 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#if RASOPS_DEPTH != 8 && RASOPS_DEPTH != 15 && RASOPS_DEPTH != 24 && \
- RASOPS_DEPTH != 32
+#if RASOPS_DEPTH != 2 && RASOPS_DEPTH != 4 && RASOPS_DEPTH != 8 && \
+ RASOPS_DEPTH != 15 && RASOPS_DEPTH != 24 && RASOPS_DEPTH != 32
#error "Depth not supported"
#endif
@@ -39,14 +39,6 @@
#error "Width not supported"
#endif
-#if RASOPS_DEPTH == 8
-#define FILLED_STAMP 15
-#elif RASOPS_DEPTH == 15
-#define FILLED_STAMP 30
-#else
-#define FILLED_STAMP 60
-#endif
-
#define PUTCHAR_WIDTH1(depth, width) rasops ## depth ## _putchar ## width
#define PUTCHAR_WIDTH(depth, width) PUTCHAR_WIDTH1(depth, width)
@@ -56,9 +48,25 @@
#define MAKESTAMP1(depth) rasops ## depth ## _makestamp
#define MAKESTAMP(depth) MAKESTAMP1(depth)
+#if RASOPS_DEPTH == 2
+#define STAMP_TYPE uint8_t
+#elif RASOPS_DEPTH == 4
+#define STAMP_TYPE uint16_t
+#else
+#define STAMP_TYPE uint32_t
+#endif
+
+#if RASOPS_DEPTH <= 8
+#define FILLED_STAMP 15
+#elif RASOPS_DEPTH == 15
+#define FILLED_STAMP 30
+#else
+#define FILLED_STAMP 60
+#endif
+
/* ################################################################### */
-#if RASOPS_DEPTH == 8
+#if RASOPS_DEPTH <= 8
#define SUBST_STAMP1(p, off, base) \
(p)[(off) * 1 + 0] = stamp[base]
@@ -72,7 +80,7 @@
} \
} while (0 /* CONSTCOND */)
-#endif /* RASOPS_DEPTH == 8 */
+#endif /* RASOPS_DEPTH <= 8 */
/* ################################################################### */
@@ -203,7 +211,7 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
struct rasops_info *ri = (struct rasops_info *)cookie;
struct wsdisplay_font *font = PICK_FONT(ri, uc);
int height, fs;
- uint32_t *rp, *hrp;
+ STAMP_TYPE *rp, *hrp;
uint8_t *fr;
hrp = NULL; /* XXX GCC */
@@ -232,20 +240,23 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
if (attr != stamp_attr)
MAKESTAMP(RASOPS_DEPTH)(ri, attr);
- rp = (uint32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
+ rp = (STAMP_TYPE *)(ri->ri_bits + row * ri->ri_yscale +
+ col * ri->ri_xscale);
if (ri->ri_hwbits)
- hrp = (uint32_t *)(ri->ri_hwbits + row*ri->ri_yscale +
- col*ri->ri_xscale);
+ hrp = (STAMP_TYPE *)(ri->ri_hwbits + row * ri->ri_yscale +
+ col * ri->ri_xscale);
height = font->fontheight;
if (uc == ' ') {
while (height--) {
SUBST_STAMP(rp, 0);
- DELTA(rp, ri->ri_stride, uint32_t *);
- if (ri->ri_hwbits) {
+ DELTA(rp, ri->ri_stride, STAMP_TYPE *);
+ }
+ if (ri->ri_hwbits) {
+ while (height--) {
SUBST_STAMP(hrp, 0);
- DELTA(hrp, ri->ri_stride, uint32_t *);
+ DELTA(hrp, ri->ri_stride, STAMP_TYPE *);
}
}
} else {
@@ -256,18 +267,18 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
SUBST_GLYPH;
fr += fs;
- DELTA(rp, ri->ri_stride, uint32_t *);
+ DELTA(rp, ri->ri_stride, STAMP_TYPE *);
if (ri->ri_hwbits)
- DELTA(hrp, ri->ri_stride, uint32_t *);
+ DELTA(hrp, ri->ri_stride, STAMP_TYPE *);
}
}
/* Do underline */
if ((attr & WSATTR_UNDERLINE) != 0) {
- DELTA(rp, -(ri->ri_stride << 1), uint32_t *);
+ DELTA(rp, -(ri->ri_stride << 1), STAMP_TYPE *);
SUBST_STAMP(rp, FILLED_STAMP);
if (ri->ri_hwbits) {
- DELTA(hrp, -(ri->ri_stride << 1), uint32_t *);
+ DELTA(hrp, -(ri->ri_stride << 1), STAMP_TYPE *);
SUBST_STAMP(hrp, FILLED_STAMP);
}
}
@@ -275,6 +286,8 @@ PUTCHAR_WIDTH(RASOPS_DEPTH, RASOPS_WIDTH
stamp_mutex--;
}
+#undef STAMP_TYPE
+
#undef FILLED_STAMP
#undef PUTCHAR_WIDTH1