plan9port

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

allocimage.3 (7311B)


      1 .TH ALLOCIMAGE 3
      2 .SH NAME
      3 allocimage, allocimagemix, freeimage, nameimage, namedimage, setalpha, loadimage, cloadimage, unloadimage, readimage, writeimage, bytesperline, wordsperline \- allocating, freeing, reading, writing images
      4 .SH SYNOPSIS
      5 .nf
      6 .PP
      7 .B
      8 #include <u.h>
      9 .B
     10 #include <libc.h>
     11 .B
     12 #include <draw.h>
     13 .PP
     14 .ta \w'\fLImage 'u
     15 .B
     16 Image	*allocimage(Display *d, Rectangle r, 
     17 .br
     18 .B
     19 	ulong chan, int repl, int col)
     20 .PP
     21 .B
     22 Image	*allocimagemix(Display *d, ulong one, ulong three)
     23 .PP
     24 .B
     25 void	freeimage(Image *i)
     26 .PP
     27 .B
     28 int	nameimage(Image *i, char *name, int in)
     29 .PP
     30 .B
     31 Image	*namedimage(Display *d, char *name)
     32 .PP
     33 .B
     34 ulong	setalpha(ulong color, uchar alpha)
     35 .PP
     36 .B
     37 int	loadimage(Image *i, Rectangle r, uchar *data, int ndata)
     38 .PP
     39 .B
     40 int	cloadimage(Image *i, Rectangle r, uchar *data, int ndata)
     41 .PP
     42 .B
     43 int	unloadimage(Image *i, Rectangle r, uchar *data, int ndata)
     44 .PP
     45 .B
     46 Image	*readimage(Display *d, int fd, int dolock)
     47 .PP
     48 .B
     49 int	writeimage(int fd, Image *i, int dolock)
     50 .PP
     51 .B
     52 int	bytesperline(Rectangle r, int d)
     53 .PP
     54 .B
     55 int	wordsperline(Rectangle r, int d)
     56 .PP
     57 .nf
     58 .B
     59 enum
     60 .nf
     61 .ft L
     62 .ta +4n +20
     63 {
     64 	DOpaque		= 0xFFFFFFFF,
     65 	DTransparent	= 0x00000000,
     66 	DBlack		= 0x000000FF,
     67 	DWhite		= 0xFFFFFFFF,
     68 	DRed		= 0xFF0000FF,
     69 	DGreen		= 0x00FF00FF,
     70 	DBlue		= 0x0000FFFF,
     71 	DCyan		= 0x00FFFFFF,
     72 	DMagenta		= 0xFF00FFFF,
     73 	DYellow		= 0xFFFF00FF,
     74 	DPaleyellow	= 0xFFFFAAFF,
     75 	DDarkyellow	= 0xEEEE9EFF,
     76 	DDarkgreen	= 0x448844FF,
     77 	DPalegreen	= 0xAAFFAAFF,
     78 	DMedgreen	= 0x88CC88FF,
     79 	DDarkblue	= 0x000055FF,
     80 	DPalebluegreen	= 0xAAFFFFFF,
     81 	DPaleblue		= 0x0000BBFF,
     82 	DBluegreen	= 0x008888FF,
     83 	DGreygreen	= 0x55AAAAFF,
     84 	DPalegreygreen	= 0x9EEEEEFF,
     85 	DYellowgreen	= 0x99994CFF,
     86 	DMedblue		= 0x000099FF,
     87 	DGreyblue	= 0x005DBBFF,
     88 	DPalegreyblue	= 0x4993DDFF,
     89 	DPurpleblue	= 0x8888CCFF,
     90 
     91 	DNotacolor	= 0xFFFFFF00,
     92 	DNofill		= DNotacolor,
     93 	
     94 };
     95 .fi
     96 .SH DESCRIPTION
     97 A new
     98 .B Image
     99 on
    100 .B Display
    101 .B d
    102 is allocated with
    103 .BR allocimage ;
    104 it will have the rectangle, pixel channel format,
    105 and replication flag
    106 given by its arguments.
    107 Convenient pixel channels like
    108 .BR GREY1 ,
    109 .BR GREY2 ,
    110 .BR CMAP8 ,
    111 .BR RGB16 ,
    112 .BR RGB24 ,
    113 and
    114 .BR RGBA32 
    115 are predefined.
    116 All the new image's pixels will have initial value
    117 .IR col .
    118 If
    119 .I col
    120 is 
    121 .BR DNofill ,
    122 no initialization is done.
    123 Representative useful values of color are predefined:
    124 .BR DBlack ,
    125 .BR DWhite ,
    126 .BR DRed ,
    127 and so on.
    128 Colors are specified by 32-bit numbers comprising,
    129 from most to least significant byte,
    130 8-bit values for red, green, blue, and alpha.
    131 The values correspond to illumination, so 0 is black and 255 is white.
    132 Similarly, for alpha 0 is transparent and 255 is opaque.
    133 The
    134 .I id
    135 field will have been set to the identifying number used by
    136 .B /dev/draw
    137 (see
    138 .MR draw (3) ),
    139 and the
    140 .I cache
    141 field will be zero.
    142 If
    143 .I repl
    144 is true, the clip rectangle is set to a very large region; if false, it is set to
    145 .IR r .
    146 The 
    147 .I depth
    148 field will be set to the number of bits per pixel specified
    149 by the channel descriptor
    150 (see
    151 .MR image (7) ).
    152 .I Allocimage
    153 returns 0 if the server has run out of image memory.
    154 .PP
    155 .I Allocimagemix
    156 is used to allocate background colors.
    157 On 8-bit color-mapped displays, it
    158 returns a 2×2 replicated image with one pixel colored 
    159 the color
    160 .I one
    161 and the other three with
    162 .IR three .
    163 (This simulates a wider range of tones than can be represented by a single pixel
    164 value on a color-mapped display.)
    165 On true color displays, it returns a 1×1 replicated image 
    166 whose pixel is the result of mixing the two colors in 
    167 a one to three ratio.
    168 .PP
    169 .I Freeimage
    170 frees the resources used by its argument image.
    171 .PP
    172 .I Nameimage
    173 publishes in the server the image
    174 .I i
    175 under the given
    176 .IR name .
    177 If
    178 .I in
    179 is non-zero, the image is published; otherwise
    180 .I i
    181 must be already named
    182 .I name
    183 and it is withdrawn from publication.
    184 .I Namedimage
    185 returns a reference to the image published under the given
    186 .I name
    187 on
    188 .B Display
    189 .IR d .
    190 These routines permit unrelated applications sharing a display to share an image;
    191 for example they provide the mechanism behind
    192 .B getwindow
    193 (see
    194 .MR graphics (3) ).
    195 .PP
    196 The RGB values in a color are
    197 .I premultiplied
    198 by the alpha value; for example, a 50% red is
    199 .B 0x7F00007F
    200 not
    201 .BR 0xFF00007F .
    202 The function
    203 .I setalpha
    204 performs the alpha computation on a given
    205 .BR color ,
    206 ignoring its initial alpha value, multiplying the components by the supplied
    207 .BR alpha .
    208 For example, to make a 50% red color value, one could execute
    209 .B setalpha(DRed,
    210 .BR 0x7F) .
    211 .PP
    212 The remaining functions deal with moving groups of pixel
    213 values between image and user space or external files.
    214 There is a fixed format for the exchange and storage of
    215 image data
    216 (see
    217 .MR image (7) ).
    218 .PP
    219 .I Unloadimage
    220 reads a rectangle of pixels from image
    221 .I i
    222 into
    223 .IR data ,
    224 whose length is specified by
    225 .IR ndata .
    226 It is an error if
    227 .I ndata
    228 is too small to accommodate the pixels.
    229 .PP
    230 .I Loadimage
    231 replaces the specified rectangle in image
    232 .I i
    233 with the
    234 .I ndata
    235 bytes of
    236 .IR data .
    237 .PP
    238 The pixels are presented one horizontal line at a time,
    239 starting with the top-left pixel of
    240 .IR r .
    241 In the data processed by these routines, each scan line starts with a new byte in the array,
    242 leaving the last byte of the previous line partially empty, if necessary.
    243 Pixels are packed as tightly as possible within
    244 .IR data ,
    245 regardless of the rectangle being extracted.
    246 Bytes are filled from most to least significant bit order,
    247 as the
    248 .I x
    249 coordinate increases, aligned so
    250 .IR x =0
    251 would appear as the leftmost pixel of its byte.
    252 Thus, for
    253 .B depth
    254 1, the pixel at
    255 .I x
    256 offset 165 within the rectangle will be in a
    257 .I data
    258 byte at bit-position
    259 .B 0x04
    260 regardless of the overall
    261 rectangle: 165 mod 8 equals 5, and
    262 .B "0x80\ >>\ 5"
    263 equals
    264 .BR 0x04 .
    265 .PP
    266 .B Cloadimage
    267 does the same as
    268 .IR loadimage ,
    269 but for
    270 .I ndata
    271 bytes of compressed image
    272 .I data
    273 (see
    274 .MR image (7) ).
    275 On each call to
    276 .IR cloadimage,
    277 the
    278 .I data
    279 must be at the beginning of a compressed data block, in particular,
    280 it should start with the
    281 .B y
    282 coordinate and data length for the block. 
    283 .PP
    284 .IR Loadimage ,
    285 .IR cloadimage ,
    286 and
    287 .I unloadimage
    288 return the number of bytes copied.
    289 .PP
    290 .I Readimage
    291 creates an image from data contained in an external file (see
    292 .MR image (7)
    293 for the file format);
    294 .I fd
    295 is a file descriptor obtained by opening such a file for reading.
    296 The returned image is allocated using
    297 .IR allocimage .
    298 The
    299 .I dolock
    300 flag specifies whether the
    301 .B Display
    302 should be synchronized for multithreaded access; single-threaded
    303 programs can leave it zero.
    304 .PP
    305 .I Writeimage
    306 writes image
    307 .I i
    308 onto file descriptor
    309 .IR fd ,
    310 which should be open for writing.
    311 The format is as described for
    312 .IR readimage .
    313 .PP
    314 .I Readimage
    315 and
    316 .I writeimage
    317 do not close
    318 .IR fd .
    319 .PP
    320 .I Bytesperline
    321 and
    322 .I wordsperline
    323 return the number of bytes or words occupied in memory by one scan line of rectangle
    324 .I r
    325 in an image with
    326 .I d
    327 bits per pixel.
    328 .SH EXAMPLE
    329 To allocate a single-pixel replicated image that may be used to paint a region red,
    330 .EX
    331 	red = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, DRed);
    332 .EE
    333 .SH SOURCE
    334 .B \*9/src/libdraw
    335 .SH "SEE ALSO"
    336 .MR graphics (3) ,
    337 .MR draw (3) ,
    338 .MR draw (3) ,
    339 .MR image (7)
    340 .SH DIAGNOSTICS
    341 These functions return pointer 0 or integer \-1 on failure, usually due to insufficient
    342 memory.
    343 .PP
    344 May set
    345 .IR errstr .
    346 .SH BUGS
    347 .B Depth
    348 must be a divisor or multiple of 8.