[OpenBIOS] [commit] r1147 - in trunk/openbios-devel: forth/device include/libopenbios libopenbios

repository service svn at openbios.org
Sun Jun 9 14:25:20 CEST 2013


Author: mcayland
Date: Sun Jun  9 14:25:20 2013
New Revision: 1147
URL: http://tracker.coreboot.org/trac/openbios/changeset/1147

Log:
video_common.c: create low-level video_invert_rect() 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:17 2013	(r1146)
+++ trunk/openbios-devel/forth/device/display.fs	Sun Jun  9 14:25:20 2013	(r1147)
@@ -165,6 +165,7 @@
 
 \ bind to low-level C function later
 defer fb8-blitmask
+defer fb8-invertrect
 
 : fb8-line2addr ( line -- addr )
   window-top +
@@ -226,15 +227,11 @@
   ;
 
 : fb8-toggle-cursor ( -- )
-  line# char-height * window-top + screen-width *
-  column# char-width * window-left + + frame-buffer-adr +
-  char-height 0 ?do
-    char-width 0 ?do
-      dup i + dup c@ invert ff and swap c!
-    loop
-    screen-width +
-  loop
-  drop
+  column# char-width * window-left +
+  line# char-height * window-top +
+  char-width char-height
+  foreground-color background-color
+  fb8-invertrect
   ;
 
 : fb8-erase-screen ( -- )
@@ -249,20 +246,14 @@
   ;
 
 : fb8-invert-screen ( -- )
-  frame-buffer-adr
-  screen-height screen-width * 
-  bounds ?do
-    i c@ case
-      foreground-color of background-color endof
-      background-color of foreground-color endof
-      dup
-    endcase
-    i c!
-  loop
+  0 0 screen-width screen-height
+  background-color foreground-color
+  fb8-invertrect
   ;
 
 : fb8-blink-screen ( -- )
-  fb8-invert-screen fb8-invert-screen
+  fb8-invert-screen 2000 ms
+  fb8-invert-screen
   ;
   
 : fb8-insert-characters ( n -- )

Modified: trunk/openbios-devel/include/libopenbios/video.h
==============================================================================
--- trunk/openbios-devel/include/libopenbios/video.h	Sun Jun  9 14:25:17 2013	(r1146)
+++ trunk/openbios-devel/include/libopenbios/video.h	Sun Jun  9 14:25:20 2013	(r1147)
@@ -8,6 +8,7 @@
 void video_scroll(int height);
 void fill_rect(int col_ind, int x, int y, int w, int h);
 void video_mask_blit(void);
+void video_invert_rect(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:17 2013	(r1146)
+++ trunk/openbios-devel/libopenbios/video_common.c	Sun Jun  9 14:25:20 2013	(r1147)
@@ -184,6 +184,61 @@
 	}
 }
 
+/* ( x y w h fgcolor bgcolor -- ) */
+
+void
+video_invert_rect( void )
+{
+	ucell bgcolor = POP();
+	ucell fgcolor = POP();
+	int h = POP();
+	int w = POP();
+	int y = POP();
+	int x = POP();
+	char *pp;
+
+	bgcolor = get_color(bgcolor);
+	fgcolor = get_color(fgcolor);
+
+	if (!video.has_video || x < 0 || y < 0 || w <= 0 || h <= 0 ||
+		x + w > video.fb.w || y + h > video.fb.h)
+		return;
+
+	pp = (char*)video.fb.mvirt + video.fb.rb * y;
+	for( ; h--; pp += video.fb.rb ) {
+		int ww = w;
+		if( video.fb.depth == 24 || video.fb.depth == 32 ) {
+			unsigned long *p = (unsigned long*)pp + x;
+			while( ww-- ) {
+				if (*p == fgcolor) {
+					*p++ = bgcolor;
+				} else if (*p == bgcolor) {
+					*p++ = fgcolor;
+				}
+			}
+		} else if( video.fb.depth == 16 || video.fb.depth == 15 ) {
+			unsigned short *p = (unsigned short*)pp + x;
+			while( ww-- ) {
+				if (*p == (unsigned short)fgcolor) {
+					*p++ = bgcolor;
+				} else if (*p == (unsigned short)bgcolor) {
+					*p++ = fgcolor;
+				}
+			}
+		} else {
+			char *p = (char *)(pp + x);
+
+			while( ww-- ) {
+				if (*p == (char)fgcolor) {
+					*p++ = bgcolor;
+				} else if (*p == (char)bgcolor) {
+					*p++ = fgcolor;
+				}
+			}
+		}
+	}
+}
+
 void
 draw_pixel( int x, int y, int colind )
 {
@@ -336,6 +391,9 @@
 	PUSH( pointer2cell(video_mask_blit) );
 	fword("is-noname-cfunc");
 	feval("to fb8-blitmask");
+	PUSH( pointer2cell(video_invert_rect) );
+	fword("is-noname-cfunc");
+	feval("to fb8-invertrect");
 
 	PUSH((video.fb.depth + 1) >> 3);
 	feval("to depth-bytes");



More information about the OpenBIOS mailing list