home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c185 / 2.ddi / OWLSRC.EXE / CSCAPE / SOURCE / OPBOX.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-09-06  |  5.1 KB  |  210 lines

  1. /*
  2.     opbox.c    5/15/88
  3.  
  4.     % Pixel-coordinate graphics and geometry related utility functions.
  5.     by Ted.
  6.  
  7.     OWL 1.1
  8.     Copyright (c) 1988, by Oakland Group, Inc.
  9.     ALL RIGHTS RESERVED.
  10.  
  11.     Revision History:
  12.     -----------------
  13.       8/17/88 jmd      removed  eNOMEM
  14.      10/19/88 ted    split out ocolmap stuff to ocolmap.c
  15.      11/02/88 ted:    split out ocbox functions to ocbox.c and clipping functions
  16.                     to oboxclip.c, renamed to opbox.c
  17.      5/09/89 ted    renamed old set's to copy's, added new set's.
  18.      5/09/89 ted    removed _point_copy because nobody uses it.
  19.      7/06/89 ted    Subtracted 1 from botrow and rightcol in opbox_charcoords.
  20. */
  21.  
  22. #include "oakhead.h"
  23. /* -------------------------------------------------------------------------- */
  24.  
  25. void opbox_charcoords(boxp, font, cboxp)
  26.     opbox *boxp;
  27.     ofont_type font;
  28.     ocbox *cboxp;
  29. /*
  30.     Set 'cboxp' to contain in char coords the pixel box 'boxp'.
  31.     If 'boxp' clips the chars in half, 'cboxp' gets rounded outward.
  32. */
  33. {
  34.     cboxp->toprow  = opcoord_GetYRow(boxp->ymin, font);
  35.     /* Round botrow up and then subtract one row */
  36.     cboxp->botrow  = opcoord_GetYRow(boxp->ymax - 1, font);
  37.  
  38.     cboxp->leftcol = opcoord_GetXCol(boxp->xmin, font); 
  39.     /* Round rightcol right and then subtract one col */
  40.     cboxp->rightcol= opcoord_GetXCol(boxp->xmax - 1, font);
  41. }
  42. /* -------------------------------------------------------------------------- */
  43.  
  44. void opbox_uncover(winboxp, boxp)
  45.     opbox *winboxp;
  46.     opbox *boxp;
  47. /*
  48.     Set 'boxp' to that part of boxp not intersecting with winboxp.
  49.     NOTE: only useful for boxes with identical top&bottom or left&right sides!
  50. */
  51. {
  52.     if (winboxp->ymin == boxp->ymin && winboxp->ymax == boxp->ymax) {
  53.         if (winboxp->xmin > boxp->xmin && winboxp->xmin < boxp->xmax) {
  54.             boxp->xmax = winboxp->xmin;
  55.         }
  56.         else if (winboxp->xmax < boxp->xmax && winboxp->xmax > boxp->xmin) {
  57.             boxp->xmin = winboxp->xmax;
  58.         }
  59.     }
  60.     else if (winboxp->xmin == boxp->xmin && winboxp->xmax == boxp->xmax) {
  61.         if (winboxp->ymin > boxp->ymin && winboxp->ymin < boxp->ymax) {
  62.             boxp->ymax = winboxp->ymin;
  63.         }
  64.         else if (winboxp->ymax < boxp->ymax && winboxp->ymax > boxp->ymin) {
  65.             boxp->ymin = winboxp->ymax;
  66.         }
  67.     }
  68. }
  69. /* -------------------------------------------------------------------------- */
  70.  
  71. boolean opbox_empty(boxp)
  72.     opbox *boxp;
  73. /*
  74.     Return TRUE if 'boxp' is an empty or inverted box.
  75. */
  76. {
  77.     return (boxp->xmin >= boxp->xmax || boxp->ymin >= boxp->ymax);
  78. }
  79. /* -------------------------------------------------------------------------- */
  80.  
  81. boolean opbox_ScrollVtIn(boxp, n)
  82.     opbox *boxp;
  83.     int n;
  84. /*
  85.     Squash box into just the part that needs to be repainted after a scroll.
  86. */
  87. {
  88.     opcoord newbound;
  89.  
  90.     if (n > 0) {
  91.         newbound = boxp->ymax - n;
  92.  
  93.         if (newbound <= boxp->ymin) {
  94.             return(FALSE);
  95.         }
  96.         else {
  97.             boxp->ymin = newbound;
  98.             return(TRUE);
  99.         }
  100.     }
  101.     else if (n < 0) {
  102.         newbound = boxp->ymin - n;
  103.  
  104.         if (newbound >= boxp->ymax) {
  105.             return(FALSE);
  106.         }
  107.         else {
  108.             boxp->ymax = newbound;
  109.             return(TRUE);
  110.         }
  111.     }
  112.     else {
  113.         return(FALSE);
  114.     }
  115. }
  116. /* -------------------------------------------------------------------------- */
  117.  
  118. boolean opbox_ScrollHzIn(boxp, n)
  119.     opbox *boxp;
  120.     int n;
  121. /*
  122.     Squash box into just the part that needs to be repainted after a scroll.
  123. */
  124. {
  125.     opcoord newbound;
  126.  
  127.     if (n > 0) {
  128.         newbound = boxp->xmax - n;
  129.  
  130.         if (newbound <= boxp->xmin) {
  131.             return(FALSE);
  132.         }
  133.         else {
  134.             boxp->xmin = newbound;
  135.             return(TRUE);
  136.         }
  137.     }
  138.     else if (n < 0) {
  139.         newbound = boxp->xmin - n;
  140.  
  141.         if (newbound >= boxp->xmax) {
  142.             return(FALSE);
  143.         }
  144.         else {
  145.             boxp->xmax = newbound;
  146.             return(TRUE);
  147.         }
  148.     }
  149.     else {
  150.         return(FALSE);
  151.     }
  152. }
  153. /* -------------------------------------------------------------------------- */
  154. /* Functions doubling for opboxes and ocboxes */
  155. /* -------------------------------------------------------------------------- */
  156.  
  157. odim _box_GetWidth(boxp)
  158.     opbox *boxp;
  159. {
  160.     return(boxp->xmax - boxp->xmin);
  161. }
  162. /* -------------------------------------------------------------------------- */
  163.  
  164. odim _box_GetHeight(boxp)
  165.     opbox *boxp;
  166. {
  167.     return(boxp->ymax - boxp->ymin);
  168. }
  169. /* -------------------------------------------------------------------------- */
  170.  
  171. opbox *_box_copy(dboxp, sboxp)
  172.     opbox *dboxp;
  173.     opbox *sboxp;
  174. {
  175.     dboxp->xmin = sboxp->xmin;
  176.     dboxp->ymin = sboxp->ymin;
  177.     dboxp->xmax = sboxp->xmax;
  178.     dboxp->ymax = sboxp->ymax;
  179.     return(dboxp);
  180. }
  181. /* -------------------------------------------------------------------------- */
  182.  
  183. opbox *_box_trans(boxp, xdisp, ydisp)
  184.     opbox *boxp;
  185.     opcoord xdisp;
  186.     opcoord ydisp;
  187. {
  188.     boxp->xmin += xdisp;
  189.     boxp->xmax += xdisp;
  190.     boxp->ymin += ydisp;
  191.     boxp->ymax += ydisp;
  192.     return(boxp);
  193. }
  194. /* -------------------------------------------------------------------------- */
  195.  
  196. boolean _box_equal(boxp1, boxp2)
  197.     opbox *boxp1;
  198.     opbox *boxp2;
  199. /*
  200.     Return TRUE if 'boxp' is an empty or inverted box.
  201. */
  202. {
  203.     return (boxp1->xmin == boxp2->xmin &&
  204.             boxp1->xmax == boxp2->xmax &&
  205.             boxp1->ymin == boxp2->ymin &&
  206.             boxp1->ymax == boxp2->ymax);
  207. }
  208. /* -------------------------------------------------------------------------- */
  209.  
  210.