aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Huth <thuth@linux.vnet.ibm.com>2015-02-26 13:32:40 +0100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2015-03-12 18:25:35 +1100
commit088baa0de49f9b97000609d3066b292b426cbb3c (patch)
treeef8126f0d9b087b90b97c6e58e7adc534a703ea8
parent21d5f489c2e311227f2a72cc7149066714398ae0 (diff)
downloadSLOF-088baa0de49f9b97000609d3066b292b426cbb3c.zip
SLOF-088baa0de49f9b97000609d3066b292b426cbb3c.tar.gz
SLOF-088baa0de49f9b97000609d3066b292b426cbb3c.tar.bz2
Fix rectangle drawing functions to work also with higher bit depths
draw-rectangle, fill-rectangle and read-rectangle were only working with 8-bit color depth displays so far. This is fixed now for 16-bit, 24-bit and 32-bit color depths, too, by taking the "screen-depth" into account. And while we're at it, consolidate all the same copies of these functions into one common file (graphics.fs) so that we do not have to do these modifications multiple times in different files. Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com> Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
-rw-r--r--board-js2x/slof/Makefile1
-rw-r--r--board-js2x/slof/vga-display.fs60
-rw-r--r--board-qemu/slof/Makefile1
-rw-r--r--board-qemu/slof/pci-device_1013_00b8.fs66
-rw-r--r--board-qemu/slof/pci-device_1234_1111.fs68
-rw-r--r--slof/fs/graphics.fs62
6 files changed, 68 insertions, 190 deletions
diff --git a/board-js2x/slof/Makefile b/board-js2x/slof/Makefile
index 5be9f07..ab3e683 100644
--- a/board-js2x/slof/Makefile
+++ b/board-js2x/slof/Makefile
@@ -76,6 +76,7 @@ OF_FFS_FILES = \
$(SLOFBRDDIR)/ipmi-kcs.fs \
$(SLOFCMNDIR)/fs/ide.fs \
$(SLOFCMNDIR)/fs/fbuffer.fs \
+ $(SLOFCMNDIR)/fs/graphics.fs \
$(SLOFCMNDIR)/fs/generic-disk.fs \
$(SLOFCMNDIR)/fs/scsi-disk.fs \
$(SLOFCMNDIR)/fs/scsi-host-helpers.fs \
diff --git a/board-js2x/slof/vga-display.fs b/board-js2x/slof/vga-display.fs
index 0295e88..96417e2 100644
--- a/board-js2x/slof/vga-display.fs
+++ b/board-js2x/slof/vga-display.fs
@@ -61,62 +61,6 @@ THEN
THEN
;
-\ as of OF 8bit Graphics Recommendation, these shall be implemented:
-
-: draw-rectangle ( adr x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( adr x y w adr x y w )
- drop ( adr x y w adr x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( adr x y w adr offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
- 1 pick 3 pick i * + swap 3 pick ( adr x y w adr adr_offs fb_adr w )
- rmove \ copy line ( adr x y w adr )
- drop ( adr x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
-: fill-rectangle ( number x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( number x y w number x y w )
- drop ( number x y w number x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( number x y w number offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( number x y w number adr )
- 2 pick 2 pick ( number x y w number adr w number )
- rfill \ draw line ( number x y w number )
- drop ( number x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
-: read-rectangle ( adr x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( adr x y w adr x y w )
- drop ( adr x y w adr x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( adr x y w adr offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
- 1 pick 3 pick i * + 3 pick ( adr x y w adr fb_adr adr_offs w )
- rmove \ copy line ( adr x y w adr )
- drop ( adr x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
: color! ( r g b number -- )
\ 3c8 is RAMDAC write mode select palette entry register
\ 3c9 is RAMDAC write mode write palette entry register ( 3 consecutive writes set new entry )
@@ -195,9 +139,7 @@ THEN
2drop
;
-: dimensions ( -- width height )
-width height
-;
+include graphics.fs
\ clear screen
mem-adr width height * 0 rfill
diff --git a/board-qemu/slof/Makefile b/board-qemu/slof/Makefile
index 7890a0f..283f77d 100644
--- a/board-qemu/slof/Makefile
+++ b/board-qemu/slof/Makefile
@@ -83,6 +83,7 @@ VIO_FFS_FILES = \
OF_FFS_FILES = \
$(SLOFCMNDIR)/fs/ide.fs \
$(SLOFCMNDIR)/fs/fbuffer.fs \
+ $(SLOFCMNDIR)/fs/graphics.fs \
$(SLOFCMNDIR)/fs/generic-disk.fs \
$(SLOFCMNDIR)/fs/dma-function.fs \
$(SLOFCMNDIR)/fs/pci-device.fs \
diff --git a/board-qemu/slof/pci-device_1013_00b8.fs b/board-qemu/slof/pci-device_1013_00b8.fs
index 8c6b623..ec7ef3f 100644
--- a/board-qemu/slof/pci-device_1013_00b8.fs
+++ b/board-qemu/slof/pci-device_1013_00b8.fs
@@ -89,67 +89,6 @@ false VALUE is-installed?
3cf vga-b!
;
-\ **************************************************************************
-\ ** These come from vga-display.fs and should probably be moved to a common
-\ ** location.
-
-: draw-rectangle ( adr x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( adr x y w adr x y w )
- drop ( adr x y w adr x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( adr x y w adr offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
- 1 pick 3 pick i * + swap 3 pick ( adr x y w adr adr_offs fb_adr w )
- rmove \ copy line ( adr x y w adr )
- drop ( adr x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
-: fill-rectangle ( number x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( number x y w number x y w )
- drop ( number x y w number x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( number x y w number offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( number x y w number adr )
- 2 pick 2 pick ( number x y w number adr w number )
- rfill \ draw line ( number x y w number )
- drop ( number x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
-: read-rectangle ( adr x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( adr x y w adr x y w )
- drop ( adr x y w adr x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( adr x y w adr offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
- 1 pick 3 pick i * + 3 pick ( adr x y w adr fb_adr adr_offs w )
- rmove \ copy line ( adr x y w adr )
- drop ( adr x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
-\ ** end of copy from vga-display.fs
-\ **************************************************************************
-
: color! ( r g b number -- )
3c8 vga-b!
rot 2 >> 3c9 vga-b!
@@ -185,6 +124,7 @@ false VALUE is-installed?
LOOP
;
+include graphics.fs
: init-mode
3da vga-b@ drop \ reset flip flop
@@ -306,10 +246,6 @@ false VALUE is-installed?
THEN
;
-: dimensions ( -- width height )
- disp-width disp-height
-;
-
: set-alias
s" screen" find-alias 0= IF
\ no previous screen alias defined, define it...
diff --git a/board-qemu/slof/pci-device_1234_1111.fs b/board-qemu/slof/pci-device_1234_1111.fs
index 13246be..0a39386 100644
--- a/board-qemu/slof/pci-device_1234_1111.fs
+++ b/board-qemu/slof/pci-device_1234_1111.fs
@@ -57,68 +57,6 @@ false VALUE is-installed?
1ce vga-w! 1d0 vga-w@
;
-
-\ **************************************************************************
-\ ** These come from vga-display.fs and should probably be moved to a common
-\ ** location.
-
-: draw-rectangle ( adr x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( adr x y w adr x y w )
- drop ( adr x y w adr x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( adr x y w adr offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
- 1 pick 3 pick i * + swap 3 pick ( adr x y w adr adr_offs fb_adr w )
- rmove \ copy line ( adr x y w adr )
- drop ( adr x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
-: fill-rectangle ( number x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( number x y w number x y w )
- drop ( number x y w number x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( number x y w number offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( number x y w number adr )
- 2 pick 2 pick ( number x y w number adr w number )
- rfill \ draw line ( number x y w number )
- drop ( number x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
-: read-rectangle ( adr x y w h -- )
- is-installed? IF
- 0 ?DO
- 4dup ( adr x y w adr x y w )
- drop ( adr x y w adr x y )
- i + screen-width * + \ calculate offset into framebuffer ((y + i) * screen_width + x)
- ( adr x y w adr offs )
- frame-buffer-adr + \ add to frame-buffer-adr ( adr x y w adr fb_adr )
- 1 pick 3 pick i * + 3 pick ( adr x y w adr fb_adr adr_offs w )
- rmove \ copy line ( adr x y w adr )
- drop ( adr x y w )
- LOOP
- 4drop
- ELSE
- 4drop drop
- THEN
-;
-
-\ ** end of copy from vga-display.fs
-\ **************************************************************************
-
: color! ( r g b number -- )
3c8 vga-b!
rot 3c9 vga-b!
@@ -154,6 +92,8 @@ false VALUE is-installed?
LOOP
;
+include graphics.fs
+
\ qemu fake VBE IO registers
0 CONSTANT VBE_DISPI_INDEX_ID
1 CONSTANT VBE_DISPI_INDEX_XRES
@@ -284,10 +224,6 @@ a CONSTANT VBE_DISPI_INDEX_NB
THEN
;
-: dimensions ( -- width height )
- disp-width disp-height
-;
-
: set-alias
s" screen" find-alias 0= IF
\ no previous screen alias defined, define it...
diff --git a/slof/fs/graphics.fs b/slof/fs/graphics.fs
new file mode 100644
index 0000000..d9407b6
--- /dev/null
+++ b/slof/fs/graphics.fs
@@ -0,0 +1,62 @@
+\ *****************************************************************************
+\ * Copyright (c) 2015 IBM Corporation
+\ * All rights reserved.
+\ * This program and the accompanying materials
+\ * are made available under the terms of the BSD License
+\ * which accompanies this distribution, and is available at
+\ * http://www.opensource.org/licenses/bsd-license.php
+\ *
+\ * Contributors:
+\ * IBM Corporation - initial implementation
+\ ****************************************************************************/
+
+\ Provide some of the functions that are defined in the
+\ "OF Recommended Practice: 8bit Graphics Extension" document
+
+: draw-rectangle ( adr x y w h -- )
+ frame-buffer-adr 0= IF 4drop drop EXIT THEN
+ 0 ?DO
+ 4dup drop ( adr x y w adr x y )
+ \ calculate offset into framebuffer: ((y + i) * width + x) * depth
+ i + screen-width * + screen-depth * ( adr x y w adr offs )
+ frame-buffer-adr + ( adr x y w adr fb_adr )
+ over 3 pick screen-depth * i * + ( adr x y w adr fb_adr src )
+ swap 3 pick screen-depth * ( adr x y w adr src fb_adr len )
+ rmove \ copy line ( adr x y w adr )
+ drop ( adr x y w )
+ LOOP
+ 4drop
+;
+
+: fill-rectangle ( col x y w h -- )
+ frame-buffer-adr 0= IF 4drop drop EXIT THEN
+ 0 ?DO
+ 4dup drop ( col x y w col x y )
+ \ calculate offset into framebuffer: ((y + i) * width + x) * depth
+ i + screen-width * + screen-depth * ( col x y w col offs )
+ frame-buffer-adr + ( col x y w col adr )
+ 2 pick screen-depth * 2 pick ( col x y w col adr len col )
+ rfill \ draw line ( col x y w col )
+ drop ( col x y w )
+ LOOP
+ 4drop
+;
+
+: read-rectangle ( adr x y w h -- )
+ frame-buffer-adr 0= IF 4drop drop EXIT THEN
+ 0 ?DO
+ 4dup drop ( adr x y w adr x y )
+ \ calculate offset into framebuffer: ((y + i) * width + x) * depth
+ i + screen-width * + screen-depth * ( adr x y w adr offs )
+ frame-buffer-adr + ( adr x y w adr fb_adr )
+ over 3 pick screen-depth * i * + ( adr x y w adr fb_adr dst )
+ 3 pick ( adr x y w adr fb_adr dst w )
+ rmove \ copy line ( adr x y w adr )
+ drop ( adr x y w )
+ LOOP
+ 4drop
+;
+
+: dimensions ( -- width height )
+ screen-width screen-height
+;