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.
This commit is contained in:
rin 2019-08-10 01:24:17 +00:00
parent b38a7d7bb7
commit b09e761aad
16 changed files with 763 additions and 697 deletions

View File

@ -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 *, int, int, int, long *);
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 fg0, int bg0, int flg, long *attr)
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, int dst, int num)
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, int dst, int num)
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, int src, int dst, int num)
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, int src, int dst, int num)
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 row, int col)
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 *ri)
(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, int num, long attr)
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, int num, long attr)
* 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, int num, long attr)
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, int col, int num, long attr)
return;
#endif
num *= ri->ri_xscale;
rp = (uint32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
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];
num *= ri->ri_xscale;
rp = (uint32_t *)(ri->ri_bits + FBOFFSET(ri, row, col));
if (ri->ri_hwbits)
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,267 +1182,6 @@ rasops_erasecols(void *cookie, int row, int col, int num, long attr)
}
}
#if NRASOPS_ROTATION > 0
/*
* Quarter clockwise rotation routines (originally intended for the
* built-in Zaurus C3x00 display in 16bpp).
*/
static void
rasops_rotate_font(int *cookie, int rotate)
{
struct rotatedfont *f;
int ncookie;
SLIST_FOREACH(f, &rotatedfonts, rf_next) {
if (f->rf_cookie == *cookie) {
*cookie = f->rf_rotated;
return;
}
}
/*
* We did not find a rotated version of this font. Ask the wsfont
* code to compute one for us.
*/
f = kmem_alloc(sizeof(*f), KM_SLEEP);
if ((ncookie = wsfont_rotate(*cookie, rotate)) == -1)
goto fail;
f->rf_cookie = *cookie;
f->rf_rotated = ncookie;
SLIST_INSERT_HEAD(&rotatedfonts, f, rf_next);
*cookie = ncookie;
return;
fail: kmem_free(f, sizeof(*f));
return;
}
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;
uint8_t *sp, *dp;
r_srcrow = srccol;
r_dstrow = dstcol;
r_srccol = ri->ri_rows - srcrow - 1;
r_dstcol = ri->ri_rows - dstrow - 1;
r_srcrow *= ri->ri_yscale;
r_dstrow *= ri->ri_yscale;
height = ri->ri_font->fontheight;
sp = ri->ri_bits + r_srcrow + r_srccol * ri->ri_xscale;
dp = ri->ri_bits + r_dstrow + r_dstcol * ri->ri_xscale;
while (height--) {
memmove(dp, sp, ri->ri_xscale);
dp += ri->ri_stride;
sp += ri->ri_stride;
}
}
static void
rasops_putchar_rotated_cw(void *cookie, int row, int col, u_int uc, long attr)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int height;
uint8_t *rp;
if (__predict_false((unsigned int)row > ri->ri_rows ||
(unsigned int)col > ri->ri_cols))
return;
/* Avoid underflow */
if (ri->ri_rows - row - 1 < 0)
return;
/* Do rotated char sans (side)underline */
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 */
if ((attr & WSATTR_UNDERLINE) != 0) {
uint16_t c =
(uint16_t)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
while (height--) {
*(uint16_t *)rp = c;
rp += ri->ri_stride;
}
}
}
static void
rasops_erasecols_rotated_cw(void *cookie, int row, int col, int num, long attr)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int i;
for (i = col; i < col + num; i++)
ri->ri_ops.putchar(cookie, row, i, ' ', attr);
}
/* XXX: these could likely be optimised somewhat. */
static void
rasops_copyrows_rotated_cw(void *cookie, int src, int dst, int num)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int col, roff;
if (src > dst)
for (roff = 0; roff < num; roff++)
for (col = 0; col < ri->ri_cols; col++)
rasops_copychar(cookie, src + roff, dst + roff,
col, col);
else
for (roff = num - 1; roff >= 0; roff--)
for (col = 0; col < ri->ri_cols; col++)
rasops_copychar(cookie, src + roff, dst + roff,
col, col);
}
static void
rasops_copycols_rotated_cw(void *cookie, int row, int src, int dst, int num)
{
int coff;
if (src > dst)
for (coff = 0; coff < num; coff++)
rasops_copychar(cookie, row, row, src + coff,
dst + coff);
else
for (coff = num - 1; coff >= 0; coff--)
rasops_copychar(cookie, row, row, src + coff,
dst + coff);
}
static void
rasops_eraserows_rotated_cw(void *cookie, int row, int num, long attr)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int col, rn;
for (rn = row; rn < row + num; rn++)
for (col = 0; col < ri->ri_cols; col++)
ri->ri_ops.putchar(cookie, rn, col, ' ', attr);
}
/*
* Quarter counter-clockwise rotation routines (originally intended for the
* built-in Sharp W-ZERO3 display in 16bpp).
*/
static void
rasops_copychar_ccw(void *cookie, int srcrow, int dstrow, int srccol,
int dstcol)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int height, r_srcrow, r_dstrow, r_srccol, r_dstcol;
uint8_t *sp, *dp;
r_srcrow = ri->ri_cols - srccol - 1;
r_dstrow = ri->ri_cols - dstcol - 1;
r_srccol = srcrow;
r_dstcol = dstrow;
r_srcrow *= ri->ri_yscale;
r_dstrow *= ri->ri_yscale;
height = ri->ri_font->fontheight;
sp = ri->ri_bits + r_srcrow + r_srccol * ri->ri_xscale;
dp = ri->ri_bits + r_dstrow + r_dstcol * ri->ri_xscale;
while (height--) {
memmove(dp, sp, ri->ri_xscale);
dp += ri->ri_stride;
sp += ri->ri_stride;
}
}
static void
rasops_putchar_rotated_ccw(void *cookie, int row, int col, u_int uc, long attr)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int height;
uint8_t *rp;
if (__predict_false((unsigned int)row > ri->ri_rows ||
(unsigned int)col > ri->ri_cols))
return;
/* Avoid underflow */
if (ri->ri_cols - col - 1 < 0)
return;
/* Do rotated char sans (side)underline */
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 */
if ((attr & WSATTR_UNDERLINE) != 0) {
uint16_t c =
(uint16_t)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
while (height--) {
*(uint16_t *)rp = c;
rp += ri->ri_stride;
}
}
}
/* XXX: these could likely be optimised somewhat. */
static void
rasops_copyrows_rotated_ccw(void *cookie, int src, int dst, int num)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int col, roff;
if (src > dst)
for (roff = 0; roff < num; roff++)
for (col = 0; col < ri->ri_cols; col++)
rasops_copychar_ccw(cookie,
src + roff, dst + roff, col, col);
else
for (roff = num - 1; roff >= 0; roff--)
for (col = 0; col < ri->ri_cols; col++)
rasops_copychar_ccw(cookie,
src + roff, dst + roff, col, col);
}
static void
rasops_copycols_rotated_ccw(void *cookie, int row, int src, int dst, int num)
{
int coff;
if (src > dst)
for (coff = 0; coff < num; coff++)
rasops_copychar_ccw(cookie, row, row,
src + coff, dst + coff);
else
for (coff = num - 1; coff >= 0; coff--)
rasops_copychar_ccw(cookie, row, row,
src + coff, dst + coff);
}
#endif /* NRASOPS_ROTATION */
void
rasops_make_box_chars_16(struct rasops_info *ri)
{
@ -1632,7 +1365,7 @@ rasops_get_cmap(struct rasops_info *ri, uint8_t *palette, size_t bytes)
int i, idx = 0;
uint8_t tmp;
if (bytes < 768)
if (bytes < 256 * 3)
return EINVAL;
for (i = 0; i < 256; i++) {
tmp = i & 0xe0;
@ -1657,5 +1390,271 @@ rasops_get_cmap(struct rasops_info *ri, uint8_t *palette, size_t bytes)
}
} else
memcpy(palette, rasops_cmap, uimin(bytes, sizeof(rasops_cmap)));
return 0;
}
#if NRASOPS_ROTATION > 0
/*
* Quarter clockwise rotation routines (originally intended for the
* built-in Zaurus C3x00 display in 16bpp).
*/
static void
rasops_rotate_font(int *cookie, int rotate)
{
struct rotatedfont *f;
int ncookie;
SLIST_FOREACH(f, &rotatedfonts, rf_next) {
if (f->rf_cookie == *cookie) {
*cookie = f->rf_rotated;
return;
}
}
/*
* We did not find a rotated version of this font. Ask the wsfont
* code to compute one for us.
*/
f = kmem_alloc(sizeof(*f), KM_SLEEP);
if ((ncookie = wsfont_rotate(*cookie, rotate)) == -1)
goto fail;
f->rf_cookie = *cookie;
f->rf_rotated = ncookie;
SLIST_INSERT_HEAD(&rotatedfonts, f, rf_next);
*cookie = ncookie;
return;
fail: kmem_free(f, sizeof(*f));
return;
}
static void
rasops_copychar(void *cookie, int srcrow, int dstrow, int srccol, int dstcol)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int r_srcrow, r_dstrow, r_srccol, r_dstcol, height;
uint8_t *sp, *dp;
r_srcrow = srccol;
r_dstrow = dstcol;
r_srccol = ri->ri_rows - srcrow - 1;
r_dstcol = ri->ri_rows - dstrow - 1;
r_srcrow *= ri->ri_yscale;
r_dstrow *= ri->ri_yscale;
height = ri->ri_font->fontheight;
sp = ri->ri_bits + r_srcrow + r_srccol * ri->ri_xscale;
dp = ri->ri_bits + r_dstrow + r_dstcol * ri->ri_xscale;
while (height--) {
memmove(dp, sp, ri->ri_xscale);
dp += ri->ri_stride;
sp += ri->ri_stride;
}
}
static void
rasops_putchar_rotated_cw(void *cookie, int row, int col, u_int uc, long attr)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int height;
uint16_t fg, *rp;
if (__predict_false((unsigned int)row > ri->ri_rows ||
(unsigned int)col > ri->ri_cols))
return;
/* Avoid underflow */
if (ri->ri_rows - row - 1 < 0)
return;
/* Do rotated char sans (side)underline */
ri->ri_real_ops.putchar(cookie, col, ri->ri_rows - row - 1, uc,
attr & ~WSATTR_UNDERLINE);
/*
* Do rotated underline
* XXX this assumes 16-bit color depth
*/
if ((attr & WSATTR_UNDERLINE) != 0) {
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--) {
*rp = fg;
DELTA(rp, ri->ri_stride, uint16_t *);
}
}
}
static void
rasops_erasecols_rotated_cw(void *cookie, int row, int col, int num, long attr)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int i;
for (i = col; i < col + num; i++)
ri->ri_ops.putchar(cookie, row, i, ' ', attr);
}
/* XXX: these could likely be optimised somewhat. */
static void
rasops_copyrows_rotated_cw(void *cookie, int src, int dst, int num)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int col, roff;
if (src > dst)
for (roff = 0; roff < num; roff++)
for (col = 0; col < ri->ri_cols; col++)
rasops_copychar(cookie, src + roff, dst + roff,
col, col);
else
for (roff = num - 1; roff >= 0; roff--)
for (col = 0; col < ri->ri_cols; col++)
rasops_copychar(cookie, src + roff, dst + roff,
col, col);
}
static void
rasops_copycols_rotated_cw(void *cookie, int row, int src, int dst, int num)
{
int coff;
if (src > dst)
for (coff = 0; coff < num; coff++)
rasops_copychar(cookie, row, row, src + coff,
dst + coff);
else
for (coff = num - 1; coff >= 0; coff--)
rasops_copychar(cookie, row, row, src + coff,
dst + coff);
}
static void
rasops_eraserows_rotated_cw(void *cookie, int row, int num, long attr)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int col, rn;
for (rn = row; rn < row + num; rn++)
for (col = 0; col < ri->ri_cols; col++)
ri->ri_ops.putchar(cookie, rn, col, ' ', attr);
}
/*
* Quarter counter-clockwise rotation routines (originally intended for the
* built-in Sharp W-ZERO3 display in 16bpp).
*/
static void
rasops_copychar_ccw(void *cookie, int srcrow, int dstrow, int srccol,
int dstcol)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int r_srcrow, r_dstrow, r_srccol, r_dstcol, height;
uint8_t *sp, *dp;
r_srcrow = ri->ri_cols - srccol - 1;
r_dstrow = ri->ri_cols - dstcol - 1;
r_srccol = srcrow;
r_dstcol = dstrow;
r_srcrow *= ri->ri_yscale;
r_dstrow *= ri->ri_yscale;
height = ri->ri_font->fontheight;
sp = ri->ri_bits + r_srcrow + r_srccol * ri->ri_xscale;
dp = ri->ri_bits + r_dstrow + r_dstcol * ri->ri_xscale;
while (height--) {
memmove(dp, sp, ri->ri_xscale);
dp += ri->ri_stride;
sp += ri->ri_stride;
}
}
static void
rasops_putchar_rotated_ccw(void *cookie, int row, int col, u_int uc, long attr)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int height;
uint16_t fg, *rp;
if (__predict_false((unsigned int)row > ri->ri_rows ||
(unsigned int)col > ri->ri_cols))
return;
/* Avoid underflow */
if (ri->ri_cols - col - 1 < 0)
return;
/* Do rotated char sans (side)underline */
ri->ri_real_ops.putchar(cookie, ri->ri_cols - col - 1, row, uc,
attr & ~WSATTR_UNDERLINE);
/*
* Do rotated underline
* XXX this assumes 16-bit color depth
*/
if ((attr & WSATTR_UNDERLINE) != 0) {
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--) {
*rp = fg;
DELTA(rp, ri->ri_stride, uint16_t *);
}
}
}
/* XXX: these could likely be optimised somewhat. */
static void
rasops_copyrows_rotated_ccw(void *cookie, int src, int dst, int num)
{
struct rasops_info *ri = (struct rasops_info *)cookie;
int col, roff;
if (src > dst)
for (roff = 0; roff < num; roff++)
for (col = 0; col < ri->ri_cols; col++)
rasops_copychar_ccw(cookie,
src + roff, dst + roff, col, col);
else
for (roff = num - 1; roff >= 0; roff--)
for (col = 0; col < ri->ri_cols; col++)
rasops_copychar_ccw(cookie,
src + roff, dst + roff, col, col);
}
static void
rasops_copycols_rotated_ccw(void *cookie, int row, int src, int dst, int num)
{
int coff;
if (src > dst)
for (coff = 0; coff < num; coff++)
rasops_copychar_ccw(cookie, row, row,
src + coff, dst + coff);
else
for (coff = num - 1; coff >= 0; coff--)
rasops_copychar_ccw(cookie, row, row,
src + coff, dst + coff);
}
#endif /* NRASOPS_ROTATION */

View File

@ -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 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 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, size_t bytes)
}
static __inline uint32_t
be32uatoh(uint8_t *p)
rasops_be32uatoh(uint8_t *p)
{
uint32_t u;

View File

@ -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, int col, u_int uc, long attr)
{
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, int col, u_int uc, long attr)
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];
col &= 31;
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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
}
/* 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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
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 *);
}
}

View File

@ -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, int col, u_int uc, long attr)
{
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, int col, u_int uc, long attr)
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];
col &= 31;
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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
}
} 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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
}
#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 */

View File

@ -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 rasops_info *, long);
#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 *ri, long attr)
}
}
/*
* 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 */

View File

@ -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, int row, int col, u_int uc, long attr)
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

View File

@ -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 rasops_info *, long);
#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, long attr)
}
}
/*
* 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 */
/* rasops2_putchar */
#undef RASOPS_AA
#include <dev/rasops/rasops1-4_putchar.h>
/* rasops2_putchar_aa */
#define RASOPS_AA
#include <dev/rasops/rasops1-4_putchar.h>
#undef RASOPS_AA
/*
* Grab routines common to depths where (bpp < 8)
*/
#undef RASOPS_AA
#include "rasops1-4_putchar.h"
#define RASOPS_AA
#include "rasops1-4_putchar.h"
#undef RASOPS_AA
#include <dev/rasops/rasops_bitops.h>

View File

@ -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 rasops_info *, long);
#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 *ri, uint32_t *xstamp,
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 *ri, long attr)
}
}
/*
* 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, int num, long attr)
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, int num, long attr)
* 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, int col, int num, long attr)
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, int col, int num, long attr)
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, int col, int num, long attr)
}
/* 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) {

View File

@ -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 rasops_info *, long);
#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 *ri, long attr)
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 *ri, long attr)
}
}
/*
* 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 */

View File

@ -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 rasops_info *, long);
#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, long attr)
}
}
/*
* 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>

View File

@ -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 rasops_info *ri, long);
#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, long attr)
}
}
/*
* 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 */

View File

@ -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, int col, int num, long attr)
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, int col, int num, long attr)
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, int col, int num, long attr)
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, int src, int dst, int num)
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, int src, int dst, int num)
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, int src, int dst, int num)
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, int src, int dst, int num)
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, int src, int dst, int num)
*dp = tmp;
}
if (lmask) {
if (lmask != 0) {
if (sbover)
--sp;
--dp;
@ -335,11 +343,9 @@ NAME(copycols)(void *cookie, int row, int src, int dst, int num)
}
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, int src, int dst, int num)
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 *);

View File

@ -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),

View File

@ -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_ */

View File

@ -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, 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, 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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
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, int col, u_int uc, long attr)
#undef PIXEL_TYPE
#undef PIXEL_BYTES
#undef SET_PIXEL
#undef SET_COLOR
#undef SET_RGB
#undef AV

View File

@ -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)(void *cookie, int row, int col,
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)(void *cookie, int row, int col,
}
} 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)(void *cookie, int row, int col,
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)(void *cookie, int row, int col,
#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