split putchar method into one for alpha fonts and one for bitmap fonts
This commit is contained in:
parent
0012d4bd2f
commit
d5062c9e69
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: rasops32.c,v 1.22 2011/12/27 06:24:40 macallan Exp $ */
|
||||
/* $NetBSD: rasops32.c,v 1.23 2012/01/03 23:15:11 macallan Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||
|
@ -30,7 +30,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.22 2011/12/27 06:24:40 macallan Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.23 2012/01/03 23:15:11 macallan Exp $");
|
||||
|
||||
#include "opt_rasops.h"
|
||||
|
||||
|
@ -43,6 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.22 2011/12/27 06:24:40 macallan Exp $
|
|||
#include <dev/rasops/rasops.h>
|
||||
|
||||
static void rasops32_putchar(void *, int, int, u_int, long attr);
|
||||
static void rasops32_putchar_aa(void *, int, int, u_int, long attr);
|
||||
|
||||
/*
|
||||
* Initialize a 'rasops_info' descriptor for this depth.
|
||||
|
@ -60,12 +61,16 @@ rasops32_init(struct rasops_info *ri)
|
|||
ri->ri_bpos = 16;
|
||||
}
|
||||
|
||||
if (FONT_IS_ALPHA(ri->ri_font)) {
|
||||
ri->ri_ops.putchar = rasops32_putchar_aa;
|
||||
} else
|
||||
ri->ri_ops.putchar = rasops32_putchar;
|
||||
}
|
||||
|
||||
/*
|
||||
* Paint a single character.
|
||||
*/
|
||||
|
||||
static void
|
||||
rasops32_putchar(void *cookie, int row, int col, u_int uc, long attr)
|
||||
{
|
||||
|
@ -122,8 +127,6 @@ rasops32_putchar(void *cookie, int row, int col, u_int uc, long attr)
|
|||
fr = (u_char *)font->data + uc * ri->ri_fontscale;
|
||||
fs = font->stride;
|
||||
|
||||
if (font->stride < width) {
|
||||
/* this is a mono font */
|
||||
while (height--) {
|
||||
dp = rp;
|
||||
fb = fr[3] | (fr[2] << 8) | (fr[1] << 16) |
|
||||
|
@ -142,11 +145,80 @@ rasops32_putchar(void *cookie, int row, int col, u_int uc, long attr)
|
|||
fb <<= 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* this is an alpha map */
|
||||
}
|
||||
|
||||
/* Do underline */
|
||||
if ((attr & 1) != 0) {
|
||||
DELTA(rp, -(ri->ri_stride << 1), int32_t *);
|
||||
if (ri->ri_hwbits)
|
||||
DELTA(hrp, -(ri->ri_stride << 1), int32_t *);
|
||||
|
||||
while (width--) {
|
||||
*rp++ = clr[1];
|
||||
if (ri->ri_hwbits)
|
||||
*hrp++ = clr[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
rasops32_putchar_aa(void *cookie, int row, int col, u_int uc, long attr)
|
||||
{
|
||||
int width, height, cnt, fs, clr[2];
|
||||
struct rasops_info *ri = (struct rasops_info *)cookie;
|
||||
struct wsdisplay_font *font = PICK_FONT(ri, uc);
|
||||
int32_t *dp, *rp, *hp, *hrp;
|
||||
u_char *fr;
|
||||
int x, y, r, g, b, aval;
|
||||
int r1, g1, b1, r0, g0, b0;
|
||||
|
||||
hp = hrp = NULL;
|
||||
|
||||
#ifdef RASOPS_CLIPPING
|
||||
/* Catches 'row < 0' case too */
|
||||
if ((unsigned)row >= (unsigned)ri->ri_rows)
|
||||
return;
|
||||
|
||||
if ((unsigned)col >= (unsigned)ri->ri_cols)
|
||||
return;
|
||||
#endif
|
||||
|
||||
/* check if character fits into font limits */
|
||||
if (uc < font->firstchar ||
|
||||
(uc - font->firstchar) >= font->numchars)
|
||||
return;
|
||||
|
||||
rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
|
||||
if (ri->ri_hwbits)
|
||||
hrp = (int32_t *)(ri->ri_hwbits + row*ri->ri_yscale +
|
||||
col*ri->ri_xscale);
|
||||
|
||||
height = font->fontheight;
|
||||
width = font->fontwidth;
|
||||
|
||||
clr[0] = ri->ri_devcmap[(attr >> 16) & 0xf];
|
||||
clr[1] = ri->ri_devcmap[(attr >> 24) & 0xf];
|
||||
|
||||
if (uc == ' ') {
|
||||
while (height--) {
|
||||
dp = rp;
|
||||
DELTA(rp, ri->ri_stride, int32_t *);
|
||||
if (ri->ri_hwbits) {
|
||||
hp = hrp;
|
||||
DELTA(hrp, ri->ri_stride, int32_t *);
|
||||
}
|
||||
|
||||
for (cnt = width; cnt; cnt--) {
|
||||
*dp++ = clr[0];
|
||||
if (ri->ri_hwbits)
|
||||
*hp++ = clr[0];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
uc -= font->firstchar;
|
||||
fr = (u_char *)font->data + uc * ri->ri_fontscale;
|
||||
fs = font->stride;
|
||||
|
||||
r0 = (clr[0] >> 16) & 0xff;
|
||||
r1 = (clr[1] >> 16) & 0xff;
|
||||
g0 = (clr[0] >> 8) & 0xff;
|
||||
|
@ -163,12 +235,9 @@ rasops32_putchar(void *cookie, int row, int col, u_int uc, long attr)
|
|||
} else if (aval == 255) {
|
||||
*dp = clr[1];
|
||||
} else {
|
||||
r = aval * r1 +
|
||||
(255 - aval) * r0;
|
||||
g = aval * g1 +
|
||||
(255 - aval) * g0;
|
||||
b = aval * b1 +
|
||||
(255 - aval) * b0;
|
||||
r = aval * r1 + (255 - aval) * r0;
|
||||
g = aval * g1 + (255 - aval) * g0;
|
||||
b = aval * b1 + (255 - aval) * b0;
|
||||
*dp = (r & 0xff00) << 8 |
|
||||
(g & 0xff00) |
|
||||
(b & 0xff00) >> 8;
|
||||
|
@ -178,7 +247,6 @@ rasops32_putchar(void *cookie, int row, int col, u_int uc, long attr)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Do underline */
|
||||
if ((attr & 1) != 0) {
|
||||
|
|
Loading…
Reference in New Issue