home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 July / Chip_2004-07_cd1.bin / tema / aos / files / Oberon.exe / Oberon / Docu.exe / Docu / XYplane.Mod (.txt) < prev   
Oberon Text  |  2000-02-29  |  4KB  |  108 lines

  1. Oberon10.Scn.Fnt
  2. Syntax10.Scn.Fnt
  3. Syntax10b.Scn.Fnt
  4. (* ETH Oberon, Copyright 2000 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  5. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  6. MODULE XYplane; (** portable *)
  7. (** virtual screen consiting of W x H pixels *)
  8. IMPORT Objects, Display, MenuViewers, Oberon, TextFrames, Input;
  9. CONST
  10.     SetSize = 32;
  11.     closed = 0; displayed = 2;
  12.     black = Display.FG; white = Display.BG;
  13.     erase* = 0; draw* = 1; (** values for parameter mode in Dot *)
  14. TYPE 
  15.     XYframe = POINTER TO XYframeDesc;
  16.     XYframeDesc = RECORD (Display.FrameDesc) END;
  17.     F: XYframe; V: MenuViewers.Viewer;
  18.     bitmap: POINTER TO ARRAY OF SET;
  19.     max: LONGINT;
  20.     W*, H*: INTEGER;    (** size of virtual screen in pixel *)
  21. PROCEDURE Modify(F: XYframe; VAR M: Display.ModifyMsg);
  22. VAR i, j: LONGINT; x, y: INTEGER;
  23. BEGIN
  24.     IF M.id = Display.extend THEN
  25.         Display.CopyBlock(F.X, F.Y, F.W, F.H, F.X, F.Y + M.dY, Display.replace);
  26.         Display.ReplConst(black, F.X, M.Y, F.W, M.H-F.H, Display.replace);
  27.         i := LONG(H - M.H)*W DIV SetSize; j := LONG(H - F.H)*W DIV SetSize;
  28.         y := M.Y;
  29.         WHILE i < j DO
  30.             x := 0;
  31.             WHILE x < F.W DO
  32.                 IF (x MOD SetSize) IN bitmap[i + x DIV SetSize] THEN
  33.                     Display.Dot(white, F.X+x, y, Display.replace) 
  34.                 END;
  35.                 INC(x)
  36.             END;
  37.             i := i + (W DIV SetSize); INC(y)
  38.         END
  39.     ELSIF (M.id = Display.reduce) & (M.dY > 0) THEN
  40.         Display.CopyBlock(F.X, F.Y + M.dY, F.W, M.H, F.X, M.Y, Display.replace)
  41. END Modify;
  42. PROCEDURE XYhandle*(F: Objects.Object; VAR M: Objects.ObjMsg);
  43. BEGIN
  44.     WITH F: XYframe DO
  45.         IF M IS Oberon.InputMsg THEN
  46.             WITH M: Oberon.InputMsg DO
  47.                 IF M.id = Oberon.track THEN
  48.                     Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, M.X, M.Y);
  49.                 END
  50.             END
  51.         ELSIF M IS Display.ModifyMsg THEN
  52.             WITH M: Display.ModifyMsg DO
  53.                 Modify(F, M)
  54.             END
  55.         END
  56.     END 
  57. END XYhandle;
  58. PROCEDURE Clear*;
  59. VAR j: LONGINT;
  60. BEGIN
  61.     Display.ReplConst(black, F.X, F.Y, F.W, F.H, Display.replace);
  62.     j := 0; WHILE j < max DO bitmap[j] := {}; INC(j) END
  63. END Clear;
  64. PROCEDURE Open*;
  65. VAR menuF: TextFrames.Frame; X, Y: INTEGER;
  66. BEGIN
  67.     IF V.state # displayed THEN
  68.         (* Oberon.OpenTrack(Oberon.Pointer.X, 0); *)
  69.         Oberon.AllocateUserViewer(Oberon.Pointer.X, X, Y);
  70.         menuF := TextFrames.NewMenu("XY Plane", "System.Close");
  71.         NEW(F); F.handle := XYhandle;
  72.         V := MenuViewers.New(menuF, F, TextFrames.menuH, X, Y)
  73.     END;
  74.     Clear
  75. END Open;
  76. PROCEDURE Dot*(x, y, mode: INTEGER);
  77. VAR k, i, j: LONGINT;
  78. BEGIN 
  79.     IF (x >= 0) & (x < W) & (y >= 0) & (y < H) THEN
  80.         k := LONG(y)*W + x; i := k DIV SetSize; j := k MOD SetSize;
  81.         INC(y, F.Y + F.H - H);
  82.         CASE mode OF
  83.              erase: EXCL(bitmap[i], j); IF (x < F.W) & (y >= F.Y) THEN Display.Dot(black, F.X+x, y, Display.replace) END
  84.             |draw: INCL(bitmap[i], j); IF (x < F.W) & (y >= F.Y) THEN Display.Dot(white, F.X+x, y, Display.replace) END
  85.         END
  86. END Dot;
  87. PROCEDURE IsDot*(x, y: INTEGER): BOOLEAN;
  88. VAR k, i, j: LONGINT;
  89. BEGIN
  90.     IF (x >= 0) & (x < W) & (y >= 0) & (y < H) THEN
  91.         k := LONG(y)*W + x; i := k DIV SetSize; j := k MOD SetSize;
  92.         RETURN j IN bitmap[i]
  93.     ELSE RETURN FALSE
  94. END IsDot;
  95. PROCEDURE Key*(): CHAR;
  96. VAR ch: CHAR;
  97. BEGIN ch := 0X;
  98.     IF Input.Available() > 0 THEN Input.Read(ch) END;
  99.     RETURN ch
  100. END Key;
  101. BEGIN
  102.     W := Display.Width; W := W + 32 - (W MOD 32);
  103.     H := Display.Height; H := H + 32 - (H MOD 32);
  104.     max := LONG(W)*LONG(H) DIV 32;
  105.     NEW(bitmap, max);
  106.     NEW(F); F.H := 0; NEW(V); V.state := closed
  107. END XYplane.
  108.