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 +++++++++++++++++++++++++++++ test/blender/blender.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 3 deletions(-) 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); + } +} diff --git a/test/blender/blender.c b/test/blender/blender.c index 344ce04..9a43db0 100644 --- a/test/blender/blender.c +++ b/test/blender/blender.c @@ -2,14 +2,37 @@ #include static void test_color_blending() { - Color a = {{0xFF, 0xED, 0x00, 0x00}}; - Color b = {{0x00, 0x47, 0xAB, 0x00}}; - Color result = blender_blend_colors(a, b, 0.125); + Color origin = {{0xFF, 0xED, 0x00, 0x00}}; + Color target = {{0x00, 0x47, 0xAB, 0x00}}; + Color result = blender_blend_colors(origin, target, 0.125); assert(color_equals(result, (Color) {{0xEE, 0xDF, 0x3C, 0x00}})); } +static void test_canvas_blending() { + Morphing morphing; + Canvas origin, target, result; + CartesianVector sample_point = {13, 17}; + + morpher_init(&morphing, 64, 64); + canvas_init(&origin, 64, 64); + canvas_init(&target, 64, 64); + canvas_init(&result, 64, 64); + + canvas_set_pixel(&origin, sample_point, (Color) {{0xFF, 0xED, 0x00, 0x00}}); + canvas_set_pixel(&target, sample_point, (Color) {{0x00, 0x47, 0xAB, 0x00}}); + + blender_blend_canvas(&result, &origin, &target, &morphing, 0.125); + assert(color_equals(canvas_get_pixel(&result, sample_point), (Color) {{0xEE, 0xDF, 0x3C, 0x00}})); + + canvas_free(&result); + canvas_free(&target); + canvas_free(&origin); + morpher_free(&morphing); +} + int main(int argc, char **argv) { test_color_blending(); + test_canvas_blending(); return 0; } -- cgit v1.2.3