]> Dogcows Code - chaz/openbox/blobdiff - render/image.c
it doesn't work but its something
[chaz/openbox] / render / image.c
index e67077fa4d14a1d4ce99b6c65b75359d22f78b4a..1e76e6ba350bd46526d78007591107c6e5484111 100644 (file)
@@ -2,7 +2,7 @@
 
    image.c for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -79,11 +79,16 @@ static void ImageCopyResampled(RrPixel32 *dst, RrPixel32 *src,
                     portionXY = (portionX * portionY) >> FRACTION;
                     sumXY += portionXY;
                     
-                    pixel = *(src + (srcY >> FRACTION) * srcW + (srcX >> FRACTION));
-                    red   += ((pixel >> RrDefaultRedOffset)   & 0xFF) * portionXY;
-                    green += ((pixel >> RrDefaultGreenOffset) & 0xFF) * portionXY;
-                    blue  += ((pixel >> RrDefaultBlueOffset)  & 0xFF) * portionXY;
-                    alpha += ((pixel >> RrDefaultAlphaOffset) & 0xFF) * portionXY;
+                    pixel = *(src + (srcY >> FRACTION) * srcW
+                            + (srcX >> FRACTION));
+                    red   += ((pixel >> RrDefaultRedOffset)   & 0xFF)
+                             * portionXY;
+                    green += ((pixel >> RrDefaultGreenOffset) & 0xFF)
+                             * portionXY;
+                    blue  += ((pixel >> RrDefaultBlueOffset)  & 0xFF)
+                             * portionXY;
+                    alpha += ((pixel >> RrDefaultAlphaOffset) & 0xFF)
+                             * portionXY;
                 }
             }
             
@@ -137,14 +142,18 @@ void RrImageDraw(RrPixel32 *target, RrTextureRGBA *rgba,
         source = rgba->data;
     }
 
-    /* copy source -> dest, and apply the alpha channel */
+    /* copy source -> dest, and apply the alpha channel.
+
+       center the image if it is smaller than the area */
     col = 0;
     num_pixels = dw * dh;
-    dest = target + area->x + target_w * area->y;
+    dest = target + area->x + (area->width - dw) / 2 +
+        (target_w * (area->y + (area->height - dh) / 2));
     while (num_pixels-- > 0) {
         guchar alpha, r, g, b, bgr, bgg, bgb;
 
-        alpha = *source >> RrDefaultAlphaOffset;
+        /* apply the rgba's opacity as well */
+        alpha = ((*source >> RrDefaultAlphaOffset) * rgba->alpha >> 8) & 0xff;
         r = *source >> RrDefaultRedOffset;
         g = *source >> RrDefaultGreenOffset;
         b = *source >> RrDefaultBlueOffset;
This page took 0.024765 seconds and 4 git commands to generate.