Scramble.mod: Translation to Stony Brook Modula-2

Last updated: 10. 1.1998, 17:46

<*/NOWARN:F*>
MODULE SCRAMBLE;
(*------------------------------------------------
   SCRAMBLE.C   -- Scramble (and Unscramble) Screen
                   (c) Charles Petzold, 1996
   SCRAMBLE.MOD -- Translation to Stony Brook Modula-2
                   (c) Peter Stadler,   1997
  ------------------------------------------------*)

IMPORT WINUSER;
IMPORT WIN32;
IMPORT WINX;
IMPORT WINGDI;
IMPORT SYSTEM;
IMPORT Lib;

CONST NUM = 200;

VAR
  iKeep   : ARRAY[0..NUM-1],[0..3] OF INTEGER;
  hdc     : WIN32.HDC;
  hdcMem  : WIN32.HDC;
  cx      : INTEGER;
  cy      : INTEGER;
  hBitmap : WIN32.HBITMAP;
  i       : INTEGER;
  j       : INTEGER;
  x1      : INTEGER;
  y1      : INTEGER;
  x2      : INTEGER;
  y2      : INTEGER;
BEGIN

     IF (WINUSER.LockWindowUpdate (WINUSER.GetDesktopWindow ())) THEN
          hdc     := WINGDI.CreateDC ("DISPLAY", "", "", WINX.NIL_DEVMODEA) ;
          hdcMem  := WINGDI.CreateCompatibleDC (hdc) ;
          cx  := WINUSER.GetSystemMetrics (WINUSER.SM_CXSCREEN) / 10 ;
          cy  := WINUSER.GetSystemMetrics (WINUSER.SM_CYSCREEN) / 10 ;
          hBitmap := WINGDI.CreateCompatibleBitmap (hdc, cx, cy) ;

          WINGDI.SelectObject (hdcMem, SYSTEM.CAST(WIN32.HGDIOBJ,hBitmap)) ;

          (*srand ((int) GetCurrentTime ()) ;*)

          FOR i := 0  TO 2-1 DO
               FOR  j := 0 TO NUM-1 DO
                    IF (i = 0) THEN
                         x1 := cx * VAL(INTEGER,(Lib.RANDOM (10) MOD 10));
                         iKeep [j,0] := x1;
                         y1 := cy * VAL(INTEGER,(Lib.RANDOM (10) MOD 10));
                         iKeep [j,1] := y1;
                         x2 := cx * VAL(INTEGER,(Lib.RANDOM (10) MOD 10));
                         iKeep [j,2] := x2;
                         y2 := cy * VAL(INTEGER,(Lib.RANDOM (10) MOD 10));
                         iKeep [j,3] := y2;
                    ELSE
                         x1 := iKeep [NUM - 1 - j] [0] ;
                         y1 := iKeep [NUM - 1 - j] [1] ;
                         x2 := iKeep [NUM - 1 - j] [2] ;
                         y2 := iKeep [NUM - 1 - j] [3] ;
                    END;
                    WINGDI.BitBlt (hdcMem, 0, 0, cx, cy, hdc,  x1, y1, WINGDI.SRCCOPY) ;
                    WINGDI.BitBlt (hdc,  x1, y1, cx, cy, hdc,  x2, y2, WINGDI.SRCCOPY) ;
                    WINGDI.BitBlt (hdc,  x2, y2, cx, cy, hdcMem, 0, 0, WINGDI.SRCCOPY) ;

                    WIN32.Sleep (10) ;
               END;
          END;
          WINGDI.DeleteDC (hdcMem) ;
          WINGDI.DeleteDC (hdc) ;
          WINGDI.DeleteObject (SYSTEM.CAST(WIN32.HGDIOBJ,hBitmap));

          WINUSER.LockWindowUpdate (NIL) ;
     END;
END SCRAMBLE.