]> Dogcows Code - chaz/openbox/blobdiff - render/image.c
it doesn't work but its something
[chaz/openbox] / render / image.c
index 2c32cd127c0fc4ec11ee190272f9e9df627d41a3..1e76e6ba350bd46526d78007591107c6e5484111 100644 (file)
@@ -1,7 +1,8 @@
 /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
 
    image.c for the Openbox window manager
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2006        Mikael Magnusson
+   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
 #define FLOOR(i)        ((i) & (~0UL << FRACTION))
 #define AVERAGE(a, b)   (((((a) ^ (b)) & 0xfefefefeL) >> 1) + ((a) & (b)))
 
-static RrPixel32* scale_half(RrPixel32 *source, gint w, gint h)
-{
-    RrPixel32 *out, *dest, *sourceline, *sourceline2;
-    gint dw, dh, x, y;
-
-    sourceline = source;
-    sourceline2 = source + w;
-
-    dw = w >> 1;
-    dh = h >> 1;
-
-    out = dest = g_new(RrPixel32, dw * dh);
-
-    for (y = 0; y < dh; ++y) {
-        RrPixel32 *s, *s2;
-
-        s = sourceline;
-        s2 = sourceline2;
-
-        for (x = 0; x < dw; ++x) {
-            *dest++ = AVERAGE(AVERAGE(*s, *(s+1)),
-                              AVERAGE(*s2, *(s2+1)));
-            s += 2;
-            s2 += 2;
-        }
-        sourceline += w << 1;
-        sourceline2 += w << 1;
-    }
-    return out;
-}
-
 static void ImageCopyResampled(RrPixel32 *dst, RrPixel32 *src,
                                gulong dstW, gulong dstH,
                                gulong srcW, gulong srcH)
@@ -109,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;
                 }
             }
             
@@ -167,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.024405 seconds and 4 git commands to generate.