X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Flayer_pastecanvas.h;h=843ee1efc54bd57f3175a385182a27525dc9f99f;hb=4463620b876137696e62be58f3e386901cb69a7a;hp=652bf7aff54351797fea70d962a79b1a12bc3355;hpb=e3acc0b267b14fda5db3c7bbb2f218b993ef84b3;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/layer_pastecanvas.h b/synfig-core/trunk/src/synfig/layer_pastecanvas.h index 652bf7a..843ee1e 100644 --- a/synfig-core/trunk/src/synfig/layer_pastecanvas.h +++ b/synfig-core/trunk/src/synfig/layer_pastecanvas.h @@ -1,28 +1,30 @@ -/* === S I N F G =========================================================== */ +/* === S Y N F I G ========================================================= */ /*! \file layer_pastecanvas.h -** \brief Template Header +** \brief Header file for implementation of the "Paste Canvas" layer ** -** $Id: layer_pastecanvas.h,v 1.2 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, 2008 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 */ /* ========================================================================= */ /* === S T A R T =========================================================== */ -#ifndef __SINFG_LAYER_PASTEIMAGE_H -#define __SINFG_LAYER_PASTEIMAGE_H +#ifndef __SYNFIG_LAYER_PASTEIMAGE_H +#define __SYNFIG_LAYER_PASTEIMAGE_H /* === H E A D E R S ======================================================= */ @@ -41,16 +43,16 @@ /* === C L A S S E S & S T R U C T S ======================================= */ -namespace sinfg { - +namespace synfig { + class Layer_PasteCanvas : public Layer_Composite, public Layer_NoDeform { - SINFG_LAYER_MODULE_EXT + SYNFIG_LAYER_MODULE_EXT private: Vector origin; - etl::loose_handle canvas; + etl::loose_handle canvas; //! Recursion depth counter mutable int depth; @@ -61,24 +63,49 @@ private: mutable Time curr_time; - bool optimize_layers(sinfg::Context context,sinfg::CanvasBase&)const; + bool muck_with_time_; - bool do_not_muck_with_time_; - bool children_lock; mutable Rect bounds; sigc::connection child_changed_connection; + + // Nasty hack: Remember whether we called an extra ref() when + // setting the canvas, so we know whether to call an extra unref() + // when finished with the canvas. + // + // Here's the story: + // + // The root canvas is destructed first. That sets the + // Layer::canvas_ (the parent canvas) of any PasteCanvas layer it + // contains to nil, due to a call to Layer::set_canvas(0), + // triggered by the connection made when Layer::set_canvas + // originally set its canvas_ member to point to the root canvas. + // ~Canvas does begin_delete() which triggers that connection. + // + // After ~Canvas has run, the members of the root canvas are + // freed, including its children_ list. If this was the last + // reference to the child canvas that the pastecanvas uses, that + // child canvas will Layer_PasteCanvas::set_sub_canvas(0) on the + // PasteCanvas layer to set its canvas (the child, pasted canvas) + // not to refer to the soon-to-be destroys child canvas. But + // set_sub_canvas() originally looked at the value of + // Layer::canvas_ (the parent canvas, obtained via + // Layer::get_canvas()) to decide whether to do an extra ref() on + // canvas (the child canvas). We need to unref() it now if we + // did, but we've forgotten whether we did. So we use this + // 'extra_reference' member to store that decision. + bool extra_reference; public: virtual void on_canvas_set(); - void set_do_not_muck_with_time(bool x=true) { do_not_muck_with_time_=true; } + void set_muck_with_time(bool x=false) { muck_with_time_=x; } + + etl::handle get_sub_canvas()const { return canvas; } + void set_sub_canvas(etl::handle x); - etl::handle get_sub_canvas()const { return canvas; } - void set_sub_canvas(etl::handle x); - Real get_zoom()const { return zoom; } Time get_time_offset()const { return time_offset; } @@ -89,8 +116,8 @@ public: virtual ~Layer_PasteCanvas(); virtual String get_local_name()const; - - virtual bool set_param(const String & param, const sinfg::ValueBase &value); + + virtual bool set_param(const String & param, const synfig::ValueBase &value); virtual ValueBase get_param(const String & param)const; @@ -102,16 +129,16 @@ public: virtual Vocab get_param_vocab()const; - virtual sinfg::Rect get_bounding_rect()const; + virtual synfig::Rect get_bounding_rect()const; + + virtual synfig::Layer::Handle hit_check(synfig::Context context, const synfig::Point &point)const; - virtual sinfg::Layer::Handle hit_check(sinfg::Context context, const sinfg::Point &point)const; - protected: - virtual void get_times_vfunc(Node::time_set &set) const; + virtual void get_times_vfunc(Node::time_set &set) const; }; // END of class Layer_PasteCanvas -}; // END of namespace sinfg +}; // END of namespace synfig /* === E N D =============================================================== */