.TH ALLOCIMAGE 2.SH NAMEallocimage, 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.BImage *allocimage(Display *d, Rectangle r, .br.B ulong chan, int repl, int col).PP.BImage *allocimagemix(Display *d, ulong one, ulong three).PP.Bvoid freeimage(Image *i).PP.Bint nameimage(Image *i, char *name, int in).PP.BImage *namedimage(Display *d, char *name).PP.Bulong setalpha(ulong color, uchar alpha).PP.Bint loadimage(Image *i, Rectangle r, uchar *data, int ndata).PP.Bint cloadimage(Image *i, Rectangle r, uchar *data, int ndata).PP.Bint unloadimage(Image *i, Rectangle r, uchar *data, int ndata).PP.BImage *readimage(Display *d, int fd, int dolock).PP.Bint writeimage(int fd, Image *i, int dolock).PP.Bint bytesperline(Rectangle r, int d).PP.Bint wordsperline(Rectangle r, int d).PP.nf.Benum.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 DESCRIPTIONA new.B Imageon.B Display.B dis allocated with.BR allocimage ;it will have the rectangle, pixel channel format,and replication flaggiven 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 colis .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 idfield will have been set to the identifying number used by.B /dev/draw(see.IR draw (3)),and the.I cachefield will be zero.If.I replis true, the clip rectangle is set to a very large region; if false, it is set to.IR r .The .I depthfield will be set to the number of bits per pixel specifiedby the channel descriptor(see.IR image (6))..I Allocimagereturns 0 if the server has run out of image memory..PP.I Allocimagemixis used to allocate background colors.On 8-bit color-mapped displays, itreturns a 2×2 replicated image with one pixel colored the color.I oneand the other three with.IR three .(This simulates a wider range of tones than can be represented by a single pixelvalue 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 Freeimagefrees the resources used by its argument image..PP.I Nameimagepublishes in the server the image.I iunder the given.IR name .If.I inis non-zero, the image is published; otherwise.I imust be already named.I nameand it is withdrawn from publication..I Namedimagereturns a reference to the image published under the given.I nameon.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))..PPThe RGB values in a color are.I premultipliedby the alpha value; for example, a 50% red is.B 0x7F00007Fnot.BR 0xFF00007F .The function.I setalphaperforms 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) ..PPThe remaining functions deal with moving groups of pixelvalues between image and user space or external files.There is a fixed format for the exchange and storage ofimage data(see.IR image (6))..PP.I Unloadimagereads a rectangle of pixels from image.I iinto.IR data ,whose length is specified by.IR ndata .It is an error if.I ndatais too small to accommodate the pixels..PP.I Loadimagereplaces the specified rectangle in image.I iwith the.I ndatabytes of.IR data ..PPThe 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 xcoordinate increases, aligned so.IR x =0would appear as the leftmost pixel of its byte.Thus, for.B depth1, the pixel at.I xoffset 165 within the rectangle will be in a.I databyte at bit-position.B 0x04regardless of the overallrectangle: 165 mod 8 equals 5, and.B "0x80\ >>\ 5"equals.BR 0x04 ..PP.B Cloadimagedoes the same as.IR loadimage ,but for.I ndatabytes of compressed image.I data(see.IR image (6)).On each call to.IR cloadimage,the.I datamust be at the beginning of a compressed data block, in particular,it should start with the.B ycoordinate and data length for the block. .PP.IR Loadimage ,.IR cloadimage ,and.I unloadimagereturn the number of bytes copied..PP.I Readimagecreates an image from data contained in an external file (see.IR image (6)for the file format);.I fdis a file descriptor obtained by opening such a file for reading.The returned image is allocated using.IR allocimage .The.I dolockflag specifies whether the.B Displayshould be synchronized for multithreaded access; single-threadedprograms can leave it zero..PP.I Writeimagewrites image.I ionto file descriptor.IR fd ,which should be open for writing.The format is as described for.IR readimage ..PP.I Readimageand.I writeimagedo not close.IR fd ..PP.I Bytesperlineand.I wordsperlinereturn the number of bytes or words occupied in memory by one scan line of rectangle.I rin an image with.I dbits per pixel..SH EXAMPLETo 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 DIAGNOSTICSThese functions return pointer 0 or integer \-1 on failure, usually due to insufficientmemory..PPMay set.IR errstr ..SH BUGS.B Depthmust be a divisor or multiple of 8.
.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, int col)
.PP
.B
Image *allocimagemix(Display *d, ulong one, ulong three)
.PP
.B
void 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,
and replication flag
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.