gimp r27410 - in trunk: . app/gegl



Author: martinn
Date: Sun Oct 26 08:39:41 2008
New Revision: 27410
URL: http://svn.gnome.org/viewvc/gimp?rev=27410&view=rev

Log:
* app/gegl/gimpoperationpointlayermode.c: Implemented Grain
Extract and Grain Merge. Also corrected the formula for Divide.

Works the same for 100% opaque layers:
 o Grain Extract
 o Grain Merge


Modified:
   trunk/ChangeLog
   trunk/app/gegl/gimpoperationpointlayermode.c

Modified: trunk/app/gegl/gimpoperationpointlayermode.c
==============================================================================
--- trunk/app/gegl/gimpoperationpointlayermode.c	(original)
+++ trunk/app/gegl/gimpoperationpointlayermode.c	Sun Oct 26 08:39:41 2008
@@ -173,9 +173,6 @@
 
   while (samples--)
     {
-      /* Alpha is treated the same */
-      out[A] = lay[A] + in[A] - lay[A] * in[A];
-
       switch (self->blend_mode)
         {
         case GIMP_NORMAL_MODE:
@@ -333,30 +330,46 @@
           break;
 
         case GIMP_SUBTRACT_MODE:
-          /* Derieved from SVG 1.2 formulas */
+          /* Derieved from SVG 1.2 formulas, f(Sc, Dc) = Dc - Sc */
           out[R] = in[R] + lay[R] - 2 * lay[R] * in[A];
           out[G] = in[G] + lay[G] - 2 * lay[G] * in[A];
           out[B] = in[B] + lay[B] - 2 * lay[B] * in[A];
           break;
 
+        case GIMP_GRAIN_EXTRACT_MODE:
+          /* Derieved from SVG 1.2 formulas, f(Sc, Dc) = Dc - Sc + 0.5 */
+          out[R] = in[R] + lay[R] - 2 * lay[R] * in[A] + 0.5 * in[A] * lay[A];
+          out[G] = in[G] + lay[G] - 2 * lay[G] * in[A] + 0.5 * in[A] * lay[A];
+          out[B] = in[B] + lay[B] - 2 * lay[B] * in[A] + 0.5 * in[A] * lay[A];
+          break;
+
+        case GIMP_GRAIN_MERGE_MODE:
+          /* Derieved from SVG 1.2 formulas, f(Sc, Dc) = Dc + Sc - 0.5 */
+          out[R] = in[R] + lay[R] - 0.5 * in[A] * lay[A];
+          out[G] = in[G] + lay[G] - 0.5 * in[A] * lay[A];
+          out[B] = in[B] + lay[B] - 0.5 * in[A] * lay[A];
+          break;
+
         case GIMP_DIVIDE_MODE:
-          /* Derieved from SVG 1.2 formulas */
-          out[R] = in[R] / lay[R] + lay[R] * (1 - in[A]) + in[R] * (1 - lay[A]);
-          out[G] = in[G] / lay[G] + lay[G] * (1 - in[A]) + in[G] * (1 - lay[A]);
-          out[B] = in[B] / lay[B] + lay[B] * (1 - in[A]) + in[B] * (1 - lay[A]);
+          /* Derieved from SVG 1.2 formulas, f(Sc, Dc) = Dc / Sc */
+          out[R] = in[R] * lay[A] * lay[A] / lay[R] + lay[R] * (1 - in[A]) + in[R] * (1 - lay[A]);
+          out[G] = in[G] * lay[A] * lay[A] / lay[G] + lay[G] * (1 - in[A]) + in[G] * (1 - lay[A]);
+          out[B] = in[B] * lay[A] * lay[A] / lay[B] + lay[B] * (1 - in[A]) + in[B] * (1 - lay[A]);
           break;
 
         case GIMP_HUE_MODE:
         case GIMP_SATURATION_MODE:
         case GIMP_COLOR_MODE:
         case GIMP_VALUE_MODE:
-        case GIMP_GRAIN_EXTRACT_MODE:
-        case GIMP_GRAIN_MERGE_MODE:
-        case GIMP_COLOR_ERASE_MODE:
+          /* TODO */
+          break;
+
+
         case GIMP_ERASE_MODE:
-        case GIMP_REPLACE_MODE:
         case GIMP_ANTI_ERASE_MODE:
-          /* TODO */
+        case GIMP_COLOR_ERASE_MODE:
+        case GIMP_REPLACE_MODE:
+          /* Icky eraser and paint modes */
           break;
 
 
@@ -370,6 +383,9 @@
           break;
         }
 
+      /* Alpha is treated the same */
+      out[A] = lay[A] + in[A] - lay[A] * in[A];
+
       in  += 4;
       lay += 4;
       out += 4;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]