home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v1.zip / IBMCPP / IBMCLASS / IRECT.HPP < prev    next >
C/C++ Source or Header  |  1993-10-22  |  19KB  |  335 lines

  1. #ifndef _IRECT_
  2. #define _IRECT_
  3. /*******************************************************************************
  4. * FILE NAME: irect.hpp                                                         *
  5. *                                                                              *
  6. * DESCRIPTION:                                                                 *
  7. *   Declaration of the class(es):                                              *
  8. *     IRectangle - rectangle class                                             *
  9. *                                                                              *
  10. * COPYRIGHT:                                                                   *
  11. *   Licensed Materials - Property of IBM                                       *
  12. *   (C) Copyright IBM Corporation 1992, 1993                                   *
  13. *   All Rights Reserved                                                        *
  14. *   US Government Users Restricted Rights - Use, duplication, or disclosure    *
  15. *   restricted by GSA ADP Schedule Contract with IBM Corp.                     *
  16. *                                                                              *
  17. *******************************************************************************/
  18.  
  19. #ifndef _IBASE_
  20.   #include <ibase.hpp>
  21. #endif
  22.  
  23. #ifndef _IPOINT_
  24.   #include <ipoint.hpp>
  25. #endif
  26.  
  27. /*----------------------------------------------------------------------------*/
  28. /* Align classes on four byte boundary.                                       */
  29. /*----------------------------------------------------------------------------*/
  30. #pragma pack(4)
  31.  
  32. struct _RECTL;
  33.  
  34. class IRectangle : public IBase {
  35. typedef IBase
  36.   Inherited;
  37. /*******************************************************************************
  38. * Objects of the IRectangle class represent a rectangular area defined by two  *
  39. * points that form opposite corners of the rectangle.  The rectangle is        *
  40. * represented by the lower left ('origin') and upper right ('corner') corners. *
  41. *                                                                              *
  42. * Mathematically, a rectangle is considered to include all the points on the   *
  43. * lines that form its lower and left edges.  It does not include the points    *
  44. * that lie on either its upper or right edges.                                 *
  45. *                                                                              *
  46. * IRectangles are used by the various graphics and windowing classes and       *
  47. * their member functions.                                                      *
  48. *******************************************************************************/
  49. public:
  50. /*------------------------------ Related Types ---------------------------------
  51. | The following related type is defined for this class:                        |
  52. |   Coord - Type of the coordinate values; this must match the type of the     |
  53. |           coordinates supported by the IPair class.                          |
  54. ------------------------------------------------------------------------------*/
  55. typedef IPair::Coord Coord;
  56.  
  57. /*------------------------------- Constructors ---------------------------------
  58. | You can construct instances of this class in the following ways:             |
  59. |                                                                              |
  60. |    - Construct a null rectangle (0,0)x(0,0); this is the default.            |
  61. |    - Construct a rectangle with two given points at opposite corners.        |
  62. |    - Construct a rectangle at a given point (presumed to be the lower left   |
  63. |      corner) and a given size.                                               |
  64. |    - Construct a rectangle given four values that represent the coordinates  |
  65. |      for two points at opposite corners.                                     |
  66. |    - Construct a rectangle from a Presentation Manager Toolkit RECTL         |
  67. |      structure.                                                              |
  68. |    - Construct a rectangle with opposite corners at (0,0) and (width,        |
  69. |      height); the width and height can be given either as two (long)         |
  70. |      integers or an IPair (ordered pair of coordinates).                     |
  71. |                                                                              |
  72. | NOTE: Rectangles are constucted by giving two points that are taken as       |
  73. |       opposite corners, not as origin and corner (or lower-left and          |
  74. |       upper-right corners); this ensures that internally the origin and      |
  75. |       corner points always are such that origin <= corner.                   |
  76. ------------------------------------------------------------------------------*/
  77.   IRectangle ( );
  78.  
  79.   IRectangle ( const IPoint &pt1,
  80.                const IPoint &pt2 );
  81.  
  82.   IRectangle ( const IPoint &pt,
  83.                const ISize  &size );
  84.  
  85.   IRectangle ( Coord left,
  86.                Coord bottom,
  87.                Coord right,
  88.                Coord top    );
  89.  
  90.   IRectangle ( const struct _RECTL &rectl);
  91.  
  92.   IRectangle ( Coord width,
  93.                Coord height );
  94.   IRectangle ( const IPair &aPair );
  95.  
  96. /*-------------------------------- Accessors -----------------------------------
  97. | Use the following functions to access information about the receiver.  You   |
  98. | can query any of nine points on the rectangle perimeter or its center by     |
  99. | using these functions:                                                       |
  100. |                                                                              |
  101. |   topLeft      - Returns the X- and Y-coordinates of the top left corner of  |
  102. |                  the rectangle.                                              |
  103. |   topCenter    - Returns the X- and Y-coordinates of the top center point    |
  104. |                  of the rectangle.                                           |
  105. |   topRight     - Returns the X- and Y-coordinates of the top right corner    |
  106. |                  of the rectangle.                                           |
  107. |   leftCenter   - Returns the X- and Y-coordinates of the left center point   |
  108. |                  of the rectangle.                                           |
  109. |   center       - Returns the X- and Y-coordinates of the center point of     |
  110. |                  the rectangle.                                              |
  111. |   rightCenter  - Returns the X- and Y-coordinates of the right center point  |
  112. |                  of the rectangle.                                           |
  113. |   bottomLeft   - Returns the X- and Y-coordinates of the bottom left corner  |
  114. |                  of the rectangle.                                           |
  115. |   bottomCenter - Returns the X- and Y-coordinates of the bottom center       |
  116. |                  point of the rectangle.                                     |
  117. |   bottomRight  - Returns the X- and Y-coordinates of the bottom right        |
  118. |                  corner of the rectangle.                                    |
  119. |                                                                              |
  120. | Other characteristics of the rectangle can be queried using:                 |
  121. |                                                                              |
  122. |   area   - Returns the area of the rectangle.                                |
  123. |   bottom - Returns the Y-coordinate of the horizontal line that forms the    |
  124. |            bottom of the rectangle.                                          |
  125. |   height - Returns the height of the rectangle.                              |
  126. |   left   - Returns the X-coordinate of the vertical line that forms the      |
  127. |            left side of the rectangle.                                       |
  128. |   right  - Returns the X-coordinate of the vertical line that forms the      |
  129. |            right side of the rectangle.                                      |
  130. |   size   - Returns the ISize(width, height).                                 |
  131. |   top    - Returns the Y-coordinate of the horizontal line that forms the    |
  132. |            top of the rectangle.                                             |
  133. |   width  - Returns the width of the rectangle.                               |
  134. ------------------------------------------------------------------------------*/
  135. IPoint
  136.   bottomLeft   ( ) const,
  137.   bottomCenter ( ) const,
  138.   bottomRight  ( ) const,
  139.   center       ( ) const,
  140.   leftCenter   ( ) const,
  141.   rightCenter  ( ) const,
  142.   topLeft      ( ) const,
  143.   topCenter    ( ) const,
  144.   topRight     ( ) const;
  145.  
  146. ISize
  147.   size ( ) const;
  148.  
  149. Coord
  150.   area   ( ) const,
  151.   bottom ( ) const,
  152.   height ( ) const,
  153.   left   ( ) const,
  154.   right  ( ) const,
  155.   top    ( ) const,
  156.   width  ( ) const;
  157.  
  158. /*-------------------------------- Conversion ----------------------------------
  159. | Use the following functions to convert a rectangle into various formats:     |
  160. |   asRECTL     - Renders the rectangle as a Presentation Manager Toolkit      |
  161. |                 RECTL structure.                                             |
  162. |   asString    - Renders the rectangle as an                                  |
  163. |                 'IString( "IRectangle(x1,y1,x2,y2)" )'.                      |
  164. |   asDebugInfo - Renders the rectangle as a diagnostic representation.        |
  165. ------------------------------------------------------------------------------*/
  166. struct _RECTL
  167.   asRECTL ( ) const;
  168. IString
  169.   asString ( ) const,
  170.   asDebugInfo ( ) const;
  171.  
  172. /*--------------------------- Comparison Operators -----------------------------
  173. | Two rectangles can be compared for equality or inequality using the          |
  174. | following operators:                                                         |
  175. |   operator == - Returns true if the two rectangles are identical.            |
  176. |   operator != - Returns true if the rectangles differ.                       |
  177. ------------------------------------------------------------------------------*/
  178. Boolean
  179.   operator == ( const IRectangle &aRect ) const,
  180.   operator != ( const IRectangle &aRect ) const;
  181.  
  182. /*-------------------------- Manipulation Operators ----------------------------
  183. | Use the following operators to calculate a rectangle's union and             |
  184. | intersection with another rectangle:                                         |
  185. |                                                                              |
  186. |   operator &  - Returns a rectangle that represents the intersection of the  |
  187. |                 argument rectangles.                                         |
  188. |   operator &= - Resets the rectangle to its intersection with the argument.  |
  189. |   operator |  - Returns the rectangle that represents the union of the       |
  190. |                 argument rectangles.  This is the smallest rectangle that    |
  191. |                 encompasses both arguments.                                  |
  192. |   operator |= - Resets the rectangle to its union with the argument.         |
  193. ------------------------------------------------------------------------------*/
  194. IRectangle
  195.   operator &  ( const IRectangle &aRect ) const,
  196.  &operator &= ( const IRectangle &aRect ),
  197.   operator |  ( const IRectangle &aRect ) const,
  198.  &operator |= ( const IRectangle &aRect );
  199.  
  200. /*------------------------------- Manipulation ---------------------------------
  201. | These functions modify the receiving rectangle, changing its size,           |
  202. | proportions, or location.                                                    |
  203. |   centerAt   - Moves the rectangle so that its center is at the argument     |
  204. |                point.                                                        |
  205. |   centeredAt - Same as centerAt, but returns a new rectangle, leaving the    |
  206. |                original unmodifed.                                           |
  207. |   expandBy   - Moves the corners of the rectangle outward from the center    |
  208. |                by the given amount; the argument can be either a scalar      |
  209. |                (long int) or a point.                                        |
  210. |   expandedBy - Same as expandBy, but returns a new rectangle, leaving the    |
  211. |                original unmodified.                                          |
  212. |   moveBy     - Moves the rectangle by the amount specified by the argument   |
  213. |                point.                                                        |
  214. |   movedBy    - Same as moveBy, but returns a new rectangle, leaving the      |
  215. |                original unmodified.                                          |
  216. |   moveTo     - Moves the rectangle so that its bottom left corner is at the  |
  217. |                argument point.                                               |
  218. |   movedTo    - Same as moveTo, but returns a new rectangle, leaving the      |
  219. |                original unmodified.                                          |
  220. |   scaleBy    - Scales the rectangle by the argument amount.  It can be       |
  221. |                one of the following:                                         |
  222. |                  - A scalar, either a long integer or double                 |
  223. |                  - A point that scales by different amounts in the X- and    |
  224. |                    Y-axis directions                                         |
  225. |                  - A pair of doubles.  The first is used to scale in the     |
  226. |                    X-axis direction, the second in the Y-axis direction.     |
  227. |   scaledBy   - Same as scaleBy, but returns a new rectangle, leaving the     |
  228. |                original unmodified.                                          |
  229. |   shrinkBy   - Moves the corners of the rectangle inward toward the center   |
  230. |                by the given amount, either a scalar or a point.  The         |
  231. |                shrinkBy(anAmount) function is always equivalent to the       |
  232. |                expandBy(- anAmount) function, and vice versa.                |
  233. |   shrunkBy   - Same as shrinkBy, but returns a new rectangle, leaving the    |
  234. |                original unmodified.                                          |
  235. |   sizeTo     - Sizes the rectangle to the argument size.                     |
  236. |   sizedTo    - Same as sizeTo, but returns a new rectangle, leaving the      |
  237. |                original unmodified.                                          |
  238. |   sizeBy     - Scales the rectangle by the argument value, leaving the       |
  239. |                rectangle at the same location because the bottomLeft point   |
  240. |                remains fixed.  The scaling factor is one of the following:   |
  241. |                  - An integer scalar, to scale by the same factor in both    |
  242. |                    the X-axis and Y-axis directions                          |
  243. |                  - A pair of integer scalars, to scale by different factors  |
  244. |                    in the X-axis and Y-axis directions.                      |
  245. |                  - One or two floating point values, the two values used to  |
  246. |                    scale by different amounts in each direction.             |
  247. |   sizedBy    - Same as sizeBy, but returns a new rectangle, leaving the      |
  248. |                original unmodified.                                          |
  249. ------------------------------------------------------------------------------*/
  250. IRectangle
  251.   ¢erAt   ( const IPoint &aPoint ),
  252.    centeredAt ( const IPoint &aPoint ) const,
  253.   &expandBy   ( const IPair  &aPair  ),
  254.   &expandBy   ( Coord         coord  ),
  255.    expandedBy ( const IPair  &aPair  ) const,
  256.    expandedBy ( Coord         coord  ) const,
  257.   &moveBy     ( const IPair  &aPair  ),
  258.    movedBy    ( const IPair  &aPair  ) const,
  259.   &moveTo     ( const IPoint &aPoint ),
  260.    movedTo    ( const IPoint &aPoint ) const,
  261.   &scaleBy    ( const IPair  &aPair  ),
  262.   &scaleBy    ( Coord         coord  ),
  263.   &scaleBy    ( double        factor ),
  264.   &scaleBy    ( double        xfact,
  265.                 double        yfact  ),
  266.    scaledBy   ( const IPair  &aPair  ) const,
  267.    scaledBy   ( Coord         coord  ) const,
  268.    scaledBy   ( double        factor ) const,
  269.    scaledBy   ( double        xfact,
  270.                 double        yfact  ) const,
  271.   &shrinkBy   ( const IPair  &aPair  ),
  272.   &shrinkBy   ( Coord         coord  ),
  273.    shrunkBy   ( const IPair  &aPair  ) const,
  274.    shrunkBy   ( Coord         coord  ) const,
  275.   &sizeTo     ( const IPair  &aPair  ),
  276.    sizedTo    ( const IPair  &aPair  ) const,
  277.   &sizeBy     ( const IPair  &aPair  ),
  278.   &sizeBy     ( Coord         factor ),
  279.   &sizeBy     ( double        factor ),
  280.   &sizeBy     ( double        xfact,
  281.                 double        yfact  ),
  282.    sizedBy    ( const IPair  &aPair  ) const,
  283.    sizedBy    ( Coord         factor ) const,
  284.    sizedBy    ( double        factor ) const,
  285.    sizedBy    ( double        xfact,
  286.                 double        yfact  ) const;
  287.  
  288. /*--------------------------------- Testing ------------------------------------
  289. | Use these functions to test various attributes of a rectangle:               |
  290. |   contains   - Returns true if the rectangle contains the argument point or  |
  291. |                rectangle.                                                    |
  292. |   intersects - Returns true if the rectangle and argument rectangles         |
  293. |                overlap.                                                      |
  294. ------------------------------------------------------------------------------*/
  295. Boolean
  296.   contains   ( const IPoint     &aPoint ) const,
  297.   contains   ( const IRectangle &aRect  ) const,
  298.   intersects ( const IRectangle &aRect  ) const;
  299.  
  300. /*-------------------------------- Displaying ----------------------------------
  301. | Use the following operator to display rectangles:                            |
  302. |   operator << - This operator lets you write rectangles to ostreams in the   |
  303. |                 conventional manner.                                         |
  304. ------------------------------------------------------------------------------*/
  305. friend ostream
  306.  &operator << ( ostream          &aStream,
  307.                 const IRectangle &aRectangle );
  308.  
  309. protected:
  310. /*------------------------------ Implementation --------------------------------
  311. | The following function provides utilities used to implement this class:      |
  312. |   validate - Corrects an invalid rectangle after creation, expansion, or     |
  313. |              intersection.                                                   |
  314. ------------------------------------------------------------------------------*/
  315. IRectangle
  316.  &validate ( );
  317.  
  318. private: /*------------------------ PRIVATE ----------------------------------*/
  319. IPoint
  320.   origin,
  321.   corner;
  322. }; // class IRectangle
  323.  
  324. /*----------------------------------------------------------------------------*/
  325. /* Resume compiler default packing.                                           */
  326. /*----------------------------------------------------------------------------*/
  327. #pragma pack()
  328.  
  329. /*--------------------------------- INLINES ----------------------------------*/
  330. #ifndef I_NO_INLINES
  331.   #include <irect.inl>
  332. #endif
  333.  
  334. #endif /* _IRECT_ */
  335.