X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Flayer_pastecanvas.cpp;h=7d8fbea22eb25d9f64760d59251a18e6e9bed772;hb=63e709f66d50c124cc0ece2325f4773ac4ae7b20;hp=e3a71f07dd9419cf02acc84f3885bf872d92f032;hpb=e3acc0b267b14fda5db3c7bbb2f218b993ef84b3;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/layer_pastecanvas.cpp b/synfig-core/trunk/src/synfig/layer_pastecanvas.cpp index e3a71f0..7d8fbea 100644 --- a/synfig-core/trunk/src/synfig/layer_pastecanvas.cpp +++ b/synfig-core/trunk/src/synfig/layer_pastecanvas.cpp @@ -1,20 +1,22 @@ -/* === S I N F G =========================================================== */ -/*! \file layer_pastecanvas.h -** \brief Template Header +/* === S Y N F I G ========================================================= */ +/*! \file layer_pastecanvas.cpp +** \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 Robert B. Quattlebaum Jr. +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 Chris Moore ** -** This software and associated documentation -** are CONFIDENTIAL and PROPRIETARY property of -** the above-mentioned copyright holder. +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. ** -** You may not copy, print, publish, or in any -** other way distribute this software without -** a prior written agreement with -** the copyright holder. +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. ** \endlegal */ /* ========================================================================= */ @@ -45,14 +47,14 @@ using namespace etl; using namespace std; -using namespace sinfg; +using namespace synfig; /* === M A C R O S ========================================================= */ #define MAX_DEPTH 10 //#ifdef __APPLE__ -//#define SINFG_NO_CLIP +//#define SYNFIG_NO_CLIP //#endif /* === C L A S S E S ======================================================= */ @@ -67,22 +69,23 @@ public: /* === G L O B A L S ======================================================= */ -SINFG_LAYER_INIT(Layer_PasteCanvas); -SINFG_LAYER_SET_NAME(Layer_PasteCanvas,"PasteCanvas"); -SINFG_LAYER_SET_LOCAL_NAME(Layer_PasteCanvas,_("Paste Canvas")); -SINFG_LAYER_SET_CATEGORY(Layer_PasteCanvas,_("Default")); -SINFG_LAYER_SET_VERSION(Layer_PasteCanvas,"0.1"); -SINFG_LAYER_SET_CVS_ID(Layer_PasteCanvas,"$Id: layer_pastecanvas.cpp,v 1.3 2005/01/24 03:08:18 darco Exp $"); +SYNFIG_LAYER_INIT(Layer_PasteCanvas); +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$"); /* === M E T H O D S ======================================================= */ Layer_PasteCanvas::Layer_PasteCanvas(): origin(0,0), + depth(0), zoom(0), time_offset(0) { children_lock=false; - do_not_muck_with_time_=false; + muck_with_time_=true; curr_time=Time::begin(); } @@ -93,7 +96,7 @@ Layer_PasteCanvas::~Layer_PasteCanvas() */ //if(canvas)DEBUGINFO(strprintf("%d",canvas->count())); - + set_sub_canvas(0); //if(canvas && (canvas->is_inline() || !get_canvas() || get_canvas()->get_root()!=canvas->get_root())) @@ -106,7 +109,7 @@ Layer_PasteCanvas::get_local_name()const if(!canvas) return _("Pasted Canvas"); if(canvas->is_inline()) return _("Inline Canvas"); if(canvas->get_root()==get_canvas()->get_root()) return '[' + canvas->get_id() + ']'; - + return '[' + canvas->get_file_name() + ']'; } @@ -114,7 +117,7 @@ Layer::Vocab Layer_PasteCanvas::get_param_vocab()const { Layer::Vocab ret(Layer_Composite::get_param_vocab()); - + ret.push_back(ParamDesc("origin") .set_local_name(_("Origin")) .set_description(_("Point where you want the origin to be")) @@ -135,7 +138,7 @@ Layer_PasteCanvas::get_param_vocab()const ret.push_back(ParamDesc("children_lock") .set_local_name(_("Children Lock")) ); - + return ret; } @@ -143,34 +146,50 @@ bool Layer_PasteCanvas::set_param(const String & param, const ValueBase &value) { 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 x) +Layer_PasteCanvas::set_sub_canvas(etl::handle 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())) canvas->unref(); - + child_changed_connection.disconnect(); - + canvas=x; - + /*if(canvas) child_changed_connection=canvas->signal_changed().connect( sigc::mem_fun( @@ -181,13 +200,13 @@ Layer_PasteCanvas::set_sub_canvas(etl::handle x) */ 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())) canvas->ref(); - + if(canvas) on_canvas_set(); } @@ -196,13 +215,13 @@ Layer_PasteCanvas::set_sub_canvas(etl::handle x) void Layer_PasteCanvas::on_canvas_set() { - //sinfg::info("before count()=%d",count()); + //synfig::info("before count()=%d",count()); if(get_canvas() && canvas && canvas->is_inline() && canvas->parent()!=get_canvas()) { - //sinfg::info("during count()=%d",count()); + //synfig::info("during count()=%d",count()); canvas->set_inline(get_canvas()); } - //sinfg::info("after count()=%d",count()); + //synfig::info("after count()=%d",count()); } ValueBase @@ -213,7 +232,7 @@ Layer_PasteCanvas::get_param(const String& param)const EXPORT(zoom); EXPORT(time_offset); EXPORT(children_lock); - + EXPORT_NAME(); EXPORT_VERSION(); @@ -225,35 +244,36 @@ Layer_PasteCanvas::set_time(Context context, Time time)const { if(depth==MAX_DEPTH)return;depth_counter counter(depth); curr_time=time; - + 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(); } else bounds=Rect::zero(); } -sinfg::Layer::Handle -Layer_PasteCanvas::hit_check(sinfg::Context context, const sinfg::Point &pos)const +synfig::Layer::Handle +Layer_PasteCanvas::hit_check(synfig::Context context, const synfig::Point &pos)const { 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(this); } - return const_cast(this); } - else - return context.hit_check(pos); + return context.hit_check(pos); } Color @@ -265,7 +285,7 @@ Layer_PasteCanvas::get_color(Context context, const Point &pos)const if(depth==MAX_DEPTH)return Color::alpha();depth_counter counter(depth); Point target_pos=(pos-canvas->rend_desc().get_focus()-origin)/exp(zoom)+canvas->rend_desc().get_focus(); - + return Color::blend(canvas->get_context().get_color(target_pos),context.get_color(pos),get_amount(),get_blend_method()); } @@ -277,21 +297,20 @@ Layer_PasteCanvas::accelerated_render(Context context,Surface *surface,int quali 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); } depth_counter counter(depth); - + 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); } - + SuperCallback stageone(cb,0,4500,10000); SuperCallback stagetwo(cb,4500,9000,10000); SuperCallback stagethree(cb,9000,9999,10000); @@ -311,32 +330,32 @@ Layer_PasteCanvas::accelerated_render(Context context,Surface *surface,int quali else if(!context.accelerated_render(surface,quality,renddesc,&stageone)) return false; Color::BlendMethod blend_method(get_blend_method()); - + const Rect full_bounding_rect(canvas->get_context().get_full_bounding_rect()); if(context->empty()) { if(Color::is_onto(blend_method)) return true; - + if(blend_method==Color::BLEND_COMPOSITE) blend_method=Color::BLEND_STRAIGHT; } else - if(!etl::intersect(context.get_full_bounding_rect(),full_bounding_rect)) + if(!etl::intersect(context.get_full_bounding_rect(),full_bounding_rect+origin)) { if(Color::is_onto(blend_method)) return true; - + if(blend_method==Color::BLEND_COMPOSITE) blend_method=Color::BLEND_STRAIGHT; } - -#ifndef SINFG_NO_CLIP + +#ifndef SYNFIG_NO_CLIP { - //sinfg::info("PasteCanv Clip"); + //synfig::info("PasteCanv Clip"); Rect area(desc.get_rect()&full_bounding_rect); - + Point min(area.get_min()); Point max(area.get_max()); @@ -345,17 +364,19 @@ Layer_PasteCanvas::accelerated_render(Context context,Surface *surface,int quali if(desc.get_tl()[1]>desc.get_br()[1]) swap(min[1],max[1]); - const int + const int x(floor_to_int((min[0]-desc.get_tl()[0])/desc.get_pw())), y(floor_to_int((min[1]-desc.get_tl()[1])/desc.get_ph())), w(ceil_to_int((max[0]-desc.get_tl()[0])/desc.get_pw())-x), h(ceil_to_int((max[1]-desc.get_tl()[1])/desc.get_ph())-y); - + desc.set_subwindow(x,y,w,h); - + 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; @@ -364,30 +385,30 @@ Layer_PasteCanvas::accelerated_render(Context context,Surface *surface,int quali if(!canvas->get_context().accelerated_render(&pastesurface,quality,desc,&stagetwo)) return false; - + Surface::alpha_pen apen(surface->get_pen(x,y)); - + apen.set_alpha(get_amount()); apen.set_blend_method(blend_method); - + pastesurface.blit_to(apen); } #else { Surface pastesurface; - + if(!canvas->get_context().accelerated_render(&pastesurface,quality,desc,&stagetwo)) return false; - + Surface::alpha_pen apen(surface->begin()); - + apen.set_alpha(get_amount()); apen.set_blend_method(blend_method); - + pastesurface.blit_to(apen); } #endif - + if(cb && !cb->amount_complete(10000,10000)) return false; return true; @@ -404,16 +425,17 @@ void Layer_PasteCanvas::get_times_vfunc(Node::time_set &set) const 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); }