Author: Carlos Lopez <[email protected]>
Date:   Tue Sep 25 20:21:11 2012 +0200

Halftone3: Add support for Cairo render

---

 synfig-core/src/modules/mod_filter/halftone3.cpp |   69 ++++++++++++++++++++++
 synfig-core/src/modules/mod_filter/halftone3.h   |    1 +
 2 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/synfig-core/src/modules/mod_filter/halftone3.cpp 
b/synfig-core/src/modules/mod_filter/halftone3.cpp
index 8b9c841..f62f56d 100644
--- a/synfig-core/src/modules/mod_filter/halftone3.cpp
+++ b/synfig-core/src/modules/mod_filter/halftone3.cpp
@@ -409,3 +409,72 @@ Halftone3::accelerated_render(Context context,Surface 
*surface,int quality, cons
 
        return true;
 }
+
+////
+bool
+Halftone3::accelerated_cairorender(Context context,cairo_surface_t 
*surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const
+{
+       SuperCallback supercb(cb,0,9500,10000);
+       
+       if(!context.accelerated_cairorender(surface,quality,renddesc,&supercb))
+               return false;
+       if(get_amount()==0)
+               return true;
+       
+       CairoSurface csurface(surface);
+       if(!csurface.map_cairo_image())
+               return false;
+       const Real pw(renddesc.get_pw()),ph(renddesc.get_ph());
+       const Point tl(renddesc.get_tl());
+       const int w(csurface.get_w());
+       const int h(csurface.get_h());
+       const float supersample_size(abs(pw/(tone[0].size).mag()));
+       
+       CairoSurface::pen pen(csurface.begin());
+       Point pos;
+       int x,y;
+       
+       if(is_solid_color())
+       {
+               
for(y=0,pos[1]=tl[1];y<h;y++,pen.inc_y(),pen.dec_x(x),pos[1]+=ph)
+                       for(x=0,pos[0]=tl[0];x<w;x++,pen.inc_x(),pos[0]+=pw)
+                               pen.put_value(
+                                       CairoColor(color_func(
+                                                       pos,
+                                                       supersample_size,
+                                                       
Color(pen.get_value().demult_alpha())
+                                                       )).premult_alpha()
+                               );
+       }
+       else
+       {
+               
for(y=0,pos[1]=tl[1];y<h;y++,pen.inc_y(),pen.dec_x(x),pos[1]+=ph)
+                       for(x=0,pos[0]=tl[0];x<w;x++,pen.inc_x(),pos[0]+=pw)
+                       {
+                               Color val=Color(pen.get_value().demult_alpha());
+                               pen.put_value(
+                                         CairoColor(Color::blend(
+                                                                 color_func(
+                                                                               
         pos,
+                                                                               
         supersample_size,
+                                                                               
         val
+                                                                               
         ),
+                                                                 val,
+                                                                 get_amount(),
+                                                                 
get_blend_method()
+                                                                 ).clamped()
+                                                ).premult_alpha()
+                               );
+                       }
+               
+       }
+       
+       csurface.unmap_cairo_image();
+       // Mark our progress as finished
+       if(cb && !cb->amount_complete(10000,10000))
+               return false;
+       
+       return true;
+}
+
+////
diff --git a/synfig-core/src/modules/mod_filter/halftone3.h 
b/synfig-core/src/modules/mod_filter/halftone3.h
index 3f19013..73902a9 100644
--- a/synfig-core/src/modules/mod_filter/halftone3.h
+++ b/synfig-core/src/modules/mod_filter/halftone3.h
@@ -72,6 +72,7 @@ public:
        virtual ValueBase get_param(const String &param)const;
        virtual Color get_color(Context context, const Point &pos)const;
        virtual bool accelerated_render(Context context,Surface *surface,int 
quality, const RendDesc &renddesc, ProgressCallback *cb)const;
+       virtual bool accelerated_cairorender(Context context,cairo_surface_t 
*surface,int quality, const RendDesc &renddesc, ProgressCallback *cb)const;
        Layer::Handle hit_check(Context context, const Point &point)const;
        virtual Vocab get_param_vocab()const;
        virtual bool reads_context()const { return true; }


------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to