ref: cf13f5df44d9815f08904dea9845406e7e61a1e0
parent: e1581c45eeaec836b6f4a166f2b14e1171c2ee5d
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Sat Jun 15 20:39:31 EDT 2013
libmemdraw: fix drawing to color mapped with alpha chan (m8a8)
--- a/sys/src/libmemdraw/draw.c
+++ b/sys/src/libmemdraw/draw.c
@@ -1541,8 +1541,8 @@
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 @@
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 @@
{if(img->depth < 8)
return writenbit;
- if(img->chan == CMAP8)
+ if(img->nbits[CMap] == 8)
return writecmap;
return writebyte;
}
--
⑨