Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/rasops split putchar method into one for alpha fonts...



details:   https://anonhg.NetBSD.org/src/rev/b66c05d23b5b
branches:  trunk
changeset: 772430:b66c05d23b5b
user:      macallan <macallan%NetBSD.org@localhost>
date:      Tue Jan 03 23:15:11 2012 +0000

description:
split putchar method into one for alpha fonts and one for bitmap fonts

diffstat:

 sys/dev/rasops/rasops32.c |  178 +++++++++++++++++++++++++++++++--------------
 1 files changed, 123 insertions(+), 55 deletions(-)

diffs (224 lines):

diff -r ac66d167b941 -r b66c05d23b5b sys/dev/rasops/rasops32.c
--- a/sys/dev/rasops/rasops32.c Tue Jan 03 23:13:59 2012 +0000
+++ b/sys/dev/rasops/rasops32.c Tue Jan 03 23:15:11 2012 +0000
@@ -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 @@
 #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 @@
                ri->ri_bpos = 16;
        }
 
-       ri->ri_ops.putchar = rasops32_putchar;
+       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,60 +127,22 @@
                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) |
-                                   (fr[0] << 24);
-                               fr += fs;
-                               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[(fb >> 31) & 1];
-                                       if (ri->ri_hwbits)
-                                               *hp++ = clr[(fb >> 31) & 1];
-                                       fb <<= 1;
-                               }
+               while (height--) {
+                       dp = rp;
+                       fb = fr[3] | (fr[2] << 8) | (fr[1] << 16) |
+                           (fr[0] << 24);
+                       fr += fs;
+                       DELTA(rp, ri->ri_stride, int32_t *);
+                       if (ri->ri_hwbits) {
+                               hp = hrp;
+                               DELTA(hrp, ri->ri_stride, int32_t *);
                        }
-               } else {
-                       /* this is an alpha map */
-                       int x, y, r, g, b, aval;
-                       int r1, g1, b1, r0, g0, b0;
 
-                       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 = rp + ri->ri_width * y;
-                               for (x = 0; x < width; x++) {
-                                       aval = *fr;
-                                       if (aval == 0) {
-                                               *dp = clr[0];
-                                       } 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;
-                                               *dp = (r & 0xff00) << 8 | 
-                                                     (g & 0xff00) | 
-                                                     (b & 0xff00) >> 8;
-                                       }
-                                       dp++;
-                                       fr++;
-                               }
+                       for (cnt = width; cnt; cnt--) {
+                               *dp++ = clr[(fb >> 31) & 1];
+                               if (ri->ri_hwbits)
+                                       *hp++ = clr[(fb >> 31) & 1];
+                               fb <<= 1;
                        }
                }
        }
@@ -193,3 +160,104 @@
                }
        }
 }
+
+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;
+               g1 = (clr[1] >> 8) & 0xff;
+               b0 =  clr[0] & 0xff;
+               b1 =  clr[1] & 0xff;
+
+               for (y = 0; y < height; y++) {
+                       dp = rp + ri->ri_width * y;
+                       for (x = 0; x < width; x++) {
+                               aval = *fr;
+                               if (aval == 0) {
+                                       *dp = clr[0];
+                               } 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;
+                                       *dp = (r & 0xff00) << 8 | 
+                                             (g & 0xff00) | 
+                                             (b & 0xff00) >> 8;
+                               }
+                               dp++;
+                               fr++;
+                       }
+               }
+       }
+
+       /* 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];
+               }
+       }
+}



Home | Main Index | Thread Index | Old Index