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 @@ + + + Synfig Studio : Preview Icon + Placed in the Public Domain in 2011 by Yu Chen (jcome) + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + 1.0000000000 + 1.0000000000 + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + 1.0000000000 + 1.0000000000 + + + + + + + + + + + + + + + + + + + 0.793110 + 0.793110 + 0.793110 + 1.000000 + + + + + + + + + + + + + + + + 0.325037 + 0.325037 + 0.325037 + 1.000000 + + + + + 0.1250000000 + 0.1250000000 + + + + + 0.2500000000 + 0.2500000000 + + + + + + + + + + + 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();