Author: Carlos Lopez <[email protected]>
Date: Sun Mar 10 19:45:16 2013 +0100
When rendering the frame on drawing area, use the tiled Cairo surfaces on the
canvas renderer.
---
synfig-studio/src/gui/workarea.cpp | 3 +-
.../src/gui/workarearenderer/renderer_canvas.cpp | 88 ++++++++++++++++----
2 files changed, 74 insertions(+), 17 deletions(-)
diff --git a/synfig-studio/src/gui/workarea.cpp
b/synfig-studio/src/gui/workarea.cpp
index 52e066e..1db9fb5 100644
--- a/synfig-studio/src/gui/workarea.cpp
+++ b/synfig-studio/src/gui/workarea.cpp
@@ -269,7 +269,6 @@ public:
{
synfig::Mutex::Lock lock(mutex);
workarea->cairo_book.resize(total_tiles());
- synfig::info("total_tiles()=%d", total_tiles());
return true;
}
@@ -303,7 +302,7 @@ public:
}
workarea->queue_draw();
- assert(workarea->tile_book[index].first);
+ assert(workarea->cairo_book[index].surface);
cairo_surface_destroy(tile_surface);
return true;
diff --git a/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
b/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
index 90d9880..ce29bb2 100644
--- a/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
+++ b/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
@@ -144,28 +144,86 @@ Renderer_Canvas::render_vfunc(
{
if(!cairo_book.empty())
{
- if(cairo_book[0].surface)
+ if(get_full_frame())
+ {
+ 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();
+ }
+ else // tiled frame
{
int div;
- cr->save();
- if(get_work_area()->get_low_resolution_flag())
+
+ const int
width_in_tiles(w/tile_w+(((get_work_area()->get_low_resolution_flag())?((w/div)%(tile_w/div)):(w%tile_w))?1:0));
+ const int
height_in_tiles(h/tile_h+(h%tile_h?1:0));
+
+ int u(0),v(0),tx,ty;
+ int u1(0),v1(0),u2(width_in_tiles),
v2(height_in_tiles);
+
+ bool needs_refresh(false);
+
+ u1=int(-x/tile_w);
+ v1=int(-y/tile_h);
+ u2=int((-x+drawable_w)/tile_w+1);
+ v2=int((-y+drawable_h)/tile_h+1);
+ if(u2>width_in_tiles)u2=width_in_tiles;
+ if(v2>height_in_tiles)v2=height_in_tiles;
+ if(u1<0)u1=0;
+ if(v1<0)v1=0;
+
+ for(v=v1;v<v2;v++)
{
- div =
get_work_area()->get_low_res_pixel_size();
- cr->scale(div, div);
+ for(u=u1;u<u2;u++)
+ {
+ int index=v*width_in_tiles+u;
+ if(int(cairo_book.size())>index
&& cairo_book[index].surface)
+ {
+ 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;
+
+ tx=u*tile_w;
+ ty=v*tile_w; // not
tile_h?
+
+
cairo_set_source_surface(cr->cobj(), cairo_book[index].surface,
(round_to_int(x)+tx)/div, (round_to_int(y)+ty)/div);
+
cairo_pattern_set_filter(cairo_get_source(cr->cobj()), CAIRO_FILTER_NEAREST);
+ cr->paint();
+ cr->restore();
+ }
+
if(cairo_book[index].refreshes!=get_refreshes())
+ needs_refresh=true;
+ }
}
- 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(needs_refresh==true && get_canceled()==false
&& get_rendering()==false && get_queued()==false)
+ {
+ get_work_area()->async_update_preview();
+ }
+
}
}
- if(cairo_book[0].refreshes!=get_refreshes() &&
get_canceled()==false && get_rendering()==false && get_queued()==false)
- get_work_area()->async_update_preview();
-
-
}
+
else if(!tile_book.empty())
{
if(get_full_frame())
------------------------------------------------------------------------------
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