350 lines
7.2 KiB
Plaintext
350 lines
7.2 KiB
Plaintext
.TH ALLOCIMAGE 2
|
||
.SH NAME
|
||
allocimage, allocimagemix, freeimage, nameimage, namedimage, setalpha, loadimage, cloadimage, unloadimage, readimage, writeimage, bytesperline, wordsperline \- allocating, freeing, reading, writing images
|
||
.SH SYNOPSIS
|
||
.nf
|
||
.PP
|
||
.B
|
||
#include <u.h>
|
||
.B
|
||
#include <libc.h>
|
||
.B
|
||
#include <draw.h>
|
||
.PP
|
||
.ta \w'\fLImage 'u
|
||
.B
|
||
Image *allocimage(Display *d, Rectangle r,
|
||
.br
|
||
.B
|
||
ulong chan, int repl, ulong col)
|
||
.PP
|
||
.B
|
||
Image *allocimagemix(Display *d, ulong one, ulong three)
|
||
.PP
|
||
.B
|
||
int freeimage(Image *i)
|
||
.PP
|
||
.B
|
||
int nameimage(Image *i, char *name, int in)
|
||
.PP
|
||
.B
|
||
Image *namedimage(Display *d, char *name)
|
||
.PP
|
||
.B
|
||
ulong setalpha(ulong color, uchar alpha)
|
||
.PP
|
||
.B
|
||
int loadimage(Image *i, Rectangle r, uchar *data, int ndata)
|
||
.PP
|
||
.B
|
||
int cloadimage(Image *i, Rectangle r, uchar *data, int ndata)
|
||
.PP
|
||
.B
|
||
int unloadimage(Image *i, Rectangle r, uchar *data, int ndata)
|
||
.PP
|
||
.B
|
||
Image *readimage(Display *d, int fd, int dolock)
|
||
.PP
|
||
.B
|
||
int writeimage(int fd, Image *i, int dolock)
|
||
.PP
|
||
.B
|
||
int bytesperline(Rectangle r, int d)
|
||
.PP
|
||
.B
|
||
int wordsperline(Rectangle r, int d)
|
||
.PP
|
||
.nf
|
||
.B
|
||
enum
|
||
.nf
|
||
.ft L
|
||
.ta +4n +20
|
||
{
|
||
DOpaque = 0xFFFFFFFF,
|
||
DTransparent = 0x00000000,
|
||
DBlack = 0x000000FF,
|
||
DWhite = 0xFFFFFFFF,
|
||
DRed = 0xFF0000FF,
|
||
DGreen = 0x00FF00FF,
|
||
DBlue = 0x0000FFFF,
|
||
DCyan = 0x00FFFFFF,
|
||
DMagenta = 0xFF00FFFF,
|
||
DYellow = 0xFFFF00FF,
|
||
DPaleyellow = 0xFFFFAAFF,
|
||
DDarkyellow = 0xEEEE9EFF,
|
||
DDarkgreen = 0x448844FF,
|
||
DPalegreen = 0xAAFFAAFF,
|
||
DMedgreen = 0x88CC88FF,
|
||
DDarkblue = 0x000055FF,
|
||
DPalebluegreen = 0xAAFFFFFF,
|
||
DPaleblue = 0x0000BBFF,
|
||
DBluegreen = 0x008888FF,
|
||
DGreygreen = 0x55AAAAFF,
|
||
DPalegreygreen = 0x9EEEEEFF,
|
||
DYellowgreen = 0x99994CFF,
|
||
DMedblue = 0x000099FF,
|
||
DGreyblue = 0x005DBBFF,
|
||
DPalegreyblue = 0x4993DDFF,
|
||
DPurpleblue = 0x8888CCFF,
|
||
|
||
DNotacolor = 0xFFFFFF00,
|
||
DNofill = DNotacolor,
|
||
|
||
};
|
||
.fi
|
||
.SH DESCRIPTION
|
||
A new
|
||
.B Image
|
||
on
|
||
.B Display
|
||
.B d
|
||
is allocated with
|
||
.BR allocimage ;
|
||
it will have the rectangle, pixel channel format,
|
||
replication flag,
|
||
and initial fill color
|
||
given by its arguments.
|
||
Convenient pixel channels like
|
||
.BR GREY1 ,
|
||
.BR GREY2 ,
|
||
.BR CMAP8 ,
|
||
.BR RGB16 ,
|
||
.BR RGB24 ,
|
||
and
|
||
.BR RGBA32
|
||
are predefined.
|
||
All the new image's pixels will have initial value
|
||
.IR col .
|
||
If
|
||
.I col
|
||
is
|
||
.BR DNofill ,
|
||
no initialization is done.
|
||
Representative useful values of color are predefined:
|
||
.BR DBlack ,
|
||
.BR DWhite ,
|
||
.BR DRed ,
|
||
and so on.
|
||
Colors are specified by 32-bit numbers comprising,
|
||
from most to least significant byte,
|
||
8-bit values for red, green, blue, and alpha.
|
||
The values correspond to illumination, so 0 is black and 255 is white.
|
||
Similarly, for alpha 0 is transparent and 255 is opaque.
|
||
The
|
||
.I id
|
||
field will have been set to the identifying number used by
|
||
.B /dev/draw
|
||
(see
|
||
.IR draw (3)),
|
||
and the
|
||
.I cache
|
||
field will be zero.
|
||
If
|
||
.I repl
|
||
is true, the clip rectangle is set to a very large region; if false, it is set to
|
||
.IR r .
|
||
The
|
||
.I depth
|
||
field will be set to the number of bits per pixel specified
|
||
by the channel descriptor
|
||
(see
|
||
.IR image (6)).
|
||
.I Allocimage
|
||
returns 0 if the server has run out of image memory.
|
||
.PP
|
||
.I Allocimagemix
|
||
is used to allocate background colors.
|
||
On 8-bit color-mapped displays, it
|
||
returns a 2×2 replicated image with one pixel colored
|
||
the color
|
||
.I one
|
||
and the other three with
|
||
.IR three .
|
||
(This simulates a wider range of tones than can be represented by a single pixel
|
||
value on a color-mapped display.)
|
||
On true color displays, it returns a 1×1 replicated image
|
||
whose pixel is the result of mixing the two colors in
|
||
a one to three ratio.
|
||
.PP
|
||
.I Freeimage
|
||
frees the resources used by its argument image.
|
||
.PP
|
||
.I Nameimage
|
||
publishes in the server the image
|
||
.I i
|
||
under the given
|
||
.IR name .
|
||
If
|
||
.I in
|
||
is non-zero, the image is published; otherwise
|
||
.I i
|
||
must be already named
|
||
.I name
|
||
and it is withdrawn from publication.
|
||
.I Namedimage
|
||
returns a reference to the image published under the given
|
||
.I name
|
||
on
|
||
.B Display
|
||
.IR d .
|
||
These routines permit unrelated applications sharing a display to share an image;
|
||
for example they provide the mechanism behind
|
||
.B getwindow
|
||
(see
|
||
.IR graphics (2)).
|
||
.PP
|
||
The RGB values in a color are
|
||
.I premultiplied
|
||
by the alpha value; for example, a 50% red is
|
||
.B 0x7F00007F
|
||
not
|
||
.BR 0xFF00007F .
|
||
The function
|
||
.I setalpha
|
||
performs the alpha computation on a given
|
||
.BR color ,
|
||
ignoring its initial alpha value, multiplying the components by the supplied
|
||
.BR alpha .
|
||
For example, to make a 50% red color value, one could execute
|
||
.B setalpha(DRed,
|
||
.BR 0x7F) .
|
||
.PP
|
||
The remaining functions deal with moving groups of pixel
|
||
values between image and user space or external files.
|
||
There is a fixed format for the exchange and storage of
|
||
image data
|
||
(see
|
||
.IR image (6)).
|
||
.PP
|
||
.I Unloadimage
|
||
reads a rectangle of pixels from image
|
||
.I i
|
||
into
|
||
.IR data ,
|
||
whose length is specified by
|
||
.IR ndata .
|
||
It is an error if
|
||
.I ndata
|
||
is too small to accommodate the pixels.
|
||
.PP
|
||
.I Loadimage
|
||
replaces the specified rectangle in image
|
||
.I i
|
||
with the
|
||
.I ndata
|
||
bytes of
|
||
.IR data .
|
||
.PP
|
||
The pixels are presented one horizontal line at a time,
|
||
starting with the top-left pixel of
|
||
.IR r .
|
||
In the data processed by these routines, 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
|
||
.B depth
|
||
1, the pixel at
|
||
.I x
|
||
offset 165 within the rectangle will be in a
|
||
.I data
|
||
byte at bit-position
|
||
.B 0x04
|
||
regardless of the overall
|
||
rectangle: 165 mod 8 equals 5, and
|
||
.B "0x80\ >>\ 5"
|
||
equals
|
||
.BR 0x04 .
|
||
.PP
|
||
.B Cloadimage
|
||
does the same as
|
||
.IR loadimage ,
|
||
but for
|
||
.I ndata
|
||
bytes of compressed image
|
||
.I data
|
||
(see
|
||
.IR image (6)).
|
||
On each call to
|
||
.IR cloadimage,
|
||
the
|
||
.I data
|
||
must be at the beginning of a compressed data block, in particular,
|
||
it should start with the
|
||
.B y
|
||
coordinate and data length for the block.
|
||
.PP
|
||
.IR Loadimage ,
|
||
.IR cloadimage ,
|
||
and
|
||
.I unloadimage
|
||
return the number of bytes copied.
|
||
.PP
|
||
.I Readimage
|
||
creates an image from data contained in an external file (see
|
||
.IR image (6)
|
||
for the file format);
|
||
.I fd
|
||
is a file descriptor obtained by opening such a file for reading.
|
||
The returned image is allocated using
|
||
.IR allocimage .
|
||
The
|
||
.I dolock
|
||
flag specifies whether the
|
||
.B Display
|
||
should be synchronized for multithreaded access; single-threaded
|
||
programs can leave it zero.
|
||
.PP
|
||
.I Writeimage
|
||
writes image
|
||
.I i
|
||
onto file descriptor
|
||
.IR fd ,
|
||
which should be open for writing.
|
||
The format is as described for
|
||
.IR readimage .
|
||
.PP
|
||
.I Readimage
|
||
and
|
||
.I writeimage
|
||
do not close
|
||
.IR fd .
|
||
.PP
|
||
.I Bytesperline
|
||
and
|
||
.I wordsperline
|
||
return the number of bytes or words occupied in memory by one scan line of rectangle
|
||
.I r
|
||
in an image with
|
||
.I d
|
||
bits per pixel.
|
||
.SH EXAMPLE
|
||
To allocate a single-pixel replicated image that may be used to paint a region red,
|
||
.EX
|
||
red = allocimage(display, Rect(0, 0, 1, 1), RGB24, 1, DRed);
|
||
.EE
|
||
.SH SOURCE
|
||
.B /sys/src/libdraw
|
||
.SH "SEE ALSO"
|
||
.IR graphics (2),
|
||
.IR draw (2),
|
||
.IR draw (3),
|
||
.IR image (6)
|
||
.SH DIAGNOSTICS
|
||
These functions return pointer 0 or integer \-1 on failure, usually due to insufficient
|
||
memory.
|
||
.PP
|
||
May set
|
||
.IR errstr .
|
||
.SH BUGS
|
||
.B Depth
|
||
must be a divisor or multiple of 8.
|