From b6d6b32a6f02965e1d088adaa6a0e051d620b878 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Tue, 12 Apr 2011 14:09:46 -0400 Subject: Fix up translucency semantics and API. --- libdimension/color.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'libdimension/color.c') diff --git a/libdimension/color.c b/libdimension/color.c index 2424e61..0b74adf 100644 --- a/libdimension/color.c +++ b/libdimension/color.c @@ -393,21 +393,42 @@ dmnsn_color_gradient(dmnsn_color c1, dmnsn_color c2, double n) return ret; } -/* Filters `color' through `filter' */ +/* Filters `light' through `filter' */ dmnsn_color -dmnsn_color_filter(dmnsn_color color, dmnsn_color filter) +dmnsn_filter_light(dmnsn_color light, dmnsn_color filter) { - dmnsn_color transmitted = dmnsn_color_mul(filter.trans, color); - dmnsn_color filtered = dmnsn_color_mul(filter.filter, - dmnsn_color_illuminate(filter, color)); - + dmnsn_color transmitted = dmnsn_color_mul(filter.trans, light); + dmnsn_color filtered = dmnsn_color_mul( + filter.filter, + dmnsn_color_illuminate(filter, light) + ); dmnsn_color ret = dmnsn_color_add(transmitted, filtered); - ret.filter = color.filter*dmnsn_color_intensity(filtered) - + filter.filter*color.trans + filter.trans*color.filter; - ret.trans = filter.trans*color.trans; + ret.filter = light.filter*dmnsn_color_intensity(filtered) + + filter.filter*light.trans + filter.trans*light.filter; + ret.trans = filter.trans*light.trans; + return ret; +} + +/* Adds the background contribution, `filtered', to `filter' */ +dmnsn_color +dmnsn_apply_translucency(dmnsn_color filtered, dmnsn_color filter) +{ + dmnsn_color ret = dmnsn_color_add( + dmnsn_color_mul(1.0 - (filter.filter + filter.trans), filter), + filtered + ); + ret.filter = filtered.filter; + ret.trans = filtered.trans; return ret; } +/* Adds the background contribution of `color' to `filter' */ +dmnsn_color +dmnsn_apply_filter(dmnsn_color color, dmnsn_color filter) +{ + return dmnsn_apply_translucency(dmnsn_filter_light(color, filter), filter); +} + /* Illuminates `color' with `light' */ dmnsn_color dmnsn_color_illuminate(dmnsn_color light, dmnsn_color color) -- cgit v1.2.3