evas: filter: brightness: software brightness filter.
authornash <nash@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 1 May 2011 06:39:24 +0000 (06:39 +0000)
committernash <nash@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 1 May 2011 06:39:24 +0000 (06:39 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@59067 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/canvas/evas_filter.c

index 88a7d96..452c1ba 100644 (file)
@@ -1152,28 +1152,72 @@ greyscale_filter(Evas_Filter_Info *info __UNUSED__, RGBA_Image *src, RGBA_Image
 }
 
 static Eina_Bool
-brightness_filter(Evas_Filter_Info *info __UNUSED__, RGBA_Image *src, RGBA_Image *dst)
+brightness_filter(Evas_Filter_Info *info, RGBA_Image *src, RGBA_Image *dst)
 {
    uint32_t *in, *out;
    int i, j;
    int w, h;
+   int a,r,g,b;
+   int delta;
+   int adjdelta;
+   Evas_Filter_Info_Brightness *bness;
 
    in = src->image.data;
    out = dst->image.data;
    w = src->cache_entry.w;
    h = src->cache_entry.h;
+   bness = info->data;
 
-   for (i = 0; i < h; i++)
+   delta = bness->adjust * 255;
+   if (delta > 255)
+      delta = 255;
+   else if (delta < -255)
+      delta = -255;
+
+   /* Note we could optimise the -255, 0 and 255 cases, but why would people
+    * be doing that */
+   if (delta >= 0)
      {
-        for (j = 0; j < w; j++)
+       for (i = 0; i < h; i++)
+         {
+            for (j = 0; j < w; j++)
+              {
+                 a = A_VAL(in);
+                 r = R_VAL(in);
+                 g = G_VAL(in);
+                 b = B_VAL(in);
+                 adjdelta = (a * delta) >> 8;
+                 r = MIN(r + adjdelta, 255);
+                 g = MIN(g + adjdelta, 255);
+                 b = MIN(b + adjdelta, 255);
+                 *out = ARGB_JOIN(a, r ,g, b);
+                 out++;
+                 in++;
+              }
+         }
+     }
+   else
+     {
+        /* Delta negative */
+        for (i = 0; i < h; i++)
           {
-             // FIXME: not even implemented
-             out++;
-             in++;
+             for (j = 0; j < w; j++)
+               {
+                  a = A_VAL(in);
+                  r = R_VAL(in);
+                  g = G_VAL(in);
+                  b = B_VAL(in);
+                  adjdelta = (a * delta) >> 8;
+                  r = MAX(r - adjdelta, 0);
+                  g = MAX(g - adjdelta, 0);
+                  b = MAX(b - adjdelta, 0);
+                  *out = ARGB_JOIN(a, r ,g, b);
+                  out++;
+                  in++;
+               }
           }
      }
 
-
    return EINA_TRUE;
 
 }