Module Name:    src
Committed By:   macallan
Date:           Thu Dec 22 05:05:24 UTC 2011

Modified Files:
        src/sys/dev/pci/voyager: files.voyager voyagerfb.c

Log Message:
support running in 32bit colour with anti-aliased fonts
enable with options VOYAGERFB_ANTIALIAS


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/pci/voyager/files.voyager
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/pci/voyager/voyagerfb.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/voyager/files.voyager
diff -u src/sys/dev/pci/voyager/files.voyager:1.3 src/sys/dev/pci/voyager/files.voyager:1.4
--- src/sys/dev/pci/voyager/files.voyager:1.3	Tue Dec 13 14:46:07 2011
+++ src/sys/dev/pci/voyager/files.voyager	Thu Dec 22 05:05:24 2011
@@ -3,10 +3,10 @@
 define voyagerbus {}
 
 # the graphics part
-device	voyagerfb: wsemuldisplaydev, rasops8, rasops16, vcons, videomode, iic, i2c_bitbang
+device	voyagerfb: wsemuldisplaydev, rasops8, rasops16, rasops32, vcons, videomode, iic, i2c_bitbang
 attach	voyagerfb at voyagerbus
 file	dev/pci/voyager/voyagerfb.c		voyagerfb needs-flag
-defflag	opt_voyagerfb.h	VOYAGERFB_DEBUG
+defflag	opt_voyagerfb.h	VOYAGERFB_DEBUG VOYAGERFB_ANTIALIAS
 
 # a clock timer
 defflag opt_pwmclock.h PWMCLOCK_DEBUG

Index: src/sys/dev/pci/voyager/voyagerfb.c
diff -u src/sys/dev/pci/voyager/voyagerfb.c:1.9 src/sys/dev/pci/voyager/voyagerfb.c:1.10
--- src/sys/dev/pci/voyager/voyagerfb.c:1.9	Tue Nov  8 07:05:06 2011
+++ src/sys/dev/pci/voyager/voyagerfb.c	Thu Dec 22 05:05:24 2011
@@ -1,7 +1,7 @@
-/*	$NetBSD: voyagerfb.c,v 1.9 2011/11/08 07:05:06 macallan Exp $	*/
+/*	$NetBSD: voyagerfb.c,v 1.10 2011/12/22 05:05:24 macallan Exp $	*/
 
 /*
- * Copyright (c) 2009 Michael Lorenz
+ * Copyright (c) 2009, 2011 Michael Lorenz
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: voyagerfb.c,v 1.9 2011/11/08 07:05:06 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: voyagerfb.c,v 1.10 2011/12/22 05:05:24 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -59,6 +59,8 @@ __KERNEL_RCSID(0, "$NetBSD: voyagerfb.c,
 #include <dev/i2c/i2cvar.h>
 #include <dev/pci/voyagervar.h>
 
+#include "opt_voyagerfb.h"
+
 #ifdef VOYAGERFB_DEBUG
 #define DPRINTF aprint_error
 #else
@@ -276,8 +278,13 @@ voyagerfb_attach(device_t parent, device
 	sc->sc_gpio_cookie = device_private(parent);
 	voyagerfb_setup_backlight(sc);
 
-	/* init engine here */
+#ifdef VOYAGERFB_ANTIALIAS
+	sc->sc_depth = 32;
+#else
 	sc->sc_depth = 8;
+#endif
+
+	/* init engine here */
 	voyagerfb_init(sc);
 
 	ri = &sc->sc_console_screen.scr_ri;
@@ -538,6 +545,9 @@ voyagerfb_init_screen(void *cookie, stru
 	if (existing) {
 		ri->ri_flg |= RI_CLEAR;
 	}
+#ifdef VOYAGERFB_ANTIALIAS
+	ri->ri_flg |= RI_ENABLE_ALPHA;
+#endif
 
 	rasops_init(ri, sc->sc_height / 8, sc->sc_width / 8);
 	ri->ri_caps = WSSCREEN_WSCOLORS;
@@ -715,7 +725,7 @@ voyagerfb_init(struct voyagerfb_softc *s
 #else
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, SM502_PANEL_CRSR_ADDR,
 	    sc->sc_cursor_addr);
-#endif
+#endif	
 }
 
 static void
@@ -856,9 +866,12 @@ voyagerfb_putchar(void *cookie, int row,
 		y = ri->ri_yorigin + row * he;
 		if (c == 0x20) {
 			voyagerfb_rectfill(sc, x, y, wi, he, bg);
-		} else {
-			uc = c - font->firstchar;
-			data = (uint8_t *)font->data + uc * ri->ri_fontscale;
+			return;
+		}
+		uc = c - font->firstchar;
+		data = (uint8_t *)font->data + uc * ri->ri_fontscale;
+		if (font->stride < font->fontwidth) {
+			/* this is a mono font */
 			cmd = ROP_COPY |
 			      SM502_CTRL_USE_ROP2 |
 			      SM502_CTRL_CMD_HOSTWRT |
@@ -889,6 +902,48 @@ voyagerfb_putchar(void *cookie, int row,
 				break;
 			
 			}	
+		} else {
+			/*
+			 * alpha font
+			 * we can't accelerate the actual alpha blending but
+			 * we can at least use a host blit to go through the
+			 * pipeline instead of having to sync the engine
+			 */
+			int i, r, g, b, alpha;
+			int rf, gf, bf, rb, gb, bb;
+			uint32_t pixel;
+
+			cmd = ROP_COPY |
+			      SM502_CTRL_USE_ROP2 |
+			      SM502_CTRL_CMD_HOSTWRT |
+			      SM502_CTRL_QUICKSTART_E;
+			voyagerfb_ready(sc);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh,
+			    SM502_CONTROL, cmd);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh,
+			    SM502_SRC, 0);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh,
+			    SM502_DST, (x << 16) | y);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh,
+			    SM502_DIMENSION, (wi << 16) | he);
+			rf = (fg >> 16) & 0xff;
+			rb = (bg >> 16) & 0xff;
+			gf = (fg >> 8) & 0xff;
+			gb = (bg >> 8) & 0xff;
+			bf =  fg & 0xff;
+			bb =  bg & 0xff;
+			for (i = 0; i < wi * he; i++) {
+				alpha = *data;
+				data++;
+				r = alpha * rf + (255 - alpha) * rb;
+				g = alpha * gf + (255 - alpha) * gb;
+				b = alpha * bf + (255 - alpha) * bb;
+				pixel = (r & 0xff00) << 8 |
+				        (g & 0xff00) |
+				        (b & 0xff00) >> 8;
+				bus_space_write_4(sc->sc_memt, sc->sc_regh,
+				    SM502_DATAPORT, pixel);
+			}
 		}
 	}
 }

Reply via email to