[OpenBIOS] [PATCH 11/16] video_common.c: create low-level video_invert_rect() function.

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Sun Mar 10 17:50:41 CET 2013


Switch display.fs over to use it.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
 openbios-devel/forth/device/display.fs     |   31 ++++++---------
 openbios-devel/include/libopenbios/video.h |    1 +
 openbios-devel/libopenbios/video_common.c  |   58 ++++++++++++++++++++++++++++
 3 files changed, 70 insertions(+), 20 deletions(-)

diff --git a/openbios-devel/forth/device/display.fs b/openbios-devel/forth/device/display.fs
index f641e46..f59ef1f 100644
--- a/openbios-devel/forth/device/display.fs
+++ b/openbios-devel/forth/device/display.fs
@@ -164,6 +164,7 @@ defer fb-emit ( x -- )
 
 \ bind to low-level C function later
 defer fb8-blitmask
+defer fb8-invertrect
 
 : fb8-line2addr ( line -- addr )
   window-top +
@@ -225,15 +226,11 @@ defer fb8-blitmask
   ;
 
 : 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 ( -- )
@@ -248,20 +245,14 @@ defer fb8-blitmask
   ;
 
 : 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 -- )
diff --git a/openbios-devel/include/libopenbios/video.h b/openbios-devel/include/libopenbios/video.h
index 6f79b49..4f10eb8 100644
--- a/openbios-devel/include/libopenbios/video.h
+++ b/openbios-devel/include/libopenbios/video.h
@@ -8,6 +8,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);
+void video_invert_rect(void);
 
 typedef struct osi_fb_info {
     unsigned long mphys;
diff --git a/openbios-devel/libopenbios/video_common.c b/openbios-devel/libopenbios/video_common.c
index 9fb7962..d1a81b5 100644
--- a/openbios-devel/libopenbios/video_common.c
+++ b/openbios-devel/libopenbios/video_common.c
@@ -183,6 +183,61 @@ video_mask_blit(void)
 	}
 }
 
+/* ( 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 )
 {
@@ -335,6 +390,9 @@ init_video( unsigned long fb, int width, int height, int depth, int rb )
 	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");
-- 
1.7.10.4




More information about the OpenBIOS mailing list