[OpenBIOS] [commit] r1146 - in trunk/openbios-devel: forth/device include/libopenbios libopenbios
repository service
svn at openbios.org
Sun Jun 9 14:25:18 CEST 2013
Author: mcayland
Date: Sun Jun 9 14:25:17 2013
New Revision: 1146
URL: http://tracker.coreboot.org/trac/openbios/changeset/1146
Log:
video_common.c: create low-level video_mask_blit() function.
Switch display.fs over to use it.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
Modified:
trunk/openbios-devel/forth/device/display.fs
trunk/openbios-devel/include/libopenbios/video.h
trunk/openbios-devel/libopenbios/video_common.c
Modified: trunk/openbios-devel/forth/device/display.fs
==============================================================================
--- trunk/openbios-devel/forth/device/display.fs Sun Jun 9 14:25:14 2013 (r1145)
+++ trunk/openbios-devel/forth/device/display.fs Sun Jun 9 14:25:17 2013 (r1146)
@@ -163,45 +163,8 @@
\ 5.3.6.3.3 Generic eight-bit frame-buffer support
-\ The following two functions are unrolled for speed.
-
-
-\ blit 8 continuous pixels described by the 8bit
-\ value in bitmask8. The most significant bit is
-\ painted first.
-
-\ this function should honour fg and bg colors
-
-: fb8-write-mask8 ( bitmask8 faddr -- )
- over 1 and 0<> over 7 + c!
- over 2 and 0<> over 6 + c!
- over 4 and 0<> over 5 + c!
- over 8 and 0<> over 4 + c!
- over 10 and 0<> over 3 + c!
- over 20 and 0<> over 2 + c!
- over 40 and 0<> over 1 + c!
- over 80 and 0<> over 0 + c!
- 2drop
- ;
-
-: fb8-blitmask ( fbaddr mask-addr width height -- )
- over >r \ save width ( -- R: width )
- * 3 >> \ fbaddr mask-addr width*height/8
- bounds \ fbaddr mask-end mask
- r> 0 2swap \ fbaddr width 0 mask-end mask
- ?do \ ( fbaddr width l-cnt )
- 2 pick over + \ fbaddr-current
- i c@ \ bitmask8
- swap fb8-write-mask8
- ( fbaddr width l-cnt )
- 8 + 2dup = if
- drop swap screen-width +
- swap 0
- then
- ( fbaddr width l-cnt )
- loop
- 2drop drop
- ;
+\ bind to low-level C function later
+defer fb8-blitmask
: fb8-line2addr ( line -- addr )
window-top +
@@ -229,6 +192,11 @@
line# char-height * window-top + screen-width *
column# char-width * window-left + + frame-buffer-adr +
swap char-width char-height
+ \ normal or inverse?
+ foreground-color background-color
+ inverse? if
+ swap
+ then
fb8-blitmask
\ now advance the position
column# 1+
Modified: trunk/openbios-devel/include/libopenbios/video.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/video.h Sun Jun 9 14:25:14 2013 (r1145)
+++ trunk/openbios-devel/include/libopenbios/video.h Sun Jun 9 14:25:17 2013 (r1146)
@@ -7,6 +7,7 @@
void draw_pixel(int x, int y, int colind);
void video_scroll(int height);
void fill_rect(int col_ind, int x, int y, int w, int h);
+void video_mask_blit(void);
typedef struct osi_fb_info {
unsigned long mphys;
Modified: trunk/openbios-devel/libopenbios/video_common.c
==============================================================================
--- trunk/openbios-devel/libopenbios/video_common.c Sun Jun 9 14:25:14 2013 (r1145)
+++ trunk/openbios-devel/libopenbios/video_common.c Sun Jun 9 14:25:17 2013 (r1146)
@@ -134,6 +134,56 @@
return 0;
}
+/* ( fbaddr maskaddr width height fgcolor bgcolor -- ) */
+
+void
+video_mask_blit(void)
+{
+ ucell bgcolor = POP();
+ ucell fgcolor = POP();
+ ucell height = POP();
+ ucell width = POP();
+ unsigned char *mask = (unsigned char *)POP();
+ unsigned char *fbaddr = (unsigned char *)POP();
+
+ ucell color;
+ unsigned char *dst, *rowdst;
+ int x, y, m, b, d, depthbytes;
+
+ fgcolor = get_color(fgcolor);
+ bgcolor = get_color(bgcolor);
+ d = video.fb.depth;
+ depthbytes = (video.fb.depth + 1) >> 3;
+
+ dst = fbaddr;
+ for( y = 0; y < height; y++) {
+ rowdst = dst;
+ for( x = 0; x < (width + 1) >> 3; x++ ) {
+ for (b = 0; b < 8; b++) {
+ m = (1 << (7 - b));
+
+ if (*mask & m) {
+ color = fgcolor;
+ } else {
+ color = bgcolor;
+ }
+
+ if( d >= 24 )
+ *((unsigned long*)dst) = color;
+ else if( d >= 15 )
+ *((short*)dst) = color;
+ else
+ *dst = color;
+
+ dst += depthbytes;
+ }
+ mask++;
+ }
+ dst = rowdst;
+ dst += video.fb.rb;
+ }
+}
+
void
draw_pixel( int x, int y, int colind )
{
@@ -283,6 +333,10 @@
feval("to frame-buffer-adr");
/* Set global variables ready for fb8-install */
+ PUSH( pointer2cell(video_mask_blit) );
+ fword("is-noname-cfunc");
+ feval("to fb8-blitmask");
+
PUSH((video.fb.depth + 1) >> 3);
feval("to depth-bytes");
PUSH(video.fb.rb);
More information about the OpenBIOS
mailing list