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

Reply via email to