summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/libmemdraw/draw.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/sys/src/libmemdraw/draw.c b/sys/src/libmemdraw/draw.c
index 574d597db..9416e0059 100644
--- a/sys/src/libmemdraw/draw.c
+++ b/sys/src/libmemdraw/draw.c
@@ -1541,8 +1541,8 @@ readcmap(Param *p, uchar *buf, int y)
static void
writecmap(Param *p, uchar *w, Buffer src)
{
- uchar *cmap, *red, *grn, *blu;
- int i, dx, delta;
+ uchar *cmap, *red, *grn, *blu, *alpha;
+ int i, dx, delta, a, m;
cmap = p->img->cmap->rgb2cmap;
@@ -1552,8 +1552,20 @@ writecmap(Param *p, uchar *w, Buffer src)
blu = src.blu;
dx = p->dx;
- for(i=0; i<dx; i++, red+=delta, grn+=delta, blu+=delta)
- *w++ = cmap[(*red>>4)*256+(*grn>>4)*16+(*blu>>4)];
+ if(p->img->flags&Falpha){
+ alpha = src.alpha;
+ m = p->img->shift[CMap]/8;
+ a = p->img->shift[CAlpha]/8;
+ for(i=0; i<dx; i++, red+=delta, grn+=delta, blu+=delta, w+=2){
+ w[a] = *alpha;
+ if(alpha != &ones)
+ alpha+=delta;
+ w[m] = cmap[(*red>>4)*256+(*grn>>4)*16+(*blu>>4)];
+ }
+ } else {
+ for(i=0; i<dx; i++, red+=delta, grn+=delta, blu+=delta)
+ *w++ = cmap[(*red>>4)*256+(*grn>>4)*16+(*blu>>4)];
+ }
}
#define DBG if(0)
@@ -1752,7 +1764,7 @@ writefn(Memimage *img)
{
if(img->depth < 8)
return writenbit;
- if(img->chan == CMAP8)
+ if(img->nbits[CMap] == 8)
return writecmap;
return writebyte;
}