Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/rasops Factor out putchar_aa functions into rasops_p...



details:   https://anonhg.NetBSD.org/src/rev/12f393c985c0
branches:  trunk
changeset: 842958:12f393c985c0
user:      rin <rin%NetBSD.org@localhost>
date:      Mon Jul 29 10:55:56 2019 +0000

description:
Factor out putchar_aa functions into rasops_putchar_aa.h, which includes
the following fixes:

- stop using memset to framebuffer for depth 8
- correctly support non-standard positions/lengths of RGB bits in pixel

diffstat:

 sys/dev/rasops/rasops15.c          |   96 +-------------------
 sys/dev/rasops/rasops32.c          |   90 +-----------------
 sys/dev/rasops/rasops8.c           |  107 +---------------------
 sys/dev/rasops/rasops_putchar_aa.h |  180 +++++++++++++++++++++++++++++++++++++
 4 files changed, 189 insertions(+), 284 deletions(-)

diffs (truncated from 540 to 300 lines):

diff -r a9bad5394929 -r 12f393c985c0 sys/dev/rasops/rasops15.c
--- a/sys/dev/rasops/rasops15.c Mon Jul 29 10:28:57 2019 +0000
+++ b/sys/dev/rasops/rasops15.c Mon Jul 29 10:55:56 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rasops15.c,v 1.30 2019/07/28 12:06:10 rin Exp $        */
+/*     $NetBSD: rasops15.c,v 1.31 2019/07/29 10:55:56 rin Exp $        */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops15.c,v 1.30 2019/07/28 12:06:10 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops15.c,v 1.31 2019/07/29 10:55:56 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -110,97 +110,7 @@
 
 #define        RASOPS_DEPTH    15
 #include "rasops_putchar.h"
-
-static void
-rasops15_putchar_aa(void *cookie, int row, int col, u_int uc, long attr)
-{
-       int width, height, cnt, clr[2];
-       struct rasops_info *ri = (struct rasops_info *)cookie;
-       struct wsdisplay_font *font = PICK_FONT(ri, uc);
-       uint16_t *dp, *rp;
-       uint8_t *rrp;
-       uint8_t *fr;
-       uint16_t buffer[64]; /* XXX */
-       int x, y, r, g, b, aval;
-       int r1, g1, b1, r0, g0, b0, fgo, bgo;
-
-#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 (!CHAR_IN_FONT(uc, font))
-               return;
-
-       rrp = (ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
-       rp = (uint16_t *)rrp;
-
-       height = font->fontheight;
-       width = font->fontwidth;
-
-       clr[0] = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
-       clr[1] = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
-
-       if (uc == ' ') {
-               for (cnt = 0; cnt < width; cnt++)
-                       buffer[cnt] = clr[0];
-               for (y = 0; y < height; y++) {
-                       dp = rp;
-                       DELTA(rp, ri->ri_stride, uint16_t *);
-                       memcpy(dp, buffer, width << 1);
-               }
-       } else {
-               fr = FONT_GLYPH(uc, font, ri);
-
-               fgo = (((uint32_t)attr >> 24) & 0xf) * 3;
-               bgo = (((uint32_t)attr >> 16) & 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++) {
-                       dp = (uint16_t *)(rrp + ri->ri_stride * y);
-                       for (x = 0; x < width; x++) {
-                               aval = *fr;
-                               if (aval == 0) {
-                                       buffer[x] = clr[0];
-                               } else if (aval == 255) {
-                                       buffer[x] = clr[1];
-                               } else {
-                                       r = aval * r1 + (255 - aval) * r0;
-                                       g = aval * g1 + (255 - aval) * g0;
-                                       b = aval * b1 + (255 - aval) * b0;
-                                       buffer[x] =
-                                           ((r >> (16 - ri->ri_rnum)) <<
-                                               ri->ri_rpos) |
-                                           ((g >> (16 - ri->ri_gnum)) <<
-                                               ri->ri_gpos) |
-                                           ((b >> (16 - ri->ri_bnum)) <<
-                                               ri->ri_bpos);
-                               }
-                               fr++;
-                       }
-                       memcpy(dp, buffer, width << 1);
-               }
-       }
-
-       /* Do underline */
-       if ((attr & WSATTR_UNDERLINE) != 0) {
-               rp = (uint16_t *)rrp;
-               DELTA(rp, (ri->ri_stride * (height - 2)), uint16_t *);
-               while (width--)
-                       *rp++ = clr[1];
-       }
-}
+#include "rasops_putchar_aa.h"
 
 #ifndef RASOPS_SMALL
 /*
diff -r a9bad5394929 -r 12f393c985c0 sys/dev/rasops/rasops32.c
--- a/sys/dev/rasops/rasops32.c Mon Jul 29 10:28:57 2019 +0000
+++ b/sys/dev/rasops/rasops32.c Mon Jul 29 10:55:56 2019 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: rasops32.c,v 1.38 2019/07/28 12:06:10 rin Exp $       */
+/*      $NetBSD: rasops32.c,v 1.39 2019/07/29 10:55:56 rin Exp $       */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.38 2019/07/28 12:06:10 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops32.c,v 1.39 2019/07/29 10:55:56 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -109,91 +109,7 @@
 
 #define        RASOPS_DEPTH    32
 #include "rasops_putchar.h"
-
-static void
-rasops32_putchar_aa(void *cookie, int row, int col, u_int uc, long attr)
-{
-       int width, height, cnt, clr[2];
-       struct rasops_info *ri = (struct rasops_info *)cookie;
-       struct wsdisplay_font *font = PICK_FONT(ri, uc);
-       uint32_t *dp, *rp;
-       uint8_t *rrp;
-       uint8_t *fr;
-       uint32_t buffer[64]; /* XXX */
-       int x, y, r, g, b, aval;
-       int r1, g1, b1, r0, g0, b0;
-
-#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 (!CHAR_IN_FONT(uc, font))
-               return;
-
-       rrp = (ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
-       rp = (uint32_t *)rrp;
-
-       height = font->fontheight;
-       width = font->fontwidth;
-
-       clr[0] = ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
-       clr[1] = ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
-
-       if (uc == ' ') {
-               for (cnt = 0; cnt < width; cnt++)
-                       buffer[cnt] = clr[0];
-               while (height--) {
-                       dp = rp;
-                       DELTA(rp, ri->ri_stride, uint32_t *);
-                       memcpy(dp, buffer, width << 2);
-               }
-       } else {
-               fr = FONT_GLYPH(uc, font, ri);
-
-               r0 = (clr[0] >> 16) & 0xff;
-               r1 = (clr[1] >> 16) & 0xff;
-               g0 = (clr[0] >> 8) & 0xff;
-               g1 = (clr[1] >> 8) & 0xff;
-               b0 =  clr[0] & 0xff;
-               b1 =  clr[1] & 0xff;
-
-               for (y = 0; y < height; y++) {
-                       dp = (uint32_t *)(rrp + ri->ri_stride * y);
-                       for (x = 0; x < width; x++) {
-                               aval = *fr;
-                               if (aval == 0) {
-                                       buffer[x] = clr[0];
-                               } else if (aval == 255) {
-                                       buffer[x] = clr[1];
-                               } else {
-                                       r = aval * r1 + (255 - aval) * r0;
-                                       g = aval * g1 + (255 - aval) * g0;
-                                       b = aval * b1 + (255 - aval) * b0;
-                                       buffer[x] = (r & 0xff00) << 8 |
-                                             (g & 0xff00) |
-                                             (b & 0xff00) >> 8;
-                               }
-                               fr++;
-                       }
-                       memcpy(dp, buffer, width << 2);
-               }
-       }
-
-       /* Do underline */
-       if ((attr & WSATTR_UNDERLINE) != 0) {
-               rp = (uint32_t *)rrp;
-               height = font->fontheight;
-               DELTA(rp, (ri->ri_stride * (height - 2)), uint32_t *);
-               while (width--)
-                       *rp++ = clr[1];
-       }
-}
+#include "rasops_putchar_aa.h"
 
 #ifndef RASOPS_SMALL
 /*
diff -r a9bad5394929 -r 12f393c985c0 sys/dev/rasops/rasops8.c
--- a/sys/dev/rasops/rasops8.c  Mon Jul 29 10:28:57 2019 +0000
+++ b/sys/dev/rasops/rasops8.c  Mon Jul 29 10:55:56 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rasops8.c,v 1.43 2019/07/28 12:06:10 rin Exp $ */
+/*     $NetBSD: rasops8.c,v 1.44 2019/07/29 10:55:56 rin Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.43 2019/07/28 12:06:10 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rasops8.c,v 1.44 2019/07/29 10:55:56 rin Exp $");
 
 #include "opt_rasops.h"
 
@@ -107,108 +107,7 @@
 
 #define        RASOPS_DEPTH    8
 #include "rasops_putchar.h"
-
-static void
-rasops8_putchar_aa(void *cookie, int row, int col, u_int uc, long attr)
-{
-       int width, height;
-       uint8_t *rp, *hrp, *fr, bg, fg, pixel;
-       struct rasops_info *ri = (struct rasops_info *)cookie;
-       struct wsdisplay_font *font = PICK_FONT(ri, uc);
-       int x, y, r, g, b, aval;
-       int r1, g1, b1, r0, g0, b0, fgo, bgo;
-       uint8_t scanline[32] __attribute__ ((aligned(8)));
-
-       hrp = NULL;     /* XXX GCC */
-
-       if (!CHAR_IN_FONT(uc, font))
-               return;
-
-#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
-       rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
-       if (ri->ri_hwbits)
-               hrp = ri->ri_hwbits + row * ri->ri_yscale + col *
-                   ri->ri_xscale;
-
-       height = font->fontheight;
-       width = font->fontwidth;
-       bg = (uint8_t)ri->ri_devcmap[((uint32_t)attr >> 16) & 0xf];
-       fg = (uint8_t)ri->ri_devcmap[((uint32_t)attr >> 24) & 0xf];
-
-       if (uc == ' ') {
-
-               while (height--) {
-                       memset(rp, bg, width);
-                       if (ri->ri_hwbits) {
-                               memset(hrp, bg, width);
-                               hrp += ri->ri_stride;
-                       }
-                       rp += ri->ri_stride;
-               }
-       } else {
-               fr = FONT_GLYPH(uc, font, ri);
-               /*
-                * we need the RGB colours here, get offsets into rasops_cmap
-                */



Home | Main Index | Thread Index | Old Index