tmemdraw.3 - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
tmemdraw.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 
    41 .nf
    42 .B #include 
    43 .B #include 
    44 .B #include 
    45 .B #include 
    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.