From f533df23fb1cd3044aaa02bf74625e9b53c032c1 Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Thu, 23 Jan 2014 17:57:37 +0000 Subject: mosaic node --- rotord/src/nodes_drawing.h | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) (limited to 'rotord/src/nodes_drawing.h') diff --git a/rotord/src/nodes_drawing.h b/rotord/src/nodes_drawing.h index f4ddbf7..7e7a178 100644 --- a/rotord/src/nodes_drawing.h +++ b/rotord/src/nodes_drawing.h @@ -201,39 +201,44 @@ namespace Rotor { class Mosaic: public Draw_node { //the difficulty here is in keeping the pixels centred //the center of the screen should remain in between pixels - //this implies that the public: Mosaic(){ title="Mosaic"; description="Increases size of pixels"; create_image_input("Image to mosaic","Image input"); - create_parameter("pixels","number","Height of scrren in pixels","Pixels",20.0,0.0,1.0); + create_parameter("pixels","number","Height of screen in pixels","Pixels",20.0,0.0,1.0); NODEID="a33a1a6a-8420-11e3-831b-74d02b29f6a6"; }; - Mosaic(map &settings):Shape() { + Mosaic(map &settings):Mosaic() { base_settings(settings); }; ~Mosaic(){}; Mosaic* clone(map &_settings) { return new Mosaic(_settings);}; void vector_output(cairo_t * cr,const Frame_spec &frame){ - colour=Colour(attributes["colour"]->value); - cairo_set_source_rgb(cr, colour.Rdouble(),colour.Gdouble(),colour.Bdouble()); - switch(attributes["shape"]->intVal) { - case SHAPE_square: - cairo_rectangle(cr,-frame.w/2,-frame.w/2,frame.w,frame.w); - break; - case SHAPE_circle: - cairo_arc(cr,0,0,frame.w/2,0.0, 2 * M_PI); - break; - case SHAPE_triangle: - //subtracting PI/2 =(1.5*PI)/3 so the triangle is pointing up - cairo_line_to(cr,0,-frame.w/2); - cairo_line_to(cr,cos((0.5 * M_PI)/3)*frame.w/2,sin((0.5 * M_PI)/3)*frame.w/2); - cairo_line_to(cr,cos((2.5 * M_PI)/3)*frame.w/2,sin((2.5 * M_PI)/3)*frame.w/2); - cairo_close_path(cr); - break; + double vpix=max(parameters["pixels"]->value,1.0); + double pixel_size=frame.h/vpix; + int h_padded=ceil(vpix/2)*2; + int w_padded=ceil((((vpix/frame.h)*frame.w))/2)*2; + + Image *in1=image_inputs[0]->get(frame); + if (in1){ + Image in=*(in1); + in.crop(w_padded*pixel_size,h_padded*pixel_size); + in.resize(w_padded,h_padded); + int x_start=-((w_padded*pixel_size)/2); + int y_start=-((h_padded*pixel_size)/2); + cairo_translate(cr,x_start,y_start); + for (int i=0;i