plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

memdraw.3 (10090B)


      1 .TH MEMDRAW 3
      2 .SH NAME
      3 Memimage,
      4 Memdata,
      5 Memdrawparam,
      6 memimageinit,
      7 wordaddr,
      8 byteaddr,
      9 memimagemove,
     10 allocmemimage,
     11 allocmemimaged,
     12 readmemimage,
     13 creadmemimage,
     14 writememimage,
     15 freememimage,
     16 memsetchan,
     17 loadmemimage,
     18 cloadmemimage,
     19 unloadmemimage,
     20 memfillcolor,
     21 memarc,
     22 mempoly,
     23 memellipse,
     24 memfillpoly,
     25 memimageline,
     26 memimagedraw,
     27 drawclip,
     28 memlinebbox,
     29 memlineendsize,
     30 allocmemsubfont,
     31 openmemsubfont,
     32 freememsubfont,
     33 memsubfontwidth,
     34 getmemdefont,
     35 memimagestring,
     36 iprint,
     37 hwdraw \- drawing routines for memory-resident images
     38 .SH SYNOPSIS
     39 .nf
     40 .B #include <u.h>
     41 .nf
     42 .B #include <u.h>
     43 .B #include <libc.h>
     44 .B #include <draw.h>
     45 .B #include <memdraw.h>
     46 .PP
     47 .ft L
     48 typedef struct Memdata
     49 {
     50 	ulong	*base;	/* allocated data pointer */
     51 	uchar	*bdata;	/* first byte of actual data; word-aligned */
     52 	int		ref;		/* number of Memimages using this data */
     53 	void*	imref;	/* last image that pointed at this */
     54 	int		allocd;	/* is this malloc'd? */
     55 } Memdata;
     56 
     57 enum {
     58 	Frepl	= 1<<0,	/* is replicated */
     59 	Fsimple	= 1<<1,	/* is 1x1 */
     60 	Fgrey	= 1<<2,	/* is grey */
     61 	Falpha	= 1<<3,	/* has explicit alpha */
     62 	Fcmap	= 1<<4,	/* has cmap channel */
     63 	Fbytes	= 1<<5,	/* has only 8-bit channels */
     64 };
     65 
     66 typedef struct Memimage
     67 {
     68 	Rectangle	r;		/* rectangle in data area, local coords */
     69 	Rectangle	clipr;	/* clipping region */
     70 	int		depth;	/* number of bits of storage per pixel */
     71 	int		nchan;	/* number of channels */
     72 	ulong	chan;	/* channel descriptions */
     73 
     74 	Memdata	*data;	/* pointer to data */
     75 	int		zero;	/* data->bdata+zero==&byte containing (0,0) */
     76 	ulong	width;	/* width in words of a single scan line */
     77 	Memlayer	*layer;	/* nil if not a layer*/
     78 	ulong	flags;
     79 	\fI...\fP
     80 } Memimage;
     81 
     82 typedef struct Memdrawparam
     83 {
     84 	Memimage	*dst;
     85 	Rectangle	r;
     86 	Memimage	*src;
     87 	Rectangle	sr;
     88 	Memimage	*mask;
     89 	Rectangle	mr;
     90 	\fI...\fP
     91 } Memdrawparam;
     92 
     93 .ta \w'\fLMemsubfont* 'u
     94 int	drawdebug;
     95 .ft
     96 .PP
     97 .ft L
     98 .nf
     99 void	memimageinit(void)
    100 ulong*	wordaddr(Memimage *i, Point p)
    101 uchar*	byteaddr(Memimage *i, Point p)
    102 void	memimagemove(void *from, void *to)
    103 .PP
    104 .ft L
    105 .nf
    106 Memimage*	allocmemimage(Rectangle r, ulong chan)
    107 Memimage*	allocmemimaged(Rectangle r, ulong chan, Memdata *data)
    108 Memimage*	readmemimage(int fd)
    109 Memimage*	creadmemimage(int fd)
    110 int	writememimage(int fd, Memimage *i)
    111 void	freememimage(Memimage *i)
    112 int	memsetchan(Memimage*, ulong)
    113 .PP
    114 .ft L
    115 .nf
    116 int	loadmemimage(Memimage *i, Rectangle r,
    117 	   uchar *buf, int nbuf)
    118 int	cloadmemimage(Memimage *i, Rectangle r,
    119 	   uchar *buf, int nbuf)
    120 int	unloadmemimage(Memimage *i, Rectangle r,
    121 	   uchar *buf, int nbuf)
    122 void	memfillcolor(Memimage *i, ulong color)
    123 .PP
    124 .ft L
    125 .nf
    126 void	memarc(Memimage *dst, Point c, int a, int b, int thick,
    127 	   Memimage *src, Point sp, int alpha, int phi, Drawop op)
    128 void	mempoly(Memimage *dst, Point *p, int np, int end0,
    129 	   int end1, int radius, Memimage *src, Point sp, Drawop op)
    130 void	memellipse(Memimage *dst, Point c, int a, int b,
    131 	   int thick, Memimage *src, Point sp, Drawop op)
    132 void	memfillpoly(Memimage *dst, Point *p, int np, int wind,
    133 		   Memimage *src, Point sp, Drawop op)
    134 void	memimageline(Memimage *dst, Point p0, Point p1, int end0,
    135 	   int end1, int radius, Memimage *src, Point sp, Drawop op)
    136 void	memimagedraw(Memimage *dst, Rectangle r, Memimage *src,
    137 	   Point sp, Memimage *mask, Point mp, Drawop op)
    138 .PP
    139 .ft L
    140 .nf
    141 int	drawclip(Memimage *dst, Rectangle *dr, Memimage *src,
    142 	   Point *sp, Memimage *mask, Point *mp,
    143 	   Rectangle *sr, Rectangle *mr)
    144 Rectangle	memlinebbox(Point p0, Point p1, int end0, int end1,
    145 	   int radius)
    146 int	memlineendsize(int end)
    147 .PP
    148 .ft L
    149 .nf
    150 Memsubfont*	allocmemsubfont(char *name, int n, int height,
    151 	   int ascent, Fontchar *info, Memimage *i)
    152 Memsubfont*	openmemsubfont(char *name)
    153 void	freememsubfont(Memsubfont *f)
    154 Point	memsubfontwidth(Memsubfont *f, char *s)
    155 Point	memimagestring(Memimage *dst, Point p, Memimage *color,
    156 	    Point cp, Memsubfont *f, char *cs, Drawop op)
    157 .PP
    158 .ft L
    159 .nf
    160 int	iprint(char *fmt, ...)
    161 int	hwdraw(Memdrawparam *param)
    162 .ft R
    163 .SH DESCRIPTION
    164 The
    165 .B Memimage
    166 type defines memory-resident rectangular pictures and the methods to draw upon them;
    167 .BR Memimage s
    168 differ from
    169 .BR Image s
    170 (see
    171 .MR draw (3) )
    172 in that they are manipulated directly in user memory rather than by
    173 RPCs to the
    174 .B /dev/draw
    175 hierarchy.
    176 The
    177 .Bmemdraw
    178 library is the basis for the kernel
    179 .MR draw (3)
    180 driver and also used by a number of programs that must manipulate
    181 images without a display.
    182 .PP
    183 The
    184 .BR r,
    185 .BR clipr ,
    186 .BR depth ,
    187 .BR nchan ,
    188 and
    189 .BR chan
    190 structure elements are identical to
    191 the ones of the same name
    192 in the
    193 .B Image
    194 structure.
    195 .PP
    196 The
    197 .B flags
    198 element of the
    199 .B Memimage
    200 structure holds a number of bits of information about the image.
    201 In particular, it subsumes the
    202 purpose of the
    203 .B repl
    204 element of
    205 .B Image
    206 structures.
    207 .PP
    208 .I Memimageinit
    209 initializes various static data that the library depends on,
    210 as well as the replicated solid color images
    211 .BR memopaque ,
    212 .BR memtransparent ,
    213 .BR memblack ,
    214 and
    215 .BR memwhite .
    216 It should be called before referring to any of these images
    217 and before calling any of the other library functions.
    218 .PP
    219 Each
    220 .B Memimage
    221 points at a
    222 .B Memdata
    223 structure that in turn points at the actual pixel data for the image.
    224 This allows multiple images to be associated with the same
    225 .BR Memdata .
    226 The first word of the data pointed at by
    227 the
    228 .B base
    229 element of
    230 .B Memdata
    231 points back at the
    232 .B Memdata
    233 structure, so that in the Plan 9 kernel, the
    234 memory allocator (see
    235 Plan 9's
    236 .IR pool (3))
    237 can compact image memory
    238 using
    239 .IR memimagemove .
    240 .PP
    241 Because images can have different coordinate systems,
    242 the
    243 .B zero
    244 element of the
    245 .B Memimage
    246 structure contains the offset that must be added
    247 to the
    248 .B bdata
    249 element of the corresponding
    250 .B Memdata
    251 structure in order to yield a pointer to the data for the pixel (0,0).
    252 Adding
    253 .BR width
    254 machine words
    255 to this pointer moves it down one scan line.
    256 The
    257 .B depth
    258 element can be used to determine how to move the
    259 pointer horizontally.
    260 Note that this method works even for images whose rectangles
    261 do not include the origin, although one should only dereference
    262 pointers corresponding to pixels within the image rectangle.
    263 .I Wordaddr
    264 and
    265 .IR byteaddr
    266 perform these calculations,
    267 returning pointers to the word and byte, respectively,
    268 that contain the beginning of the data for a given pixel.
    269 .PP
    270 .I Allocmemimage
    271 allocates
    272 images with a given rectangle and channel descriptor
    273 (see
    274 .B strtochan
    275 in
    276 .MR graphics (3) ),
    277 creating a fresh
    278 .B Memdata
    279 structure and associated storage.
    280 .I Allocmemimaged
    281 is similar but uses the supplied
    282 .I Memdata
    283 structure rather than a new one.
    284 The
    285 .I readmemimage
    286 function reads an uncompressed bitmap
    287 from the given file descriptor,
    288 while
    289 .I creadmemimage
    290 reads a compressed bitmap.
    291 .I Writememimage
    292 writes a compressed representation of
    293 .I i
    294 to file descriptor
    295 .IR fd .
    296 For more on bitmap formats, see
    297 .MR image (7) .
    298 .I Freememimage
    299 frees images returned by any of these routines.
    300 The
    301 .B Memimage
    302 structure contains some tables that are used
    303 to store precomputed values depending on the channel descriptor.
    304 .I Memsetchan
    305 updates the
    306 .B chan
    307 element of the structure as well as these tables,
    308 returning \-1 if passed a bad channel descriptor.
    309 .PP
    310 .I Loadmemimage
    311 and
    312 .I cloadmemimage
    313 replace the pixel data for a given rectangle of an image
    314 with the given buffer of uncompressed or compressed
    315 data, respectively.
    316 When calling
    317 .IR cloadmemimage ,
    318 the buffer must contain an
    319 integral number of
    320 compressed chunks of data that exactly cover the rectangle.
    321 .I Unloadmemimage
    322 retrieves the uncompressed pixel data for a given rectangle of an image.
    323 All three return the number of bytes consumed on success,
    324 and \-1 in case of an error.
    325 .PP
    326 .I Memfillcolor
    327 fills an image with the given color, a 32-bit number as
    328 described in
    329 .MR color (3) .
    330 .PP
    331 .IR Memarc ,
    332 .IR mempoly ,
    333 .IR memellipse ,
    334 .IR memfillpoly ,
    335 .IR memimageline ,
    336 and
    337 .I memimagedraw
    338 are identical to the
    339 .IR arc ,
    340 .IR poly ,
    341 .IR ellipse ,
    342 .IR fillpoly ,
    343 .IR line ,
    344 and
    345 .IR gendraw ,
    346 routines described in
    347 .MR draw (3) ,
    348 except that they operate on
    349 .BR Memimage s
    350 rather than
    351 .BR Image s.
    352 Similarly,
    353 .IR allocmemsubfont ,
    354 .IR openmemsubfont ,
    355 .IR freememsubfont ,
    356 .IR memsubfontwidth ,
    357 and
    358 .I memimagestring
    359 are the
    360 .B Memimage
    361 analogues of
    362 .IR allocsubfont ,
    363 .IR openfont ,
    364 .IR freesubfont ,
    365 .IR strsubfontwidth ,
    366 and
    367 .B string
    368 (see
    369 .MR subfont (3)
    370 and
    371 .MR graphics (3) ),
    372 except that they operate
    373 only on
    374 .BR Memsubfont s
    375 rather than
    376 .BR Font s.
    377 .PP
    378 .I Drawclip
    379 takes the images involved in a draw operation,
    380 together with the destination rectangle
    381 .B dr
    382 and source
    383 and mask alignment points
    384 .B sp
    385 and
    386 .BR mp ,
    387 and
    388 clips them according to the clipping rectangles of the images involved.
    389 It also fills in the rectangles
    390 .B sr
    391 and
    392 .B mr
    393 with rectangles congruent to the returned destination rectangle
    394 but translated so the upper left corners are the returned
    395 .B sp
    396 and
    397 .BR mp .
    398 .I Drawclip
    399 returns zero when the clipped rectangle is empty.
    400 .I Memlinebbox
    401 returns a conservative bounding box containing a line between
    402 two points
    403 with given end styles
    404 and radius.
    405 .I Memlineendsize
    406 calculates the extra length added to a line by attaching
    407 an end of a given style.
    408 .PP
    409 The
    410 .I hwdraw
    411 and
    412 .I iprint
    413 functions are no-op stubs that may be overridden by clients
    414 of the library.
    415 .I Hwdraw
    416 is called at each call to
    417 .I memimagedraw
    418 with the current request's parameters.
    419 If it can satisfy the request, it should do so
    420 and return 1.
    421 If it cannot satisfy the request, it should return 0.
    422 This allows (for instance) the kernel to take advantage
    423 of hardware acceleration.
    424 .I Iprint
    425 should format and print its arguments;
    426 it is given much debugging output when
    427 the global integer variable
    428 .B drawdebug
    429 is non-zero.
    430 In the kernel,
    431 .I iprint
    432 prints to a serial line rather than the screen, for obvious reasons.
    433 .SH SOURCE
    434 .B \*9/src/libmemdraw
    435 .SH SEE ALSO
    436 .MR addpt (3) ,
    437 .MR color (3) ,
    438 .MR draw (3) ,
    439 .MR graphics (3) ,
    440 .MR memlayer (3) ,
    441 .MR stringsize (3) ,
    442 .MR subfont (3) ,
    443 .MR color (7) ,
    444 .MR utf (7)
    445 .SH BUGS
    446 .I Memimagestring
    447 is unusual in using a subfont rather than a font,
    448 and in having no parameter to align the source.