winedos / Fix text mode scrolling

Jukka Heinonen jhei at iki.fi
Tue May 6 14:15:08 CDT 2003


Changelog:
  Add scrolling support for VGA text mode.




Index: dlls/winedos/vga.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/vga.c,v
retrieving revision 1.34
diff -u -r1.34 vga.c
--- dlls/winedos/vga.c	1 Apr 2003 00:12:50 -0000	1.34
+++ dlls/winedos/vga.c	6 May 2003 19:10:12 -0000
@@ -781,9 +781,19 @@
         vga_text_x++;
     }
 
-    /*
-     * FIXME: add line wrapping and scrolling
-     */
+    if (vga_text_x >= vga_text_width)
+    {
+        vga_text_x = 0;
+        vga_text_y++;
+    }
+
+    if (vga_text_y >= vga_text_height)
+    {
+        vga_text_y = vga_text_height - 1;
+        VGA_ScrollUpText( 0, 0, 
+                          vga_text_height - 1, vga_text_width - 1, 
+                          1, vga_text_attr );
+    }
 
     /*
      * If we don't have a console, write directly to standard output.
@@ -814,18 +824,56 @@
     LeaveCriticalSection(&vga_lock);
 }
 
-void VGA_ScrollUpText(unsigned row1, unsigned col1,
-                     unsigned row2, unsigned col2,
-                     unsigned lines, BYTE attr)
+void VGA_ScrollUpText(unsigned row1,  unsigned col1,
+                      unsigned row2,  unsigned col2,
+                      unsigned lines, BYTE attr)
 {
-    FIXME("not implemented\n");
+    char    *buffer = VGA_AlphaBuffer();
+    unsigned y;
+
+    EnterCriticalSection(&vga_lock);
+
+    /*
+     * Scroll buffer.
+     */
+    for (y = row1; y <= row2 - lines; y++)
+        memmove( buffer + col1 + y * vga_text_width * 2,
+                 buffer + col1 + (y + lines) * vga_text_width * 2,
+                 (col2 - col1 + 1) * 2 );
+
+    /*
+     * Fill exposed lines.
+     */
+    for (y = max(row1, row2 - lines + 1); y <= row2; y++)
+        VGA_WriteChars( col1, y, ' ', attr, col2 - col1 + 1 );
+
+    LeaveCriticalSection(&vga_lock);
 }
 
-void VGA_ScrollDownText(unsigned row1, unsigned col1,
-                       unsigned row2, unsigned col2,
-                       unsigned lines, BYTE attr)
+void VGA_ScrollDownText(unsigned row1,  unsigned col1,
+                        unsigned row2,  unsigned col2,
+                        unsigned lines, BYTE attr)
 {
-    FIXME("not implemented\n");
+    char    *buffer = VGA_AlphaBuffer();
+    unsigned y;
+
+    EnterCriticalSection(&vga_lock);
+
+    /*
+     * Scroll buffer.
+     */
+    for (y = row2; y >= row1 + lines; y--)
+        memmove( buffer + col1 + y * vga_text_width * 2,
+                 buffer + col1 + (y - lines) * vga_text_width * 2,
+                 (col2 - col1 + 1) * 2 );
+
+    /*
+     * Fill exposed lines.
+     */
+    for (y = row1; y <= min(row1 + lines - 1, row2); y++)
+        VGA_WriteChars( col1, y, ' ', attr, col2 - col1 + 1 );
+
+    LeaveCriticalSection(&vga_lock);
 }
 
 void VGA_GetCharacterAtCursor(BYTE *ascii, BYTE *attr)




-- 
Jukka Heinonen <http://www.iki.fi/jhei/>



More information about the wine-patches mailing list