From de7b6472c31671f28708ff9ee71d6546811ed809 Mon Sep 17 00:00:00 2001 From: pacien Date: Sat, 2 Dec 2017 20:36:29 +0100 Subject: Impl. canvas blending Signed-off-by: pacien --- src/blender/blender.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src') diff --git a/src/blender/blender.c b/src/blender/blender.c index 0e0835d..738811d 100644 --- a/src/blender/blender.c +++ b/src/blender/blender.c @@ -1,6 +1,7 @@ #include "blender/blender.h" #include #include +#include "morpher/morpher.h" static ColorComponent blend_components(ColorComponent origin, ColorComponent target, TimeVector frame) { return (ColorComponent) sqrt((TIME_UNIT - frame) * pow(origin, 2) + frame * pow(target, 2)); @@ -13,3 +14,31 @@ Color blender_blend_colors(Color origin, Color target, TimeVector frame) { blend_components(origin.rgba.b, target.rgba.b, frame), blend_components(origin.rgba.a, target.rgba.a, frame)}}; } + +void blender_blend_canvas(Canvas *canvas, Canvas *source, Canvas *target, Morphing *morphing, TimeVector frame) { + IntVector flat_dim; + CartesianVector dim, point; + CartesianMapping mapping; + Color pixel; + + dim = morpher_get_dim(morphing); + + assert(dim.x > 0 && dim.y > 0); + assert(vector_equals(dim, canvas_get_dim(canvas))); + assert(vector_equals(dim, canvas_get_dim(source))); + assert(vector_equals(dim, canvas_get_dim(target))); + assert(frame >= TIME_ORIGIN && frame <= TIME_UNIT); + + for (flat_dim = (dim.x - 1) * (dim.y - 1); flat_dim >= 0; --flat_dim) { + point.x = flat_dim % dim.y; + point.y = flat_dim / dim.y; + + mapping = morpher_get_point_mapping(morphing, point, frame); + + pixel = blender_blend_colors(canvas_get_pixel(source, mapping.origin), + canvas_get_pixel(target, mapping.target), + frame); + + canvas_set_pixel(canvas, point, pixel); + } +} -- cgit v1.2.3