1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <draw.h>
4*8ccd4a63SDavid du Colombier #include <memdraw.h>
5*8ccd4a63SDavid du Colombier #include <memlayer.h>
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier int
memload(Memimage * dst,Rectangle r,uchar * data,int n,int iscompressed)87dd7cddfSDavid du Colombier memload(Memimage *dst, Rectangle r, uchar *data, int n, int iscompressed)
97dd7cddfSDavid du Colombier {
107dd7cddfSDavid du Colombier int (*loadfn)(Memimage*, Rectangle, uchar*, int);
117dd7cddfSDavid du Colombier Memimage *tmp;
127dd7cddfSDavid du Colombier Memlayer *dl;
137dd7cddfSDavid du Colombier Rectangle lr;
147dd7cddfSDavid du Colombier int dx;
157dd7cddfSDavid du Colombier
167dd7cddfSDavid du Colombier loadfn = loadmemimage;
177dd7cddfSDavid du Colombier if(iscompressed)
187dd7cddfSDavid du Colombier loadfn = cloadmemimage;
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier Top:
217dd7cddfSDavid du Colombier dl = dst->layer;
227dd7cddfSDavid du Colombier if(dl == nil)
237dd7cddfSDavid du Colombier return loadfn(dst, r, data, n);
247dd7cddfSDavid du Colombier
257dd7cddfSDavid du Colombier /*
267dd7cddfSDavid du Colombier * Convert to screen coordinates.
277dd7cddfSDavid du Colombier */
287dd7cddfSDavid du Colombier lr = r;
297dd7cddfSDavid du Colombier r.min.x += dl->delta.x;
307dd7cddfSDavid du Colombier r.min.y += dl->delta.y;
317dd7cddfSDavid du Colombier r.max.x += dl->delta.x;
327dd7cddfSDavid du Colombier r.max.y += dl->delta.y;
337dd7cddfSDavid du Colombier dx = dl->delta.x&(7/dst->depth);
347dd7cddfSDavid du Colombier if(dl->clear && dx==0){
357dd7cddfSDavid du Colombier dst = dl->screen->image;
367dd7cddfSDavid du Colombier goto Top;
377dd7cddfSDavid du Colombier }
387dd7cddfSDavid du Colombier
397dd7cddfSDavid du Colombier /*
407dd7cddfSDavid du Colombier * dst is an obscured layer or data is unaligned
417dd7cddfSDavid du Colombier */
427dd7cddfSDavid du Colombier if(dl->save && dx==0){
437dd7cddfSDavid du Colombier n = loadfn(dl->save, lr, data, n);
447dd7cddfSDavid du Colombier if(n > 0)
457dd7cddfSDavid du Colombier memlexpose(dst, r);
467dd7cddfSDavid du Colombier return n;
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier tmp = allocmemimage(lr, dst->chan);
497dd7cddfSDavid du Colombier if(tmp == nil)
507dd7cddfSDavid du Colombier return -1;
517dd7cddfSDavid du Colombier n = loadfn(tmp, lr, data, n);
52*8ccd4a63SDavid du Colombier memdraw(dst, lr, tmp, lr.min, nil, lr.min, S);
537dd7cddfSDavid du Colombier freememimage(tmp);
547dd7cddfSDavid du Colombier return n;
557dd7cddfSDavid du Colombier }
56