summaryrefslogtreecommitdiff
path: root/man/2/draw-image
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 20:52:35 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 20:52:35 +0000
commit46439007cf417cbd9ac8049bb4122c890097a0fa (patch)
tree6fdb25e5f3a2b6d5657eb23b35774b631d4d97e4 /man/2/draw-image
parent37da2899f40661e3e9631e497da8dc59b971cbd0 (diff)
20060303-partial
Diffstat (limited to 'man/2/draw-image')
-rw-r--r--man/2/draw-image909
1 files changed, 909 insertions, 0 deletions
diff --git a/man/2/draw-image b/man/2/draw-image
new file mode 100644
index 00000000..477e69e0
--- /dev/null
+++ b/man/2/draw-image
@@ -0,0 +1,909 @@
+.TH DRAW-IMAGE 2
+.SH NAME
+Image \-
+pictures and drawing
+.SH SYNOPSIS
+.EX
+include "draw.m";
+draw := load Draw Draw->PATH;
+
+# compositing operators
+SinD: con 1<<3;
+DinS: con 1<<2;
+SoutD: con 1<<1;
+DoutS: con 1<<0;
+
+S: con SinD|SoutD;
+SoverD: con SinD|SoutD|DoutS;
+SatopD: con SinD|DoutS;
+SxorD: con SoutD|DoutS;
+
+D: con DinS|DoutS;
+DoverS: con DinS|DoutS|SoutD;
+DatopS: con DinS|SoutD;
+DxorS: con DoutS|SoutD;
+
+Clear: con 0;
+
+Image: adt
+{
+ r: Rect;
+ clipr: Rect;
+ chans: Chans;
+ depth: int;
+ repl: int;
+
+ display: ref Display;
+ screen: ref Screen;
+
+ draw: fn(dst: self ref Image, r: Rect, src: ref Image,
+ mask: ref Image, p: Point);
+ drawop: fn(dst: self ref Image, r: Rect, src: ref Image,
+ mask: ref Image, p: Point, op: int);
+ gendraw: fn(dst: self ref Image, r: Rect, src: ref Image,
+ p0: Point, mask: ref Image, p1: Point);
+ gendrawop: fn(dst: self ref Image, r: Rect, src: ref Image,
+ p0: Point, mask: ref Image, p1: Point, op: int);
+ line: fn(dst: self ref Image, p0,p1: Point,
+ end0,end1,thick: int,
+ src: ref Image, sp: Point);
+ lineop: fn(dst: self ref Image, p0,p1: Point,
+ end0,end1,thick: int,
+ src: ref Image, sp: Point, op: int);
+ poly: fn(dst: self ref Image, p: array of Point,
+ end0,end1,thick: int,
+ src: ref Image, sp: Point);
+ polyop: fn(dst: self ref Image, p: array of Point,
+ end0,end1,thick: int,
+ src: ref Image, sp: Point, op: int);
+ bezspline: fn(dst: self ref Image, p: array of Point,
+ end0,end1,thick: int,
+ src: ref Image, sp: Point);
+ bezsplineop: fn(dst: self ref Image, p: array of Point,
+ end0,end1,thick: int,
+ src: ref Image, sp: Point, op: int);
+ fillpoly: fn(dst: self ref Image, p: array of Point,
+ wind: int, src: ref Image, sp: Point);
+ fillpolyop: fn(dst: self ref Image, p: array of Point,
+ wind: int, src: ref Image, sp: Point, op: int);
+ fillbezspline: fn(dst: self ref Image, p: array of Point,
+ wind: int, src: ref Image, sp: Point);
+ fillbezsplineop: fn(dst: self ref Image, p: array of Point,
+ wind: int, src: ref Image, sp: Point, op: int);
+ ellipse: fn(dst: self ref Image, c: Point, a, b,
+ thick: int, src: ref Image, sp: Point);
+ ellipseop: fn(dst: self ref Image, c: Point, a, b,
+ thick: int, src: ref Image, sp: Point, op: int);
+ fillellipse:fn(dst: self ref Image, c: Point, a, b: int,
+ src: ref Image, sp: Point);
+ fillellipseop:fn(dst: self ref Image, c: Point, a, b: int,
+ src: ref Image, sp: Point, op: int);
+ arc: fn(dst: self ref Image, c: Point, a, b, thick: int,
+ src: ref Image, sp: Point, alpha, phi: int);
+ arcop: fn(dst: self ref Image, c: Point, a, b, thick: int,
+ src: ref Image, sp: Point,
+ alpha, phi: int, op: int);
+ fillarc: fn(dst: self ref Image, c: Point, a, b: int,
+ src: ref Image, sp: Point, alpha, phi: int);
+ fillarcop: fn(dst: self ref Image, c: Point, a, b: int,
+ src: ref Image, sp: Point,
+ alpha, phi: int, op: int);
+ bezier: fn(dst: self ref Image, a,b,c,d: Point,
+ end0,end1,thick: int,
+ src: ref Image, sp: Point);
+ bezierop: fn(dst: self ref Image, a,b,c,d: Point,
+ end0,end1,thick: int,
+ src: ref Image, sp: Point, op: int);
+ fillbezier: fn(dst: self ref Image, a,b,c,d: Point, wind:int,
+ src: ref Image, sp: Point);
+ fillbezierop: fn(dst: self ref Image, a,b,c,d: Point, wind:int,
+ src: ref Image, sp: Point, op: int);
+ arrow: fn(a,b,c: int): int;
+ text: fn(dst: self ref Image, p: Point, src: ref Image,
+ sp: Point, font: ref Font, str: string): Point;
+ textop: fn(dst: self ref Image, p: Point, src: ref Image,
+ sp: Point, font: ref Font, str: string,
+ op: int): Point;
+ textbg: fn(dst: self ref Image, p: Point, src: ref Image,
+ sp: Point, font: ref Font, str: string,
+ bg: ref Image, bgp: Point): Point;
+ textbgop: fn(dst: self ref Image, p: Point, src: ref Image,
+ sp: Point, font: ref Font, str: string,
+ bg: ref Image, bgp: Point, op: int): Point;
+ border: fn(dst: self ref Image, r: Rect, i: int,
+ src: ref Image, sp: Point);
+ borderop: fn(dst: self ref Image, r: Rect, i: int,
+ src: ref Image, sp: Point, op: int);
+
+ readpixels: fn(src: self ref Image, r: Rect,
+ data: array of byte): int;
+ writepixels:fn(dst: self ref Image, r: Rect,
+ data: array of byte): int;
+ name: fn(im: self ref Image, s: string, in: int): int;
+ top: fn(win: self ref Image);
+ bottom: fn(win: self ref Image);
+ flush: fn(win: self ref Image, func: int);
+ origin: fn(win: self ref Image, log, scr: Point): int;
+};
+.EE
+.SH DESCRIPTION
+The
+.B Image
+type defines rectangular pictures and the methods to draw upon them;
+it is also the building block for higher level objects such as
+windows and fonts.
+In particular, a window is represented as an
+.BR Image ;
+no special operators are needed to draw on a window.
+Off-screen images can have an alpha channel, which gives each pixel an opacity
+factor, which in turn allows non-rectangular images to be defined
+(ie, pixels made fully transparent by the alpha channel
+do not appear when the image is displayed).
+Many drawing operations allow images to be shaped, or partial transparency added, by using the alpha
+channel of another image as a mask (also called a `matte').
+There are two functions in
+.B Image
+for each such operation.
+One has an
+.B op
+suffix, and takes an explicit image compositing operator:
+.BR S ,
+.BR D ,
+.BR SinD , ...,
+.BR SoverD
+and so on.
+(See the Porter-Duff paper mentioned below for the meaning of each operation.)
+The other function (without the
+.B op
+suffix) provides as its default operation the most common operation,
+.BR SoverD ,
+by which the source image, within its matte, is drawn over the destination image.
+.PP
+An
+.B Image
+has a pixel channel structure as described in
+.IR colour (6),
+represented by a value of the
+.B Chans
+adt,
+defined in
+.IR draw-display (2).
+The channel structure of an image is fixed when the image is allocated.
+.PP
+.B Image
+has the following components:
+.TP 10
+.B display
+Tells on which display the image resides.
+.TP
+.B screen
+If the image is a window on a
+.B Screen
+(see
+.IR draw-screen (2)),
+this field refers to that screen; otherwise it is nil.
+.TP
+.B r
+The coordinates of the rectangle in the plane for which the
+.B Image
+has defined pixel values.
+It should not be modified after the image is created.
+.TP
+.B clipr
+The clipping rectangle: operations that read or write
+the image will not access pixels outside
+.BR clipr .
+Frequently,
+.B clipr
+is the same as
+.BR Image.r ,
+but it may differ; see in particular the discussion of
+.BR Image.repl .
+The clipping region may be modified dynamically.
+.TP
+.B chans
+The pixel channel structure of the image; the value
+should not be modified after the image is created.
+.TP
+.B depth
+The number of bits per pixel in the picture:
+it is simply a convenience since it is necessarily equal to
+.BR chans.depth() ,
+and it should not be modified after the image is created.
+.TP
+.B repl
+A boolean value specifying whether the image is tiled to cover
+the plane when used as a source for a drawing operation.
+If
+.B Image.repl
+is zero, operations are restricted to the intersection of
+.B Image.r
+and
+.BR Image.clipr .
+If
+.B Image.repl
+is set,
+.B Image.r
+defines the tile to be replicated and
+.B Image.clipr
+defines the portion of the plane covered by the tiling, in other words,
+.B Image.r
+is replicated to cover
+.BR Image.clipr ;
+in such cases
+.B Image.r
+and
+.B Image.clipr
+are independent.
+.IP
+For example, a replicated image with
+.B Image.r
+set to ((0,\ 0),\ (1,\ 1)) and
+.B Image.clipr
+set to ((0,\ 0),\ (100,\ 100)),
+with the single pixel of
+.B Image.r
+set to blue,
+behaves identically to an image with
+.B Image.r
+and
+.B Image.clipr
+both set to ((0,\ 0),\ (100,\ 100)) and all pixels set to blue.
+However,
+the first image requires far less memory.
+The replication flag may be modified dynamically along with the clipping
+rectangle.
+.TP
+.IB dst .draw( r\fP,\fP\ src\fP,\fP\ mask\fP,\fP\ p\fP )
+.PD0
+.TP
+.IB dst .drawop( r\fP,\fP\ src\fP,\fP\ mask\fP,\fP\ p\fP,\fP\ op )
+.PD
+.B Draw
+is the standard drawing function.
+Only those pixels within the intersection of
+.IB dst .r
+and
+.IB dst .clipr
+will be affected;
+.B draw
+ignores
+.IB dst .repl\fR.
+The operation proceeds as follows
+(this is a description of the behavior, not the implementation):
+.RS
+.IP 1.
+If
+.B repl
+is set in
+.I src
+or
+.IR mask ,
+replicate their contents to fill
+their clip rectangles.
+.IP 2.
+Translate
+.I src
+and
+.I mask
+so
+.I p
+is aligned with
+.IB r .min\fR.
+.IP 3.
+Set
+.I r
+to the intersection of
+.I r
+and
+.IB dst .r\fR.
+.IP 4.
+Intersect
+.I r
+with
+.IB src .clipr\fR.
+If
+.IB src .repl
+is false, also intersect
+.I r
+with
+.IB src .r\fR.
+.IP 5.
+Intersect
+.I r
+with
+.IB mask .clipr\fR.
+If
+.IB mask .repl
+is false, also intersect
+.I r
+with
+.IB mask .r\fR.
+.IP 6.
+For each location in
+.IR r ,
+combine the
+.I dst
+pixel using the alpha value corresponding to the
+.I mask
+pixel.
+If the
+.I mask
+has an explicit alpha channel, the alpha value corresponding to the
+.I mask
+pixel is simply that pixel's alpha channel.
+Otherwise, the alpha value is the NTSC greyscale equivalent of the colour value,
+with white meaning opaque and black transparent.
+.RE
+.IP
+In terms of the Porter-Duff compositing algebra,
+.I draw
+replaces the
+.I dst
+pixels with
+.RI ( src
+in
+.IR mask )
+over
+.IR dst .
+.I Drawop
+is almost identical, but applies the compositing operation
+.I op
+instead:
+.RI ( src
+in
+.IR mask )
+.I op
+.IR dst .
+.IP
+The various
+pixel channel formats
+involved need not be identical.
+If the channels involved are smaller than 8-bits, they will
+be promoted before the calculation by replicating the extant bits;
+after the calculation, they will be truncated to their proper sizes.
+For
+.B draw
+and
+.B gendraw
+only,
+if
+.I mask
+is nil, no mask is used.
+.TP
+\f2dst\fP.\f5gendraw(\f2r\fP, \f2src\fP, \f2p0\fP, \f2mask\fP, \f2p1\fP)\fP
+.PD0
+.TP
+\f2dst\fP.\f5gendrawop(\f2r\fP, \f2src\fP, \f2p0\fP, \f2mask\fP, \f2p1\fP\f5, \f2op\fP)\fP
+.PD
+Similar to \f5draw()\fP except that it aligns the source and mask differently:
+.I src
+is aligned so
+.I p0
+corresponds to
+.IB r . min
+and
+.I mask
+is aligned so
+.I p1
+corresponds to
+.IB r . min .
+For most purposes with simple masks and source images,
+.B draw
+is sufficient, but
+.B gendraw
+is the general operator and the one the other drawing primitives are built upon.
+.TP
+\f2dst\fP.\f5line(\f2p0\fP, \f2p1\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5lineop(\f2p0\fP, \f2p1\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Line
+draws in
+.I dst
+a line of width
+.RI 1+2* thick
+pixels joining points
+.I p0
+and
+.IR p1 .
+The line is drawn using pixels from the
+.I src
+image aligned so
+.I sp
+in the source corresponds to
+.I p0
+in the destination.
+The line touches both
+.I p0
+and
+.IR p1 ,
+and
+.I end0
+and
+.I end1
+specify how the ends of the line are drawn.
+.B Draw->Endsquare
+terminates the line perpendicularly to the direction of the line; a thick line with
+.B Endsquare
+on both ends will be a rectangle.
+.B Draw->Enddisc
+terminates the line by drawing a disc of diameter
+.RI 1+2* thick
+centered on the end point.
+.B Draw->Endarrow
+terminates the line with an arrowhead whose tip touches the endpoint.
+See the description of
+.B arrow
+for more information.
+.IP
+.B Line
+and the other geometrical operators are equivalent to calls to
+.B gendraw
+using a mask produced by the geometric procedure.
+.TP
+\f2dst\fP.\f5poly(\f2p\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5polyop(\f2p\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Poly
+draws a general polygon; it
+is equivalent to a series of calls to
+.B line
+joining adjacent points in the array of
+.B Points
+.IR p .
+The ends of the polygon are specified as in
+.BR line ;
+interior lines are terminated with
+.B Enddisc
+to make smooth joins.
+The source is aligned so
+.I sp
+corresponds to
+.IB p [0]\f1.
+.TP
+\f2dst\fP.\f5bezspline(\f2p\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5bezsplineop(\f2p\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Bezspline
+takes the same arguments as
+.B poly
+but draws a quadratic B-spline (despite its name) rather than a polygon.
+If the first and last points in
+.I p
+are equal, the spline has periodic end conditions.
+.TP
+\f2dst\fP.\f5fillpoly(\f2p\fP, \f2wind\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5fillpolyop(\f2p\fP, \f2wind\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Fillpoly
+is like
+.B poly
+but fills in the resulting polygon rather than outlining it.
+The source is aligned so
+.I sp
+corresponds to
+.IB p [0]\f1.
+The winding rule parameter
+.I wind
+resolves ambiguities about what to fill if the polygon is self-intersecting.
+If
+.I wind
+is
+.BR ~0 ,
+a pixel is inside the polygon if the polygon's winding number about the point
+is non-zero.
+If
+.I wind
+is 1,
+a pixel is inside if the winding number is odd.
+Complementary values (0 or ~1) cause outside pixels to be filled.
+The meaning of other values is undefined.
+The polygon is closed with a line if necessary.
+.TP
+\f2dst\fP.\f5fillbezspline(\f2p\fP, \f2wind\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5fillbezsplineop(\f2p\fP, \f2wind\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Fillbezspline
+is like
+.B fillpoly
+but fills the quadratic B-spline rather than the polygon outlined by
+.IR p .
+The spline is closed with a line if necessary.
+.TP
+\f2dst\fP.\f5ellipse(\f2c\fP, \f2a\fP, \f2b\fP, \f2thick\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5ellipseop(\f2c\fP, \f2a\fP, \f2b\fP, \f2thick\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Ellipse
+draws in
+.I dst
+an ellipse centered on
+.I c
+with horizontal and vertical semiaxes
+.I a
+and
+.IR b .
+The source is aligned so
+.I sp
+in
+.I src
+corresponds to
+.I c
+in
+.IR dst .
+The ellipse is drawn with thickness
+.RI 1+2* thick .
+.TP
+\f2dst\fP.\f5fillellipse(\f2c\fP, \f2a\fP, \f2b\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5fillellipseop(\f2c\fP, \f2a\fP, \f2b\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Fillellipse
+is like
+.B ellipse
+but fills the ellipse rather than outlining it.
+.TP
+.IB dst .arc(\fIc\fP,\ \fIa\fP,\ \fIb\fP,\ \fIthick\fP,\ \fIsrc\fP,\ \fIsp\fP,\ \fIalpha\fP,\ \fIphi\fP)
+.PD0
+.TP
+.IB dst .arcop(\fIc\fP,\ \fIa\fP,\ \fIb\fP,\ \fIthick\fP,\ \fIsrc\fP,\ \fIsp\fP,\ \fIalpha\fP,\ \fIphi\fP,\ \fIop\fP)
+.PD
+.I Arc
+is like
+.IR ellipse ,
+but draws only that portion of the ellipse starting at angle
+.I alpha
+and extending through an angle of
+.IR phi .
+The angles are measured in degrees counterclockwise from the positive
+.I x
+axis.
+.TP
+.IB dst .fillarc(\fIc\fP,\ \fIa\fP,\ \fIb\fP,\ \fIsrc\fP,\ \fIsp\fP,\ \fIalpha\fP,\ \fIphi\fP)
+.PD0
+.TP
+.IB dst .fillarcop(\fIc\fP,\ \fIa\fP,\ \fIb\fP,\ \fIsrc\fP,\ \fIsp\fP,\ \fIalpha\fP,\ \fIphi\fP,\ \fIop\fP)
+.PD
+.I Fillarc
+is like
+.IR arc ,
+but fills the sector with the source color.
+.TP
+\f2dst\fP.\f5bezier(\f2a\fP, \f2b\fP, \f2c\fP, \f2d\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5bezierop(\f2a\fP, \f2b\fP, \f2c\fP, \f2d\fP, \f2end0\fP, \f2end1\fP, \f2thick\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Bezier
+draws the
+cubic Bezier curve defined by
+.B Points
+.IR a ,
+.IR b ,
+.IR c ,
+and
+.IR d .
+The end styles are determined by
+.I end0
+and
+.IR end1 ;
+the thickness of the curve is
+.RI 1+2* thick .
+The source is aligned so
+.I sp
+in
+.I src
+corresponds to
+.I a
+in
+.IR dst .
+.TP
+\f2dst\fP.\f5fillbezier(\f2a\fP, \f2b\fP, \f2c\fP, \f2d\fP, \f2wind\fP, \f2src\fP, \f2sp\fP)
+.PD0
+.TP
+\f2dst\fP.\f5fillbezierop(\f2a\fP, \f2b\fP, \f2c\fP, \f2d\fP, \f2wind\fP, \f2src\fP, \f2sp\fP, \f2op\fP)
+.PD
+.B Fillbezier
+is to
+.B bezier
+as
+.B fillpoly
+is to
+.BR poly .
+.TP
+.BI arrow( "a,\ b,\ c" )
+.B Arrow
+is a function to describe general arrowheads; its result is passed as
+.I end
+parameters to
+.BR line ,
+.BR poly ,
+etc.
+If all three parameters are zero, it produces the default arrowhead,
+otherwise,
+.I a
+sets the distance along line from end of the regular line to tip,
+.I b
+sets the distance along line from the barb to the tip,
+and
+.I c
+sets the distance perpendicular to the line from edge of line to the tip of the barb,
+all in pixels.
+.TP
+.IB dst .border( r\fP,\fP\ i\fP,\fP\ src\fP,\fP\ sp\fP)
+.PD0
+.TP
+.IB dst .borderop( r\fP,\fP\ i\fP,\fP\ src\fP,\fP\ sp\fP,\ \f2op\fP)
+.PD
+.I Border
+draws in
+.I dst
+an outline of rectangle
+.I r
+in the given
+.I src
+colour.
+The outline has width
+.IR i ;
+if positive, the border goes inside the rectangle; negative, outside.
+The source is aligned so
+.I sp
+corresponds to
+.IB r .min .
+.TP
+.IB dst .text( p\fP,\fP\ src\fP,\fP\ sp\fP,\fP\ font\fP,\fP\ str\fP)
+.PD0
+.TP
+.IB dst .textop( p\fP,\fP\ src\fP,\fP\ sp\fP,\fP\ font\fP,\fP\ str\fP,\ \f2op\fP)
+.TP
+.IB dst .textbg( p\fP,\fP\ src\fP,\fP\ sp\fP,\fP\ font\fP,\fP\ str\fP,\ \f2bg\fP,\ \f2bgp\fP)
+.PD0
+.TP
+.IB dst .textbgop( p\fP,\fP\ src\fP,\fP\ sp\fP,\fP\ font\fP,\fP\ str\fP,\ \f2bg\fP,\ \f2bgp\fP,\ \f2op\fP)
+.PD
+.B Text
+draws in
+.I dst
+characters specified by the string
+.I str
+and font
+.IR font ;
+it is equivalent to a series of calls to
+.B gendraw
+using source
+.I src
+and masks determined by the character shapes.
+The text is positioned with the left of the first character at
+.IB p .x
+and the top of the line of text at
+.IB p .y\f1.
+The source is positioned so
+.I sp
+in
+.I src
+corresponds to
+.I p
+in
+.IR dst .
+.B Text
+returns a
+.B Point
+that is the position of the next character that would be drawn if the string were longer.
+.IP
+For characters with undefined
+or zero-width images in the font, the character at font position 0 (NUL) is drawn.
+.IP
+.B Text
+draws the text leaving the background intact.
+.B Textbg
+draws the background colour
+.I bg
+behind the characters, with the alignment specified by point
+.IR bgp ;
+it is otherwise the same as
+.BR text .
+.TP
+.IB src .readpixels( r\fP,\fP\ data )
+.B Readpixels
+fills the
+.I data
+array with pixels from the specified rectangle of the
+.I src
+image.
+The pixels are presented one horizontal line at a time,
+starting with the top-left pixel of
+.IR r .
+Each scan line starts with a new byte in the array,
+leaving the last byte of the previous line partially empty, if necessary.
+Pixels are packed as tightly as possible within
+.IR data ,
+regardless of the rectangle being extracted.
+Bytes are filled from most to least significant bit order,
+as the
+.I x
+coordinate increases, aligned so
+.IR x =0
+would appear as the leftmost pixel of its byte.
+Thus, for a 1-bit deep greyscale image,
+the pixel at
+.I x
+offset 165 within the rectangle will be in a
+.I data
+byte with mask value
+.B 16r04
+regardless of the overall
+rectangle: 165 mod 8 equals 5, and
+.B "16r80\ >>\ 5" equals
+.BR 16r04 .
+It is an error to call
+.B readpixels
+with an array that is too small to hold the rectangle's pixels.
+The return value is the number of bytes copied.
+The arrangement of pixels in arrays of bytes is described in
+.IR image (6).
+.TP
+.IB dst .writepixels( r\fP,\fP\ data )
+.B Writepixels
+copies pixel values from the
+.I data
+array to the specified rectangle in the
+.I dst
+image.
+The format of the data is that produced by
+.BR readpixels .
+The return value is the number of bytes copied.
+It is an error to call
+.B writepixels
+with an array that is too small to fill the rectangle.
+.TP
+.IB im .name( s , in )
+Publish the image
+.I im
+on its display under name
+.IR s ,
+if
+.I in is non-zero;
+otherwise,
+.I s
+must be an already published name and it is withdrawn from publication.
+A published image can be retrieved using
+.B Display.namedimage
+(see
+.IR draw-display (2)).
+This function returns -1 on error, typically because the name is already in use
+(for
+.I in
+non-zero), or does not exist
+(for
+.I in
+zero).
+.TP
+.IB win .top()
+If the image
+.I win
+is a window,
+.B top
+pulls it to the ``top'' of the stack of windows on its
+.BR Screen ,
+perhaps obscuring other images.
+If
+.I win
+is not a window,
+.B top
+has no effect.
+.TP
+.IB win .bottom()
+If the image
+.I win
+is a window,
+.B bottom
+pulls it to the ``bottom'' of the stack of windows on its
+.BR Screen ,
+perhaps obscuring it.
+If
+.I win
+is not a window,
+.B bottom
+has no effect.
+.TP
+.IB image .flush( flag )
+The connection to a display has a buffer used to gather graphics requests
+generated by calls to the draw library.
+By default, the library flushes the buffer at the conclusion of any
+call that affects the visible display
+image itself.
+The
+.B flush
+routine allows finer control of buffer management.
+The
+.I flag
+has three possible values:
+.B Flushoff
+turns off all automatic flushing caused by writes to
+.IR image ,
+typically a window or the display image itself
+(buffers may still be written when they fill or when other objects on the display
+are modified);
+.B Flushnow
+causes the buffer to be flushed immediately;
+and
+.B Flushon
+restores the default behaviour.
+.TP
+\f2win\fP.\f5origin(\f2log\fP, \f2scr\fP)
+When a window is created (see
+.IR draw-screen (2)),
+the coordinate system within the window is identical to that of the screen:
+the upper left corner of the window rectangle is its physical location on the display,
+not for example (0, 0).
+This symmetry may be broken, however:
+.B origin
+allows control of the location of the window on the display and the coordinate
+system used by programs drawing on the window.
+The first argument,
+.IR log ,
+sets the upper left corner of the logical (in-window) coordinate system without
+changing the position of the window on the screen.
+The second argument,
+.IR scr ,
+sets the upper left corner of physical (on-screen) coordinate system, that is, the
+window's location on the display, without changing the internal coordinate system.
+Therefore, changing
+.I scr
+without changing
+.I log
+moves the window without requiring the client using it to be notified of the change;
+changing
+.I log
+without changing
+.I scr
+allows the client to set up a private coordinate system regardless of the window's
+location.
+It is permissible for values of
+.I scr
+to move some or all of the window off screen.
+.B Origin
+returns \-1 if the image is not a window or, in the case of changes to
+.IR scr ,
+if there are insufficient resources available to move the window;
+otherwise it returns 1.
+.SH SOURCE
+.B /libdraw
+.SH SEE ALSO
+.IR draw-intro (2),
+.IR draw-display (2),
+.IR draw-point (2),
+.IR draw-rect (2),
+.IR draw-screen (2),
+.IR colour (6),
+.IR image (6),
+.IR font (6)
+.IR utf (6)
+.PP
+T. Porter, T. Duff.
+``Compositing Digital Images'',
+.I "Computer Graphics
+(Proc. SIGGRAPH), 18:3, pp. 253-259, 1984.
+.SH DIAGNOSTICS
+These functions raise exceptions if argument images are nil,
+except for
+.B draw
+and
+.B gendraw
+where the mask image is optional and may be nil.
+.SH BUGS
+Anti-aliased characters can be drawn by defining a font
+with multiple bits per pixel, but there are
+no anti-aliasing geometric primitives.