Hi Genete, Genete wrote: > Module: synfig > Branch: genete_canvasview > Commit: 82ecc8c458140ac91907a15a7d2cda8d2164c567 > URL: > http://synfig.git.sourceforge.net/git/gitweb.cgi?p=synfig;a=commit;h=82ecc8c458140ac91907a15a7d2cda8d2164c567 > > Author: Carlos Lopez <car...@pcnuevo.(none)> > Date: Wed Jul 8 15:09:50 2009 +0200 > > Add code for multiple onion skins. >
You have to be careful with adding extra onionskins to the onion_skin_queue. I think the current code expects a max queue size of 5 (previous keyframe, now - 1, now, now + 1, next keyframe), and that this is related to the rather dubious "refreshes+=5;" statements you can find in the WorkArea class. They seem to be related via the refresh_id fields of the WorkAreaTarget and WorkAreaTarget_Full classes. Otherwise, good luck, I found that code rather hairy... ;-) Gerco. > --- > > synfig-studio/trunk/src/gtkmm/workarea.cpp | 61 > ++++++++++++++++------------ > synfig-studio/trunk/src/gtkmm/workarea.h | 2 + > 2 files changed, 37 insertions(+), 26 deletions(-) > > diff --git a/synfig-studio/trunk/src/gtkmm/workarea.cpp > b/synfig-studio/trunk/src/gtkmm/workarea.cpp > index 0ebd729..0d1ce1a 100644 > --- a/synfig-studio/trunk/src/gtkmm/workarea.cpp > +++ b/synfig-studio/trunk/src/gtkmm/workarea.cpp > @@ -117,7 +117,7 @@ public: > > synfig::Mutex mutex; > > - void set_onion_skin(bool x) > + void set_onion_skin(bool x, int *onions) > { > onionskin=x; > > @@ -126,26 +126,29 @@ public: > if(!onionskin) > return; > onion_skin_queue.push_back(time); > - //onion_skin_queue.push_back(time-1); > - //onion_skin_queue.push_back(time+1); > + > try > { > - onion_skin_queue.push_back( > - get_canvas()->keyframe_list().find_prev( > - time > - )->get_time() > - ); > + Time thistime=time; > + for(int i=0; i<onions[0]; i++) > + { > + Time > keytime=get_canvas()->keyframe_list().find_prev(thistime)->get_time(); > + onion_skin_queue.push_back(keytime); > + thistime=keytime; > + } > } > catch(...) > { } > > try > { > - onion_skin_queue.push_back( > - get_canvas()->keyframe_list().find_next( > - time > - )->get_time() > - ); > + Time thistime=time; > + for(int i=0; i<onions[1]; i++) > + { > + Time > keytime=get_canvas()->keyframe_list().find_next(thistime)->get_time(); > + onion_skin_queue.push_back(keytime); > + thistime=keytime; > + } > } > catch(...) > { } > @@ -414,7 +417,7 @@ public: > > std::list<synfig::Time> onion_skin_queue; > > - void set_onion_skin(bool x) > + void set_onion_skin(bool x, int *onions) > { > onionskin=x; > > @@ -427,22 +430,26 @@ public: > //onion_skin_queue.push_back(time+1); > try > { > - onion_skin_queue.push_back( > - get_canvas()->keyframe_list().find_prev( > - time > - )->get_time() > - ); > + Time thistime=time; > + for(int i=0; i<onions[0]; i++) > + { > + Time > keytime=get_canvas()->keyframe_list().find_prev(thistime)->get_time(); > + onion_skin_queue.push_back(keytime); > + thistime=keytime; > + } > } > catch(...) > { } > > try > { > - onion_skin_queue.push_back( > - get_canvas()->keyframe_list().find_next( > - time > - )->get_time() > - ); > + Time thistime=time; > + for(int i=0; i<onions[1]; i++) > + { > + Time > keytime=get_canvas()->keyframe_list().find_next(thistime)->get_time(); > + onion_skin_queue.push_back(keytime); > + thistime=keytime; > + } > } > catch(...) > { } > @@ -672,6 +679,8 @@ > WorkArea::WorkArea(etl::loose_handle<synfigapp::CanvasInterface> > canvas_interfac > ph=0.001; > last_focus_point=Point(0,0); > onion_skin=false; > + onion_skins[0]=0; > + onion_skins[1]=2; > queued=false; > dirty_trap_enabled=false; > solid_lines=true; > @@ -2289,7 +2298,7 @@ studio::WorkArea::async_update_preview() > handle<WorkAreaTarget> trgt(new class WorkAreaTarget(this,w,h)); > > trgt->set_rend_desc(&desc); > - trgt->set_onion_skin(get_onion_skin()); > + trgt->set_onion_skin(get_onion_skin(), onion_skins); > target=trgt; > } > else > @@ -2298,7 +2307,7 @@ studio::WorkArea::async_update_preview() > handle<WorkAreaTarget_Full> trgt(new class > WorkAreaTarget_Full(this,w,h)); > > trgt->set_rend_desc(&desc); > - trgt->set_onion_skin(get_onion_skin()); > + trgt->set_onion_skin(get_onion_skin(), onion_skins); > target=trgt; > } > > diff --git a/synfig-studio/trunk/src/gtkmm/workarea.h > b/synfig-studio/trunk/src/gtkmm/workarea.h > index 6e5ab7f..c2ec70e 100644 > --- a/synfig-studio/trunk/src/gtkmm/workarea.h > +++ b/synfig-studio/trunk/src/gtkmm/workarea.h > @@ -235,6 +235,8 @@ private: > > > bool onion_skin; > + //! stores the future [1] and past [0] onion skins based on keyframes > + int onion_skins[2]; > > etl::loose_handle<synfig::ValueNode> selected_value_node_; > > > > ------------------------------------------------------------------------------ > Enter the BlackBerry Developer Challenge > This is your chance to win up to $100,000 in prizes! For a limited time, > vendors submitting new applications to BlackBerry App World(TM) will have > the opportunity to enter the BlackBerry Developer Challenge. See full prize > details at: http://p.sf.net/sfu/Challenge > _______________________________________________ > Synfig-devl mailing list > Synfig-devl@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/synfig-devl ------------------------------------------------------------------------------ Enter the BlackBerry Developer Challenge This is your chance to win up to $100,000 in prizes! For a limited time, vendors submitting new applications to BlackBerry App World(TM) will have the opportunity to enter the BlackBerry Developer Challenge. See full prize details at: http://p.sf.net/sfu/Challenge _______________________________________________ Synfig-devl mailing list Synfig-devl@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/synfig-devl