--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
--All rights reserved.
--
--Redistribution and use in source and binary forms, with or without
--modification, are permitted provided that the following conditions are
--met:
--
--    - Redistributions of source code must retain the above copyright
--      notice, this list of conditions and the following disclaimer.
--
--    - Redistributions in binary form must reproduce the above copyright
--      notice, this list of conditions and the following disclaimer in
--      the documentation and/or other materials provided with the
--      distribution.
--
--    - Neither the name of The Numerical ALgorithms Group Ltd. nor the
--      names of its contributors may be used to endorse or promote products
--      derived from this software without specific prior written permission.
--
--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
)abbrev package VIEW ViewportPackage
++ Author: Jim Wen
++ Date Created: 30 April 1989
++ Date Last Updated: 15 June 1990
++ Basic Operations: graphCurves, drawCurves, coerce
++ Related Constructors:
++ Also See:
++ AMS Classifications:
++ Keywords: 
++ References:
++ Description: ViewportPackage provides functions for creating GraphImages 
++ and TwoDimensionalViewports from lists of lists of points.

ViewportPackage():Exports == Implementation where
  DROP    ==> DrawOption
  GRIMAGE ==> GraphImage
  L       ==> List
  P       ==> Point DoubleFloat
  PAL     ==> Palette
  PI      ==> PositiveInteger
  VIEW2D  ==> TwoDimensionalViewport

  Exports ==> with

    graphCurves : (L L P,PAL,PAL,PI,L DROP) -> GRIMAGE
      ++ graphCurves([[p0],[p1],...,[pn]],ptColor,lineColor,ptSize,[options]) 
      ++ creates a \spadtype{GraphImage} from the list of lists of points, p0
      ++ throught pn, using the options specified in the list \spad{options}.
      ++ The graph point color is specified by \spad{ptColor}, the graph line 
      ++ color is specified by \spad{lineColor}, and the size of the points is 
      ++ specified by \spad{ptSize}.
    graphCurves : L L P -> GRIMAGE 
      ++ graphCurves([[p0],[p1],...,[pn]]) creates a \spadtype{GraphImage} from
      ++ the list of lists of points indicated by p0 through pn.
    graphCurves : (L L P,L DROP) -> GRIMAGE 
      ++ graphCurves([[p0],[p1],...,[pn]],[options]) creates a 
      ++ \spadtype{GraphImage} from the list of lists of points, p0 throught pn,
      ++ using the options specified in the list \spad{options}.
    drawCurves : (L L P,PAL,PAL,PI,L DROP) -> VIEW2D
      ++ drawCurves([[p0],[p1],...,[pn]],ptColor,lineColor,ptSize,[options]) 
      ++ creates a \spadtype{TwoDimensionalViewport} from the list of lists of 
      ++ points, p0 throught pn, using the options specified in the list 
      ++ \spad{options}. The point color is specified by \spad{ptColor}, the
      ++ line color is specified by \spad{lineColor}, and the point size is 
      ++ specified by \spad{ptSize}.
    drawCurves : (L L P,L DROP) -> VIEW2D 
      ++ drawCurves([[p0],[p1],...,[pn]],[options]) creates a 
      ++ \spadtype{TwoDimensionalViewport} from the list of lists of points, 
      ++ p0 throught pn, using the options specified in the list \spad{options};
    coerce : GRIMAGE -> VIEW2D  
      ++ coerce(gi) converts the indicated \spadtype{GraphImage}, gi, into the
      ++ \spadtype{TwoDimensionalViewport} form.

  Implementation ==> add      

    import ViewDefaultsPackage
    import DrawOptionFunctions0

--% Functions that return GraphImages

    graphCurves(listOfListsOfPoints) ==
      graphCurves(listOfListsOfPoints, pointColorDefault(),_
                  lineColorDefault(), pointSizeDefault(),nil())

    graphCurves(listOfListsOfPoints,optionsList) ==
      graphCurves(listOfListsOfPoints, pointColorDefault(),_
                  lineColorDefault(), pointSizeDefault(),optionsList)

    graphCurves(listOfListsOfPoints,ptColor,lineColor,ptSize,optionsList) ==
      len := #listOfListsOfPoints
      listOfPointColors : L PAL := [ptColor for i in 1..len]
      listOfLineColors  : L PAL := [lineColor for i in 1..len]
      listOfPointSizes  : L PI  := [ptSize  for i in 1..len]
      makeGraphImage(listOfListsOfPoints,listOfPointColors, _
                         listOfLineColors,listOfPointSizes,optionsList)

--% Functions that return Two Dimensional Viewports

    drawCurves(listOfListsOfPoints,optionsList) ==
      drawCurves(listOfListsOfPoints,pointColorDefault(),_
                 lineColorDefault(),pointSizeDefault(),optionsList)

    drawCurves(ptLists:L L P,ptColor:PAL,lColor:PAL,ptSize:PI,optList:L DROP) ==
      v := viewport2D()
      options(v,optList)
      g :=  graphCurves(ptLists,ptColor,lColor,ptSize,optList)
      putGraph(v,g,1)
      makeViewport2D v

--% Coercions

    coerce(graf:GRIMAGE):VIEW2D ==
      if (key graf = 0) then makeGraphImage graf
      v := viewport2D()
      title(v,"VIEW2D")
--      dimensions(v,viewPosDefault().1,viewPosDefault().2,viewSizeDefault().1,viewSizeDefault().2)
      putGraph(v,graf,1::PI)
      makeViewport2D v

