support transparent images
authorMarkus Teich <markus.teich@stusta.mhn.de>
Tue, 8 Dec 2015 20:46:18 +0000 (21:46 +0100)
committerMarkus Teich <markus.teich@stusta.mhn.de>
Tue, 8 Dec 2015 20:46:18 +0000 (21:46 +0100)
sent.c

diff --git a/sent.c b/sent.c
index eb3aadc2a4b77f161193173043d0719e4b763e8a..e10e8ca8ab840312f64d525e289322e61b0a3c50 100644 (file)
--- a/sent.c
+++ b/sent.c
@@ -215,6 +215,8 @@ int ffread(Image *img)
 {
        uint32_t y, x;
        uint16_t *row;
+       uint8_t opac;
+       uint8_t fg_r, fg_g, fg_b, bg_r, bg_g, bg_b;
        size_t rowlen, off, nbytes;
        ssize_t r;
 
@@ -239,6 +241,11 @@ int ffread(Image *img)
                return 0;
        }
 
+       /* extract window background color channels for transparency */
+       bg_r = (sc->bg.pix >> 16) % 256;
+       bg_g = (sc->bg.pix >>  8) % 256;
+       bg_b = (sc->bg.pix >>  0) % 256;
+
        for (off = 0, y = 0; y < img->bufheight; y++) {
                nbytes = 0;
                while (nbytes < rowlen) {
@@ -248,9 +255,15 @@ int ffread(Image *img)
                        nbytes += r;
                }
                for (x = 0; x < rowlen / 2; x += 4) {
-                       img->buf[off++] = ntohs(row[x + 0]) / 257;
-                       img->buf[off++] = ntohs(row[x + 1]) / 257;
-                       img->buf[off++] = ntohs(row[x + 2]) / 257;
+                       fg_r = ntohs(row[x + 0]) / 256;
+                       fg_g = ntohs(row[x + 1]) / 256;
+                       fg_b = ntohs(row[x + 2]) / 256;
+                       opac = ntohs(row[x + 3]) / 256;
+                       /* blend opaque part of image data with window background color to
+                        * emulate transparency */
+                       img->buf[off++] = (fg_r * opac + bg_r * (255 - opac)) / 256;
+                       img->buf[off++] = (fg_g * opac + bg_g * (255 - opac)) / 256;
+                       img->buf[off++] = (fg_b * opac + bg_b * (255 - opac)) / 256;
                }
        }