(*********************************************************************)
(*                                                                   *)
(* Module PlotLibrary Copyright © 1994 by Computer Inspirations      *)
(*                                                                   *)
(*********************************************************************)

DEFINITION MODULE PlotLibrary;


TYPE
  PlotType;  (* Opaque type -- holds plot characteristics *)

  PlotFunction = PROCEDURE(REAL) : REAL;
  LabelProc    = PROCEDURE(INTEGER, VAR ARRAY OF CHAR);

  PlotKindType = (Normal, Line, Bar, LogX, LogY, Log);

  LineType     = ARRAY [0..80] OF CHAR;
  PositionType = (UpperLeft, UpperMiddle, UpperRight,
                  LowerLeft, LowerMiddle, LowerRight);

(*-------------------------------------------------------

  Plot creation and maintenance routines

  ------------------------------------------------------*)

PROCEDURE InitPlot(VAR Plot               : PlotType;
                   MainTitle              : ARRAY OF CHAR;
                   PlotKind               : PlotKindType;
                   xMin, xMax, yMin, yMax : REAL;
                   width, height          : INTEGER;
                   xDiv, yDiv             : CARDINAL;
                   xSubDiv, ySubDiv       : CARDINAL;
                   xDec, yDec             : CARDINAL;
                   NumberOfColours        : CARDINAL)
                   : BOOLEAN;


PROCEDURE InitOffsetPlot
                  (VAR Plot               : PlotType;
                   PlotKind               : PlotKindType;
                   xMin, xMax, yMin, yMax : REAL;
                   width, height          : INTEGER;
                   xDiv, yDiv             : CARDINAL;
                   xSubDiv, ySubDiv       : CARDINAL;
                   xDec, yDec             : CARDINAL;
                   xOffset, yOffset       : INTEGER;
                   OldPlot                : PlotType)
                   : BOOLEAN;


PROCEDURE DonePlot(VAR Plot : PlotType);


PROCEDURE PlotFx(Plot : PlotType; Fx : PlotFunction);


PROCEDURE Empty() : PlotType;


(*-------------------------------------------------------

  Plot modification routines for more functionality

  ------------------------------------------------------*)

PROCEDURE ClearPlot(Plot : PlotType);


PROCEDURE InformationBox(Plot          : PlotType;
                         Position      : PositionType;
                         Lines         : ARRAY OF LineType;
                         FillColour    : CARDINAL;
                         OutlineColour : CARDINAL);


PROCEDURE PlotLine(Plot           : PlotType;
                   Colour         : CARDINAL;
                   x1, y1, x2, y2 : REAL);


PROCEDURE SetColourMap(Plot             : PlotType;
                       ColourIndex      : CARDINAL;
                       Red, Green, Blue : CARDINAL);


PROCEDURE SetPlotColour(Plot   : PlotType;
                        Colour : CARDINAL);


PROCEDURE SetPlotLimits(Plot                   : PlotType;
                        xMin, xMax, yMin, yMax : REAL);


PROCEDURE SetPlotScale (Plot           : PlotType;
                        xscale, yscale : REAL);


PROCEDURE SetPlotOffset(Plot       : PlotType;
                        xoff, yoff : INTEGER);


PROCEDURE SetTextColour(Plot   : PlotType;
                        Colour : CARDINAL);


PROCEDURE SetGridColour(Plot   : PlotType;
                        Colour : CARDINAL);


PROCEDURE SetZeroLine  (Plot   : PlotType;
                        On     : BOOLEAN);


PROCEDURE SetScatterPlot(Plot  : PlotType);


PROCEDURE SetScatterChar(Plot  : PlotType;
                         Ch    : CHAR);


(*-------------------------------------------------------

  Plot labelling routines

  ------------------------------------------------------*)

PROCEDURE CenterLabelX(Plot  : PlotType;
                       Label : ARRAY OF CHAR;
                       y     : INTEGER);


PROCEDURE CenterLabelY(Plot  : PlotType;
                       Label : ARRAY OF CHAR;
                       x     : INTEGER);


PROCEDURE LabelX(Plot  : PlotType;
                 Label : ARRAY OF CHAR;
                 x, y  : INTEGER);


PROCEDURE LabelY(Plot  : PlotType;
                 Label : ARRAY OF CHAR;
                 x, y  : INTEGER);


PROCEDURE LabelMinMax(Plot : PlotType;
                      Fx   : PlotFunction);


PROCEDURE SetLabelRoutine(Plot         : PlotType;
                          LabelRoutine : LabelProc);


END PlotLibrary.