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