Author: Carlos Lopez <genet...@gmail.com> Date: Sat Jul 14 12:28:52 2012 +0200
Layer_Bitmap: new get_cairocolor. For use with CairoSurface. --- synfig-core/src/synfig/layer_bitmap.cpp | 74 +++++++++++++++++++++++++++++++ synfig-core/src/synfig/layer_bitmap.h | 1 + 2 files changed, 75 insertions(+), 0 deletions(-) diff --git a/synfig-core/src/synfig/layer_bitmap.cpp b/synfig-core/src/synfig/layer_bitmap.cpp index 1bf6175..c5d51dc 100644 --- a/synfig-core/src/synfig/layer_bitmap.cpp +++ b/synfig-core/src/synfig/layer_bitmap.cpp @@ -278,6 +278,80 @@ synfig::Layer_Bitmap::get_color(Context context, const Point &pos)const return context.get_color(pos); } + +CairoColor +synfig::Layer_Bitmap::get_cairocolor(Context context, const Point &pos)const +{ + Point surface_pos; + + if(!get_amount()) + return context.get_cairocolor(pos); + + surface_pos=pos-tl; + + surface_pos[0]/=br[0]-tl[0]; + if(surface_pos[0]<=1.0 && surface_pos[0]>=0.0) + { + surface_pos[1]/=br[1]-tl[1]; + if(surface_pos[1]<=1.0 && surface_pos[1]>=0.0) + { + if (trimmed) + { + surface_pos[0]*=width; + surface_pos[1]*=height; + + if (surface_pos[0] > left+surface.get_w() || surface_pos[0] < left || surface_pos[1] > top+surface.get_h() || surface_pos[1] < top) + return context.get_cairocolor(pos); + + surface_pos[0] -= left; + surface_pos[1] -= top; + } + else + { + surface_pos[0]*=surface.get_w(); + surface_pos[1]*=surface.get_h(); + } + + CairoColor ret(CairoColor::alpha()); + + switch(c) + { + case 6: // Undefined + case 5: // Undefined + case 4: // Undefined + case 3: // Cubic + ret=cairosurface.cubic_sample(surface_pos[0],surface_pos[1]); + break; + + case 2: // Cosine + ret=cairosurface.cosine_sample(surface_pos[0],surface_pos[1]); + break; + case 1: // Linear + ret=cairosurface.linear_sample(surface_pos[0],surface_pos[1]); + break; + case 0: // Nearest Neighbor + default: + { + int x(min(cairosurface.get_w()-1,max(0,round_to_int(surface_pos[0])))); + int y(min(cairosurface.get_h()-1,max(0,round_to_int(surface_pos[1])))); + ret= cairosurface[y][x]; + } + break; + } + + ret=filter(ret); + + if(get_amount()==1 && get_blend_method()==Color::BLEND_STRAIGHT) + return ret; + else + return CairoColor::blend(ret,context.get_cairocolor(pos),get_amount(),get_blend_method()); + } + } + + return context.get_cairocolor(pos); +} + + bool Layer_Bitmap::accelerated_render(Context context,Surface *out_surface,int quality, const RendDesc &renddesc, ProgressCallback *cb) const { diff --git a/synfig-core/src/synfig/layer_bitmap.h b/synfig-core/src/synfig/layer_bitmap.h index b101439..1b907b3 100644 --- a/synfig-core/src/synfig/layer_bitmap.h +++ b/synfig-core/src/synfig/layer_bitmap.h @@ -65,6 +65,7 @@ public: virtual ValueBase get_param(const String & param)const; virtual Color get_color(Context context, const Point &pos)const; + virtual CairoColor get_cairocolor(Context context, const Point &pos)const; virtual Vocab get_param_vocab()const; ------------------------------------------------------------------------------ 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