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);
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
{
}
break;
case LAYERMODE_OVERLAY:
- case LAYERMODE_SOFTLIGHT:
f = overlay;
for (j=0;j<th;j++)
for (i=0;i<tw;i++) {
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++)