All pastes #291251 Raw Edit

Mine

public text v1 · immutable
#291251 ·published 2006-12-24 23:22 UTC
rendered paste body
Index: PixbufUtils.cs
===================================================================
RCS file: /cvs/gnome/f-spot/src/PixbufUtils.cs,v
retrieving revision 1.80
diff -u -p -r1.80 PixbufUtils.cs
--- PixbufUtils.cs      23 Dec 2006 02:26:26 -0000      1.80
+++ PixbufUtils.cs      24 Dec 2006 23:21:36 -0000
@@ -345,6 +345,7 @@ class PixbufUtils {
                Marshal.Copy (data, content, 0, (int)length);

                return content;
+#endif
        }

        public static Pixbuf TagIconFromPixbuf (Pixbuf source)
@@ -576,17 +577,47 @@ class PixbufUtils {
                return ret;
        }

+#if OLDREDEYE
        [DllImport ("libfspot")]
        static extern void f_pixbuf_remove_redeye (IntPtr src);
-
+
        public static Gdk.Pixbuf RemoveRedeye (Gdk.Pixbuf src, Gdk.Rectangle area)
+#else
+       public unsafe static Gdk.Pixbuf RemoveRedeye (Gdk.Pixbuf src, Gdk.Rectangle area)
+#endif
        {
                Gdk.Pixbuf copy = src.Copy ();
                Gdk.Pixbuf selection = new Gdk.Pixbuf (copy, area.X, area.Y, area.Width, area.Height);
-
+#if OLREDEYE
                f_pixbuf_remove_redeye (selection.Handle);
                selection.Dispose ();
+#else
+               byte *spix = (byte *)selection.Pixels;
+               int h = selection.Height;
+               int w = selection.Width;
+               int channels = src.NChannels;
+
+               double RED_FACTOR = 0.5133333;
+               double GREEN_FACTOR = 1;
+               double BLUE_FACTOR = 0.1933333;
+               int THRESHOLD = -15;
+
+               for (int j = 0; j < h; j++) {
+                       byte *s = spix;
+                       for (int i = 0; i < w; i++) {
+                               int adjusted_red = (int)(s[0] * RED_FACTOR);
+                               int adjusted_green = (int)(s[1] * GREEN_FACTOR);
+                               int adjusted_blue = (int)(s[2] * BLUE_FACTOR);
+
+                               if (adjusted_red >= adjusted_green - THRESHOLD
+                                   && adjusted_red >= adjusted_blue - THRESHOLD)
+                                       s[0] = (byte)(((double)(adjusted_green + adjusted_blue)) / (2.0 * RED_FACTOR));
+                               s += channels;
+                       }
+                       spix += selection.Rowstride;
+               }

+#endif
                return copy;
        }