diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-06-16 00:39:31 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-06-16 00:39:31 +0200 |
commit | 56073b738103379003a594bbea31eb35c2fa58ee (patch) | |
tree | 1c142ab0cf1f564c33f79ef25378744be22797e1 | |
parent | 4cbfe26da4c90969dd36c224b79d77a1d69ddce5 (diff) | |
download | plan9front-56073b738103379003a594bbea31eb35c2fa58ee.tar.xz |
libmemdraw: fix drawing to color mapped with alpha chan (m8a8)
-rw-r--r-- | sys/src/libmemdraw/draw.c | 22 |
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; } |