#include "compose.h"
static Rectangle ulrange; /* the upper left corner of the image must be in this rectangle */
static Point ul; /* the upper left corner of the image is at this point on the screen */
static Point
pclip(Point p, Rectangle r)
{
if(p.x < r.min.x)
p.x = r.min.x;
else if(p.x >= r.max.x)
p.x = r.max.x-1;
if(p.y < r.min.y)
p.y = r.min.y;
else if(p.y >= r.max.y)
p.y = r.max.y-1;
return p;
}
static void
compose(Memimage *screen, Memimage *im, ulong op)
{
static Memimage *gray;
if(im == nil)
return;
ul = pclip(ul, ulrange);
memdraw(screen, screen->r, im, ZP, nil, ZP, op);
/* gray for the rest */
if(gray == nil && op == S) {
gray = allocmemimage(screen->r, screen->chan);
gray->flags |= Frepl;
gray->clipr = Rect(-0x3FFFFFF, -0x3FFFFFF, 0x3FFFFFF, 0x3FFFFFF);
*wordaddr(gray, ZP) = 0x888888FF;
if(gray == nil) {
fprint(2, "g out of memory: %r\n");
sysfatal("malloc: %r");
}
}
}
void
composer(C *c, int n, ulong chan)
{
int i;
ulong op;
Memimage *im;
memimageinit();
im = pageimg(c + 0, chan);
ulrange = im->r;
op = SoverD;
for(i = 1; i < n; i++)
compose(im, pageimg(c + i, 0), op);
writememimage(1, im);
}
|