**
** \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
{
name=get_id()+"_CLONE";
- throw runtime_error("Cloning of non-inline canvases is not yet suported");
+ throw runtime_error("Cloning of non-inline canvases is not yet supported");
}
Handle canvas(new Canvas(name));
Context iter;
std::vector< std::pair<float,Layer::Handle> > sort_list;
- int i, motion_blur_i; // motion_blur_i is for resolving which layer comes first in the event of a z_depth tie
- float motion_blur_z_depth; // the z_depth of the least deep motion blur layer in this context
+ int i, motion_blur_i=0; // motion_blur_i is for resolving which layer comes first in the event of a z_depth tie
+ float motion_blur_z_depth=0; // the z_depth of the least deep motion blur layer in this context
bool seen_motion_blur_locally = false;
- bool motion_blurred; // the final result - is this layer blurred or not?
+ bool motion_blurred; // the final result - is this layer blurred or not?
// If the parent didn't cause us to already be motion blurred,
// check whether there's a motion blur in this context,
continue;
Layer_PasteCanvas* paste_canvas(static_cast<Layer_PasteCanvas*>(layer.get()));
- if(layer->get_name()=="PasteCanvas" && paste_canvas->get_time_offset()==0)
+
+ // note: this used to include "&& paste_canvas->get_time_offset()==0", but then
+ // time-shifted layers weren't being sorted by z-depth (bug #1806852)
+ if(layer->get_name()=="PasteCanvas")
{
- Canvas::Handle sub_canvas(Canvas::create_inline(op_canvas));
- Canvas::Handle paste_sub_canvas = paste_canvas->get_sub_canvas();
- if(paste_sub_canvas)
- {
- // we need to blur the sub canvas if:
- // our parent is blurred,
- // or the child is lower than a local blur,
- // or the child is at the same z_depth as a local blur, but later in the context
+ // we need to blur the sub canvas if:
+ // our parent is blurred,
+ // or the child is lower than a local blur,
+ // or the child is at the same z_depth as a local blur, but later in the context
+
#if 0 // DEBUG
- if (seen_motion_blur_in_parent) synfig::info("seen BLUR in parent\n");
- else if (seen_motion_blur_locally)
- if (z_depth > motion_blur_z_depth) synfig::info("paste is deeper than BLUR\n");
- else if (z_depth == motion_blur_z_depth) { synfig::info("paste is same depth as BLUR\n");
- if (i > motion_blur_i) synfig::info("paste is physically deeper than BLUR\n");
- else synfig::info("paste is less physically deep than BLUR\n");
- } else synfig::info("paste is less deep than BLUR\n");
- else synfig::info("no BLUR at all\n");
+ if (seen_motion_blur_in_parent) synfig::info("seen BLUR in parent\n");
+ else if (seen_motion_blur_locally)
+ if (z_depth > motion_blur_z_depth) synfig::info("paste is deeper than BLUR\n");
+ else if (z_depth == motion_blur_z_depth) { synfig::info("paste is same depth as BLUR\n");
+ if (i > motion_blur_i) synfig::info("paste is physically deeper than BLUR\n");
+ else synfig::info("paste is less physically deep than BLUR\n");
+ } else synfig::info("paste is less deep than BLUR\n");
+ else synfig::info("no BLUR at all\n");
#endif // DEBUG
- motion_blurred = (seen_motion_blur_in_parent ||
- (seen_motion_blur_locally &&
- (z_depth > motion_blur_z_depth ||
- (z_depth == motion_blur_z_depth && i > motion_blur_i))));
+ motion_blurred = (seen_motion_blur_in_parent ||
+ (seen_motion_blur_locally &&
+ (z_depth > motion_blur_z_depth ||
+ (z_depth == motion_blur_z_depth && i > motion_blur_i))));
+
+ Canvas::Handle sub_canvas(Canvas::create_inline(op_canvas));
+ Canvas::Handle paste_sub_canvas = paste_canvas->get_sub_canvas();
+ if(paste_sub_canvas)
optimize_layers(paste_sub_canvas->get_context(),sub_canvas,motion_blurred);
- }
//#define SYNFIG_OPTIMIZE_PASTE_CANVAS 1
#ifdef SYNFIG_OPTIMIZE_PASTE_CANVAS