Author: Carlos Lopez <[email protected]>
Date:   Sat Mar  9 10:23:22 2013 +0100

Effectively use the Cairo render on work area.

---

 synfig-studio/src/gui/workarea.cpp                 |   12 ++++++-
 synfig-studio/src/gui/workarea.h                   |    1 +
 .../src/gui/workarearenderer/renderer_canvas.cpp   |   36 ++++++++++++++++++-
 .../src/gui/workarearenderer/renderer_canvas.h     |    2 +
 4 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/synfig-studio/src/gui/workarea.cpp 
b/synfig-studio/src/gui/workarea.cpp
index 5dde3de..81f91ca 100644
--- a/synfig-studio/src/gui/workarea.cpp
+++ b/synfig-studio/src/gui/workarea.cpp
@@ -2592,7 +2592,17 @@ studio::WorkArea::async_update_preview()
        // if we have lots of pixels to render and the tile renderer isn't 
disabled, use it
        int div;
        div = low_resolution ? low_res_pixel_size : 1;
-       if ((w*h > 240*div*135*div && !getenv("SYNFIG_DISABLE_TILE_RENDER")) || 
getenv("SYNFIG_FORCE_TILE_RENDER"))
+       if(studio::App::workarea_uses_cairo)
+       {
+               // do a Cairo render
+               handle<WorkAreaTarget_Cairo> trgt(new class 
WorkAreaTarget_Cairo(this,w,h));
+               
+               trgt->set_rend_desc(&desc);
+               trgt->set_onion_skin(get_onion_skin(), onion_skins);
+               target=trgt;
+
+       }
+       else if ((w*h > 240*div*135*div && 
!getenv("SYNFIG_DISABLE_TILE_RENDER")) || getenv("SYNFIG_FORCE_TILE_RENDER"))
        {
                // do a tile render
                handle<WorkAreaTarget> trgt(new class WorkAreaTarget(this,w,h));
diff --git a/synfig-studio/src/gui/workarea.h b/synfig-studio/src/gui/workarea.h
index 313a6d0..667fe2f 100644
--- a/synfig-studio/src/gui/workarea.h
+++ b/synfig-studio/src/gui/workarea.h
@@ -288,6 +288,7 @@ public:
        const etl::loose_handle<synfig::ValueNode>& get_selected_value_node() { 
return  selected_value_node_; }
        const synfig::Point& get_drag_point()const { return drag_point; }
        std::vector< std::pair<Glib::RefPtr<Gdk::Pixbuf>,int> >& 
get_tile_book(){ return tile_book; }
+       SurfaceBook& get_cairo_book() { return cairo_book; }
        int get_refreshes()const { return refreshes; }
        bool get_canceled()const { return canceled_; }
        bool get_queued()const { return queued; }
diff --git a/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp 
b/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
index 0477f7d..90d9880 100644
--- a/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
+++ b/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
@@ -32,11 +32,11 @@
 #endif
 
 #include "renderer_canvas.h"
-#include "workarea.h"
 #include <ETL/misc>
 #include <gdkmm/general.h>
 
 #include "general.h"
+#include "app.h"
 
 #endif
 
@@ -64,6 +64,12 @@ Renderer_Canvas::get_tile_book()
        return get_work_area()->get_tile_book();
 }
 
+studio::WorkArea::SurfaceBook&
+Renderer_Canvas::get_cairo_book()
+{
+       return get_work_area()->get_cairo_book();
+}
+
 bool
 Renderer_Canvas::get_full_frame()const
 {
@@ -108,6 +114,7 @@ Renderer_Canvas::render_vfunc(
        const synfig::Vector focus_point(get_work_area()->get_focus_point());
 
        std::vector< std::pair<Glib::RefPtr<Gdk::Pixbuf>,int> >& 
tile_book(get_tile_book());
+       WorkArea::SurfaceBook& cairo_book(get_cairo_book());
 
        int drawable_w,drawable_h;
        drawable->get_size(drawable_w,drawable_h);
@@ -133,8 +140,33 @@ Renderer_Canvas::render_vfunc(
 
        Glib::RefPtr<Gdk::GC> gc(Gdk::GC::create(drawable));
        Cairo::RefPtr<Cairo::Context> cr = drawable->create_cairo_context();
+       if(studio::App::workarea_uses_cairo)
+       {
+               if(!cairo_book.empty())
+               {
+                       if(cairo_book[0].surface)
+                       {
+                               int div;
+                               cr->save();
+                               if(get_work_area()->get_low_resolution_flag())
+                               {
+                                       div = 
get_work_area()->get_low_res_pixel_size();
+                                       cr->scale(div, div);
+                               }
+                               else
+                                       div=1;
+                               cairo_set_source_surface(cr->cobj(), 
cairo_book[0].surface, round_to_int(x)/div, round_to_int(y)/div);
+                               
cairo_pattern_set_filter(cairo_get_source(cr->cobj()), CAIRO_FILTER_NEAREST);
+                               cr->paint();
+                               cr->restore();
+                       }
+               }
+               if(cairo_book[0].refreshes!=get_refreshes() && 
get_canceled()==false && get_rendering()==false && get_queued()==false)
+                  get_work_area()->async_update_preview();
 
-       if(!tile_book.empty())
+                  
+       }
+       else if(!tile_book.empty())
        {
                if(get_full_frame())
                {
diff --git a/synfig-studio/src/gui/workarearenderer/renderer_canvas.h 
b/synfig-studio/src/gui/workarearenderer/renderer_canvas.h
index ad2509e..02f345a 100644
--- a/synfig-studio/src/gui/workarearenderer/renderer_canvas.h
+++ b/synfig-studio/src/gui/workarearenderer/renderer_canvas.h
@@ -28,6 +28,7 @@
 /* === H E A D E R S ======================================================= */
 
 #include "workarearenderer.h"
+#include "workarea.h"
 #include <vector>
 
 /* === M A C R O S ========================================================= */
@@ -45,6 +46,7 @@ public:
        ~Renderer_Canvas();
 
        std::vector< std::pair<Glib::RefPtr<Gdk::Pixbuf>,int> >& 
get_tile_book();
+       WorkArea::SurfaceBook& get_cairo_book();
 
        bool get_full_frame()const;
 


------------------------------------------------------------------------------
Symantec Endpoint Protection 12 positioned as A LEADER in The Forrester  
Wave(TM): Endpoint Security, Q1 2013 and "remains a good choice" in the  
endpoint security space. For insight on selecting the right partner to 
tackle endpoint security challenges, access the full report. 
http://p.sf.net/sfu/symantec-dev2dev
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to