diff --git a/synfig-studio/images/CMakeLists.txt b/synfig-studio/images/CMakeLists.txt
index 28438cc..35de376 100644
--- a/synfig-studio/images/CMakeLists.txt
+++ b/synfig-studio/images/CMakeLists.txt
@@ -171,6 +171,7 @@ set(ICONS
palette_icon
parameters_icon
preview_options_icon
+ background_rendering_icon
rename_icon
render_options_icon
reset_colors_icon
diff --git a/synfig-studio/images/Makefile.am b/synfig-studio/images/Makefile.am
index 098a24e..10ecc2f 100644
--- a/synfig-studio/images/Makefile.am
+++ b/synfig-studio/images/Makefile.am
@@ -69,6 +69,7 @@ EXTRA_DIST = \
decr_resolution_icon.sif \
render_options_icon.sif \
preview_options_icon.sif \
+ background_rendering_icon.sif \
action_set_layer_description_icon.sif \
action_add_to_set_icon.sif \
action_remove_from_set_icon.sif \
@@ -243,6 +244,7 @@ IMAGES = \
decr_resolution_icon.$(EXT) \
render_options_icon.$(EXT) \
preview_options_icon.$(EXT) \
+ background_rendering_icon.$(EXT) \
action_set_layer_description_icon.$(EXT) \
action_add_to_set_icon.$(EXT) \
action_remove_from_set_icon.$(EXT) \
diff --git a/synfig-studio/images/background_rendering_icon.sif b/synfig-studio/images/background_rendering_icon.sif
new file mode 100644
index 0000000..6c90aa5
--- /dev/null
+++ b/synfig-studio/images/background_rendering_icon.sif
@@ -0,0 +1,200 @@
+
+
diff --git a/synfig-studio/src/gui/app.cpp b/synfig-studio/src/gui/app.cpp
index 41d1e47..c82db45 100644
--- a/synfig-studio/src/gui/app.cpp
+++ b/synfig-studio/src/gui/app.cpp
@@ -960,6 +960,7 @@ DEFINE_ACTION("toggle-guide-snap", _("Toggle Guide Snap"));
DEFINE_ACTION("toggle-low-res", _("Toggle Low-Res"));
DEFINE_ACTION("decrease-low-res-pixel-size", _("Decrease Low-Res Pixel Size"));
DEFINE_ACTION("increase-low-res-pixel-size", _("Increase Low-Res Pixel Size"));
+DEFINE_ACTION("toggle-background-rendering", _("Toggle Background Rendering"));
DEFINE_ACTION("toggle-onion-skin", _("Toggle Onion Skin"));
DEFINE_ACTION("canvas-zoom-in", Gtk::StockID("gtk-zoom-in"));
DEFINE_ACTION("canvas-zoom-out", Gtk::StockID("gtk-zoom-out"));
@@ -1104,6 +1105,7 @@ DEFINE_ACTION("keyframe-properties","Properties");
" "
" "
" "
+" "
" "
" "
" "
diff --git a/synfig-studio/src/gui/canvasview.cpp b/synfig-studio/src/gui/canvasview.cpp
index 3e764c9..c3c1c0d 100644
--- a/synfig-studio/src/gui/canvasview.cpp
+++ b/synfig-studio/src/gui/canvasview.cpp
@@ -575,6 +575,7 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handleappend(*draft_button);
}
+ // Separator
+ displaybar->append( *create_tool_separator() );
+
+ { // Set up the background rendering button
+ Gtk::Image *icon = manage(new Gtk::Image(Gtk::StockID("synfig-toggle_background_rendering"), iconsize));
+ icon->set_padding(0, 0);
+ icon->show();
+
+ background_rendering_button = Gtk::manage(new class Gtk::ToggleToolButton());
+ background_rendering_button->set_active(work_area->get_background_rendering());
+ background_rendering_button->set_icon_widget(*icon);
+ background_rendering_button->signal_toggled().connect(
+ sigc::mem_fun(*this, &CanvasView::toggle_background_rendering));
+ background_rendering_button->set_label(_("Background rendering"));
+ background_rendering_button->set_tooltip_text( _("Render future and past frames in background when enabled"));
+ background_rendering_button->show();
+
+ displaybar->append(*background_rendering_button);
+ }
// Separator
displaybar->append( *create_tool_separator() );
@@ -1503,11 +1523,14 @@ CanvasView::init_menus()
action->set_active(work_area->get_guide_snap());
action_group->add(action, sigc::mem_fun(*work_area, &WorkArea::toggle_guide_snap));
-
action = Gtk::ToggleAction::create("toggle-low-res", _("Use Low-Res"));
action->set_active(work_area->get_low_resolution_flag());
action_group->add(action, sigc::mem_fun(*this, &CanvasView::toggle_low_res_pixel_flag));
+ background_rendering_toggle = Gtk::ToggleAction::create("toggle-background-rendering", _("Enable rendering in background"));
+ background_rendering_toggle->set_active(work_area->get_background_rendering());
+ action_group->add(background_rendering_toggle, sigc::mem_fun(*this, &CanvasView::toggle_background_rendering));
+
onion_skin_toggle = Gtk::ToggleAction::create("toggle-onion-skin", _("Show Onion Skin"));
onion_skin_toggle->set_active(work_area->get_onion_skin());
action_group->add(onion_skin_toggle, sigc::mem_fun(*this, &CanvasView::toggle_onion_skin));
@@ -2556,15 +2579,29 @@ CanvasView::toggle_onion_skin()
if(toggling_onion_skin)
return;
toggling_onion_skin=true;
- work_area->toggle_onion_skin();
+ work_area->set_onion_skin(!work_area->get_onion_skin());
// Update the toggle onion skin action
set_onion_skin_toggle(work_area->get_onion_skin());
- // Update the toggle grid snap check button
+ // Update the toggle onion skin button
onion_skin->set_active(work_area->get_onion_skin());
toggling_onion_skin=false;
}
void
+CanvasView::toggle_background_rendering()
+{
+ if(toggling_background_rendering)
+ return;
+ toggling_background_rendering=true;
+ work_area->set_background_rendering(!work_area->get_background_rendering());
+ // Update the toggle background rendering action
+ set_background_rendering_toggle(work_area->get_background_rendering());
+ // Update the toggle background rendering button
+ background_rendering_button->set_active(work_area->get_background_rendering());
+ toggling_background_rendering=false;
+}
+
+void
CanvasView::on_dirty_preview()
{
if (!is_playing()) {
@@ -3289,6 +3326,7 @@ CanvasView::on_meta_data_changed()
toggling_show_grid=true;
toggling_snap_grid=true;
toggling_onion_skin=true;
+ toggling_background_rendering=true;
try
{
// Update the toggle ducks actions
@@ -3312,10 +3350,12 @@ CanvasView::on_meta_data_changed()
toggling_show_grid=false;
toggling_snap_grid=false;
toggling_onion_skin=false;
+ toggling_background_rendering=false;
}
toggling_show_grid=false;
toggling_snap_grid=false;
toggling_onion_skin=false;
+ toggling_background_rendering=false;
}
void
diff --git a/synfig-studio/src/gui/canvasview.h b/synfig-studio/src/gui/canvasview.h
index 4df1ca2..15c6b92 100644
--- a/synfig-studio/src/gui/canvasview.h
+++ b/synfig-studio/src/gui/canvasview.h
@@ -218,6 +218,8 @@ public:
void set_grid_show_toggle(bool flag) { grid_show_toggle->set_active(flag); }
void set_onion_skin_toggle(bool flag) { onion_skin_toggle->set_active(flag); }
+ void set_background_rendering_toggle(bool flag) { background_rendering_toggle->set_active(flag); }
+
/*
-- ** -- P R I V A T E D A T A ---------------------------------------------
*/
@@ -270,6 +272,7 @@ private:
Gtk::Statusbar *statusbar;
Gtk::Button *closebutton;
Gtk::Button *stopbutton;
+ Gtk::ToggleToolButton *background_rendering_button;
Gtk::ToolButton *refreshbutton;
Gtk::ToggleToolButton *draft_button;
Gtk::VBox *timebar;
@@ -302,6 +305,7 @@ private:
bool toggling_show_grid;
bool toggling_snap_grid;
bool toggling_onion_skin;
+ bool toggling_background_rendering;
//! Shows current time and allows edition
Widget_Time *current_time_widget;
void on_current_time_widget_changed();
@@ -324,6 +328,8 @@ private:
Glib::RefPtr grid_show_toggle;
Glib::RefPtr onion_skin_toggle;
+ Glib::RefPtr background_rendering_toggle;
+
Gtk::RadioButtonGroup low_res_pixel_size_group;
Glib::RefPtr action_group;
@@ -443,6 +449,7 @@ private:
void toggle_show_grid();
void toggle_snap_grid();
void toggle_onion_skin();
+ void toggle_background_rendering();
void toggle_animatebutton();
void toggle_timetrackbutton();
diff --git a/synfig-studio/src/gui/iconcontroller.cpp b/synfig-studio/src/gui/iconcontroller.cpp
index 7b602a4..012a553 100644
--- a/synfig-studio/src/gui/iconcontroller.cpp
+++ b/synfig-studio/src/gui/iconcontroller.cpp
@@ -350,6 +350,8 @@ IconController::init_icons(const synfig::String& path_to_icons)
INIT_STOCK_ICON(toggle_onion_skin, "onion_skin_icon." IMAGE_EXT, _("Toggle onion skin"));
+ INIT_STOCK_ICON(toggle_background_rendering, "background_rendering_icon." IMAGE_EXT, _("Toggle background rendering"));
+
INIT_STOCK_ICON(increase_resolution, "incr_resolution_icon." IMAGE_EXT, _("Increase resolution"));
INIT_STOCK_ICON(decrease_resolution, "decr_resolution_icon." IMAGE_EXT, _("Decrease resolution"));
diff --git a/synfig-studio/src/gui/workarea.cpp b/synfig-studio/src/gui/workarea.cpp
index b2b3f3b..2711cc6 100644
--- a/synfig-studio/src/gui/workarea.cpp
+++ b/synfig-studio/src/gui/workarea.cpp
@@ -168,6 +168,7 @@ WorkArea::WorkArea(etl::loose_handle canvas_interfac
dirty_trap_count(0),
dirty_trap_queued(0),
onion_skin(false),
+ background_rendering(true),
allow_duck_clicks(true),
allow_bezier_clicks(true),
allow_layer_clicks(true),
@@ -357,22 +358,23 @@ WorkArea::save_meta_data()
Color c(get_grid_color());
canvas_interface->set_meta_data("grid_color",strprintf("%f %f %f",c.get_r(),c.get_g(),c.get_b()));
c = get_guides_color();
- canvas_interface->set_meta_data("guide_color",strprintf("%f %f %f",c.get_r(),c.get_g(),c.get_b()));
- canvas_interface->set_meta_data("grid_snap",get_grid_snap()?"1":"0");
- canvas_interface->set_meta_data("guide_snap",get_guide_snap()?"1":"0");
- canvas_interface->set_meta_data("guide_show",get_show_guides()?"1":"0");
- canvas_interface->set_meta_data("grid_show",show_grid?"1":"0");
- canvas_interface->set_meta_data("jack_offset",strprintf("%f", (double)jack_offset));
- canvas_interface->set_meta_data("onion_skin",onion_skin?"1":"0");
+ canvas_interface->set_meta_data("guide_color", strprintf("%f %f %f", c.get_r(), c.get_g(), c.get_b()));
+ canvas_interface->set_meta_data("grid_snap", get_grid_snap() ? "1" : "0");
+ canvas_interface->set_meta_data("guide_snap", get_guide_snap() ? "1" : "0");
+ canvas_interface->set_meta_data("guide_show", get_show_guides() ? "1" : "0");
+ canvas_interface->set_meta_data("grid_show", show_grid ? "1" : "0");
+ canvas_interface->set_meta_data("jack_offset", strprintf("%f", (double)jack_offset));
+ canvas_interface->set_meta_data("onion_skin", onion_skin ? "1" : "0");
canvas_interface->set_meta_data("onion_skin_past", strprintf("%d", onion_skins[0]));
canvas_interface->set_meta_data("onion_skin_future", strprintf("%d", onion_skins[1]));
+ canvas_interface->set_meta_data("background_rendering", background_rendering ? "1" : "0");
s = get_background_size();
- canvas_interface->set_meta_data("background_size",strprintf("%f %f",s[0],s[1]));
+ canvas_interface->set_meta_data("background_size", strprintf("%f %f", s[0], s[1]));
c = get_background_first_color();
- canvas_interface->set_meta_data("background_first_color",strprintf("%f %f %f",c.get_r(),c.get_g(),c.get_b()));
+ canvas_interface->set_meta_data("background_first_color", strprintf("%f %f %f", c.get_r(), c.get_g(), c.get_b()));
c = get_background_second_color();
- canvas_interface->set_meta_data("background_second_color",strprintf("%f %f %f",c.get_r(),c.get_g(),c.get_b()));
+ canvas_interface->set_meta_data("background_second_color", strprintf("%f %f %f", c.get_r(), c.get_g(), c.get_b()));
{
String data;
@@ -596,6 +598,12 @@ WorkArea::load_meta_data()
// Update the canvas
if (onion_skin && render_required) queue_render();
+ data=canvas->get_meta_data("background_rendering");
+ if(data.size() && (data=="1" || data[0]=='t' || data[0]=='T'))
+ set_background_rendering(true);
+ if(data.size() && (data=="0" || data[0]=='f' || data[0]=='F'))
+ set_background_rendering(false);
+
data=canvas->get_meta_data("guide_x");
get_guide_list_x().clear();
while(!data.empty())
@@ -752,6 +760,16 @@ void WorkArea::set_onion_skins(int *onions)
}
void
+WorkArea::set_background_rendering(bool x)
+{
+ if (background_rendering == x)
+ return;
+ background_rendering = x;
+ save_meta_data();
+ queue_draw();
+}
+
+void
WorkArea::enable_grid()
{
show_grid=true;
diff --git a/synfig-studio/src/gui/workarea.h b/synfig-studio/src/gui/workarea.h
index 9898558..b919781 100644
--- a/synfig-studio/src/gui/workarea.h
+++ b/synfig-studio/src/gui/workarea.h
@@ -217,6 +217,9 @@ private:
//! stores the future [1] and past [0] onion skins based on keyframes
int onion_skins[2];
+ // render future and past frames in background
+ bool background_rendering;
+
etl::loose_handle selected_value_node_;
bool allow_duck_clicks;
@@ -307,10 +310,12 @@ public:
void set_onion_skin(bool x);
bool get_onion_skin() const { return onion_skin; }
- void toggle_onion_skin() { set_onion_skin(!get_onion_skin()); }
void set_onion_skins(int *onions);
int const * get_onion_skins() const { return onion_skins; }
+ void set_background_rendering(bool x);
+ bool get_background_rendering() const { return background_rendering; }
+
void set_selected_value_node(etl::loose_handle x);
DragMode get_drag_mode() { return drag_mode; }
diff --git a/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp b/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
index 765498d..566eb79 100644
--- a/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
+++ b/synfig-studio/src/gui/workarearenderer/renderer_canvas.cpp
@@ -524,6 +524,7 @@ Renderer_Canvas::enqueue_render()
String renderer_name = get_work_area()->get_renderer();
RectInt window_rect = get_work_area()->get_window_rect();
+ bool bg_rendering = get_work_area()->get_background_rendering();
Canvas::Handle canvas = get_work_area()->get_canvas();
etl::handle time_model = get_work_area()->get_canvas_view()->time_model();
@@ -553,7 +554,8 @@ Renderer_Canvas::enqueue_render()
long long frame_size = image_rect_size(window_rect);
bool time_in_repeat_range = time_model->get_time() >= time_model->get_play_bounds_lower()
&& time_model->get_time() <= time_model->get_play_bounds_upper();
- while(enqueued_tasks < max_enqueued_tasks && tiles_size + frame_size < max_tiles_size_soft) {
+ while(bg_rendering && enqueued_tasks < max_enqueued_tasks && tiles_size + frame_size < max_tiles_size_soft)
+ {
Time future_time = current_frame.time + frame_duration*future;
bool future_exists = future_time >= time_model->get_lower()
&& future_time <= time_model->get_upper();