shapes.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:45k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * shapes.h
  3.  *
  4.  * Geometric Shapes GUI classes.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: shapes.h,v $
  30.  * Revision 1.17  1999/08/17 03:46:40  robertj
  31.  * Fixed usage of inlines in optimised version.
  32.  *
  33.  * Revision 1.16  1999/03/09 08:01:47  robertj
  34.  * Changed comments for doc++ support (more to come).
  35.  *
  36.  * Revision 1.15  1999/02/16 08:08:28  robertj
  37.  * MSVC 6.0 compatibility changes.
  38.  *
  39.  * Revision 1.14  1998/09/23 06:19:56  robertj
  40.  * Added open source copyright license.
  41.  *
  42.  * Revision 1.13  1997/07/08 13:02:07  robertj
  43.  * DLL support.
  44.  *
  45.  * Revision 1.12  1996/08/17 10:00:32  robertj
  46.  * Changes for Windows DLL support.
  47.  *
  48.  * Revision 1.11  1996/08/08 10:08:52  robertj
  49.  * Directory structure changes for common files.
  50.  *
  51.  * Revision 1.10  1995/06/17 11:13:20  robertj
  52.  * Documentation update.
  53.  *
  54.  * Revision 1.9  1995/04/25 11:00:32  robertj
  55.  * Fixed function hiding ancestor virtual.
  56.  *
  57.  * Revision 1.8  1995/03/14 12:42:35  robertj
  58.  * Updated documentation to use HTML codes.
  59.  *
  60.  * Revision 1.7  1995/01/21  05:22:29  robertj
  61.  * Documentation.
  62.  *
  63.  * Revision 1.6  1994/12/05  11:34:23  robertj
  64.  * Major rewrite of images, pictures and pixmaps.
  65.  * Renamed PPict, PPixels and PImage to make sure all uses are found.
  66.  *
  67.  * Revision 1.5  1994/10/23  04:56:18  robertj
  68.  * Changed PImage descendents to be pointers for polymorphism.
  69.  *
  70.  * Revision 1.4  1994/08/23  11:32:52  robertj
  71.  * Oops
  72.  *
  73.  * Revision 1.3  1994/08/22  00:46:48  robertj
  74.  * Added pragma fro GNU C++ compiler.
  75. *
  76.  * Revision 1.2  1994/06/25  11:55:15  robertj
  77.  * Unix version synchronisation.
  78.  *
  79.  * Revision 1.1  1994/04/01  14:16:42  robertj
  80.  * Initial revision
  81.  *
  82.  * Revision 1.5  1994/01/03  04:42:23  robertj
  83.  * Mass changes to common container classes and interactors etc etc etc.
  84.  *
  85.  * Revision 1.4  1993/11/20  17:26:28  robertj
  86.  * Started implementation.
  87.  *
  88.  * Revision 1.3  1993/10/16  20:33:20  robertj
  89.  * Added PShape API.
  90.  *
  91.  * Revision 1.2  1993/07/14  12:49:16  robertj
  92.  * Fixed RCS keywords.
  93.  *
  94.  */
  95. #ifndef _PSHAPES
  96. #define _PSHAPES
  97. #ifdef __GNUC__
  98. #pragma interface
  99. #endif
  100. /**A class representing a graphics shape object. This is an abstract class for
  101.    a number of objects representing graphics that may be drawn on a canvas, eg
  102.    ref{PLine} or ref{PEllipse} etc.
  103.    A shape has all the niformation needed to draw it. This comes from the
  104.    PCanvasState ancestor plus shape specific information such as the end
  105.    points for a line.
  106.    All shapes have at least a position, plus the capability of a common set of
  107.    behavour as defined by this class, eg the ref{Draw()} function draws the
  108.    shape on a ref{PCanvas}.
  109.  */
  110. class PShape : public PObject, public PCanvasState {
  111.   PCLASSINFO(PShape, PObject);
  112.   public:
  113.   /**@name Construction */
  114.   //@{
  115.     /** Create a new graphic shape. */
  116.     PShape(
  117.       PORDINATE x,    /// Horizontal position for the shape.
  118.       PORDINATE y     /// Vertical position for the shape.
  119.     );
  120.     /** Create a new graphic shape. */
  121.     PShape(
  122.       const PPoint & pt  /// Position for the shape.
  123.     );
  124.   //@}
  125.   // New functions for class
  126.     void SetPosition(
  127.       PORDINATE x,    // Horizontal position for the shape.
  128.       PORDINATE y     // Vertical position for the shape.
  129.     );
  130.     void SetPosition(
  131.       const PPoint & pt  // Position for the shape.
  132.     );
  133.     /* Set the position of the shape. This changes the internal position only,
  134.        it is up to the application to redraw the canvas to reflect the change.
  135.        The user should not override this function. If some form of action is
  136.        required on changing the shapes position then the
  137.        ref{_SetPosition()} function should be overridden.
  138.      */
  139.     PPoint GetPosition() const;
  140.     /* Get the current position of the shape.
  141.        @return
  142.        point for position of shape.
  143.      */
  144.     void Offset(
  145.       PORDINATE dx,   // Amount to move the shape horizontally.
  146.       PORDINATE dy    // Amount to move the shape vertically.
  147.     );
  148.     void Offset(
  149.       const PPoint & pt   // Amount to move the shape.
  150.     );
  151.     /* Move the position of the shape by the offset specified. This will use
  152.        the ref{GetPosition()} and ref{SetPosition()} functions.
  153.      */
  154.     void SetDimensions(
  155.       PDIMENSION width,   // New width for shape.
  156.       PDIMENSION height   // New height for shape.
  157.     );
  158.     void SetDimensions(
  159.       const PDim & dim    // New dimensions for shape.
  160.     );
  161.     /* Set the dimensions of the shape. The exact semantics of this function
  162.        is dependent on the descendent class. Not all shapes can change their
  163.        dimensions, being defined by other factors, eg a text lines width and
  164.        height is defined by the text and font size used.
  165.        The user should not override this function. If some form of action is
  166.        required on changing the shapes position then the
  167.        ref{_SetPosition()} function should be overridden.
  168.      */
  169.     virtual PDim GetDimensions() const = 0;
  170.     /* Get the dimensions of the shape. This is defined by the descendent
  171.        class as the definition of the dimensions is specific to the type of
  172.        shape, eg a text lines width and height is defined by the text and font
  173.        size used.
  174.        @return
  175.        dimensions of the shape.
  176.      */
  177.     void Grow(
  178.       PORDINATE dx,   // Amount to grow/shrink the shape horizontally.
  179.       PORDINATE dy    // Amount to grow/shrink the shape vertically.
  180.     );
  181.     void Grow(
  182.       const PPoint & pt   // Amount to grow/shrink the shape.
  183.     );
  184.     /* Increase the size of the shape by the amount specified. If the values
  185.        are negative then the dimensions are decreased. This uses the
  186.        ref{GetDimensions()} and ref{SetDimensions()} functions.
  187.        
  188.        Note this will not have an effect on all shapes.
  189.      */
  190.     PRect GetBounds() const;
  191.     /* Get the smallest rectangle that completely encloses the shape. This
  192.        uses the ref{GetPosition()} and ref{GetDimensions()} functions.
  193.      */
  194.     virtual BOOL InShape(
  195.       const PPoint & pt   // Point to determine if inside shape.
  196.     ) const;
  197.     /* Determine if the point is within the content of the shape.
  198.     
  199.        Note that the contents of a shape is usually the bounding box but not
  200.        always. For example a ref{PLine} might encompass a very large bounding
  201.        box but the line only occupies a thin slice of it. This function would
  202.        then be altered to detect a point near the line.
  203.        @return
  204.        TRUE if point is "inside" the shape.
  205.      */
  206.     virtual BOOL IsComposite() const;
  207.     /* Determine if the shape is a composite shape, ie is made up of a
  208.        collection of other shapes.
  209.        @return
  210.        TRUE if the shape is composite.
  211.      */
  212.     virtual void Draw(
  213.       PCanvas & canvas    // Canvas to draw the shape on.
  214.     ) const = 0;
  215.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  216.        state embodied by the shape ancestor. The canvas state is {bf not}
  217.        restored afterward.
  218.      */
  219.   protected:
  220.   // New functions for class
  221.     virtual void _SetPosition(
  222.       const PPoint & pt  // Position for the shape.
  223.     );
  224.     /* Set the position of the shape. This changes the internal position only,
  225.        it is up to the application to redraw the canvas to reflect the change.
  226.        The user should override this function instead of the
  227.        ref{SetPosition()} functions.
  228.      */
  229.     virtual void _SetDimensions(
  230.       const PDim & dim    // New dimensions for shape.
  231.     );
  232.     /* Set the dimensions of the shape. The exact semantics of this function
  233.        is dependent on the descendent class. Not all shapes can change their
  234.        dimensions, being defined by other factors, eg a text lines width is
  235.        defined by the text and font size.
  236.        The user should override this function instead of the
  237.        ref{SetDimensions()} functions.
  238.      */
  239.   // Member variables
  240.     PPoint position;
  241.     // Location of the shape on the canvas.
  242. };
  243. /**A class representing a simple straight line graphic shape.
  244.  */
  245. class PLine : public PShape
  246. {
  247.   PCLASSINFO(PLine, PShape);
  248.   public:
  249.     PLine(
  250.       PORDINATE x1,   // Horizontal position of start of line.
  251.       PORDINATE y1,   // Vertical position of start of line.
  252.       PORDINATE x2,   // Horizontal position of end of line.
  253.       PORDINATE y2    // Vertical position of end of line.
  254.     );
  255.     PLine(
  256.       const PPoint & pt1,   // Position of start of line.
  257.       const PPoint & pt2    // Position of end of line.
  258.     );
  259.     // Construct a new line shape.
  260.   // Overrides from class PObject
  261.     virtual Comparison Compare(
  262.       const PObject & obj   // Line shape object to compare against.
  263.     ) const;
  264.     /* Compare the two graphic shape objects to determine if they are the same
  265.        shape.
  266.        @return
  267.        #EqualTo# if the two shapes match is form and position,
  268.        #LessThan# if the form is the same but their positions are
  269.        different and #GreaterThan# if the form and position are
  270.        both different.
  271.      */
  272.   // Overrides from class PShape
  273.     virtual PDim GetDimensions() const;
  274.     /* Get the dimensions of the shape. This returns the horizontal and
  275.        vertical lengths of the line.
  276.        @return
  277.        dimensions of the shape.
  278.      */
  279.     virtual BOOL InShape(
  280.       const PPoint & pt   // Point to determine if inside shape.
  281.     ) const;
  282.     /* Determine if the point is within the content of the shape.
  283.     
  284.        This overrides the usual behaviour as a line might encompass a very
  285.        large bounding box but the line only occupies a thin slice of it. This
  286.        function is altered to detect a point near the line.
  287.        @return
  288.        TRUE if point is "inside" the shape.
  289.      */
  290.     virtual void Draw(
  291.       PCanvas & canvas    // Canvas to draw the shape on.
  292.     ) const;
  293.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  294.        state embodied by the shape ancestor. The canvas state is {bf not}
  295.        restored afterward.
  296.      */
  297.   protected:
  298.     // Member variables
  299.     PPoint otherEnd;
  300.       // Location of the other end of the line.
  301. };
  302. /**A class representing a graphic shape that is orthogonal, ie specified by a
  303.    rectangle.
  304.  */
  305. class POrthoShape : public PShape
  306. {
  307.   PCLASSINFO(POrthoShape, PShape);
  308.   public:
  309.     POrthoShape(
  310.       PORDINATE x,    // Horizontal position of the orthogonal shape.
  311.       PORDINATE y,    // Vertical position of the orthogonal shape.
  312.       PDIMENSION dx,  // Width of the orthogonal shape.
  313.       PDIMENSION dy   // Height of the orthogonal shape.
  314.     );
  315.     POrthoShape(
  316.       const PPoint & p1,    // First corner of orthogonal shape.
  317.       const PPoint & p2     // Second, opposite, corner of orthogonal shape.
  318.     );
  319.     POrthoShape(
  320.       const PPoint & topLeft,   // Top left corner ofthe orthogonal shape.
  321.       const PDim & dim          // Dimensions of the orthogonal shape.
  322.     );
  323.     POrthoShape(
  324.       const PRect & rect    // Rectangle for the orthogonal shape.
  325.     );
  326.     // Create a new orthoganal shape.
  327.   // Overrides from class PObject
  328.     Comparison Compare(
  329.       const PObject & obj   // Orthogonal shape object to compare against.
  330.     ) const;
  331.     /* Compare the two graphic shape objects to determine if they are the same
  332.        shape.
  333.        @return
  334.        #EqualTo# if the two shapes match is form and position,
  335.        #LessThan# if the form is the same but their positions are
  336.        different and #GreaterThan# if the form and position are
  337.        both different.
  338.      */
  339.   // Overrides from class PShape
  340.     virtual PDim GetDimensions() const;
  341.     /* Get the dimensions of the shape. This returns the horizontal and
  342.        vertical lengths of the line.
  343.        @return
  344.        dimensions of the shape.
  345.      */
  346.   protected:
  347.   // Overrides from class PShape
  348.     virtual void _SetDimensions(
  349.       const PDim & dim    // New dimensions for shape.
  350.     );
  351.     /* Set the dimensions of the shape. This sets the dimensions of the
  352.        rectangle that defines an othogonal shape.
  353.        The user should override this function instead of the
  354.        ref{SetDimensions()} functions.
  355.      */
  356.   // Member variables
  357.     PDim dimensions;
  358.       // Size of the rectangular shape.
  359. };
  360. /**A class representing a simple rectangle graphic shape.
  361.  */
  362. class PRectangle : public POrthoShape
  363. {
  364.   PCLASSINFO(PRectangle, POrthoShape);
  365.   public:
  366.     PRectangle(
  367.       PORDINATE x,    // Horizontal position of the orthogonal shape.
  368.       PORDINATE y,    // Vertical position of the orthogonal shape.
  369.       PDIMENSION dx,  // Width of the orthogonal shape.
  370.       PDIMENSION dy   // Height of the orthogonal shape.
  371.     );
  372.     PRectangle(
  373.       const PPoint & p1,    // First corner of orthogonal shape.
  374.       const PPoint & p2     // Second, opposite, corner of orthogonal shape.
  375.     );
  376.     PRectangle(
  377.       const PPoint & topLeft,   // Top left corner ofthe orthogonal shape.
  378.       const PDim & dim          // Dimensions of the orthogonal shape.
  379.     );
  380.     PRectangle(
  381.       const PRect & rect    // Rectangle for the orthogonal shape.
  382.     );
  383.     // Create a new rectangle shape.
  384.   // Overrides from class PShape
  385.     virtual void Draw(
  386.       PCanvas & canvas    // Canvas to draw the shape on.
  387.     ) const;
  388.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  389.        state embodied by the shape ancestor. The canvas state is {bf not}
  390.        restored afterward.
  391.      */
  392. };
  393. /**A class representing a rectangle graphic shape with rounded corners.
  394.  */
  395. class PRoundedRectangle : public PRectangle
  396. {
  397.   PCLASSINFO(PRoundedRectangle, PRectangle);
  398.   public:
  399.     PRoundedRectangle(
  400.       PORDINATE x,    // Horizontal position of the orthogonal shape.
  401.       PORDINATE y,    // Vertical position of the orthogonal shape.
  402.       PDIMENSION dx,  // Width of the orthogonal shape.
  403.       PDIMENSION dy,  // Height of the orthogonal shape.
  404.       PDIMENSION cornerWidth, // Horizontal width of rounded corner.
  405.       PDIMENSION cornerHeight // Vertical height of rounded corner.
  406.     );
  407.     PRoundedRectangle(
  408.       const PPoint & p1,    // First corner of orthogonal shape.
  409.       const PPoint & p2,    // Second, opposite, corner of orthogonal shape.
  410.       PDIMENSION cornerWidth, // Horizontal width of rounded corner.
  411.       PDIMENSION cornerHeight // Vertical height of rounded corner.
  412.     );
  413.     PRoundedRectangle(
  414.       const PPoint & topLeft,   // Top left corner ofthe orthogonal shape.
  415.       const PDim & dim,         // Dimensions of the orthogonal shape.
  416.       PDIMENSION cornerWidth, // Horizontal width of rounded corner.
  417.       PDIMENSION cornerHeight // Vertical height of rounded corner.
  418.     );
  419.     PRoundedRectangle(
  420.       const PRect & rect,   // Rectangle for the orthogonal shape.
  421.       PDIMENSION cornerWidth, // Horizontal width of rounded corner.
  422.       PDIMENSION cornerHeight // Vertical height of rounded corner.
  423.     );
  424.     // Create a new rounded rectangle shape.
  425.   // Overrides from class PObject
  426.     Comparison Compare(
  427.       const PObject & obj   // Rounded rectangle object to compare against.
  428.     ) const;
  429.     /* Compare the two graphic shape objects to determine if they are the same
  430.        shape.
  431.        @return
  432.        #EqualTo# if the two shapes match is form and position,
  433.        #LessThan# if the form is the same but their positions are
  434.        different and #GreaterThan# if the form and position are
  435.        both different.
  436.      */
  437.   // Overrides from class PShape
  438.     virtual void Draw(
  439.       PCanvas & canvas    // Canvas to draw the shape on.
  440.     ) const;
  441.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  442.        state embodied by the shape ancestor. The canvas state is {bf not}
  443.        restored afterward.
  444.      */
  445.   // New functions for class
  446.     void SetCornerWidth(
  447.       PDIMENSION width    // New width for rounded corner.
  448.     );
  449.     // Set the width of the rounded corner.
  450.     
  451.     PDIMENSION GetCornerWidth();
  452.     /* Get the width of the rounded corner.
  453.        @return
  454.        width of rounded corner.
  455.      */
  456.     
  457.     void SetCornerHeight(
  458.       PDIMENSION height   // Height of rounded corner.
  459.     );
  460.     // Set the width of the rounded corner.
  461.     
  462.     PDIMENSION GetCornerHeight();
  463.     /* Get the width of the rounded corner.
  464.        @return
  465.        height of rounded corner.
  466.      */
  467.   protected:
  468.     // Member variables
  469.     PDim corner;
  470.       // Size of the rounded corners.
  471. };
  472. /**A class representing an ellipse graphic shape.
  473.    Note that the semi-major axes of the ellipse must be horizontal and
  474.    vertical.
  475.  */
  476. class PEllipse : public POrthoShape
  477. {
  478.   PCLASSINFO(PEllipse, POrthoShape);
  479.   public:
  480.     PEllipse(
  481.       PORDINATE x,    // Horizontal position of the orthogonal shape.
  482.       PORDINATE y,    // Vertical position of the orthogonal shape.
  483.       PDIMENSION dx,  // Width of the orthogonal shape.
  484.       PDIMENSION dy   // Height of the orthogonal shape.
  485.     );
  486.     PEllipse(
  487.       const PPoint & p1,    // First corner of orthogonal shape.
  488.       const PPoint & p2     // Second, opposite, corner of orthogonal shape.
  489.     );
  490.     PEllipse(
  491.       const PPoint & topLeft,   // Top left corner ofthe orthogonal shape.
  492.       const PDim & dim          // Dimensions of the orthogonal shape.
  493.     );
  494.     PEllipse(
  495.       const PRect & rect    // Rectangle for the orthogonal shape.
  496.     );
  497.     // Create a new ellipse shape.
  498.   // Overrides from class PShape
  499.     virtual void Draw(
  500.       PCanvas & canvas    // Canvas to draw the shape on.
  501.     ) const;
  502.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  503.        state embodied by the shape ancestor. The canvas state is {bf not}
  504.        restored afterward.
  505.      */
  506. };
  507. /**A class representing a part of ellipse graphic shape.  An arc is an
  508.    unfilled object so only a line segment is drawn.
  509.        
  510.    The arc is always part of an ellipse that would fit in the rectangle. The
  511.    start and end indicate how much of the arc is drawn. Thus drawing from 0 to
  512.    360 degrees would result in a complete ellipse.
  513.    Note that the semi-major axes of the ellipse must be horizontal and
  514.    vertical.
  515.  */
  516. class PArc : public POrthoShape
  517. {
  518.   PCLASSINFO(PArc, POrthoShape);
  519.   public:
  520.     PArc(
  521.       PORDINATE x,    // Horizontal position of the orthogonal shape.
  522.       PORDINATE y,    // Vertical position of the orthogonal shape.
  523.       PDIMENSION dx,  // Width of the orthogonal shape.
  524.       PDIMENSION dy,  // Height of the orthogonal shape.
  525.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  526.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  527.     );
  528.     PArc(
  529.       const PPoint & p1,    // First corner of orthogonal shape.
  530.       const PPoint & p2,    // Second, opposite, corner of orthogonal shape.
  531.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  532.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  533.     );
  534.     PArc(
  535.       const PPoint & topLeft,   // Top left corner ofthe orthogonal shape.
  536.       const PDim & dim,         // Dimensions of the orthogonal shape.
  537.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  538.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  539.     );
  540.     PArc(
  541.       const PRect & rect,   // Rectangle for the orthogonal shape.
  542.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  543.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  544.     );
  545.     // Create a new arc shape.
  546.   // Overrides from class PObject
  547.     Comparison Compare(
  548.       const PObject & obj   // Arc shape object to compare against.
  549.     ) const;
  550.     /* Compare the two graphic shape objects to determine if they are the same
  551.        shape.
  552.        @return
  553.        #EqualTo# if the two shapes match is form and position,
  554.        #LessThan# if the form is the same but their positions are
  555.        different and #GreaterThan# if the form and position are
  556.        both different.
  557.      */
  558.   // Overrides from class PShape
  559.     virtual void Draw(
  560.       PCanvas & canvas    // Canvas to draw the shape on.
  561.     ) const;
  562.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  563.        state embodied by the shape ancestor. The canvas state is {bf not}
  564.        restored afterward.
  565.      */
  566.   // New functions for class
  567.     void SetStartAngle(
  568.       PORDINATE start   // New starting angle, in degrees.
  569.     );
  570.     // Set the starting angle of the partial ellipse.
  571.     PORDINATE GetStartAngle();
  572.     /* Get the starting angle of the partial ellipse.
  573.        @return
  574.        starting angle, in degrees.
  575.      */
  576.     void SetEndAngle(
  577.       PORDINATE finish   // New finishing angle, in degrees.
  578.     );
  579.     // Set the finishing angle of the partial ellipse.
  580.     
  581.     PORDINATE GetEndAngle();
  582.     /* Get the finishing angle of the partial ellipse.
  583.        @return
  584.        finishing angle, in degrees.
  585.      */
  586.     
  587.   protected:
  588.     // Member variables
  589.     PORDINATE startAngle;
  590.     // Starting angle of the partial ellipse, in degrees.
  591.     PORDINATE endAngle;
  592.     // Finishing angle of the partial ellipse, in degrees.
  593. };
  594. /**A class representing a pie segment graphic shape. A pie is an arc with two
  595.    lines connecting the ends of the arc to the centre of the ellipse the arc
  596.    is part of.
  597.    The arc is always part of an ellipse that would fit in the rectangle. The
  598.    start and end indicate how much of the arc is drawn. Thus drawing from 0 to
  599.    360 degrees would result in a complete ellipse.
  600.    Note that the semi-major axes of the ellipse must be horizontal and
  601.    vertical.
  602.  */
  603. class PPie : public PArc
  604. {
  605.   PCLASSINFO(PPie, PArc);
  606.   public:
  607.     PPie(
  608.       PORDINATE x,    // Horizontal position of the orthogonal shape.
  609.       PORDINATE y,    // Vertical position of the orthogonal shape.
  610.       PDIMENSION dx,  // Width of the orthogonal shape.
  611.       PDIMENSION dy,  // Height of the orthogonal shape.
  612.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  613.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  614.     );
  615.     PPie(
  616.       const PPoint & p1,    // First corner of orthogonal shape.
  617.       const PPoint & p2,    // Second, opposite, corner of orthogonal shape.
  618.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  619.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  620.     );
  621.     PPie(
  622.       const PPoint & topLeft,   // Top left corner ofthe orthogonal shape.
  623.       const PDim & dim,         // Dimensions of the orthogonal shape.
  624.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  625.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  626.     );
  627.     PPie(
  628.       const PRect & rect,   // Rectangle for the orthogonal shape.
  629.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  630.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  631.     );
  632.       // Create a new pie shape
  633.   // Overrides from class PShape
  634.     virtual void Draw(
  635.       PCanvas & canvas    // Canvas to draw the shape on.
  636.     ) const;
  637.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  638.        state embodied by the shape ancestor. The canvas state is {bf not}
  639.        restored afterward.
  640.      */
  641. };
  642. /**A class representing a chord segment graphic shape. A chord is an arc with
  643.    a single line connecting the ends of the arc across the chord of the
  644.    ellipse.
  645.    The arc is always part of an ellipse that would fit in the rectangle. The
  646.    start and end indicate how much of the arc is drawn. Thus drawing from 0 to
  647.    360 degrees would result in a complete ellipse.
  648.    Note that the semi-major axes of the ellipse must be horizontal and
  649.    vertical.
  650.  */
  651. class PChord : public PArc
  652. {
  653.   PCLASSINFO(PChord, PArc);
  654.   public:
  655.     PChord(
  656.       PORDINATE x,    // Horizontal position of the orthogonal shape.
  657.       PORDINATE y,    // Vertical position of the orthogonal shape.
  658.       PDIMENSION dx,  // Width of the orthogonal shape.
  659.       PDIMENSION dy,  // Height of the orthogonal shape.
  660.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  661.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  662.     );
  663.     PChord(
  664.       const PPoint & p1,    // First corner of orthogonal shape.
  665.       const PPoint & p2,    // Second, opposite, corner of orthogonal shape.
  666.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  667.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  668.     );
  669.     PChord(
  670.       const PPoint & topLeft,   // Top left corner ofthe orthogonal shape.
  671.       const PDim & dim,         // Dimensions of the orthogonal shape.
  672.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  673.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  674.     );
  675.     PChord(
  676.       const PRect & rect,   // Rectangle for the orthogonal shape.
  677.       PORDINATE startAngle, // Starting angle, in degrees, for arc.
  678.       PORDINATE endAngle    // Ending angle, in degrees, for arc.
  679.     );
  680.       // Create a new chord shape
  681.   // Overrides from class PShape
  682.     virtual void Draw(
  683.       PCanvas & canvas    // Canvas to draw the shape on.
  684.     ) const;
  685.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  686.        state embodied by the shape ancestor. The canvas state is {bf not}
  687.        restored afterward.
  688.      */
  689. };
  690. /**A class representing a pixel image graphic shape.
  691.  */
  692. class PPixShape : public POrthoShape
  693. {
  694.   PCLASSINFO(PPixShape, POrthoShape);
  695.   public:
  696.     PPixShape(
  697.       PORDINATE x,    // Horizontal position for the shape.
  698.       PORDINATE y,    // Vertical position for the shape.
  699.       const PPixelImage & pix  // Pixel image to contain in the shape
  700.     );
  701.     PPixShape(
  702.       const PPoint & pt,  // Position for the shape.
  703.       const PPixelImage & pix  // Pixel image to contain in the shape
  704.     );
  705.     // Create a new pixel image graphic shape.
  706.   // Overrides from class PShape
  707.     virtual void Draw(
  708.       PCanvas & canvas    // Canvas to draw the shape on.
  709.     ) const;
  710.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  711.        state embodied by the shape ancestor. The canvas state is {bf not}
  712.        restored afterward.
  713.      */
  714.   // New functions for class
  715.     void SetPixels(
  716.       const PPixelImage & img   // New pixel image for shape.
  717.     );
  718.     // Set the image for the shape.
  719.     PPixelImage GetPixels() const;
  720.     /* Get the pixel image for the shape.
  721.        @return
  722.        current pixel image for shape.
  723.      */
  724.   protected:
  725.   // Member variables
  726.     PPixelImage pixels;
  727.     // Pixel image in the shape.
  728. };
  729. /**A class representing a picture image graphic shape.
  730.  */
  731. class PPicShape : public POrthoShape
  732. {
  733.   PCLASSINFO(PPicShape, POrthoShape);
  734.   public:
  735.     PPicShape(
  736.       PORDINATE x,    // Horizontal position for the shape.
  737.       PORDINATE y,    // Vertical position for the shape.
  738.       const PPictImage & pic  // Picture image to contain in the shape.
  739.     );
  740.     PPicShape(
  741.       const PPoint & pt,  // Position for the shape.
  742.       const PPictImage & pic  // Picture image to contain in the shape.
  743.     );
  744.     // Create a new picture image graphic shape.
  745.   // Overrides from class PShape
  746.     virtual void Draw(
  747.       PCanvas & canvas    // Canvas to draw the shape on.
  748.     ) const;
  749.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  750.        state embodied by the shape ancestor. The canvas state is {bf not}
  751.        restored afterward.
  752.      */
  753.   // New functions for class
  754.     void SetPicture(
  755.       const PPictImage & img    // New picture image for shape.
  756.     );
  757.     // Set the image for the shape.
  758.     PPictImage GetPicture() const;
  759.     /* Get the picture image for the shape.
  760.        @return
  761.        current picture image for shape.
  762.      */
  763.   protected:
  764.   // Member variables
  765.     PPictImage picture;
  766.     // Picture image in the shape.
  767. };
  768. /**A class representing a lines of text graphic shape. The dimensions for this
  769.    shape is determined by the font used and the text it contains. Multiple
  770.    lines are permitted but no word wrapping or ellipses will be performed.
  771.  */
  772. class PTextLines : public PShape
  773. {
  774.   PCLASSINFO(PTextLines, PShape);
  775.   public:
  776.     PTextLines(
  777.       PORDINATE x,    // Horizontal position for the shape.
  778.       PORDINATE y,    // Vertical position for the shape.
  779.       const PString & text    // Text for the shape.
  780.     );
  781.     PTextLines(
  782.       const PPoint & pt,  // Position for the shape.
  783.       const PString & text    // Text for the shape.
  784.     );
  785.     // Create a new text lines shape.
  786.   // Overrides from class PObject
  787.     Comparison Compare(
  788.       const PObject & obj   // Text line shape object to compare against.
  789.     ) const;
  790.     /* Compare the two graphic shape objects to determine if they are the same
  791.        shape.
  792.        @return
  793.        #EqualTo# if the two shapes match is form and position,
  794.        #LessThan# if the form is the same but their positions are
  795.        different and #GreaterThan# if the form and position are
  796.        both different.
  797.      */
  798.   // Overrides from class PShape
  799.     virtual PDim GetDimensions() const;
  800.     /* Get the dimensions of the shape. This returns the horizontal and
  801.        vertical dimensions of the line of text. This must be calculated for a
  802.        canvas by either a ref{Draw()} or ref{GetDimensions(PCanvas)}
  803.        function call.
  804.        @return
  805.        dimensions of the shape.
  806.      */
  807.     virtual void Draw(
  808.       PCanvas & canvas    // Canvas to draw the shape on.
  809.     ) const;
  810.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  811.        state embodied by the shape ancestor. The canvas state is {bf not}
  812.        restored afterward.
  813.      */
  814.   // New functions for class
  815.     void SetText(
  816.       const PString & text    // New text for shape.
  817.     );
  818.     // Set the text for the text shape.
  819.     PString GetText() const;
  820.     /* Get the text for the text shape.
  821.        @return
  822.        text in shape.
  823.      */
  824.     virtual PDim GetDimensions(
  825.       PCanvas & canvas    // Canvas to calculate the dimensions for.
  826.     );
  827.     /* Get the dimensions of the shape, calculating for the specified canvas.
  828.        The dimensions are saved and will be henceforth returned by the
  829.        parameterless version of the ref{GetDimensions()} function.
  830.        @return
  831.        dimensions of the text.
  832.      */
  833.       
  834.   protected:
  835.     // Member variables
  836.     PString text;
  837.     // Text lines for the shape.
  838.     PDim dimensions;
  839.     // Last dimension calculated for the text lines.
  840. };
  841. /**A class representing a lines of text graphic shape. Unlike the ancestor
  842.    class, the width of a text block is fixed and the text is word wrapped to
  843.    fit within that bounds. Extra lines may be added to fit. The vertical
  844.    dimension cannot be set as it is determined by the font and text selected.
  845.  */
  846. class PTextBlock : public PTextLines
  847. {
  848.   PCLASSINFO(PTextBlock, PTextLines);
  849.   public:
  850.     PTextBlock(
  851.       PORDINATE x,    // Horizontal position for the shape.
  852.       PORDINATE y,    // Vertical position for the shape.
  853.       const PString & text,   // Text for the shape.
  854.       PDIMENSION width        // Width of the text block.
  855.     );
  856.     PTextBlock(
  857.       const PPoint & pt,  // Position for the shape.
  858.       const PString & text,    // Text for the shape.
  859.       PDIMENSION width        // Width of the text block.
  860.     );
  861.     // Create a new text block shape.
  862.   // Overrides from class PObject
  863.     Comparison Compare(
  864.       const PObject & obj   // Text block shape object to compare against.
  865.     ) const;
  866.     /* Compare the two graphic shape objects to determine if they are the same
  867.        shape.
  868.        @return
  869.        #EqualTo# if the two shapes match is form and position,
  870.        #LessThan# if the form is the same but their positions are
  871.        different and #GreaterThan# if the form and position are
  872.        both different.
  873.      */
  874.   // Overrides from class PShape
  875.     virtual void Draw(
  876.       PCanvas & canvas    // Canvas to draw the shape on.
  877.     ) const;
  878.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  879.        state embodied by the shape ancestor. The canvas state is {bf not}
  880.        restored afterward.
  881.      */
  882.   // Overrides from class PTextLines
  883.     virtual PDim GetDimensions() const { return PTextLines::GetDimensions(); }
  884.     /* Get the dimensions of the shape. This returns the horizontal and
  885.        vertical dimensions of the line of text. This must be calculated for a
  886.        canvas by either a ref{Draw()} or ref{GetDimensions(PCanvas&)}
  887.        function call.
  888.        @return
  889.        dimensions of the shape.
  890.      */
  891.     virtual PDim GetDimensions(
  892.       PCanvas & canvas    // Canvas to calculate the dimensions for.
  893.     );
  894.     /* Get the dimensions of the shape, calculating for the specified canvas.
  895.        The dimensions are saved and will be henceforth returned by the
  896.        parameterless version of the ref{GetDimensions()} function.
  897.        @return
  898.        dimensions of the text.
  899.      */
  900.   protected:
  901.     void _SetDimensions(
  902.       const PDim & dim    // New dimensions for shape.
  903.     );
  904.     /* Set the dimensions of the shape. For a text block the vertical
  905.        dimension is ignored as it is defined by the text in the block.
  906.      */
  907. };
  908. /**A class representing a graphic drawing shape with variable number of
  909.    point components, eg polylines and polygons.
  910.  */
  911. class PPolyShape : public PShape
  912. {
  913.   PCLASSINFO(PPolyShape, PShape);
  914.   public:
  915.     PPolyShape(
  916.       PORDINATE x,    // Horizontal position for the first point in the shape.
  917.       PORDINATE y     // Vertical position for the first point in the shape.
  918.     );
  919.     PPolyShape(
  920.       const PPoint & pt  // Position for the first point in the shape.
  921.     );
  922.     PPolyShape(
  923.       const PPointArray & pts   // Array of points for the shape.
  924.     );
  925.     PPolyShape(
  926.       const PPoint * ptArray,   // Pointer to an array of points for shape.
  927.       PINDEX numPts         // Number of points #ptArray# points at.
  928.     );
  929.     // Create a new "poly" graphic shape.
  930.   // Overrides from class PShape
  931.     virtual PDim GetDimensions() const;
  932.     /* Get the dimensions of the shape. This returns the horizontal and
  933.        vertical dimensions of the bounding box for the polyline, polygon etc.
  934.        @return
  935.        dimensions of the shape.
  936.      */
  937.   // New functions for class
  938.     void AddPoint(
  939.       PORDINATE x,    // Horizontal position for the point to add.
  940.       PORDINATE y     // Vertical position for the point to add.
  941.     );
  942.     void AddPoint(
  943.       const PPoint & pt  // Position for the point to add.
  944.     );
  945.     // Add a new point to the "poly" shape.
  946.     void RemovePoint(
  947.       PINDEX idx    // Index position of the point to remove from the shape.
  948.     );
  949.     // Remove a point from the "poly" shape.
  950.     PPoint & operator[](
  951.       PINDEX idx    // Index position of the point to get from the shape.
  952.     ) const;
  953.     /* Get the point from the "poly" shape at the specified index position.
  954.        @return
  955.        point at index in the shape.
  956.      */
  957.   protected:
  958.   // Overrides from class PShape
  959.     virtual void _SetPosition(
  960.       const PPoint & pt   // New position for the "poly" shape.
  961.     );
  962.     /* Set the position of the shape. This will move every point in the
  963.        "poly" shape by the same amount so the shape does not change only its
  964.        position.
  965.      */
  966.   // Member variables
  967.     PPointArray points;
  968.     // Location of the points defining the poly shape on the canvas.
  969. };
  970. /**A class representing a graphic drawing shape with variable number of
  971.    line segments. This is an unfilled object, so only the line segments are
  972.    drawn.
  973.  */
  974. class PPolyLine : public PPolyShape
  975. {
  976.   PCLASSINFO(PPolyLine, PPolyShape);
  977.   public:
  978.     PPolyLine(
  979.       PORDINATE x,    // Horizontal position for the first point in the shape.
  980.       PORDINATE y     // Vertical position for the first point in the shape.
  981.     );
  982.     PPolyLine(
  983.       const PPoint & pt  // Position for the first point in the shape.
  984.     );
  985.     PPolyLine(
  986.       const PPointArray & pts   // Array of points for the shape.
  987.     );
  988.     PPolyLine(
  989.       const PPoint * ptArray,   // Pointer to an array of points for shape.
  990.       PINDEX numPts         // Number of points #ptArray# points at.
  991.     );
  992.     // Create a new polyline graphic shape.
  993.   // Overrides from class PShape
  994.     virtual void Draw(
  995.       PCanvas & canvas    // Canvas to draw the shape on.
  996.     ) const;
  997.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  998.        state embodied by the shape ancestor. The canvas state is {bf not}
  999.        restored afterward.
  1000.      */
  1001. };
  1002. /**A class representing a graphic drawing shape with variable number of
  1003.    sides. This is an filled object, so there is an implicit line connecting
  1004.    the last point back to the first.
  1005.  */
  1006. class PPolygon : public PPolyShape
  1007. {
  1008.   PCLASSINFO(PPolygon, PPolyShape);
  1009.   public:
  1010.     PPolygon(
  1011.       PORDINATE x,    // Horizontal position for the first point in the shape.
  1012.       PORDINATE y     // Vertical position for the first point in the shape.
  1013.     );
  1014.     PPolygon(
  1015.       const PPoint & pt  // Position for the first point in the shape.
  1016.     );
  1017.     PPolygon(
  1018.       const PPointArray & pts   // Array of points for the shape.
  1019.     );
  1020.     PPolygon(
  1021.       const PPoint * ptArray,   // Pointer to an array of points for shape.
  1022.       PINDEX numPts         // Number of points #ptArray# points at.
  1023.     );
  1024.     // Create a new polygon graphic shape
  1025.   // Overrides from class PShape
  1026.     virtual void Draw(
  1027.       PCanvas & canvas    // Canvas to draw the shape on.
  1028.     ) const;
  1029.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  1030.        state embodied by the shape ancestor. The canvas state is {bf not}
  1031.        restored afterward.
  1032.      */
  1033. };
  1034. /**A class representing a graphic drawing shape which constitutes a variable
  1035.    mathematical curve given a sequence of "control" points. This is an
  1036.    abstract class with different formulae being appliend by the descendent
  1037.    clases eg ref{PBezier}.
  1038.  */
  1039. class PCurve : public PPolyShape
  1040. {
  1041.   PCLASSINFO(PCurve, PPolyShape);
  1042.   public:
  1043.     PCurve(
  1044.       PORDINATE x,    // Horizontal position for the first point in the shape.
  1045.       PORDINATE y     // Vertical position for the first point in the shape.
  1046.     );
  1047.     PCurve(
  1048.       const PPoint & pt  // Position for the first point in the shape.
  1049.     );
  1050.     PCurve(
  1051.       const PPointArray & pts   // Array of points for the shape.
  1052.     );
  1053.     PCurve(
  1054.       const PPoint * ptArray,   // Pointer to an array of points for shape.
  1055.       PINDEX numPts         // Number of points #ptArray# points at.
  1056.     );
  1057.     // Create a new curve graphic shape.
  1058. };
  1059. /**A class representing a graphic drawing shape which constitutes a variable
  1060.    mathematical curve given a sequence of "control" points. This implements
  1061.    a Bezier curve.
  1062.  */
  1063. class PBezier : public PCurve
  1064. {
  1065.   PCLASSINFO(PBezier, PCurve);
  1066.   public:
  1067.     PBezier(
  1068.       PORDINATE x,    // Horizontal position for the first point in the shape.
  1069.       PORDINATE y     // Vertical position for the first point in the shape.
  1070.     );
  1071.     PBezier(
  1072.       const PPoint & pt  // Position for the first point in the shape.
  1073.     );
  1074.     PBezier(
  1075.       const PPointArray & pts   // Array of points for the shape.
  1076.     );
  1077.     PBezier(
  1078.       const PPoint * ptArray,   // Pointer to an array of points for shape.
  1079.       PINDEX numPts         // Number of points #ptArray# points at.
  1080.     );
  1081.     // Create a new Bezier curve graphic shape.
  1082.   // Overrides from class PShape
  1083.     virtual void Draw(
  1084.       PCanvas & canvas    // Canvas to draw the shape on.
  1085.     ) const;
  1086.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  1087.        state embodied by the shape ancestor. The canvas state is {bf not}
  1088.        restored afterward.
  1089.      */
  1090. };
  1091. /**A class representing a graphic drawing shape which constitutes a variable
  1092.    mathematical curve given a sequence of "control" points. This implements
  1093.    a B-Spline curve.
  1094.  */
  1095. class PBSpline : public PCurve
  1096. {
  1097.   PCLASSINFO(PBSpline, PCurve);
  1098.   public:
  1099.     PBSpline(
  1100.       PORDINATE x,    // Horizontal position for the first point in the shape.
  1101.       PORDINATE y     // Vertical position for the first point in the shape.
  1102.     );
  1103.     PBSpline(
  1104.       const PPoint & pt  // Position for the first point in the shape.
  1105.     );
  1106.     PBSpline(
  1107.       const PPointArray & pts   // Array of points for the shape.
  1108.     );
  1109.     PBSpline(
  1110.       const PPoint * ptArray,   // Pointer to an array of points for shape.
  1111.       PINDEX numPts         // Number of points #ptArray# points at.
  1112.     );
  1113.     // Create a new B-Spline curve graphic shape.
  1114.   // Overrides from class PShape
  1115.     virtual void Draw(
  1116.       PCanvas & canvas    // Canvas to draw the shape on.
  1117.     ) const;
  1118.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  1119.        state embodied by the shape ancestor. The canvas state is {bf not}
  1120.        restored afterward.
  1121.      */
  1122. };
  1123. PLIST(PShapeList, PShape);
  1124. /**A class representing a graphic drawing shape that is made from a collection
  1125.    of other shapes. Note that this can be recursive, ie a composite shape may
  1126.    contain other composite shapes.
  1127.  */
  1128. class PCompositeShape : public PShape
  1129. {
  1130.   PCLASSINFO(PCompositeShape, PShape);
  1131.   public:
  1132.     PCompositeShape();
  1133.     PCompositeShape(
  1134.       PShape & shape    // First shape in composite.
  1135.     );
  1136.     // Create a new composite graphic shape.
  1137.   // Override from class PShape
  1138.     virtual PDim GetDimensions() const;
  1139.     /* Get the dimensions of the shape. This returns the dimensions of the
  1140.        bounding box for all the shapes contained in the composite shape.
  1141.        @return
  1142.        dimensions of the shape.
  1143.      */
  1144.     virtual BOOL IsComposite() const;
  1145.     /* Determine if the shape is a composite shape.
  1146.        @return
  1147.        TRUE always.
  1148.      */
  1149.     virtual void Draw(
  1150.       PCanvas & canvas    // Canvas to draw the shape on.
  1151.     ) const;
  1152.     /* Draw the shape on the supplied canvas. The canvas state is altered to
  1153.        state embodied by the shape ancestor. The canvas state is {bf not}
  1154.        restored afterward.
  1155.      */
  1156.   // New functions for class
  1157.     void Add(
  1158.       PShape & shape    // Shape to add to the composite shape.
  1159.     );
  1160.     // Add a shape to the composite shape.
  1161.     void Remove(
  1162.       PShape & shape    // Shape to remove from the composite shape.
  1163.     );
  1164.     void Remove(
  1165.       PINDEX idx // Index position of shape to remove from the composite shape.
  1166.     );
  1167.     // Remove the shape from the composite shape.
  1168.     PShape & operator[](
  1169.       PINDEX idx
  1170.     );
  1171.     /* Get the shape at the specified index.
  1172.        @return
  1173.        reference to shape at index position.
  1174.      */
  1175.     PShape * Find(
  1176.       const PPoint & pt   // Point to search for shape with.
  1177.     );
  1178.     /* Find a shape in the composite shape at the location. This will return
  1179.        a shape within this particular composite shape, so a composite shape
  1180.        may be returned.
  1181.        @return
  1182.        pointer to shape that the point is within, or NULL if there was no such
  1183.        shape.
  1184.      */
  1185.     PShape * FindPrimitive(
  1186.       const PPoint & pt   // Point to search for shape with.
  1187.     );
  1188.     /* Find a non-composite shape in the composite shape at the location. This
  1189.        will recursively descend into nested shapes intil a primitive shape is
  1190.        detected as being around the point.
  1191.        @return
  1192.        pointer to shape that the point is within, or NULL if there was no such
  1193.        shape.
  1194.      */
  1195.   protected:
  1196.   // Override from class PShape
  1197.     virtual void _SetPosition(
  1198.       const PPoint & pt  // Position for the shape.
  1199.     );
  1200.     /* Set the position of the shape. This will move every shape contained
  1201.        within the composite shape so that their relative positions do not
  1202.        change but the position of the whole does.
  1203.      */
  1204.   // New functions for class
  1205.     void CalculateBounds();
  1206.     // Recalculate the position and dimensions of the composite shape.
  1207.   // Member variables
  1208.     PShapeList shapes;
  1209.       // List of shapes that make up the composite shape.
  1210.     PDim dimensions;
  1211.       // Bounding size of all the shapes in the composite shape.
  1212. };
  1213. #if P_USE_INLINES
  1214. #include <pwclib/shapes.inl>
  1215. #endif
  1216. #endif