blob: 57a0c96c3adcb914e82d1b17b24aa248901df80b [file] [log] [blame]
<head>
<title>memdraw(3) - Plan 9 from User Space</title>
<meta content="text/html; charset=utf-8" http-equiv=Content-Type>
</head>
<body bgcolor=#ffffff>
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr height=10><td>
<tr><td width=20><td>
<tr><td width=20><td><b>MEMDRAW(3)</b><td align=right><b>MEMDRAW(3)</b>
<tr><td width=20><td colspan=2>
<br>
<p><font size=+1><b>NAME </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Memimage, Memdata, Memdrawparam, memimageinit, wordaddr, byteaddr,
memimagemove, allocmemimage, allocmemimaged, readmemimage, creadmemimage,
writememimage, freememimage, memsetchan, loadmemimage, cloadmemimage,
unloadmemimage, memfillcolor, memarc, mempoly, memellipse,
memfillpoly, memimageline, memimagedraw, drawclip, memlinebbox,
memlineendsize, allocmemsubfont, openmemsubfont, freememsubfont,
memsubfontwidth, getmemdefont, memimagestring, iprint, hwdraw
&ndash; drawing routines for memory-resident images<br>
</table>
<p><font size=+1><b>SYNOPSIS </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<tt><font size=+1>#include &lt;u.h&gt; <br>
#include &lt;u.h&gt; <br>
#include &lt;libc.h&gt; <br>
#include &lt;draw.h&gt; <br>
#include &lt;memdraw.h&gt; <br>
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
</font></tt>
<tt><font size=+1>typedef struct Memdata<br>
{<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
ulong &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*base; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* allocated data pointer */<br>
uchar &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*bdata; &nbsp;&nbsp;&nbsp;&nbsp;/* first byte of actual data; word&#8722;aligned */<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ref; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* number of Memimages using this data */<br>
void* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imref; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* last image that pointed at this */<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allocd; &nbsp;&nbsp;&nbsp;&nbsp;/* is this malloc'd? */<br>
</table>
} Memdata;<br>
enum {<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Frepl &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1&lt;&lt;0, &nbsp;&nbsp;&nbsp;&nbsp;/* is replicated */<br>
Fsimple &nbsp;&nbsp;&nbsp;&nbsp;= 1&lt;&lt;1, &nbsp;&nbsp;&nbsp;&nbsp;/* is 1x1 */<br>
Fgrey &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1&lt;&lt;2, &nbsp;&nbsp;&nbsp;&nbsp;/* is grey */<br>
Falpha &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1&lt;&lt;3, &nbsp;&nbsp;&nbsp;&nbsp;/* has explicit alpha */<br>
Fcmap &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1&lt;&lt;4, &nbsp;&nbsp;&nbsp;&nbsp;/* has cmap channel */<br>
Fbytes &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1&lt;&lt;5, &nbsp;&nbsp;&nbsp;&nbsp;/* has only 8&#8722;bit channels */<br>
</table>
};<br>
typedef struct Memimage<br>
{<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Rectangle r; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* rectangle in data area, local coords */<br>
Rectangle clipr; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* clipping region */<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;depth; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* number of bits of storage per pixel */<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nchan; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* number of channels */<br>
ulong &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chan; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* channel descriptions */<br>
Memdata &nbsp;&nbsp;&nbsp;&nbsp;*data; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* pointer to data */<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zero; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* data&#8722;&gt;bdata+zero==&amp;byte containing (0,0) */<br>
ulong &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* width in words of a single scan line */<br>
Memlayer &nbsp;&nbsp;&nbsp;*layer; &nbsp;&nbsp;&nbsp;&nbsp;/* nil if not a layer*/<br>
ulong &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flags;<br>
</table>
</font></tt>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<i>...<br>
</i>
</table>
<tt><font size=+1>} Memimage;<br>
typedef struct Memdrawparam<br>
{<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Memimage &nbsp;&nbsp;&nbsp;*dst;<br>
Rectangle r;<br>
Memimage &nbsp;&nbsp;&nbsp;*src;<br>
Rectangle sr;<br>
Memimage &nbsp;&nbsp;&nbsp;*mask;<br>
Rectangle mr;<br>
</table>
</font></tt>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<i>...<br>
</i>
</table>
<tt><font size=+1>} Memdrawparam;<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawdebug;<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
</font></tt><i>
</i><tt><font size=+1>void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memimageinit(void)<br>
ulong* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wordaddr(Memimage *i, Point p)<br>
uchar* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteaddr(Memimage *i, Point p)<br>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memimagemove(void *from, void *to)<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Memimage* &nbsp;&nbsp;&nbsp;&nbsp;allocmemimage(Rectangle r, ulong chan)<br>
Memimage* &nbsp;&nbsp;&nbsp;&nbsp;allocmemimaged(Rectangle r, ulong chan, Memdata *data)<br>
Memimage* &nbsp;&nbsp;&nbsp;&nbsp;readmemimage(int fd)<br>
Memimage* &nbsp;&nbsp;&nbsp;&nbsp;creadmemimage(int fd)<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writememimage(int fd, Memimage *i)<br>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freememimage(Memimage *i)<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memsetchan(Memimage*, ulong)<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadmemimage(Memimage *i, Rectangle r,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
uchar *buf, int nbuf)<br>
</table>
</table>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cloadmemimage(Memimage *i, Rectangle r,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
uchar *buf, int nbuf)<br>
</table>
</table>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unloadmemimage(Memimage *i, Rectangle r,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
uchar *buf, int nbuf)<br>
</table>
</table>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memfillcolor(Memimage *i, ulong color)<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memarc(Memimage *dst, Point c, int a, int b, int thick,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Memimage *src, Point sp, int alpha, int phi, Drawop op)<br>
</table>
</table>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mempoly(Memimage *dst, Point *p, int np, int end0,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
int end1, int radius, Memimage *src, Point sp, Drawop op)<br>
</table>
</table>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memellipse(Memimage *dst, Point c, int a, int b,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
int thick, Memimage *src, Point sp, Drawop op)<br>
</table>
</table>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memfillpoly(Memimage *dst, Point *p, int np, int wind,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Memimage *src, Point sp, Drawop op)<br>
</table>
</table>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memimageline(Memimage *dst, Point p0, Point p1, int end0,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
int end1, int radius, Memimage *src, Point sp, Drawop op)<br>
</table>
</table>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memimagedraw(Memimage *dst, Rectangle r, Memimage *src,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Point sp, Memimage *mask, Point mp, Drawop op)<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
</table>
</table>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawclip(Memimage *dst, Rectangle *dr, Memimage *src,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Point *sp, Memimage *mask, Point *mp,<br>
Rectangle *sr, Rectangle *mr)<br>
</table>
</table>
Rectangle &nbsp;&nbsp;&nbsp;&nbsp;memlinebbox(Point p0, Point p1, int end0, int end1,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
int radius)<br>
</table>
</table>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memlineendsize(int end)<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Memsubfont* allocmemsubfont(char *name, int n, int height,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
int ascent, Fontchar *info, Memimage *i)<br>
</table>
</table>
Memsubfont* openmemsubfont(char *name)<br>
void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freememsubfont(Memsubfont *f)<br>
Point &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memsubfontwidth(Memsubfont *f, char *s)<br>
Memsubfont* getmemdefont(void)<br>
Point &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memimagestring(Memimage *dst, Point p, Memimage *color,<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
Point cp, Memsubfont *f, char *cs, Drawop op)<br>
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
</table>
</table>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iprint(char *fmt, ...)<br>
int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hwdraw(Memdrawparam *param)<br>
</font></tt>
</table>
<p><font size=+1><b>DESCRIPTION </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
The <tt><font size=+1>Memimage</font></tt> type defines memory-resident rectangular pictures
and the methods to draw upon them; <tt><font size=+1>Memimage</font></tt>s differ from <tt><font size=+1>Image</font></tt>s
(see <a href="../man3/draw.html"><i>draw</i>(3)</a>) in that they are manipulated directly in user memory
rather than by RPCs to the <tt><font size=+1>/dev/draw</font></tt> hierarchy. The library is
the basis for the kernel <a href="../man3/draw.html"><i>draw</i>(3)</a> driver and also
used by a number of programs that must manipulate images without
a display.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
The <tt><font size=+1>r, clipr</font></tt>, <tt><font size=+1>depth</font></tt>, <tt><font size=+1>nchan</font></tt>, and <tt><font size=+1>chan</font></tt> structure elements are identical
to the ones of the same name in the <tt><font size=+1>Image</font></tt> structure.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
The <tt><font size=+1>flags</font></tt> element of the <tt><font size=+1>Memimage</font></tt> structure holds a number of
bits of information about the image. In particular, it subsumes
the purpose of the <tt><font size=+1>repl</font></tt> element of <tt><font size=+1>Image</font></tt> structures.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<i>Memimageinit</i> initializes various static data that the library
depends on, as well as the replicated solid color images <tt><font size=+1>memopaque</font></tt>,
<tt><font size=+1>memtransparent</font></tt>, <tt><font size=+1>memblack</font></tt>, and <tt><font size=+1>memwhite</font></tt>. It should be called before
referring to any of these images and before calling any of the
other library functions.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Each <tt><font size=+1>Memimage</font></tt> points at a <tt><font size=+1>Memdata</font></tt> structure that in turn points
at the actual pixel data for the image. This allows multiple images
to be associated with the same <tt><font size=+1>Memdata</font></tt>. The first word of the
data pointed at by the <tt><font size=+1>base</font></tt> element of <tt><font size=+1>Memdata</font></tt> points back at
the <tt><font size=+1>Memdata</font></tt> structure, so that in the Plan 9 kernel,
the memory allocator (see Plan 9&#8217;s <i>pool</i>(3)) can compact image
memory using <i>memimagemove</i>.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
Because images can have different coordinate systems, the <tt><font size=+1>zero</font></tt>
element of the <tt><font size=+1>Memimage</font></tt> structure contains the offset that must
be added to the <tt><font size=+1>bdata</font></tt> element of the corresponding <tt><font size=+1>Memdata</font></tt> structure
in order to yield a pointer to the data for the pixel (0,0). Adding
<tt><font size=+1>width</font></tt> machine words to this pointer moves it
down one scan line. The <tt><font size=+1>depth</font></tt> element can be used to determine
how to move the pointer horizontally. Note that this method works
even for images whose rectangles do not include the origin, although
one should only dereference pointers corresponding to pixels within
the image rectangle. <i>Wordaddr</i> and
<i>byteaddr</i> perform these calculations, returning pointers to the
word and byte, respectively, that contain the beginning of the
data for a given pixel.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<i>Allocmemimage</i> allocages images with a given rectangle and channel
descriptor (see <tt><font size=+1>strtochan</font></tt> in <a href="../man3/graphics.html"><i>graphics</i>(3)</a>), creating a fresh <tt><font size=+1>Memdata</font></tt>
structure and associated storage. <i>Allocmemimaged</i> is similar but
uses the supplied <i>Memdata</i> structure rather than a new one. The
<i>readmemimage</i> function reads an
uncompressed bitmap from the given file descriptor, while <i>creadmemimage</i>
reads a compressed bitmap. <i>Writememimage</i> writes a compressed representation
of <i>i</i> to file descriptor <i>fd</i>. For more on bitmap formats, see <a href="../man7/image.html"><i>image</i>(7)</a>.
<i>Freememimage</i> frees images returned by any of these routines. The
<tt><font size=+1>Memimage</font></tt> structure
contains some tables that are used to store precomputed values
depending on the channel descriptor. <i>Memsetchan</i> updates the <tt><font size=+1>chan</font></tt>
element of the structure as well as these tables, returning &ndash;1
if passed a bad channel descriptor.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<i>Loadmemimage</i> and <i>cloadmemimage</i> replace the pixel data for a given
rectangle of an image with the given buffer of uncompressed or
compressed data, respectively. When calling <i>cloadmemimage</i>, the
buffer must contain an integral number of compressed chunks of
data that exactly cover the rectangle.
<i>Unloadmemimage</i> retrieves the uncompressed pixel data for a given
rectangle of an image. All three return the number of bytes consumed
on success, and &ndash;1 in case of an error.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<i>Memfillcolor</i> fills an image with the given color, a 32-bit number
as described in <a href="../man3/color.html"><i>color</i>(3)</a>.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<i>Memarc</i>, <i>mempoly</i>, <i>memellipse</i>, <i>memfillpoly</i>, <i>memimageline</i>, and <i>memimagedraw</i>
are identical to the <i>arc</i>, <i>poly</i>, <i>ellipse</i>, <i>fillpoly</i>, <i>line</i>, and <i>gendraw</i>,
routines described in <a href="../man3/draw.html"><i>draw</i>(3)</a>, except that they operate on <tt><font size=+1>Memimage</font></tt>s
rather than <tt><font size=+1>Image</font></tt>s. Similarly, <i>allocmemsubfont</i>, <i>openmemsubfont</i>,
<i>freememsubfont</i>,
<i>memsubfontwidth</i>, <i>getmemdefont</i>, and <i>memimagestring</i> are the <tt><font size=+1>Memimage</font></tt>
analogues of <i>allocsubfont</i>, <i>openfont</i>, <i>freesubfont</i>, <i>strsubfontwidth</i>,
<i>getdefont</i>, and <tt><font size=+1>string</font></tt> (see <a href="../man3/subfont.html"><i>subfont</i>(3)</a> and <a href="../man3/graphics.html"><i>graphics</i>(3)</a>), except
that they operate only on <tt><font size=+1>Memsubfont</font></tt>s rather than <tt><font size=+1>Font</font></tt>s.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
<i>Drawclip</i> takes the images involved in a draw operation, together
with the destination rectangle <tt><font size=+1>dr</font></tt> and source and mask alignment
points <tt><font size=+1>sp</font></tt> and <tt><font size=+1>mp</font></tt>, and clips them according to the clipping rectangles
of the images involved. It also fills in the rectangles <tt><font size=+1>sr</font></tt> and
<tt><font size=+1>mr</font></tt> with rectangles congruent to the returned
destination rectangle but translated so the upper left corners
are the returned <tt><font size=+1>sp</font></tt> and <tt><font size=+1>mp</font></tt>. <i>Drawclip</i> returns zero when the clipped
rectangle is empty. <i>Memlinebbox</i> returns a conservative bounding
box containing a line between two points with given end styles
and radius. <i>Memlineendsize</i> calculates the extra length
added to a line by attaching an end of a given style.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
The <i>hwdraw</i> and <i>iprint</i> functions are no-op stubs that may be overridden
by clients of the library. <i>Hwdraw</i> is called at each call to <i>memimagedraw</i>
with the current request&#8217;s parameters. If it can satisfy the request,
it should do so and return 1. If it cannot satisfy the request,
it should return 0. This allows (for
instance) the kernel to take advantage of hardware acceleration.
<i>Iprint</i> should format and print its arguments; it is given much
debugging output when the global integer variable <tt><font size=+1>drawdebug</font></tt> is
non-zero. In the kernel, <i>iprint</i> prints to a serial line rather
than the screen, for obvious reasons.
</table>
<p><font size=+1><b>SOURCE </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<tt><font size=+1>/usr/local/plan9/src/libdraw<br>
</font></tt>
</table>
<p><font size=+1><b>SEE ALSO </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<a href="../man3/addpt.html"><i>addpt</i>(3)</a>, <a href="../man3/color.html"><i>color</i>(3)</a>, <a href="../man3/draw.html"><i>draw</i>(3)</a>, <a href="../man3/graphics.html"><i>graphics</i>(3)</a>, <a href="../man3/memlayer.html"><i>memlayer</i>(3)</a>, <a href="../man3/stringsize.html"><i>stringsize</i>(3)</a>,
<a href="../man3/subfont.html"><i>subfont</i>(3)</a>, <a href="../man7/color.html"><i>color</i>(7)</a>, <a href="../man7/utf.html"><i>utf</i>(7)</a><br>
</table>
<p><font size=+1><b>BUGS </b></font><br>
<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>
<i>Memimagestring</i> is unusual in using a subfont rather than a font,
and in having no parameter to align the source.
<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
These functions are archived into <i>libdraw</i>.<br>
</table>
<td width=20>
<tr height=20><td>
</table>
<!-- TRAILER -->
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr height=15><td width=10><td><td width=10>
<tr><td><td>
<center>
<a href="../../"><img src="../../dist/spaceglenda100.png" alt="Space Glenda" border=1></a>
</center>
</table>
<!-- TRAILER -->
</body></html>