add alpha blending... - lel - Farbfeld image viewer
 (HTM) git clone git://git.codemadness.org/lel
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ab9cbe037f3c83444be66af5531f2f4bc61cb0c4
 (DIR) parent 77d29cab890dd1623b96d445cf0b898ff8c09df8
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat,  2 Aug 2014 23:53:54 +0000
       
       add alpha blending...
       
       ... and add configurable background colour.
       
       Diffstat:
         M lel.c                               |      17 ++++++++++++-----
       
       1 file changed, 12 insertions(+), 5 deletions(-)
       ---
 (DIR) diff --git a/lel.c b/lel.c
       @@ -44,11 +44,14 @@ static struct img *cimg;
        static size_t nimgs;
        static int viewmode = ASPECT;
        static char *wintitle = APP_NAME;
       +static char *bgcolor = "#000000";
        static XImage *ximg = NULL;
        static Drawable xpix = 0;
        static Display *dpy = NULL;
       +static Colormap cmap;
        static Window win;
        static GC gc;
       +static XColor bg;
        static int screen, xfd;
        static int running = 1;
        static int winwidth = 0, winheight = 0;
       @@ -231,6 +234,7 @@ scale(unsigned int width, unsigned int height, unsigned int bytesperline,
        {
                unsigned char *ibuf;
                unsigned int jdy, dx, bufx, x, y;
       +        float a = 0.0f;
        
                jdy = bytesperline / 4 - width;
                dx = (cimg->width << 10) / width;
       @@ -239,9 +243,10 @@ scale(unsigned int width, unsigned int height, unsigned int bytesperline,
                        ibuf = &cimg->buf[y * cimg->height / height * cimg->width * 4];
        
                        for(x = 0; x < width; x++) {
       -                        *newbuf++ = (ibuf[(bufx >> 10)*4+2]);
       -                        *newbuf++ = (ibuf[(bufx >> 10)*4+1]);
       -                        *newbuf++ = (ibuf[(bufx >> 10)*4+0]);
       +                        a = (ibuf[(bufx >> 10)*4+3]) / 255.0f;
       +                        *newbuf++ = (ibuf[(bufx >> 10)*4+2] * a) + (bg.blue * (1 - a));
       +                        *newbuf++ = (ibuf[(bufx >> 10)*4+1] * a) + (bg.green * (1 - a));
       +                        *newbuf++ = (ibuf[(bufx >> 10)*4+0] * a) + (bg.red * (1 - a));
                                newbuf++;
                                bufx += dx;
                        }
       @@ -308,7 +313,7 @@ draw(void)
                        xoffset -= cimg->view.panxoffset;
                        yoffset -= cimg->view.panyoffset;
                }
       -        XSetForeground(dpy, gc, BlackPixel(dpy, 0));
       +        XSetForeground(dpy, gc, bg.pixel);
                XFillRectangle(dpy, xpix, gc, 0, 0, winwidth, winheight);
                XPutImage(dpy, xpix, gc, ximg, 0, 0, xoffset, yoffset, ximg->width, ximg->height);
                XCopyArea(dpy, xpix, win, gc, 0, 0, winwidth, winheight, 0, 0);
       @@ -513,7 +518,9 @@ setup(void)
                                    DefaultDepth(dpy, screen), InputOutput,
                                    CopyFromParent, 0, NULL);
                gc = XCreateGC(dpy, win, 0, NULL);
       -
       +        cmap = DefaultColormap(dpy, screen);
       +        if(!XAllocNamedColor(dpy, cmap, bgcolor, &bg, &bg))
       +                die("cannot allocate color\n");
                XStoreName(dpy, win, wintitle);
                XSelectInput(dpy, win, StructureNotifyMask | ExposureMask | KeyPressMask |
                                       ButtonPressMask);