ADD(2)                                                     ADD(2)

     NAME
          add, sub, mul, div, raddp, rsubp, rmul, rdiv, rshift, inset,
          rcanon, eqpt, eqrect, ptinrect, rectinrect, rectXrect,
          rectclip, Dx, Dy, Pt, Rect, Rpt - arithmetic on points and
          rectangles

     SYNOPSIS
          #include <u.h>
          #include <libc.h>
          #include <libg.h>

          Point       add(Point p, Point q)

          Point       sub(Point p, Point q)

          Point       mul(Point p, int a)

          Point       div(Point p, int a)

          Rectangle   raddp(Rectangle r, Point p)

          Rectangle   rsubp(Rectangle r, Point p)

          Rectangle   rmul(Rectangle r, int a)

          Rectangle   rdiv(Rectangle r, int a)

          Rectangle   rshift(Rectangle r, int a)

          Rectangle   inset(Rectangle r, int n)

          Rectangle   rcanon(Rectangle r)

          int         eqpt(Point p, Point q)

          int         eqrect(Rectangle r, Rectangle s)

          int         ptinrect(Point p, Rectangle r)

          int         rectinrect(Rectangle r, Rectangle s)

          int         rectXrect(Rectangle r, Rectangle s)

          int         rectclip(Rectangle *rp, Rectangle b)

          int         Dx(Rectangle r)

          int         Dy(Rectangle r)

          Point       Pt(int x, int y)

     Page 1                       Plan 9             (printed 4/19/24)

     ADD(2)                                                     ADD(2)

          Rectangle   Rect(int x0, int y0, int x1, int y1)

          Rectangle   Rpt(Point p, Point q)

     DESCRIPTION
          The functions Pt, Rect and Rpt construct geometrical data
          types from their components.  These are implemented as mac-
          ros.

          Add returns the Point sum of its arguments: Pt(p.x+q.x,
          p.y+q.y).  Sub returns the Point difference of its argu-
          ments: Pt(p.x-q.x, p.y-q.y).  Mul returns the Point
          Pt(p.x*a, p.y*a).  Div returns the Point Pt(p.x/a, p.y/a).

          Raddp returns the Rectangle Rect(add(r.min, p), add(r.max,
          p)); rsubp returns the Rectangle Rpt(sub(r.min, p),
          sub(r.max, p)).  Rmul returns the Rectangle
          Rpt(mul(r.min,a), mul(r.max,a)); Rdiv returns the Rectangle
          Rpt(div(r.min,a), div(r.max,a)).

          Rshift returns the rectangle r with all coordinates either
          left-shifted or right-shifted by a, depending on whether a
          is positive or negative, respectively.

          Inset returns the Rectangle Rect(r.min.x+n, r.min.y+n,
          r.max.x-n, r.max.y-n).

          Rcanon returns a rectangle with the same extent as r, canon-
          icalized so that min.x ≤ max.x, and min.y ≤ max.y.

          Eqpt compares its argument Points and returns 0 if unequal,
          1 if equal.  Eqrect does the same for its argument Rectan-
          gles.

          Ptinrect returns 1 if p is a point within r, and 0 other-
          wise.

          Rectinrect returns 1 if all the pixels in r are also in s,
          and 0 otherwise.

          RectXrect returns 1 if r and s share any point, and 0 other-
          wise.

          Rectclip clips in place the Rectangle pointed to by rp so
          that it is completely contained within b. The return value
          is 1 if any part of *rp is within b. Otherwise, the return
          value is 0 and *rp is unchanged.

          The functions Dx and Dy give the width (x) and height (y) of
          a Rectangle.  They are implemented as macros.

     SOURCE

     Page 2                       Plan 9             (printed 4/19/24)

     ADD(2)                                                     ADD(2)

          /sys/src/libg

     SEE ALSO
          graphics(2)

     Page 3                       Plan 9             (printed 4/19/24)