Author: Carlos Lopez <genet...@gmail.com> Date: Mon Aug 13 12:24:37 2012 +0200
Layer_Polygon: initial version for Cairo render. No feather support yet. Needed to expose some private members of Layer_Shape to Polygon_Layer in order to use them in the render procedure --- synfig-core/src/synfig/layer_polygon.cpp | 86 ++++++++++++++++++++++++++++++ synfig-core/src/synfig/layer_polygon.h | 2 + synfig-core/src/synfig/layer_shape.h | 6 +- 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/synfig-core/src/synfig/layer_polygon.cpp b/synfig-core/src/synfig/layer_polygon.cpp index 9060dad..c46f1a2 100644 --- a/synfig-core/src/synfig/layer_polygon.cpp +++ b/synfig-core/src/synfig/layer_polygon.cpp @@ -179,3 +179,89 @@ Layer_Polygon::get_param_vocab()const return ret; } + + +///////// +bool +Layer_Polygon::accelerated_cairorender(Context context,cairo_surface_t *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const +{ + synfig::info("rendering Cairo polygon"); + + // Grab the rgba values + const float r(color.get_r()); + const float g(color.get_g()); + const float b(color.get_b()); + const float a(color.get_a()); + + // Window Boundaries + const Point tl(renddesc.get_tl()); + const Point br(renddesc.get_br()); + const int w(renddesc.get_w()); + const int h(renddesc.get_h()); + + // Width and Height of a pixel + const Real pw = (br[0] - tl[0]) / w; + const Real ph = (br[1] - tl[1]) / h; + + // These are the scale and translation values + const double sx(1/pw); + const double sy(1/ph); + const double tx((-tl[0]+origin[0])*sx); + const double ty((-tl[1]+origin[1])*sy); + + cairo_t* cr=cairo_create(surface); + // Let's render the polygon in other surface + // Initially I'll fill it completely with the alpha color + // Create a similar image with the same dimensions than the current renddesc + cairo_surface_t* subimage=cairo_surface_create_similar(surface, CAIRO_CONTENT_COLOR_ALPHA, renddesc.get_w(), renddesc.get_h()); + cairo_t* subcr=cairo_create(subimage); + cairo_save(subcr); + cairo_set_source_rgba(subcr, r, g, b, a); + // Now let's check if it is inverted + if(invert) + { + cairo_paint(subcr); + } + // Draw the polygon + cairo_save(subcr); + cairo_translate(subcr, tx , ty); + cairo_scale(subcr, sx, sy); + int i,pointcount=vector_list.size(); + for(i=0;i<pointcount; i++) + { + cairo_line_to(subcr, vector_list[i][0], vector_list[i][1]); + } + cairo_close_path(subcr); + if(invert) + cairo_set_operator(subcr, CAIRO_OPERATOR_CLEAR); + else + cairo_set_operator(subcr, CAIRO_OPERATOR_OVER); + + cairo_fill(subcr); + cairo_restore(subcr); + + // ADD FEATHER HERE + + // Put the polygon on the surface + if(!is_solid_color()) // we need to render the context before + if(!context.accelerated_cairorender(surface,quality,renddesc,cb)) + { + if(cb) + cb->error(strprintf(__FILE__"%d: Accelerated Cairo Renderer Failure",__LINE__)); + cairo_destroy(cr); + cairo_destroy(subcr); + cairo_surface_destroy(subimage); + return false; + } + cairo_set_source_surface(cr, subimage, 0, 0); + cairo_set_operator(cr, CAIRO_OPERATOR_OVER); // TODO: this has to be the real operator + cairo_paint_with_alpha(cr, get_amount()); + cairo_restore(cr); + cairo_surface_destroy(subimage); + cairo_destroy(subcr); + cairo_destroy(cr); + + return true; +} + +///////// diff --git a/synfig-core/src/synfig/layer_polygon.h b/synfig-core/src/synfig/layer_polygon.h index 262c91b..8294648 100644 --- a/synfig-core/src/synfig/layer_polygon.h +++ b/synfig-core/src/synfig/layer_polygon.h @@ -88,6 +88,8 @@ public: private: class PolySpan; bool render_polyspan(Surface *surface,PolySpan &polyspan)const; + virtual bool accelerated_cairorender(Context context,cairo_surface_t *surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const; + }; // END of Layer_Polygon }; // END of namespace synfig diff --git a/synfig-core/src/synfig/layer_shape.h b/synfig-core/src/synfig/layer_shape.h index 1b20d52..5655cfd 100644 --- a/synfig-core/src/synfig/layer_shape.h +++ b/synfig-core/src/synfig/layer_shape.h @@ -62,9 +62,9 @@ private: //internal caching struct Intersector; Intersector *edge_table; - +protected: //exported data - Color color; + Color color; Point origin; bool invert; @@ -73,7 +73,7 @@ private: int blurtype; Real feather; WindingStyle winding_style; - +private: std::vector< char > bytestream; //for use in creating the bytestream ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Synfig-devl mailing list Synfig-devl@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/synfig-devl