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:
parent
b38a7d7bb7
commit
b09e761aad
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 *);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 *);
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue