From e43825e73848079880f1b7ac250bb7dc96dff1f7 Mon Sep 17 00:00:00 2001 From: Stephane Delcroix Date: Mon, 16 Mar 2009 13:02:03 +0100 Subject: [PATCH] implement softlight as gimp does and not as the docs state. Fix test02 for good --- io-xcf.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/io-xcf.c b/io-xcf.c index 1a91e56..68ea51c 100644 --- 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