home *** CD-ROM | disk | FTP | other *** search
- /*
- opbox.c 5/15/88
-
- % Pixel-coordinate graphics and geometry related utility functions.
- by Ted.
-
- OWL 1.1
- Copyright (c) 1988, by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 8/17/88 jmd removed eNOMEM
- 10/19/88 ted split out ocolmap stuff to ocolmap.c
- 11/02/88 ted: split out ocbox functions to ocbox.c and clipping functions
- to oboxclip.c, renamed to opbox.c
- 5/09/89 ted renamed old set's to copy's, added new set's.
- 5/09/89 ted removed _point_copy because nobody uses it.
- 7/06/89 ted Subtracted 1 from botrow and rightcol in opbox_charcoords.
- */
-
- #include "oakhead.h"
- /* -------------------------------------------------------------------------- */
-
- void opbox_charcoords(boxp, font, cboxp)
- opbox *boxp;
- ofont_type font;
- ocbox *cboxp;
- /*
- Set 'cboxp' to contain in char coords the pixel box 'boxp'.
- If 'boxp' clips the chars in half, 'cboxp' gets rounded outward.
- */
- {
- cboxp->toprow = opcoord_GetYRow(boxp->ymin, font);
- /* Round botrow up and then subtract one row */
- cboxp->botrow = opcoord_GetYRow(boxp->ymax - 1, font);
-
- cboxp->leftcol = opcoord_GetXCol(boxp->xmin, font);
- /* Round rightcol right and then subtract one col */
- cboxp->rightcol= opcoord_GetXCol(boxp->xmax - 1, font);
- }
- /* -------------------------------------------------------------------------- */
-
- void opbox_uncover(winboxp, boxp)
- opbox *winboxp;
- opbox *boxp;
- /*
- Set 'boxp' to that part of boxp not intersecting with winboxp.
- NOTE: only useful for boxes with identical top&bottom or left&right sides!
- */
- {
- if (winboxp->ymin == boxp->ymin && winboxp->ymax == boxp->ymax) {
- if (winboxp->xmin > boxp->xmin && winboxp->xmin < boxp->xmax) {
- boxp->xmax = winboxp->xmin;
- }
- else if (winboxp->xmax < boxp->xmax && winboxp->xmax > boxp->xmin) {
- boxp->xmin = winboxp->xmax;
- }
- }
- else if (winboxp->xmin == boxp->xmin && winboxp->xmax == boxp->xmax) {
- if (winboxp->ymin > boxp->ymin && winboxp->ymin < boxp->ymax) {
- boxp->ymax = winboxp->ymin;
- }
- else if (winboxp->ymax < boxp->ymax && winboxp->ymax > boxp->ymin) {
- boxp->ymin = winboxp->ymax;
- }
- }
- }
- /* -------------------------------------------------------------------------- */
-
- boolean opbox_empty(boxp)
- opbox *boxp;
- /*
- Return TRUE if 'boxp' is an empty or inverted box.
- */
- {
- return (boxp->xmin >= boxp->xmax || boxp->ymin >= boxp->ymax);
- }
- /* -------------------------------------------------------------------------- */
-
- boolean opbox_ScrollVtIn(boxp, n)
- opbox *boxp;
- int n;
- /*
- Squash box into just the part that needs to be repainted after a scroll.
- */
- {
- opcoord newbound;
-
- if (n > 0) {
- newbound = boxp->ymax - n;
-
- if (newbound <= boxp->ymin) {
- return(FALSE);
- }
- else {
- boxp->ymin = newbound;
- return(TRUE);
- }
- }
- else if (n < 0) {
- newbound = boxp->ymin - n;
-
- if (newbound >= boxp->ymax) {
- return(FALSE);
- }
- else {
- boxp->ymax = newbound;
- return(TRUE);
- }
- }
- else {
- return(FALSE);
- }
- }
- /* -------------------------------------------------------------------------- */
-
- boolean opbox_ScrollHzIn(boxp, n)
- opbox *boxp;
- int n;
- /*
- Squash box into just the part that needs to be repainted after a scroll.
- */
- {
- opcoord newbound;
-
- if (n > 0) {
- newbound = boxp->xmax - n;
-
- if (newbound <= boxp->xmin) {
- return(FALSE);
- }
- else {
- boxp->xmin = newbound;
- return(TRUE);
- }
- }
- else if (n < 0) {
- newbound = boxp->xmin - n;
-
- if (newbound >= boxp->xmax) {
- return(FALSE);
- }
- else {
- boxp->xmax = newbound;
- return(TRUE);
- }
- }
- else {
- return(FALSE);
- }
- }
- /* -------------------------------------------------------------------------- */
- /* Functions doubling for opboxes and ocboxes */
- /* -------------------------------------------------------------------------- */
-
- odim _box_GetWidth(boxp)
- opbox *boxp;
- {
- return(boxp->xmax - boxp->xmin);
- }
- /* -------------------------------------------------------------------------- */
-
- odim _box_GetHeight(boxp)
- opbox *boxp;
- {
- return(boxp->ymax - boxp->ymin);
- }
- /* -------------------------------------------------------------------------- */
-
- opbox *_box_copy(dboxp, sboxp)
- opbox *dboxp;
- opbox *sboxp;
- {
- dboxp->xmin = sboxp->xmin;
- dboxp->ymin = sboxp->ymin;
- dboxp->xmax = sboxp->xmax;
- dboxp->ymax = sboxp->ymax;
- return(dboxp);
- }
- /* -------------------------------------------------------------------------- */
-
- opbox *_box_trans(boxp, xdisp, ydisp)
- opbox *boxp;
- opcoord xdisp;
- opcoord ydisp;
- {
- boxp->xmin += xdisp;
- boxp->xmax += xdisp;
- boxp->ymin += ydisp;
- boxp->ymax += ydisp;
- return(boxp);
- }
- /* -------------------------------------------------------------------------- */
-
- boolean _box_equal(boxp1, boxp2)
- opbox *boxp1;
- opbox *boxp2;
- /*
- Return TRUE if 'boxp' is an empty or inverted box.
- */
- {
- return (boxp1->xmin == boxp2->xmin &&
- boxp1->xmax == boxp2->xmax &&
- boxp1->ymin == boxp2->ymin &&
- boxp1->ymax == boxp2->ymax);
- }
- /* -------------------------------------------------------------------------- */
-
-