[SLOF] [PATCH v3 2/6] fbuffer: Precalculate line length in bytes
Alexey Kardashevskiy
aik at ozlabs.ru
Tue Aug 4 13:48:04 AEST 2015
On 08/04/2015 07:06 AM, Thomas Huth wrote:
> The framebuffer code calculates the length of a line in bytes over
> and over again, even in the tight innermost loops of the drawing
> functions. We can easily avoid this multiplication and make the
> code more readable by storing this value in a variable instead.
>
> Signed-off-by: Thomas Huth <thuth at redhat.com>
> Reviewed-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
> ---
> slof/fs/fbuffer.fs | 25 ++++++++++++++-----------
> 1 file changed, 14 insertions(+), 11 deletions(-)
>
> diff --git a/slof/fs/fbuffer.fs b/slof/fs/fbuffer.fs
> index bfe7ebf..4704608 100644
> --- a/slof/fs/fbuffer.fs
> +++ b/slof/fs/fbuffer.fs
> @@ -19,6 +19,7 @@
> 0 VALUE screen-height
> 0 VALUE screen-width
> 0 VALUE screen-depth
> +0 VALUE screen-line-bytes
> 0 VALUE window-top
> 0 VALUE window-left
>
> @@ -54,10 +55,10 @@
> : fb8-background inverse? ;
> : fb8-foreground inverse? invert ;
>
> -: fb8-lines2bytes ( #lines -- #bytes ) char-height * screen-width * screen-depth * ;
> +: fb8-lines2bytes ( #lines -- #bytes ) char-height * screen-line-bytes * ;
> : fb8-columns2bytes ( #columns -- #bytes ) char-width * screen-depth * ;
> : fb8-line2addr ( line# -- addr )
> - char-height * window-top + screen-width * screen-depth *
> + char-height * window-top + screen-line-bytes *
> frame-buffer-adr + window-left screen-depth * +
> ;
>
> @@ -98,10 +99,10 @@ CREATE bitmap-buffer 400 4 * allot
>
> : fb8-toggle-cursor ( -- )
> line# fb8-line2addr column# fb8-columns2bytes +
> - char-height 2 - screen-width screen-depth * * +
> + char-height 2 - screen-line-bytes * +
> 2 0 ?DO
> dup char-width screen-depth * invert-region
> - screen-width screen-depth * +
> + screen-line-bytes +
> LOOP drop
> ;
>
> @@ -111,7 +112,7 @@ CREATE bitmap-buffer 400 4 * allot
> line# fb8-line2addr column# fb8-columns2bytes + ( bitmap-buf fb-addr )
> char-height 0 ?DO
> 2dup char-width screen-depth * mrmove
> - screen-width screen-depth * + >r char-width screen-depth * + r>
> + screen-line-bytes + >r char-width screen-depth * + r>
> LOOP 2drop
> ELSE 2drop r> 3drop THEN
> ;
> @@ -136,12 +137,12 @@ CREATE bitmap-buffer 400 4 * allot
> fb8-columns2bytes swap fb8-columns2bytes tuck -
> over r@ tuck + rot char-height 0 ?DO
> 3dup rmove
> - -rot screen-width screen-depth * tuck + -rot + swap rot
> + -rot screen-line-bytes tuck + -rot + swap rot
> LOOP
> 3drop r>
> THEN
> char-height 0 ?DO
> - dup 2 pick fb8-erase-block screen-width screen-depth * +
> + dup 2 pick fb8-erase-block screen-line-bytes +
> LOOP
> 2drop
> ;
> @@ -154,12 +155,12 @@ CREATE bitmap-buffer 400 4 * allot
> fb8-columns2bytes swap fb8-columns2bytes tuck -
> over r@ + 2dup + r> swap >r rot char-height 0 ?DO
> 3dup rmove
> - -rot screen-width screen-depth * tuck + -rot + swap rot
> + -rot screen-line-bytes tuck + -rot + swap rot
> LOOP
> 3drop r> over -
> THEN
> char-height 0 ?DO
> - dup 2 pick fb8-erase-block screen-width screen-depth * +
> + dup 2 pick fb8-erase-block screen-line-bytes +
> LOOP
> 2drop
> ;
> @@ -167,11 +168,11 @@ CREATE bitmap-buffer 400 4 * allot
> : fb8-reset-screen ( -- ) ( Left as no-op by design ) ;
>
> : fb8-erase-screen ( -- )
> - frame-buffer-adr screen-height screen-width * screen-depth * fb8-erase-block
> + frame-buffer-adr screen-height screen-line-bytes * fb8-erase-block
> ;
>
> : fb8-invert-screen ( -- )
> - frame-buffer-adr screen-height screen-width * screen-depth * invert-region
> + frame-buffer-adr screen-height screen-line-bytes * invert-region
> ;
>
> : fb8-blink-screen ( -- ) fb8-invert-screen fb8-invert-screen ;
> @@ -179,6 +180,7 @@ CREATE bitmap-buffer 400 4 * allot
> : fb8-install ( width height #columns #lines -- )
> 1 to screen-depth
> 2swap to screen-height to screen-width
> + screen-width to screen-line-bytes
This does not seem right...
> screen-#rows min to #lines
> screen-#columns min to #columns
> screen-height char-height #lines * - 2/ to window-top
> @@ -200,6 +202,7 @@ CREATE bitmap-buffer 400 4 * allot
> >r
> fb8-install
> r> to screen-depth
> + screen-width screen-depth * to screen-line-bytes
... but this seems correct.
> ;
>
>
>
--
Alexey
More information about the SLOF
mailing list