Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/rasops Support anti-aliasing for depth 24.



details:   https://anonhg.NetBSD.org/src/rev/2ff4e580a48e
branches:  trunk
changeset: 452972:2ff4e580a48e
user:      rin <rin%NetBSD.org@localhost>
date:      Mon Jul 29 14:06:32 2019 +0000

description:
Support anti-aliasing for depth 24.

diffstat:

 sys/dev/rasops/rasops24.c          |   11 ++-
 sys/dev/rasops/rasops_putchar_aa.h |  166 +++++++++++++++++++++++-------------
 2 files changed, 113 insertions(+), 64 deletions(-)

diffs (289 lines):

diff -r c1eef7ebabdb -r 2ff4e580a48e sys/dev/rasops/rasops24.c
--- a/sys/dev/rasops/rasops24.c Mon Jul 29 12:37:26 2019 +0000
+++ b/sys/dev/rasops/rasops24.c Mon Jul 29 14:06:32 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rasops24.c,v 1.36 2019/07/28 12:06:10 rin Exp $        */
+/*     $NetBSD: rasops24.c,v 1.37 2019/07/29 14:06:32 rin Exp $        */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.36 2019/07/28 12:06:10 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops24.c,v 1.37 2019/07/29 14:06:32 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -48,6 +48,7 @@
 static void    rasops24_erasecols(void *, int, int, int, long);
 static void    rasops24_eraserows(void *, int, int, long);
 static void    rasops24_putchar(void *, int, int, u_int, long);
+static void    rasops24_putchar_aa(void *, int, int, u_int, long);
 #ifndef RASOPS_SMALL
 static void    rasops24_putchar8(void *, int, int, u_int, long);
 static void    rasops24_putchar12(void *, int, int, u_int, long);
@@ -90,6 +91,11 @@
        ri->ri_ops.erasecols = rasops24_erasecols;
        ri->ri_ops.eraserows = rasops24_eraserows;
 
+       if (FONT_IS_ALPHA(ri->ri_font)) {
+               ri->ri_ops.putchar = rasops24_putchar_aa;
+               return;
+       }
+
        switch (ri->ri_font->fontwidth) {
 #ifndef RASOPS_SMALL
        case 8:
@@ -110,6 +116,7 @@
 
 #define        RASOPS_DEPTH    24
 #include "rasops_putchar.h"
+#include "rasops_putchar_aa.h"
 
 #ifndef RASOPS_SMALL
 /*
diff -r c1eef7ebabdb -r 2ff4e580a48e sys/dev/rasops/rasops_putchar_aa.h
--- a/sys/dev/rasops/rasops_putchar_aa.h        Mon Jul 29 12:37:26 2019 +0000
+++ b/sys/dev/rasops/rasops_putchar_aa.h        Mon Jul 29 14:06:32 2019 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rasops_putchar_aa.h,v 1.1 2019/07/29 10:55:56 rin Exp $ */
+/* $NetBSD: rasops_putchar_aa.h,v 1.2 2019/07/29 14:06:32 rin Exp $ */
 
 /* NetBSD: rasops8.c,v 1.43 2019/07/28 12:06:10 rin Exp */
 /*-
@@ -30,7 +30,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
-#if RASOPS_DEPTH != 8 && RASOPS_DEPTH != 15 && /* RASOPS_DEPTH != 24 && */ \
+#if RASOPS_DEPTH != 8 && RASOPS_DEPTH != 15 && RASOPS_DEPTH != 24 && \
     RASOPS_DEPTH != 32
 #error "Depth not supported"
 #endif
@@ -38,33 +38,63 @@
 #define        PUTCHAR_AA(depth)       PUTCHAR_AA1(depth)
 #define        PUTCHAR_AA1(depth)      rasops ## depth ## _putchar_aa
 
+#define        MAX_WIDTH       64      /* XXX */
+
 #if   RASOPS_DEPTH == 8
 #define        PIXEL_TYPE      uint8_t
-#define        PIXEL_BITS      8
 #elif RASOPS_DEPTH == 15
 #define        PIXEL_TYPE      uint16_t
-#define        PIXEL_BITS      16
+#elif RASOPS_DEPTH == 24
+#define        PIXEL_TYPE      uint8_t
 #elif RASOPS_DEPTH == 32
 #define        PIXEL_TYPE      uint32_t
-#define        PIXEL_BITS      32
 #endif
 
-#define        MAX_WIDTH       64      /* XXX */
+#if RASOPS_DEPTH != 24
+#define        PIXEL_LEN       sizeof(PIXEL_TYPE)
+#define        BUF_LEN         MAX_WIDTH
+#define        SET_PIXEL(x, c) buf[x] = clr[c]
+#endif /* RASOPS_DEPTH != 24 */
+
+#if RASOPS_DEPTH == 24
+#define        PIXEL_LEN       3
+#define        BUF_LEN         (MAX_WIDTH * 3)
+#  if BYTE_ORDER == LITTLE_ENDIAN
+#define        ROFF            (ri->ri_rpos / 8)
+#define        GOFF            (ri->ri_gpos / 8)
+#define        BOFF            (ri->ri_bpos / 8)
+#  else        /* BIG_ENDIAN XXX not tested */
+#define        ROFF            (2 - ri->ri_rpos / 8)
+#define        GOFF            (2 - ri->ri_gpos / 8)
+#define        BOFF            (2 - ri->ri_bpos / 8)
+#  endif
+#define        SET_PIXEL(x, c)                         \
+       do {                                    \
+               buf[3 * x + ROFF] = r[c];       \
+               buf[3 * x + GOFF] = g[c];       \
+               buf[3 * x + BOFF] = b[c];       \
+       } while (0 /* CONSTCOND */)
+#endif /* RASOPS_DEPTH == 24 */
+
+#if RASOPS_DEPTH != 8
+#define        SET_BUF(c)      for (x = 0; x < width; x++) { SET_PIXEL(x, c); }
+#else
+#define        SET_BUF(c)      memset(buf, clr[c], width)
+#endif
 
 static void
 PUTCHAR_AA(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, bgo, fgo, x, y;
-       uint8_t *fr, r0, r1, g0, g1, b0, b1, aval;
-#if RASOPS_DEPTH == 8
-       uint16_t r, g, b;
-#else
-       PIXEL_TYPE r, g, b;
+       int height, width, x, y, off[2];
+       uint16_t r[2], g[2], b[2];
+       uint8_t *fr, aval;
+       PIXEL_TYPE *rp, *hp, R, G, B;
+       PIXEL_TYPE buf[BUF_LEN] __attribute__ ((aligned(8))); /* XXX */
+#if RASOPS_DEPTH != 24
+       PIXEL_TYPE clr[2];
 #endif
-       PIXEL_TYPE *rp, *hp, bg, fg, pixel;
-       PIXEL_TYPE buf[MAX_WIDTH] __attribute__ ((aligned(8))); /* XXX */
 
        hp = NULL;      /* XXX GCC */
 
@@ -93,65 +123,72 @@
        if (__predict_false(width > MAX_WIDTH))
                width = MAX_WIDTH;
 
-       bg = (PIXEL_TYPE)ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
-       fg = (PIXEL_TYPE)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
+#if RASOPS_DEPTH != 24
+       clr[0] = (PIXEL_TYPE)ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
+       clr[1] = (PIXEL_TYPE)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
+#endif
+
+       /*
+        * This is independent to positions/lengths of RGB in pixel.
+        */
+       off[0] = (((uint32_t)attr >> 16) & 0xf) * 3;
+       off[1] = (((uint32_t)attr >> 24) & 0xf) * 3;
+
+       r[0] = rasops_cmap[off[0]];
+       r[1] = rasops_cmap[off[1]];
+       g[0] = rasops_cmap[off[0] + 1];
+       g[1] = rasops_cmap[off[1] + 1];
+       b[0] = rasops_cmap[off[0] + 2];
+       b[1] = rasops_cmap[off[1] + 2];
 
        if (uc == ' ') {
-#if RASOPS_DEPTH == 8
-               memset(buf, bg, width);
-#else
-               for (x = 0; x < width; x++)
-                       buf[x] = bg;
-#endif
+               SET_BUF(0);
                while (height--) {
-                       memcpy(rp, buf, width * sizeof(PIXEL_TYPE));
+                       memcpy(rp, buf, width * PIXEL_LEN);
                        DELTA(rp, ri->ri_stride, PIXEL_TYPE *);
                        if (ri->ri_hwbits) {
-                               memcpy(hp, buf, width * sizeof(PIXEL_TYPE));
+                               memcpy(hp, buf, width * PIXEL_LEN);
                                DELTA(hp, ri->ri_stride, PIXEL_TYPE *);
                        }
                }
        } else {
                fr = FONT_GLYPH(uc, font, ri);
 
-               /*
-                * This is independent to positions/lengths of RGB in pixel.
-                */
-               bgo = (((uint32_t)attr >> 16) & 0xf) * 3;
-               fgo = (((uint32_t)attr >> 24) & 0xf) * 3;
-
-               r0 = rasops_cmap[bgo];
-               r1 = rasops_cmap[fgo];
-               g0 = rasops_cmap[bgo + 1];
-               g1 = rasops_cmap[fgo + 1];
-               b0 = rasops_cmap[bgo + 2];
-               b1 = rasops_cmap[fgo + 2];
-
                for (y = 0; y < height; y++) {
                        for (x = 0; x < width; x++) {
                                aval = *fr;
                                fr++;
-                               if (aval == 0) {
-                                       pixel = bg;
-                               } else if (aval == 255) {
-                                       pixel = fg;
-                               } else {
-                                       r = aval * r1 + (0xff - aval) * r0;
-                                       g = aval * g1 + (0xff - aval) * g0;
-                                       b = aval * b1 + (0xff - aval) * b0;
-#define        RGB2PIXEL(r, g, b)                                              \
-       ((((r) & 0xff00) >> (8 + 8 - ri->ri_rnum)) << ri->ri_rpos) |    \
-       ((((g) & 0xff00) >> (8 + 8 - ri->ri_gnum)) << ri->ri_gpos) |    \
-       ((((b) & 0xff00) >> (8 + 8 - ri->ri_bnum)) << ri->ri_bpos)
-                                       pixel = RGB2PIXEL(r, g, b);
+                               if (aval == 0)
+                                       SET_PIXEL(x, 0);
+                               else if (aval == 255)
+                                       SET_PIXEL(x, 1);
+                               else {
+#define        AVERAGE(p, w)   ((w * p[1] + (0xff - w) * p[0]) >> 8)
+                                       R = AVERAGE(r, aval);
+                                       G = AVERAGE(g, aval);
+                                       B = AVERAGE(b, aval);
+#undef AVERAGE
+
+#if RASOPS_DEPTH != 24
+#define        RGB2PIXEL(_r, _g, _b)                           \
+       (((_r) >> (8 - ri->ri_rnum)) << ri->ri_rpos) |  \
+       (((_g) >> (8 - ri->ri_gnum)) << ri->ri_gpos) |  \
+       (((_b) >> (8 - ri->ri_bnum)) << ri->ri_bpos)
+                                       buf[x] = RGB2PIXEL(R, G, B);
 #undef RGB2PIXEL
+#endif
+
+#if RASOPS_DEPTH == 24
+                                       buf[3 * x + ROFF] = R;
+                                       buf[3 * x + GOFF] = G;
+                                       buf[3 * x + BOFF] = B;
+#endif
                                }
-                               buf[x] = pixel;
                        }
-                       memcpy(rp, buf, width * sizeof(PIXEL_TYPE));
+                       memcpy(rp, buf, width * PIXEL_LEN);
                        DELTA(rp, ri->ri_stride, PIXEL_TYPE *);
                        if (ri->ri_hwbits) {
-                               memcpy(hp, buf, width * sizeof(PIXEL_TYPE));
+                               memcpy(hp, buf, width * PIXEL_LEN);
                                DELTA(hp, ri->ri_stride, PIXEL_TYPE *);
                        }
                }
@@ -159,22 +196,27 @@
 
        /* Do underline */
        if ((attr & WSATTR_UNDERLINE) != 0) {
+               SET_BUF(1);
                DELTA(rp, -(ri->ri_stride << 1), PIXEL_TYPE *);
-               if (ri->ri_hwbits) {
+               if (ri->ri_hwbits)
                        DELTA(hp, -(ri->ri_stride << 1), PIXEL_TYPE *);
-               }
-               while (width--) {
-                       *rp++ = fg;
-                       if (ri->ri_hwbits)
-                               *hp++ = fg;
-               }
+               memcpy(rp, buf, width * PIXEL_LEN);
+               if (ri->ri_hwbits)
+                       memcpy(hp, buf, width * PIXEL_LEN);
        }
 }
 
 #undef PUTCHAR_AA
 #undef PUTCHAR_AA1
 
+#undef MAX_WIDTH
+
 #undef PIXEL_TYPE
-#undef PIXEL_BITS
+#undef PIXEL_LEN
+#undef SET_PIXEL
 
-#undef MAX_WIDTH
+#undef ROFF
+#undef GOFF
+#undef BOFF
+
+#undef SET_BUF



Home | Main Index | Thread Index | Old Index