/* === S Y N F I G ========================================================= */
/*! \file layer_pastecanvas.cpp
-** \brief Template Header
+** \brief Implementation of the "Paste Canvas" layer
**
-** $Id: layer_pastecanvas.cpp,v 1.3 2005/01/24 03:08:18 darco Exp $
+** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
/* === G L O B A L S ======================================================= */
SYNFIG_LAYER_INIT(Layer_PasteCanvas);
-SYNFIG_LAYER_SET_NAME(Layer_PasteCanvas,"PasteCanvas");
-SYNFIG_LAYER_SET_LOCAL_NAME(Layer_PasteCanvas,_("Paste Canvas"));
-SYNFIG_LAYER_SET_CATEGORY(Layer_PasteCanvas,_("Default"));
+SYNFIG_LAYER_SET_NAME(Layer_PasteCanvas,"PasteCanvas"); // todo: use paste_canvas
+SYNFIG_LAYER_SET_LOCAL_NAME(Layer_PasteCanvas,N_("Paste Canvas"));
+SYNFIG_LAYER_SET_CATEGORY(Layer_PasteCanvas,N_("Other"));
SYNFIG_LAYER_SET_VERSION(Layer_PasteCanvas,"0.1");
-SYNFIG_LAYER_SET_CVS_ID(Layer_PasteCanvas,"$Id: layer_pastecanvas.cpp,v 1.3 2005/01/24 03:08:18 darco Exp $");
+SYNFIG_LAYER_SET_CVS_ID(Layer_PasteCanvas,"$Id$");
/* === M E T H O D S ======================================================= */
time_offset(0)
{
children_lock=false;
- do_not_muck_with_time_=false;
+ muck_with_time_=true;
curr_time=Time::begin();
}
{
IMPORT(origin);
- if(param=="canvas" && value.same_as(Canvas::Handle()))
+ // IMPORT(canvas);
+ if(param=="canvas" && value.same_type_as(Canvas::Handle()))
{
set_sub_canvas(value.get(Canvas::Handle()));
return true;
}
-// IMPORT(canvas);
+ //! \todo this introduces bug 1844764 if enabled; it was introduced in r954, but I can't see if it's useful
+#if 0
+ if (param=="time_offset" && value.same_type_as(time_offset))
+ {
+ if (time_offset != value.get(Time()))
+ {
+ value.put(&time_offset);
+ // notify that the time_offset has changed so we can update the
+ // waypoint positions in parent layers
+ changed();
+ }
+ return true;
+ }
+#else
+ IMPORT(time_offset);
+#endif
+
IMPORT(children_lock);
IMPORT(zoom);
- IMPORT(time_offset);
return Layer_Composite::set_param(param,value);
}
void
Layer_PasteCanvas::set_sub_canvas(etl::handle<synfig::Canvas> x)
{
- if(canvas && !do_not_muck_with_time_)
+ if(canvas && muck_with_time_)
remove_child(canvas.get());
if(canvas && (canvas->is_inline() || !get_canvas() || get_canvas()->get_root()!=canvas->get_root()))
if(canvas)
bounds=(canvas->get_context().get_full_bounding_rect()-canvas->rend_desc().get_focus())*exp(zoom)+origin+canvas->rend_desc().get_focus();
- if(canvas && !do_not_muck_with_time_)
+ if(canvas && muck_with_time_)
add_child(canvas.get());
if(canvas && (canvas->is_inline() || !get_canvas() || get_canvas()->get_root()!=canvas->get_root()))
context.set_time(time);
if(canvas)
{
- canvas->set_time(time);
+ canvas->set_time(time+time_offset);
bounds=(canvas->get_context().get_full_bounding_rect()-canvas->rend_desc().get_focus())*exp(zoom)+origin+canvas->rend_desc().get_focus();
}
{
if(depth==MAX_DEPTH)return 0;depth_counter counter(depth);
- Point target_pos=(pos-canvas->rend_desc().get_focus()-origin)/exp(zoom)+canvas->rend_desc().get_focus();
+ if (canvas) {
+ Point target_pos=(pos-canvas->rend_desc().get_focus()-origin)/exp(zoom)+canvas->rend_desc().get_focus();
- if(canvas && get_amount() && canvas->get_context().get_color(target_pos).get_a()>=0.25)
- {
- if(!children_lock)
+ if(canvas && get_amount() && canvas->get_context().get_color(target_pos).get_a()>=0.25)
{
- return canvas->get_context().hit_check(target_pos);
+ if(!children_lock)
+ {
+ return canvas->get_context().hit_check(target_pos);
+ }
+ return const_cast<Layer_PasteCanvas*>(this);
}
- return const_cast<Layer_PasteCanvas*>(this);
}
- else
- return context.hit_check(pos);
+ return context.hit_check(pos);
}
Color
if(depth==MAX_DEPTH)
{
- DEBUGPOINT();
// if we are at the extent of our depth,
// then we should just return whatever is under us.
return context.accelerated_render(surface,quality,renddesc,cb);
if(!canvas || !get_amount())
return context.accelerated_render(surface,quality,renddesc,cb);
- if(!do_not_muck_with_time_ && curr_time!=Time::begin() && canvas->get_time()!=curr_time+time_offset)
+ if(muck_with_time_ && curr_time!=Time::begin() && canvas->get_time()!=curr_time+time_offset)
{
canvas->set_time(curr_time+time_offset);
}
Surface pastesurface;
- if(area.area()<=0.000001 || desc.get_w()==0 || desc.get_h()==0)
+ // \todo this used to also have "area.area()<=0.000001 || " - is it useful?
+ // it was causing bug #1809480 (Zoom in beyond 8.75 in nested canvases fails)
+ if(desc.get_w()==0 || desc.get_h()==0)
{
if(cb && !cb->amount_complete(10000,10000)) return false;
Node::time_set tset;
if(canvas) tset = canvas->get_times();
- Node::time_set::iterator i = tset.begin(),
- end = tset.end();
+ Node::time_set::iterator i = tset.begin(), end = tset.end();
//Make sure we offset the time...
- //TODO: SOMETHING STILL HAS TO BE DONE WITH THE OTHER DIRECTION
- // (recursing down the tree needs to take this into account too...)
+ //! \todo: SOMETHING STILL HAS TO BE DONE WITH THE OTHER DIRECTION
+ // (recursing down the tree needs to take this into account too...)
for(; i != end; ++i)
- {
- set.insert(*i + time_offset);
- }
+ set.insert(*i
+#ifdef ADJUST_WAYPOINTS_FOR_TIME_OFFSET // see node.h
+ - time_offset
+#endif
+ );
Layer::get_times_vfunc(set);
}