[Oberon] System5 - Optimised CopyBlock()

Tomas Kral thomas.kral at email.cz
Fri Feb 22 15:15:13 CET 2019


I have coded optimised Display.CopyBlock(), now putting it to a real
test with `DIY Dialogs' I need to revisit my coding, that actually borrows from the original.

PROCEDURE CopyBlock*(sx, sy, w, h, dx, dy, mode: INTEGER); (*only for mode = replace*)
d := da - sa; n := u1 - v1; (*displacement in words and bits*)
(*len := (u2 - u0) * 4;*) len := (v2 - v0) * 4; (*source/target word span in bytes*)
IF dx = sx THEN (*scroll up / down*)
  (*use of SYSTEM.COPY()*)
ELSIF (dy = sy) & (n <= 0) THEN (*scroll right*)
  (*use of ASR,LSL*)
ELSIF (dy = sy) & (n > 0) THEN (*scroll left*)
  (*use of ASR,LSL*)
ELSIF n <= 0 THEN (*shift diagonal right*)
  (*use of ROR*)
ELSE (*n > 0 shift diagonal left*)
  (*use of ROR*)

I am not happy with my coding for horizontal scroll, has problems in some test cases. As a temporary solution for (dy = sy) case I wish to 
[1] scroll up /or down by 1 pixel (*optimised*)
[2] do a diagonal move (*functional*)

I could possibly introduce CopyBlock0(), and call from CopyBlock(), but I would prefer call CopyBlock() from within itself, but cannot figure out how, so the recursion is properly terminated.

Many thanks.

Tomas Kral <thomas.kral at email.cz>

More information about the Oberon mailing list