gimp r27410 - in trunk: . app/gegl
- From: martinn svn gnome org
- To: svn-commits-list gnome org
- Subject: gimp r27410 - in trunk: . app/gegl
- Date: Sun, 26 Oct 2008 08:39:42 +0000 (UTC)
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]