Scramble.mod: Translation to XDS Modula-2

Last updated: 18. 1.1998, 10:23

<* +M2EXTENSIONS *>
MODULE SCRAMBLE;
(*------------------------------------------------
   SCRAMBLE.C   -- Scramble (and Unscramble) Screen
                   (c) Charles Petzold, 1996
   SCRAMBLE.MOD -- Translation to XDS Modula-2
                   (c) Peter Stadler,   1997
  ------------------------------------------------*)


IMPORT Windows;


IMPORT SYSTEM;
IMPORT Lib;

CONST NUM = 200;

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

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

          Windows.SelectObject (hdcMem, SYSTEM.CAST(Windows.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;
                    Windows.BitBlt (hdcMem, 0, 0, cx, cy, hdc,  x1, y1, Windows.SRCCOPY) ;
                    Windows.BitBlt (hdc,  x1, y1, cx, cy, hdc,  x2, y2, Windows.SRCCOPY) ;
                    Windows.BitBlt (hdc,  x2, y2, cx, cy, hdcMem, 0, 0, Windows.SRCCOPY) ;

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

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