DRAW(3) DRAW(3) NAME draw - graphics device SYNOPSIS bind -b #d /dev /dev/draw/new /dev/draw/n/ctl /dev/draw/n/data /dev/draw/n/refresh DESCRIPTION The draw device serves a three-level file system providing an interface to the graphics facilities of the system; the Limbo Draw module (see draw-intro(2)) accesses the device to implement its functions. Each client of the device connects by opening /dev/draw/new and reading back 7 decimal numbers, each 11 characters wide followed by a blank: the connection number (n), the image id (q.v.) of the display image (always zero), the ldepth of the display image, and the min.x, min.y, max.x, and max.y of the rectangle defining the display image. The client can then open the directory /dev/draw/n/ to access the ctl, data, and refresh files associated with the connection. The ctl file accepts no messages; its only purpose is to return the initialization information. The data file accepts messages corresponding to procedures in the Draw module: allocate a window or image, draw on the image, paint text, etc. Some such messages generate data to be returned to the client, which can recover it by reading the data file. The refresh file is read-only. As windows owned by the client are uncovered, if they cannot be refreshed by the server (such as when they have refresh functions associated with them), a message is made available on the refresh file reporting what needs to be repainted by the client. The message has five decimal integers formatted as in the ctl message: the image id of the window and the coordinates of the rectangle that should be refreshed. The draw device provides three types of graphical resource: Images, Screens and Fonts. Resource instances have an iden- tification number. Screen identifiers are global to the device. All other identifiers are local to each client. Page 1 Plan 9 (printed 12/21/24) DRAW(3) DRAW(3) Image is the fundamental resource type on which all drawing primitives are performed. At client connection the physical display is represented by Image 0. A Screen manages a set of (overlapping) Images, handling Z- order and position manipulation and the refreshing of regions uncovered by such operations. When a Screen is cre- ated it is associated with an Image on which to render itself. New images can be associated with a screen when they are created; they are then treated as windows on that screen. Screens can be marked as public, meaning that other clients can import their ID and create new windows on them. A Font is an image with associated character data. The Font image provides the bitmap of all the characters in the Font; the character data is used by the string command to render characters from the image. Command Messages Messages written to the data file take the form of a single command code followed by command specific binary parameters. The command is given by the byte code of a US-ASCII charac- ter. Multibyte integer parameters are presented low-order byte first. Points are two four-byte numbers: x and y. Rectangles are four four-byte numbers: min.x, min.y, max.x, and max.y. Any errors in the format of a message or its parameter values result in the write (see sys-read(2)) request failing with an appropriate diagnostic message. In the following list, the byte width of each parameter is given in square brackets. a id[4] screenid[4] refresh[1] ldepth[2] repl[1] R[4*4] clipR[4*4] value[1] Allocate an image with the given numeric id. The device checks that id is unique within the id-space of the client. If screenid is 0 the image is created as a simple off-screen bitmap, otherwise it is created as a window on the specified screen. The refresh parameter specifies the refresh method to use when on-screen images (windows) need updating. It is ignored for off-screen images. The refresh methods are: Backup (0) Modifications to covered areas of the image are written to backing store. When an area is uncovered, the cor- responding area of the screen image is refreshed from the backing store. No notification is given via the refresh file. Page 2 Plan 9 (printed 12/21/24) DRAW(3) DRAW(3) Local (1) No backing store is associated with the image. Opera- tions only affect uncovered areas of the image on the screen. No refresh notification is given via the refresh file. This method is useful for images that are constantly updated. Remote (2) No backing store is associated with the image. Opera- tions only affect uncovered areas of the image on the screen. When an area is uncovered, a refresh message is buffered on the refresh file of the client that cre- ated the image. Ldepth is the log base 2 of the number of bits per pix- els. This must match that of the associated screen. If repl is non-zero the image behaves as if it tiles the entire integer plane bounded by clipR. The rectan- gle R gives the extent of the image. For windows, R also gives the position of the image on the screen. New windows are always created on top of the others on the screen. The clipping rectangle of the image is given by clipR. The pixels in the new image are assigned the value palette index. A id[4] imageid[4] fillid[4] public[1] Create a new screen on the existing image given by imageid. The image must not already be assigned to a screen. The screen id must be unique on the device. Fillid specifies the image used to paint the screen background. This image should be tiled (repl != 0), or be larger than the sreen image. If public is non-zero then the screen is made available for use by other clients. c dstid[4] repl[1] clipR[4*4] Set the repl flag and clipping rectangle clipR of the existing image dstid. x P[2*4] Move the cursor to point P. C id[4] hotspot[2*4] Set the cursor image to that given by id. The hotspot point is the offset added to the mouse position when drawing the cursor image. The image given by id must have ldepth 0. d dstid[4] srcid[4] maskid[4] R[4*4] P0[2*4] P1[2*4] The general drawing, or bitmap block transfer (bitblt) command. The rectangle R specifies the region in the dstid image to be modified. Pixel values are copied Page 3 Plan 9 (printed 12/21/24) DRAW(3) DRAW(3) from the rectangle of the same size located at point P0 in the srcid image. Only those pixels in R of dstid are copied for which the congruent pixel in the same sized rectangle positioned at point P1 in the maskid image have a non-zero value. The repl flag is honoured when determining pixel values in the source and mask images. The clipping rectangles and actual dimensions of all the images are observed when determining which pixels are to be copied. e dstid[4] srcid[4] center[2*4] a[4] b[4] thick[4] sp[2*4] alpha[4] phi[4] Draw an ellipse or arc. The ellipse is drawn on the dstid image using pixel values from the srcid image. The point sp in the srcid image maps to the point center in the dstid image. The ellipse is centered on the point center in dstid. The parameters a and b specify the horizontal and ver- tical semiaxes. The outline of the ellipse is 1+2thick pixels wide. An outline thicker than 1 pixel extends equally inside and outside of the ellipse. An arc of the ellipse is drawn if the most significant bit (1<<31) of alpha is set. Alpha specifies the start angle and phi gives the path angle of the arc. Angles are given in degrees measured counterclockwise from the positive x axis. E dstid[4] srcid[4] center[2*4] a[4] b[4] thick[4] sp[2*4] alpha[4] phi[4] Draw a filled ellipse. Parameters are as for e, the unfilled ellipse command. If an arc is specified then the filled wedge defined by the arc is drawn. f id[4] Free the image specified by id. If id represents a screen fill or image, then the resource will not be released until the screen is freed. F id[4] Free the screen specified by id. A public screen is only released when no other clients have a reference to it. When a screen is freed, its image and fill resources are also freed, invalidating their IDs. i fontid[4] nchars[4] ascent[1] Allocate a new font using the existing image fontid. Nchars worth of character data is reserved for the font. Ascent defines the distance from the top of the font image to the baseline. Page 4 Plan 9 (printed 12/21/24) DRAW(3) DRAW(3) l fontid[4] srcid[4] index[2] R[4*4] P[2*4] left[1] width[1] Initialise a font character. Load the image and ren- dering data for the character code index in font fontid. The character bitmap is copied to the rectangle R in the font image, from the same sized rectangle positioned at point P in the srcid image. When the character is rendered, using the s command, it is drawn offset horizontally by left pixels to allow for internal whitespace on the left of the character image. Width specifies the width of the rendered char- acter, not of its internal bitmap. L dstid[4] p0[2*4] p1[2*4] end0[4] end1[4] radius[4] srcid[4] sp[2*4] Draw a line from p0 to p1 in dstid using pixels from srcid. The point sp in srcid corresponds to the point p0 in dstid. The thickness of the line is given by 1+2radius. The parameters end0 and end1 specify how the respective ends of the line are drawn. The end type is given by the low-order 5 bits of the parameter. The following values can be used: Endsquare (0) The line is terminated perpendicularly to its direc- tion. Enddisc (1) The line is terminated by a semi-circle of diameter 1+2radius, centered on the end-point. Endarrow (2) The remaining 27 high-order bits of the parameter spec- ify how the arrow is drawn by partitioning the bits into three 9-bit values: a, b and c. The 9 lower-order bits give a, the 9 high-order bits give c. The parame- ter a defines the distance from the tip to the point on the line where the barb starts. The parameter b gives the distance along the line from the tip to the tail of the barb. If a = b a triangular arrow-head is formed. If a < b a delta shaped arrow-head is formed. The parameter c specifies the distance perpendicular from the edge of the line to the barb. o id[4] r.min[2*4] screenr.min[2*4] Set the screen and logical origin of window id. If id is not an on-screen image (window) the command does nothing. The logical origin of the window, affecting all drawing primitives on that window's image, is given by the point r.min. The position of the window on its screen is given by the point screenr.min. Page 5 Plan 9 (printed 12/21/24) DRAW(3) DRAW(3) p dstid[4] n[2] end0[4] end1[4] radius[4] srcid[4] sp[2*4] p0[2*4] dp[2*2*n] Draw the polygon made up of n lines. The starting point of the first line is given by p0. The (x, y) del- tas of the remaining vertices are given by dp. The ends of the polygon, end0 and end1, and the line radius are treated as per the line (`L') command. Interior lines are terminated with Enddisc, to give a smooth join. The lines are drawn using pixel values from the srcid image, where sp in srcid aligns with p0 in the destina- tion image. P dstid[4] n[2] wind[4] ignore[2*4] srcid[4] sp[2*4] p0[2*4] dp[2*2*n] Draw a filled polygon. The parameters dstid, n, srcid, sp, p0, and dp are treated in the same way as the poly- gon line command (`p'). The ignore parameter is ignored! The wind parameter specifies the winding rule to use for determining which pixels are `inside' the polygon. A value of ~0 specifies that pixels are inside if the polygon's winding number about the point is non-zero. For the value 1, a pixel is inside if the winding number is odd. The complements of these values (0 and ~1) result in outside pixels being painted. r id[4] R[4*4] Read the pixel values from the rectangle R of image id. The binary values are returned by reading the data file of the client. The data is formatted one horizontal line at a time, starting with the top-left pixel of R. The bit-width of the pixel values depends on the ldepth of the image. Pixel values are packed into bytes most significant bit first. Each line encodes to a whole number of bytes in the output, even if the last byte is not completely filled. s dstid[4] srcid[4] fontid[4] P[2*4] clipR[4*4] sp[2*4] ni[2] index[2*ni] Draw text using font fontid. The text line is drawn with its top left corner starting at point P in dstid. The text string, of length ni, is given by index, the sequence of font character indices. The clipping rect- angle of dstid is temporarily set to clipR. Characters are rendered using the associated character image as a mask. Only those pixels in the srcid image are copied for which the corresponding pixel in the character rectangle of the font image is non-zero. The point sp of the source image is aligned with point P of dstid. Page 6 Plan 9 (printed 12/21/24) DRAW(3) DRAW(3) S id[4] ldepth[4] Import public screen id. Before a public screen can be used by a client that did not create it, its ID must be imported. The device checks that id is a valid public screen and that its ldepth matches that specified. t top[1] nw[2] id[4*n] Raise (or lower) nw windows to the top (or bottom) of their screen. All the window IDs given in the id list must belong to the same screen. If top is non-zero, the windows are brought in front of any others, the first window of the list being foremost. Otherwise, they are pushed to the back, the first window of the list being placed right at the back. v Update changes to the display. Drawing on the display image (id 0) immediately affects the contents of the internal image but the changes are not automatically flushed to the physical display hardware. This command updates the display hardware with the modified region of the display image. w id[4] R[4*4] data[1*x] Write pixel values to the rectangle R in the image given by id. The pixel data in the data parameter is in the same format as returned by the read pixels (`r') command and must be of at least the length required for the given R and image ldepth. W id[4] R[4*4] data[1*x] Write pixel values from compressed data. The parame- ters are the same as for the 'w' command, except that the data is in a compressed format. The data is in the Inferno compressed image format (see image(6)), stripped of all headers; just the variable-length code words are given. SOURCE /emu/devdraw.c /os/port/devdraw.c /memimage/*.c /memlayer/*.c SEE ALSO draw-intro(2), image(6) Page 7 Plan 9 (printed 12/21/24)