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

  1. Oberon10.Scn.Fnt
  2. Syntax10.Scn.Fnt
  3. (* ETH Oberon, Copyright 2000 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  4. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  5. MODULE Plotter; (** portable *)
  6. IMPORT Display, Display3, Gadgets, Objects, BasicGadgets, Oberon;
  7. CONST MaxPoints = 362;
  8.     Plotter = POINTER TO PlotterDesc;
  9.     PlotterDesc = RECORD (Gadgets.FrameDesc)
  10.         points: ARRAY MaxPoints OF LONGINT;
  11.         min, max: LONGINT;
  12.         end: INTEGER
  13.     END;
  14. PROCEDURE Min(x, y: LONGINT): LONGINT;
  15. BEGIN IF x < y THEN RETURN x ELSE RETURN y END
  16. END Min;
  17. PROCEDURE Max(x, y: LONGINT): LONGINT;
  18. BEGIN IF x > y THEN RETURN x ELSE RETURN y END
  19. END Max;
  20. PROCEDURE DisplayPlotter(P: Plotter; X, Y, W, H: INTEGER; VAR M: Display3.Mask);
  21. VAR i, p : INTEGER; range, min: LONGINT;
  22. BEGIN
  23.     Display3.FilledRect3D(M, Display3.white, Display3.black, 12, X, Y, W, H, 1, Display.replace);
  24.     range := P.max - P.min + 10; min := P.min - 5;
  25.     IF range = 0 THEN range := 1 END;
  26.     i := 0;
  27.     WHILE i < P.end DO
  28.         p := SHORT((P.points[i] - min) * (H - 4) DIV range);
  29.         Display3.Dot(M, Display3.black, X + i + 1, Y + p + 2, Display.replace);
  30.         INC(i);
  31.     END;
  32.     IF Gadgets.selected IN P.state THEN Display3.FillPattern(M, Display3.black, Display3.selectpat, X, Y, X, Y, W, H, Display.paint) END
  33. END DisplayPlotter;
  34. PROCEDURE Plot(P: Plotter; value: LONGINT; X, Y, W, H: INTEGER; VAR M: Display3.Mask);
  35. VAR i, p, end : INTEGER; oldrange, range, min: LONGINT;
  36. BEGIN
  37.     oldrange := P.max - P.min + 10;
  38.     IF oldrange = 0 THEN oldrange := 1 END;
  39.     end := P.end;
  40.     P.points[P.end] := value; P.end := (P.end + 1) MOD MaxPoints;
  41.     IF P.end = 0 THEN (* overflow *)
  42.         P.points[0] := value; P.end := 1;
  43.         DisplayPlotter(P, X, Y, W, H, M);
  44.         RETURN
  45.     END;
  46.     P.min := MAX(LONGINT); P.max := MIN(LONGINT);
  47.     i := 0;
  48.     WHILE i # P.end DO
  49.         P.min := Min(P.min, P.points[i]); P.max := Max(P.max, P.points[i]);
  50.         i := (i + 1) MOD MaxPoints
  51.     END;
  52.     range := P.max - P.min + 10; min := P.min - 5;
  53.     IF range = 0 THEN range := 1 END;
  54.     IF range # oldrange THEN DisplayPlotter(P, X, Y, W, H, M);
  55.     ELSE p := SHORT((value - min) * (H - 4) DIV range);
  56.         Display3.Dot(M, Display3.black, X + end + 1, Y + p + 2, Display.replace)
  57.     END;
  58.     IF Gadgets.selected IN P.state THEN Display3.FillPattern(M, Display3.black, Display3.selectpat, X, Y, X, Y, W, H, Display.paint) END
  59. END Plot;
  60. PROCEDURE *PlotterHandler(P: Objects.Object; VAR M: Objects.ObjMsg);
  61. VAR x, y, w, h: INTEGER; P0: Plotter; R: Display3.Mask;
  62. BEGIN
  63.     WITH P: Plotter DO
  64.         IF M IS Objects.AttrMsg THEN
  65.             WITH M: Objects.AttrMsg DO
  66.                 IF (M.id = Objects.get) & (M.name = "Gen") THEN M.s := "Plotter.NewPlotter"; M.res := 0; M.class := Objects.String
  67.                 ELSE Gadgets.framehandle(P, M)
  68.                 END
  69.              END;
  70.         ELSIF M IS Objects.CopyMsg THEN
  71.             WITH M: Objects.CopyMsg DO
  72.                 IF M.stamp = P.stamp THEN M.obj := P.dlink    (* copy msg arrives again *)
  73.                 ELSE    (* first time copy message arrives *)
  74.                     NEW(P0); P.stamp := M.stamp; P.dlink := P0; Gadgets.CopyFrame(M, P, P0); M.obj := P0
  75.                 END
  76.             END
  77.         ELSIF M IS Display.FrameMsg THEN
  78.             WITH M: Display.FrameMsg DO
  79.                 IF (M.F = NIL) OR (M.F = P) THEN    (* message addressed to this frame *)
  80.                     x := M.x + P.X; y := M.y + P.Y; w := P.W; h := P.H; (* calculate actual display coordinates *)
  81.                     IF M IS Display.DisplayMsg THEN
  82.                         WITH M: Display.DisplayMsg DO
  83.                             IF M.device = Display.screen THEN
  84.                                 IF (M.id = Display.full) OR (M.F = NIL) THEN
  85.                                     Gadgets.MakeMask(P, x, y, M.dlink, R);
  86.                                     DisplayPlotter(P, x, y, w, h, R);
  87.                                 ELSIF M.id = Display.area THEN
  88.                                     Gadgets.MakeMask(P, x, y, M.dlink, R);
  89.                                     Display3.AdjustMask(R, x + M.u, y + h - 1 + M.v, M.w, M.h);
  90.                                     DisplayPlotter(P, x, y, w, h, R);
  91.                                 END
  92.                             ELSIF M.device = Display.printer THEN Gadgets.framehandle(P, M)
  93.                             END
  94.                         END;
  95.                     ELSIF M IS Gadgets.UpdateMsg THEN
  96.                         WITH M: Gadgets.UpdateMsg DO
  97.                             IF (M.obj = P.obj) & (M.obj IS BasicGadgets.Integer) THEN
  98.                                 Gadgets.MakeMask(P, x, y, M.dlink, R);
  99.                                 Plot(P, P.obj(BasicGadgets.Integer).val, x, y, w, h, R);
  100.                             END
  101.                         END
  102.                     ELSIF M IS Oberon.InputMsg THEN
  103.                         WITH M: Oberon.InputMsg DO
  104.                             Gadgets.framehandle(P, M)
  105.                         END
  106.                     ELSE Gadgets.framehandle(P, M)
  107.                     END
  108.                 ELSE Gadgets.framehandle(P, M)
  109.                 END
  110.             END
  111.         ELSE Gadgets.framehandle(P, M)
  112.         END
  113. END PlotterHandler;
  114. PROCEDURE NewPlotter*;
  115. VAR P: Plotter;
  116. BEGIN NEW(P); P.W := 130; P.H := 100; P.handle := PlotterHandler; Objects.NewObj := P
  117. END NewPlotter;
  118. END Plotter.
  119.