term% ls -F
term% cat index.txt
ADD(2)                        System Calls Manual                       ADD(2)

       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

       #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)

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

       Rectangle   Rpt(Point p, Point q)

       The  functions  Pt,  Rect and Rpt construct geometrical data types from
       their components.  These are implemented as macros.

       Add returns the Point sum of its arguments: Pt(p.x+q.x, p.y+q.y).   Sub
       returns  the  Point  difference of its arguments: 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 Rectan‐
       gle 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,

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

       Rcanon  returns a rectangle with the same extent as r, canonicalized 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 Rectangles.

       Ptinrect returns 1 if p is a point within r, and 0 otherwise.

       Rectinrect returns 1 if all the pixels in r are also in s, and 0 other‐

       RectXrect returns 1 if r and s share any point, and 0 otherwise.

       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  un‐

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