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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * canvas.h
  3.  *
  4.  * Canvas ancestor class.
  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: canvas.h,v $
  30.  * Revision 1.42  1999/03/10 03:49:50  robertj
  31.  * More documentation adjustments.
  32.  *
  33.  * Revision 1.41  1999/03/09 08:01:47  robertj
  34.  * Changed comments for doc++ support (more to come).
  35.  *
  36.  * Revision 1.40  1998/12/01 12:55:50  robertj
  37.  * new directory structure.
  38.  *
  39.  * Revision 1.39  1998/10/16 11:08:10  robertj
  40.  * GNU compatibility.
  41.  *
  42.  * Revision 1.38  1998/09/23 06:22:55  robertj
  43.  * Added open source copyright license.
  44.  *
  45.  * Revision 1.37  1998/03/20 03:14:36  robertj
  46.  * Added function to get physical bounds of canvas. Allows to scale drawing.
  47.  *
  48.  * Revision 1.36  1997/07/08 13:02:05  robertj
  49.  * DLL support.
  50.  *
  51.  * Revision 1.35  1996/08/17 10:00:29  robertj
  52.  * Changes for Windows DLL support.
  53.  *
  54.  * Revision 1.34  1996/01/02 11:49:49  robertj
  55.  * Removed redundent comma.
  56.  *
  57.  * Revision 1.33  1995/07/02 01:16:51  robertj
  58.  * Added ability to set the clip region.
  59.  *
  60.  * Revision 1.32  1995/03/14 12:41:01  robertj
  61.  * Updated documentation to use HTML codes.
  62.  *
  63.  * Revision 1.31  1995/02/22  10:50:28  robertj
  64.  * Changes required for compiling release (optimised) version.
  65.  *
  66.  * Revision 1.30  1995/01/27  11:03:12  robertj
  67.  * Added FillRect function.
  68.  * "Commonised" DrawRect function.
  69.  *
  70.  * Revision 1.29  1995/01/21  05:13:04  robertj
  71.  * Documentation.
  72.  *
  73.  * Revision 1.28  1995/01/07  06:42:51  robertj
  74.  * Unix requires virtual functions.
  75.  *
  76.  * Revision 1.27  1995/01/07  04:39:35  robertj
  77.  * Redesigned font enumeration code and changed font styles.
  78.  *
  79.  * Revision 1.26  1995/01/06  10:43:45  robertj
  80.  * Changed PRealFont usage from pointer to reference.
  81.  *
  82.  * Revision 1.25  1994/12/12  10:00:37  robertj
  83.  * Added return value of height to DrawString()
  84.  *
  85.  * Revision 1.24  1994/12/05  11:34:01  robertj
  86.  * Major rewrite of images, pictures and pixmaps.
  87.  * Renamed PPict, PPixels and PImage to make sure all uses are found.
  88.  *
  89.  * Revision 1.23  1994/11/26  03:44:21  robertj
  90.  * Documentation.
  91.  *
  92.  * Revision 1.23  1994/11/26  01:33:17  robertj
  93.  * Documentation.
  94.  *
  95.  * Revision 1.22  1994/10/30  11:32:30  robertj
  96.  * Added functions for checking in clip region.
  97.  *
  98.  * Revision 1.21  1994/09/25  10:35:33  robertj
  99.  * Added clip region functions.
  100.  *
  101.  * Revision 1.20  1994/08/23  11:32:52  robertj
  102.  * Oops
  103.  *
  104.  * Revision 1.19  1994/08/22  00:46:48  robertj
  105.  * Added pragma fro GNU C++ compiler.
  106.  *
  107.  * Revision 1.18  1994/07/17  10:46:06  robertj
  108.  * Changed returned font faces to sorted string list.
  109.  *
  110.  * Revision 1.17  1994/07/02  03:03:49  robertj
  111.  * Made device resolution protected.
  112.  *
  113.  * Revision 1.16  1994/06/25  11:55:15  robertj
  114.  * Unix version synchronisation.
  115.  *
  116.  * Revision 1.15  1994/04/01  14:09:14  robertj
  117.  * Added low level draw line function.
  118.  *
  119.  * Revision 1.14  1994/03/07  07:38:19  robertj
  120.  * Major enhancementsacross the board.
  121.  *
  122.  * Revision 1.13  1994/01/15  02:46:51  robertj
  123.  * Fixed missing return value in private assignment operator to PCanvas.
  124.  *
  125.  * Revision 1.12  1994/01/13  11:30:39  robertj
  126.  * Fixed PCanvasState assignment to be virtual.
  127.  *
  128.  * Revision 1.11  1994/01/03  04:42:23  robertj
  129.  * Mass changes to common container classes and interactors etc etc etc.
  130.  *
  131.  * Revision 1.10  1993/12/31  06:39:16  robertj
  132.  * Made inlines optional for debugging purposes.
  133.  * Added DrawImgIcon and DrawIcon functions.
  134.  *
  135.  * Revision 1.9  1993/12/24  04:20:52  robertj
  136.  * Mac CFront port.
  137.  *
  138.  * Revision 1.8  1993/12/16  03:41:01  robertj
  139.  * Made overloaded functions virtual so all can be overridden.
  140.  *
  141.  * Revision 1.7  1993/11/20  17:26:28  robertj
  142.  * Added assignment operator to assign from PCanvasState.
  143.  * Some formatting
  144.  *
  145.  * Revision 1.6  1993/10/16  20:33:20  robertj
  146.  * Extracted PCanvasState class out of the PCanvas.
  147.  *
  148.  * Revision 1.5  1993/09/27  16:35:25  robertj
  149.  * Capitilised macros.
  150.  *
  151.  * Revision 1.4  1993/08/27  18:17:47  robertj
  152.  * Added general function for drawing 3D bevelled areas.
  153.  *
  154.  * Revision 1.3  1993/07/14  12:49:16  robertj
  155.  * Fixed RCS keywords.
  156.  *
  157.  */
  158. #define _PCANVAS
  159. #ifdef __GNUC__
  160. #pragma interface
  161. #endif
  162. #ifndef _PCANVASSTATE
  163. #include <pwlib/canstate.h>
  164. #endif
  165. /**A class representing something that can be drawn into. There are three main;
  166.   destinations of drawing that descend from this class: an area of the screen
  167.    in a Ref{PInteractor}, a printer device or an off screen image.
  168.   *********************************** NOTE ***********************************
  169.   On Some platforms, canvases are a limited resource. Do NOT create and leave
  170.   them around for long periods. As soon as it is not required till the next
  171.   user event, destroy it!
  172.   ****************************************************************************
  173.  */
  174. class PCanvas : public PObject, public PCanvasState {
  175.   PCLASSINFO(PCanvas, PObject);
  176.   protected:
  177.    /**Create a new canvas. This constructor is protected so only descendent
  178.        classes can be instantiated.
  179.      */
  180.     PCanvas();
  181.   public:
  182.     /** Destroy the canvas, freeing any resources held by the canvas. */
  183.     virtual ~PCanvas();
  184.     // Overrides from class PObject
  185.    /**Compare two canvas objects returning their relative rank. As a canvas
  186.        really cannot be ranked only equality is really returned.
  187.        @return
  188.        #EqualTo# if the two objects reference the same canvas,
  189.        otherwise it returns #GreaterThan#.
  190.      */
  191.     virtual Comparison Compare(
  192.       const PObject & obj /// Another object to compare against
  193.     ) const;
  194.     /**@name New functions for class */
  195.    /**Set the state of the canvas from the canvas state object. All drawing
  196.        modes etc are set in one go with this function.
  197.        @return
  198.        the new canvas state for the canvas.
  199.      */
  200.     virtual PCanvasState & operator=(
  201.       const PCanvasState & state  /// The new canvas state for the canvas
  202.     );
  203.    /**Get the current physical font that is used by drawing operations. This
  204.        is the font that will actually be used by the canvas. The font in the
  205.        Ref{PCanvasState} is only a request for what font to use. As the
  206.        particular drawing environment may not have that font availale, a
  207.        matching algorithm is applied to get the nearest font available. This
  208.        is described by the PRealFont.
  209.        @return
  210.        pointer to the current font used by the canvas. Note that the user of
  211.        this pointer should {bf not} delete it.
  212.      */
  213.     const PRealFont & GetFont() const;
  214.    /**Get the list of available fonts the canvas currently supports. Each list
  215.        entry consists of the font family specification. A font family are all
  216.        variations of a particular face name eg Times italic, Times bold are
  217.        two fonts of the Times font family.
  218.        @return
  219.        a list of font families.
  220.      */
  221.     virtual PFontFamilyList GetAvailableFonts() const;
  222.    /**Save the state of the canvas on an internal stack. This function in
  223.        combination with Restore() can be used to do many drawing operations
  224.        within a subroutine and not affect external users of the canvas.
  225.      */
  226.     virtual void Save();
  227.    /**Restore the state of the canvas to the last one saved. This function in
  228.        combination with Save() can be used to do many drawing operations within
  229.        a subroutine and not affect external users of the canvas.
  230.      */
  231.     virtual void Restore();
  232.     virtual void SetCurrentPosition(
  233.       const PPoint & pos  /// New position for line drawing operations
  234.     );
  235.    /**Set the current position for line drawing operations. The current
  236.        position can be viewed as the "pen" position on the canvas.
  237.      */
  238.     virtual void SetCurrentPosition(
  239.       PORDINATE x,  /// New x position for line drawing operations
  240.       PORDINATE y   /// New y position for line drawing operations
  241.     );
  242.    /**Move the current position for line drawing operations relative to the
  243.        previous current position. The current position can be viewed as the
  244.        "pen" position on the canvas.
  245.      */
  246.     virtual void MoveCurrentPosition(
  247.       PORDINATE x,  /// X amount to offset the position for line drawing.
  248.       PORDINATE y   /// Y amount to offset the position for line drawing.
  249.     );
  250.    /**Move the current position for line drawing operations relative to the
  251.        previous current position. The current position can be viewed as the
  252.        "pen" position on the canvas.
  253.      */
  254.     virtual void MoveCurrentPosition(
  255.       const PPoint & pos  /// Amount to offset the position for line drawing.
  256.     );
  257.    /**Get the current position for line drawing operations. The current
  258.        position can be viewed as the "pen" position on the canvas.
  259.        @return
  260.        point representing the x and y position.
  261.      */
  262.     virtual PPoint GetCurrentPosition() const;
  263.    /**Draw a line, using the current canvas state pen modes, colour etc, from
  264.        the current "pen position" to the specified point. The current position
  265.        is updated to the destination of this drawing operation. Thus
  266.        consecutive calls of DrawLine() function would draw a series of
  267.        connected line segments.
  268.      */
  269.     virtual void DrawLine(
  270.       PORDINATE x,  /// X position to draw the line to.
  271.       PORDINATE y   /// Y position to draw the line to.
  272.     );
  273.    /**Draw a line, using the current canvas state pen modes, colour etc, from
  274.        the current "pen position" to the specified point. The current position
  275.        is updated to the destination of this drawing operation. Thus
  276.        consecutive calls of DrawLine() function would draw a series of
  277.        connected line segments.
  278.      */
  279.     virtual void DrawLine(
  280.       const PPoint & pt  /// Position to draw the line to.
  281.     );
  282.    /**Draw a line, using the current canvas state pen modes, colour etc, from
  283.        the current "pen position" to the point offset from that position. The
  284.        current position is updated to the destination of this drawing
  285.        operation. Thus consecutive calls of DrawLine() function would draw a
  286.        series of connected line segments.
  287.      */
  288.     virtual void DrawLineRelative(
  289.       PORDINATE x,  /// X offset to draw the line to.
  290.       PORDINATE y   /// Y offset to draw the line to.
  291.     );
  292.     virtual void DrawLineRelative(
  293.       const PPoint & pt  /// X & Y offset to draw the line to.
  294.     );
  295.    /**Draw a line, using the current canvas state pen modes, colour etc, from
  296.        a source point to a destination point, note that this does {bf not}
  297.        update the current position for line drawing.
  298.      */
  299.     virtual void DrawLine(
  300.       PORDINATE x1, /// X position to start the line from.
  301.       PORDINATE y1, /// Y position to start the line from.
  302.       PORDINATE x2, /// X position to draw the line to.
  303.       PORDINATE y2  /// Y position to draw the line to.
  304.     );
  305.     virtual void DrawLine(
  306.       const PPoint & p1, /// X & Y position to start the line from.
  307.       const PPoint & p2  /// X & Y position to draw the line to.
  308.     );
  309.    /**Draw a rectangle, using the current canvas state pen modes, fill modes,
  310.        colours etc. A number of options are available for how to specify the
  311.        rectangle to draw.
  312.      */
  313.     void DrawRect(
  314.       PORDINATE x,
  315.       /// X position of the top left corner of the rectangle to draw.
  316.       PORDINATE y,
  317.       /// Y position of the top left corner of the rectangle to draw.
  318.       PDIMENSION width, /// Width of the rectangle to draw.
  319.       PDIMENSION height /// Height of the rectangle to draw.
  320.     );
  321.     void DrawRect(
  322.       const PPoint & topLeft,
  323.       /// X & Y position of the top left corner of the rectangle to draw.
  324.       const PPoint & botRight
  325.       /// X & Y position of the bottom right corner of the rectangle to draw.
  326.     );
  327.     void DrawRect(
  328.       const PPoint & topLeft,
  329.       /// X & Y position of the top left corner of the rectangle to draw.
  330.       const PDim & dim
  331.       /// The width & height of the rectangle to draw.
  332.     );
  333.     void DrawRect(
  334.       const PRect & rect   /// The rectangle to draw.
  335.     );
  336.    /**Fill a rectangle, using the current canvas state fill modes, colours
  337.        etc. A number of options are available for how to specify the rectangle
  338.        to draw.
  339.      */
  340.     void FillRect(
  341.       PORDINATE x,
  342.       /// X position of the top left corner of the rectangle to draw.
  343.       PORDINATE y,
  344.       /// Y position of the top left corner of the rectangle to draw.
  345.       PDIMENSION width, /// Width of the rectangle to draw.
  346.       PDIMENSION height /// Height of the rectangle to draw.
  347.     );
  348.     void FillRect(
  349.       const PPoint & topLeft,
  350.       /// X & Y position of the top left corner of the rectangle to draw.
  351.       const PPoint & botRight
  352.       /// X & Y position of the bottom right corner of the rectangle to draw.
  353.     );
  354.     void FillRect(
  355.       const PPoint & topLeft,
  356.       /// X & Y position of the top left corner of the rectangle to draw.
  357.       const PDim & dim
  358.       /// The width & height of the rectangle to draw.
  359.     );
  360.     void FillRect(
  361.       const PRect & rect   /// The rectangle to draw.
  362.     );
  363.    /**Draw a system standard focus indication rectangle. This will ignore the
  364.        pen modes, fill modes, colours etc and draw a rectangle in a manner
  365.        typical for the platform. This would typically be an inverting dotted
  366.        line with no fill.
  367.      */
  368.     virtual void DrawFocusRect(
  369.       const PRect & rect /// The bounds of the focus rectangle to draw.
  370.     );
  371.    /**Draw a bevelled "3D look" rectangle. This is achieved by drawing
  372.        carefully coloured shadows and highlights about the rectangle. By
  373.        convention all lighting appears from the top left corner. Thus by
  374.        reversing the edges that are lighted or shadowed the rectangle can look
  375.        raised above the plane of the background or sunk into it. The thickness
  376.        of the shadow determines how deeply sunk (or raised) the inside of the
  377.        rectangle is.
  378.        There are a set of system parameter available in the Ref{PApplication}
  379.        object that determine the way a bevelled rectangle is drawn. These are
  380.        the colours for highlight and shadow and the standard width of a
  381.        border. A "deep" bevell is 2 standard border widths.
  382.      */
  383.     virtual void DrawBevelledRect(
  384.       const PRect & rect, /// The bounds of the bevelled rectangle to draw.
  385.       BOOL raised,        /// Indicate that the rectangle looks raised or sunk.
  386.       BOOL deep           /// Indicate that rectangle looks deep or shallow.
  387.     );
  388.    /**Draw a rectangle with rounded corners, using the current canvas state
  389.        pen modes, fill modes, colours etc. The amount of roundness to the
  390.        corner is determined by the cornerWidth and cornerHeight parameters
  391.        which indicate the amount inside the actuak corner to begin the curve.
  392.        Thus values of zero would result in a standard square corner rectangle.
  393.      */
  394.     virtual void DrawRoundRect(
  395.       const PRect & rect,     /// The bounds of the rounded rectangle to draw.
  396.       PDIMENSION cornerWidth, /// The width of the rounded corners.
  397.       PDIMENSION cornerHeight /// The height of the rounded corners.
  398.     );
  399.    /**Draw an ellipse that fits into the specified rectangle, using the
  400.        current canvas state pen modes, fill modes, colours etc. Note that
  401.        ellipses semi-major axes must be aligned with the vertical and
  402.        horizontal.
  403.      */
  404.     virtual void DrawEllipse(
  405.       const PRect & rect  /// The bounds of the ellipse to draw.
  406.     );
  407.    /**Draw an arc, using the current canvas state pen modes, colours etc. An
  408.        arc is an unfilled object so only a line segment is drawn.
  409.        
  410.        The arc is always part of an ellipse that would fit in the rectangle.
  411.        The start and end indicate how much of the arc is drawn. Thus drawing
  412.        from 0 to 360 degrees would result in a complete ellipse.
  413.        The start and end points do not actually need to be on the ellipse
  414.        boundary. Conceptually, a vector from the centre of the ellipse out to
  415.        the boundary is drawn and this represents the starting and end of the
  416.        drawn arc.
  417.      */
  418.     virtual void DrawArc(
  419.       const PRect & rect,  /// The bounds of the arc to draw.
  420.       int startAngle,      /// The angle in degrees to start drawing the arc.
  421.       int endAngle         /// The angle in degrees to finish drawing the arc.
  422.     );
  423.     virtual void DrawArc(
  424.       const PRect & rect,     /// The bounds of the arc to draw.
  425.       const PPoint & startPt, /// The point along the arc to start drawing.
  426.       const PPoint & endPt    /// The point along the arc to finish drawing.
  427.     );
  428.    /**Draw a pie segment, using the current canvas state pen modes, fill
  429.        modes, colours etc. A pie is an arc with two lines connecting the ends
  430.        of the arc to the centre of the ellipse the arc is part of.
  431.        The arc is always part of an ellipse that would fit in the rectangle.
  432.        The start and end indicate how much of the arc is drawn. Thus drawing
  433.        from 0 to 360 degrees would result in a complete ellipse.
  434.        The start and end points do not actually need to be on the ellipse
  435.        boundary. Conceptually, a vector from the centre of the ellipse out to
  436.        the boundary is drawn and this represents the starting and end of the
  437.        drawn arc.
  438.      */
  439.     virtual void DrawPie(
  440.       const PRect & rect,  /// The bounds of the pie to draw.
  441.       int startAngle,      /// The angle in degrees to start drawing the pie.
  442.       int endAngle         /// The angle in degrees to finish drawing the pie.
  443.     );
  444.     virtual void DrawPie(
  445.       const PRect & rect,     /// The bounds of the pie to draw.
  446.       const PPoint & startPt, /// The point along the pie to start drawing.
  447.       const PPoint & endPt    /// The point along the pie to finish drawing.
  448.     );
  449.    /**Draw a chord segment, using the current canvas state pen modes, fill
  450.        modes, colours etc. A chord is an arc with a single line connecting
  451.        the ends of the arc across the chord of the ellipse.
  452.        The arc is always part of an ellipse that would fit in the rectangle.
  453.        The start and end indicate how much of the arc is drawn. Thus drawing
  454.        from 0 to 360 degrees would result in a complete ellipse.
  455.        The start and end points do not actually need to be on the ellipse
  456.        boundary. Conceptually, a vector from the centre of the ellipse out to
  457.        the boundary is drawn and this represents the starting and end of the
  458.        drawn arc.
  459.      */
  460.     virtual void DrawChord(
  461.       const PRect & rect,  /// The bounds of the chord to draw.
  462.       int startAngle,      /// The angle in degrees to start drawing the chord.
  463.       int endAngle         /// The angle in degrees to finish drawing the chord.
  464.     );
  465.     virtual void DrawChord(
  466.       const PRect & rect,     /// The bounds of the chord to draw.
  467.       const PPoint & startPt, /// The point along the chord to start drawing.
  468.       const PPoint & endPt    /// The point along the chord to finish drawing.
  469.     );
  470.    /**Draw a series of lines between each consecutive point in the array,
  471.        using the current canvas state pen modes, colours etc.
  472.        
  473.        Note that there should be at least 2 points in the array provided.
  474.      */
  475.     virtual void DrawPolyLine(
  476.       const PPointArray & ptArray  /// Array of points to draw lines between.
  477.     );
  478.     virtual void DrawPolyLine(
  479.       const PPoint * ptArray,  /// Array of points to draw lines between.
  480.       PINDEX numPts            /// Number of points in the array.
  481.     );
  482.    /**Draw a closed polygon where the array of points determine its vertices.
  483.        The polygon is drawn using the current canvas state pen modes, fill
  484.        modes, colours etc. Also important if the PolyFillMode which determines
  485.        the filling of complex polygons. A complex polygon is one where some
  486.        of the line segments cross over. The PolyFillMode determines what
  487.        constitutes "inside" and "outside" of the polygon.
  488.        There is an implicit line between the first and last points in the
  489.        array to close the polygon.
  490.        Note that there should be at least 2 points in the array provided.
  491.      */
  492.     virtual void DrawPolygon(
  493.       const PPointArray & ptArray  /// Array of points for each polygon vertex.
  494.     );
  495.     virtual void DrawPolygon(
  496.       const PPoint * ptArray,  /// Array of points for each polygon vertex.
  497.       PINDEX numPts            /// Number of points in the array.
  498.     );
  499.    /**Draw the specified pixel bitmap image icon at the specified position. A
  500.        Ref{PImgIcon} is usually a small pixel image used for screen interface
  501.        elements, eg a picture in a push button on a tool bar.
  502.        If the image is black and white (1 bit per pixel) then white pixels are
  503.        actually in the fill foreground colour and the black pixels are in the
  504.        fill background colour.
  505.      */
  506.     virtual void DrawImgIcon(
  507.       PORDINATE x,          /// The X position at which to draw the image icon.
  508.       PORDINATE y,          /// The Y position at which to draw the image icon.
  509.       const PImgIcon & icn  /// The image icon to draw.
  510.     );
  511.     virtual void DrawImgIcon(
  512.       const PPoint & pt,    /// The position at which to draw the image icon.
  513.       const PImgIcon & icn  /// The image icon to draw.
  514.     );
  515.    /**Draw the specified pixel bitmap icon at the specified position. Note
  516.        that a Ref{PIcon} differs from a Ref{PImgIcon} in that it is a
  517.        platform dependent entity that has a particular form.
  518.        If the image is black and white (1 bit per pixel) then white pixels are
  519.        actually in the fill foreground colour and the black pixels are in the
  520.        fill background colour.
  521.      */
  522.     virtual void DrawIcon(
  523.       PORDINATE x,          /// The X position at which to draw the icon.
  524.       PORDINATE y,          /// The Y position at which to draw the icon.
  525.       const PIcon & icn     /// The icon to draw.
  526.     );
  527.     virtual void DrawIcon(
  528.       const PPoint & pt,    /// The position at which to draw the icon.
  529.       const PIcon & icn     /// The icon to draw.
  530.     );
  531.    /**Draw the specified pixel bitmap image at the specified position. Note
  532.        that a Ref{PPixels} differs from a Ref{PImgIcon} in that it is
  533.        usually a large image which has an associated colour translation.
  534.        If the image is black and white (1 bit per pixel) then white pixels are
  535.        actually in the fill foreground colour and the black pixels are in the
  536.        fill background colour.
  537.      */
  538.     virtual void DrawPixels(
  539.       PORDINATE x,             /// The X position at which to draw the pixels.
  540.       PORDINATE y,             /// The Y position at which to draw the pixels.
  541.       const PPixelImage & pix  /// The pixel image to draw.
  542.     );
  543.     virtual void DrawPixels(
  544.       const PPoint & pt,       /// The position at which to draw the pixels.
  545.       const PPixelImage & pix  /// The pixel image to draw.
  546.     );
  547.    /**Draw the specified pixel bitmap image scaling it to fit the spcified
  548.        destination rectangle. This may involve stretching or shrinking the
  549.        original image.
  550.        If the image is black and white (1 bit per pixel) then white pixels are
  551.        actually in the fill foreground colour and the black pixels are in the
  552.        fill background colour.
  553.      */
  554.     virtual void DrawPixels(
  555.       const PRect & rect,    /// The destination rectangle to draw the image to.
  556.       const PPixelImage & pix  /// The pixel image to draw.
  557.     );
  558.    /**Draw the specified picture image at the specified position. The current
  559.        canvas state may affect the drawing depending on the picture.
  560.        A picture image is a platform dependent representation of a series of
  561.        drawing instructions. This is usually much smaller than a pixel image
  562.        but is not as portable.
  563.      */
  564.     virtual void DrawPict(
  565.       PORDINATE x,            /// The X position at which to draw the picture.
  566.       PORDINATE y,            /// The Y position at which to draw the picture.
  567.       const PPictImage & pic  /// The picture to draw.
  568.     );
  569.     virtual void DrawPict(
  570.       const PPoint & pt,      /// The position at which to draw the picture.
  571.       const PPictImage & pic  /// The picture to draw.
  572.     );
  573.    /**Draw the specified picture image into the specified rectangle, scaling
  574.        it to fit. The current canvas state may affect the drawing depending on
  575.        the picture.
  576.        A picture image is a platform dependent representation of a series of
  577.        drawing instructions. This is usually much smaller than a pixel image
  578.        but is not as portable.
  579.      */
  580.     virtual void DrawPict(
  581.       const PRect & rect,    /// The destination rectangle to draw the image to.
  582.       const PPictImage & pic    /// The picture to draw.
  583.     );
  584.    /**The text alignment options determine the manner in which the drawn text
  585.        related to the position it is being drawn into. There are some
  586.        variations of these options depending on whether the alignment is to be
  587.        made to a point or to a rectangle.
  588.      */
  589.     enum DrawStringOptions {
  590.      /**The text lines are positioned on the left side with blank space on
  591.          the right side. When aligned to a point the X value is on the left of
  592.          the text. When aligned to a rectangle the left side is used.
  593.        */
  594.       LeftAlign = 0x00,
  595.      /**The text lines are positioned so the right side of the text is on the
  596.          right with blank space on the left before each line. When aligned to
  597.          a point the X value is on the right of the text. When aligned to a
  598.          rectangle the right side is used.
  599.        */
  600.       RightAlign = 0x01,
  601.      /**The text lines are positioned so there is an even amount of space on
  602.          the left and right sides of the text. When aligned to a point the X
  603.          value is at the centre of the text. When aligned to a rectangle the
  604.          median between the left and right sides is used. In the latter the
  605.          text is horizontally centred in the rectangle.
  606.        */
  607.       Centred = 0x02,
  608.      /**The text lines are broken up into words (space separated characters)
  609.          and the space between then increased so that the line completely fills
  610.          the width and there is no blank space at either end of the line.
  611.          
  612.          This mode is only relevent when aligment is to a rectangle. When a
  613.          point is used this is the same as LeftAligned.
  614.        */
  615.       Justified = 0x03,
  616.      /**Mask to extract the horizontal alignment values from the DrawString
  617.          options value. */
  618.       HorizontalAlignmentMask = 0x03,
  619.      /**The top of the text line is set to the drawing position. The text is
  620.          thus drawn entirely underneath the position specified. The position
  621.          is either the Y of a point or the top of a rectangle.
  622.        */
  623.       TopAlign = 0x00,
  624.      /**The bottom of the text line is set to the drawing position. The text
  625.          is thus drawn entirely above the position specified. The position is
  626.          either the Y of a point or the bottom of a rectangle.
  627.        */
  628.       BottomAlign = 0x04,
  629.      /**The centre of the text line is set to the drawing position. The text
  630.          is thus drawn half above and half below the position specified. The
  631.          position is either the Y of a point or the bedian between the top and
  632.          bottom of a rectangle. In the latter the text is vertically centred in
  633.          the rectangle.
  634.        */
  635.       CentreVertical = 0x08,
  636.      /**The baseline of the font of the text line is set to the drawing
  637.          position. The text is thus drawn mostly above position specified, with
  638.          descenders on characters such as 'p' being below that position.
  639.        */
  640.       BaseLine = 0x0c,
  641.      /**Mask to extract the vertical alignment values from the DrawString
  642.          options value. */
  643.       VerticalAlignmentMask = 0x0c,
  644.      /**No word wrapping is performed. The text lines are drawn beyond the
  645.          right side of the rectangle ignoring the width. Note that the normal
  646.          canvas clipping still occurs.
  647.        */
  648.       NoWrapping = 0x00,
  649.      /**The text lines are broken up into words and if too wide to fit into
  650.          the rectangles width, additional lines are inserted into the string.
  651.        */
  652.       WordWrap = 0x10,
  653.      /**The text lines are forced to fit within the width of the rectangle. No
  654.          word wrapping is performed. The string is shortened by removing
  655.          characters from the centre of the line and replacing them with an
  656.          ellipses (" ... "). Enough characters are removed so that the width
  657.          of the string will fit into the rectangle.
  658.          Similarly in the vertical
  659.          direction whole lines are dropped and replaced with an ellipses to
  660.          fit the lines into the vertical height of the rectangle.
  661.        */
  662.       CentreEllipses = 0x20,
  663.      /**As in CentreEllipses the text lines are forced to fit within the width
  664.          of the rectangle. In this case the truncation occurs at the opposite
  665.          end of the horizontal alignment. Thus for LeftAlign text the right
  666.          hand end of the string is clipped at the rectangle boundary.
  667.        */
  668.       EndEllipses = 0x30,
  669.      /**Mask to extract the horizontal alignment wrapping values from the
  670.          DrawString options value.
  671.          These modes are only relevent when aligment is to a rectangle. When a
  672.          point is used they are ignored.
  673.        */
  674.       HorizontalWrapMask = 0x30,
  675.      /**No truncation of lines is performed. The text lines are drawn beyond
  676.          the bottom of the rectangle ignoring the height. Note that the normal
  677.          canvas clipping still occurs.
  678.        */
  679.       NoTruncation = 0x00,
  680.      /**The lines in the string are truncated to fit into the height of the
  681.          rectangle by removing whole lines from the string and replacing them
  682.          with an ellipses (" ... "). The first part of the first line removed
  683.          and the last part of the last line removed is put onto the line in
  684.          the centre of the rectangle.
  685.        */
  686.       CentreTruncation = 0x40,
  687.      /**As in CentreTruncation the text lines are forced to fit within the
  688.          height of the rectangle. In this case the truncation occurs at the
  689.          opposite end of the vertical alignment. Thus for TopAlign text the
  690.          last lines of the string is clipped at the rectangle boundary.
  691.        */
  692.       EndTruncation = 0x80,
  693.      /**Mask to extract the verical alignment truncation values from the
  694.          DrawString options value.
  695.          These modes are only relevent when aligment is to a rectangle. When a
  696.          point is used they are ignored.
  697.        */
  698.       VerticalTruncationMask = 0xc0
  699.     };
  700.    /**Draw a string at the specified location, using the current canvas text
  701.        font, modes and colours.
  702.        The options parameter determines the relationship between the text
  703.        string drawn and the location it is drawn at. The point is placed at
  704.        the position relative to the rectangle formed around the text (as
  705.        returned by MeasureText()). Thus:
  706.        #        options = bottomAlign | centred#
  707.        would result in the text positioned such that the specified point is at
  708.        the bottom centre of the line of text. See Ref{DrawStringOptions} for
  709.        more infromation.
  710.        
  711.        Note the Justified alignment is not relevent for this function and is
  712.        treated as LeftAlign.
  713.      */
  714.     virtual void DrawString(
  715.       PORDINATE x,            /// The X position at which to draw the string.
  716.       PORDINATE y,            /// The Y position at which to draw the string.
  717.       const PString & str,    /// The string to draw.
  718.       int options = LeftAlign /// The alignment of the lines in the string.
  719.     );
  720.     virtual void DrawString(
  721.       const PPoint & pt,      /// The position at which to draw the string.
  722.       const PString & str,    /// The string to draw.
  723.       int options = LeftAlign /// The alignment of the lines in the string.
  724.     );
  725.    /**Draw a string within the bounds of the rectangle, using the current
  726.        canvas text font, modes and colours.
  727.        
  728.        The options parameter determines the relationship between the text
  729.        string drawn and the rectangle it is drawn in.
  730.        The BaseLine alignment is not relevent for this function and is treated
  731.        as BottomAlign.
  732.        @return
  733.        the height of the text lines drawn.
  734.      */
  735.     virtual PDIMENSION DrawString(
  736.       const PRect & rect,     /// The rectangle into which to draw the string.
  737.       const PString & str,    /// The string to draw.
  738.       int options = LeftAlign /// The alignment of the lines in the string.
  739.     );
  740.    /**Get the width and height of the string if it were to be drawn in the
  741.        current font selected for the canvas.
  742.        
  743.        @return
  744.        the width and height of the text lines.
  745.      */
  746.     virtual PDim MeasureString(
  747.       const PString & str   /// The string to measure.
  748.     );
  749.    /**Return the height of the string if drawn with word wrapping about the
  750.        specified width.
  751.        @return
  752.        the height of the text lines.
  753.      */
  754.     virtual PDIMENSION MeasureString(const PString & str, PDIMENSION width);
  755.    /**Draw a single line of text at the specified starting position. The text
  756.        block may contain any characters for the block length. Note that there
  757.        cannot be any control characters in the string.
  758.        No checking for lines or word wrapping is performed by this function.
  759.        With charWidths = NULL, this is the fastest way to draw text on the
  760.        canvas.
  761.      */
  762.     virtual void DrawTextLine(
  763.       PORDINATE x,                   /// The X position to draw the text.
  764.       PORDINATE y,                   /// The Y position to draw the text.
  765.       const char * textChars,        /// The array of characters to draw.
  766.       const PDIMENSION * charWidths,
  767.      /**An array with the width of each character in the text array. If this
  768.          is NULL then the default character width for the font is used.
  769.        */
  770.       PINDEX len                     /// The number of characters to draw.
  771.     );
  772.    /**Get the limits of the drawable area for this canvas. This is dependent
  773.        on the specific descendent of PCanvas. For example the
  774.        Ref{PPrintCanvas} would return the size of the printer page while a
  775.        Ref{PInteractorCanvas} would return the size of the interactor window.
  776.        @return
  777.        drawing bounds rectangle in current canvas coordinate system.
  778.      */
  779.     virtual PRect GetDrawingBounds() const;
  780.    /**Get the physical size of the drawable area for this canvas in pixels or
  781.        millimeters.This is dependent on the specific descendent of PCanvas. For
  782.        example the Ref{PPrintCanvas} would return the size of the printer page
  783.        while a Ref{PInteractorCanvas} would return the size of the interactor
  784.        window.
  785.        @return
  786.        drawing bounds rectangle in current canvas coordinate system.
  787.      */
  788.     virtual PRect GetPhysicalBounds(BOOL inPixels = FALSE) const;
  789.    /**Set the clip region for the canvas. Any drawing operations that are
  790.        outside this region are not actually drawn.
  791.      */
  792.     virtual void SetClipRegion(
  793.       const PRegion & rgn   /// clip region in current canvas coordinate system.
  794.     );
  795.    /**Get the clip region for the canvas. Any drawing operations that are
  796.        outside this region are not actually drawn.
  797.        
  798.        An application can optimise drawing operations by verifying that the
  799.        operation would actually do something. This can save significant
  800.        processing time under some circumstances.
  801.        @return
  802.        clip region in current canvas coordinate system.
  803.      */
  804.     virtual PRegion GetClipRegion() const;
  805.    /**Set the bounding rectangle around the clip region for the canvas. Any
  806.        drawing operations that are outside this region may not be actually
  807.        drawn.
  808.      */
  809.     virtual void SetClipRect(
  810.       const PRect & rect /// clip rectangle in current canvas coordinate system.
  811.     );
  812.    /**Get the bounding rectangle around the clip region for the canvas. Any
  813.        drawing operations that are outside this region may not be actually
  814.        drawn.
  815.        
  816.        An application can optimise drawing operations by verifying that the
  817.        operation would actually do something. This can save significant
  818.        processing time under some circumstances.
  819.        @return
  820.        clip rectangle in current canvas coordinate system.
  821.      */
  822.     virtual PRect GetClipRect() const;
  823.    /**Determine if the specified point or any part of the specified rectangle
  824.        is inside the clip region, ie any drawing operation would not be
  825.        inhibited due to clipping.
  826.        An application can optimise drawing operations by verifying that the
  827.        operation would actually do something. This can save significant
  828.        processing time under some circumstances.
  829.        @return
  830.        clip rectangle in current canvas coordinate system.
  831.      */
  832.     BOOL IsInClipRegion(
  833.       const PPoint & pt   /// Point to test as being in the clip region.
  834.     ) const;
  835.     BOOL IsInClipRegion(
  836.       const PRect & rect
  837.         /// Rectangle to test for intersection with the clip region.
  838.     ) const;
  839.    /**Convert the specified parameter from pixels to the coordinate system for
  840.        this canvas. Note that for the PDIMENSION and PDim versions, no origin
  841.        translation is made, only the scaling transform is applied.
  842.      */
  843.     PDIMENSION FromPixelsDX(
  844.       PDIMENSION dx /// X distance to scale.
  845.     ) const;
  846.     PDIMENSION FromPixelsDY(
  847.       PDIMENSION dy /// Y distance to scale.
  848.     ) const;
  849.     PDim FromPixels(
  850.       const PDim & dim /// Width and Height to scale.
  851.     ) const;
  852.     PORDINATE FromPixelsX(
  853.       PORDINATE x  /// X position to scale and offset.
  854.     ) const;
  855.     PORDINATE FromPixelsY(
  856.       PORDINATE y  /// Y position to scale and offset.
  857.     ) const;
  858.     PPoint FromPixels(
  859.       const PPoint & p  /// X and Y position to scale and offset.
  860.     ) const;
  861.     PRect FromPixels(
  862.       const PRect & r  /// Rectangle to scale and offset.
  863.     ) const;
  864.    /**Convert the specified parameter from the coordinate system for this
  865.        canvas to pixels. Note that for the PDIMENSION and PDim versions, no
  866.        origin translation is made, only the scaling transform is applied.
  867.      */
  868.     PDIMENSION ToPixelsDX(
  869.       PDIMENSION dx /// X distance to scale.
  870.     ) const;
  871.     PDIMENSION ToPixelsDY(
  872.       PDIMENSION dy /// Y distance to scale.
  873.     ) const;
  874.     PDim ToPixels(
  875.       const PDim & dim /// Width and Height to scale.
  876.     ) const;
  877.     PORDINATE ToPixelsX(
  878.       PORDINATE x  /// X position to scale and offset.
  879.     ) const;
  880.     PORDINATE ToPixelsY(
  881.       PORDINATE y  /// Y position to scale and offset.
  882.     ) const;
  883.     PPoint ToPixels(
  884.       const PPoint & p  /// X and Y position to scale and offset.
  885.     ) const;
  886.     PRect ToPixels(
  887.       const PRect & r  /// Rectangle to scale and offset.
  888.     ) const;
  889.    /**Convert the specified parameter from printers points (1/72 inch) to the
  890.       coordinate system for this canvas. This is mainly used in support of the
  891.       font system.
  892.      */
  893.     PDIMENSION FromPointsX(
  894.       PDIMENSION dx /// X distance to scale.
  895.     );
  896.     PDIMENSION FromPointsY(
  897.       PDIMENSION dy /// Y distance to scale.
  898.     );
  899.    /**Convert the specified parameter from the coordinate system for this
  900.        canvas to printers points (1/72 inch). This is mainly used in support
  901.        of the font system.
  902.      */
  903.     PDIMENSION ToPointsX(
  904.       PDIMENSION dx /// X distance to scale.
  905.     );
  906.     PDIMENSION ToPointsY(
  907.       PDIMENSION dy /// Y distance to scale.
  908.     );
  909.   protected:
  910.       /** Really draw the rectangle. */
  911.     virtual void _DrawRect(
  912.       PORDINATE x,
  913.       /// X position of the top left corner of the rectangle to draw.
  914.       PORDINATE y,
  915.       /// Y position of the top left corner of the rectangle to draw.
  916.       PDIMENSION width, /// Width of the rectangle to draw.
  917.       PDIMENSION height /// Height of the rectangle to draw.
  918.     );
  919.       /** Really fill the rectangle. */
  920.     virtual void _FillRect(
  921.       PORDINATE x,
  922.       /// X position of the top left corner of the rectangle to draw.
  923.       PORDINATE y,
  924.       /// Y position of the top left corner of the rectangle to draw.
  925.       PDIMENSION width, /// Width of the rectangle to draw.
  926.       PDIMENSION height /// Height of the rectangle to draw.
  927.     );
  928.     /**@name Member variables */
  929.     PORDINATE deviceResX, deviceResY;
  930.       /** Device (usually screen) resolution for conversion functions */
  931.     PRealFont realFont;
  932.       /** Actual font used by the canvas derived from the font in the canvas
  933.           state. */
  934.     class State : public PObject, public PCanvasState {
  935.       PCLASSINFO(State, PObject)
  936.       public:
  937.         State(const PCanvas & canvas)
  938.           : PCanvasState(canvas), font(canvas.GetFont()) { }
  939.         Comparison Compare(const PObject &) const
  940.           { return EqualTo; }
  941.         PRealFont font;
  942.     };
  943.     PSTACK(StateStack, State);
  944.     StateStack stack;
  945.   private:
  946.     PCanvas(const PCanvas &) { }
  947.     PCanvas & operator=(const PCanvas &) { return *this; }
  948.       // Prevent descendents from ever doing copy/assignment of canvases.
  949. #ifdef DOC_PLUS_PLUS
  950. };
  951. #endif
  952. // Class declaration continued in platform specific header file ///////////////