implement softlight as gimp does and not as the docs state. Fix test02 for good
authorStephane Delcroix <stephane@delcroix.org>
Mon, 16 Mar 2009 12:02:03 +0000 (13:02 +0100)
committerStephane Delcroix <stephane@delcroix.org>
Mon, 16 Mar 2009 12:02:03 +0000 (13:02 +0100)
io-xcf.c

index 1a91e56..68ea51c 100644 (file)
--- a/io-xcf.c
+++ b/io-xcf.c
@@ -323,6 +323,7 @@ screen (guchar *rgb0, guchar *rgb1)
 void
 overlay (guchar *rgb0, guchar *rgb1)
 {
+       //FIXME
        //LOG ("Overlay (%d %d %d) (%d %d %d) : ", rgb0[0], rgb0[1], rgb0[2], rgb1[0], rgb1[1], rgb1[2]);
        rgb1[0] = MIN (0xff, ((0xff - rgb1[0]) * rgb0[0] * rgb0[0] / 0xff + rgb0[0] * (0xff - (0xff - rgb1[0]) * (0xff - rgb1[0]) / 0xff)) / 0xff);
        rgb1[1] = MIN (0xff, ((0xff - rgb1[1]) * rgb0[1] * rgb0[1] / 0xff + rgb0[1] * (0xff - (0xff - rgb1[1]) * (0xff - rgb1[1]) / 0xff)) / 0xff);
@@ -404,6 +405,17 @@ hardlight (guchar *rgb0, guchar *rgb1) //if x2 < 0.5 then 2*x1*x2 else 1-2*(1-x1
        rgb1[2] = rgb1[2] < 0x80 ? 2 * rgb0[2] * rgb1[2] / 0xff : 0xff - 2 * (0xff - rgb0[2]) * (0xff - rgb1[2])/ 0xff;
 }
 
+void
+softlight(guchar *rgb0, guchar *rgb1)
+{
+       //FIXME
+       //LOG ("Softlight (%d %d %d) (%d %d %d) : ", rgb0[0], rgb0[1], rgb0[2], rgb1[0], rgb1[1], rgb1[2]);
+       rgb1[0] = ((0xff - rgb0[0]) * rgb0[0] * rgb1[0] / 0xff + rgb0[0] * (0xff - (0xff - rgb1[0]) * (0xff - rgb0[0]) / 0x100)) / 0x100;
+       rgb1[1] = ((0xff - rgb0[1]) * rgb0[1] * rgb1[1] / 0xff + rgb0[1] * (0xff - (0xff - rgb1[1]) * (0xff - rgb0[1]) / 0x100)) / 0x100;
+       rgb1[2] = ((0xff - rgb0[2]) * rgb0[2] * rgb1[2] / 0xff + rgb0[2] * (0xff - (0xff - rgb1[2]) * (0xff - rgb0[2]) / 0x100)) / 0x100;
+       //LOG ("(%d %d %d)\n", rgb1[0], rgb1[1], rgb1[2]);      
+}
+
 void
 grainextract (guchar *rgb0, guchar *rgb1) //x1-x2+.5
 {
@@ -583,7 +595,6 @@ composite (gchar *pixbuf_pixels, int rowstride, gchar *tile_pixels, int ox, int
                        }
                break;
        case LAYERMODE_OVERLAY:
-       case LAYERMODE_SOFTLIGHT:
                f = overlay;
                for (j=0;j<th;j++)
                        for (i=0;i<tw;i++) {
@@ -594,6 +605,17 @@ composite (gchar *pixbuf_pixels, int rowstride, gchar *tile_pixels, int ox, int
                                blend (dest, src);
                        }
                break;
+       case LAYERMODE_SOFTLIGHT:
+               f = softlight;
+               for (j=0;j<th;j++)
+                       for (i=0;i<tw;i++) {
+                               guchar *dest = pixbuf_pixels + origin + j * rowstride + 4 * i;
+                               guchar *src = tile_pixels + j*tw*4 + i*4;
+                               f (dest, src);
+                               src[3] = MIN (dest[3], src[3]);
+                               blend (dest, src);
+                       }
+               break;
        case LAYERMODE_DIFFERENCE:
                f = difference;
                for (j=0;j<th;j++)