/* === S Y N F I G ========================================================= */ /*! \file layerpaint.h ** \brief Template File ** ** $Id$ ** ** \legal ** ......... ... 2014 Ivan Mahonin ** ** 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. ** ** 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 __SYNFIG_APP_ACTION_LAYERPAINT_H #define __SYNFIG_APP_ACTION_LAYERPAINT_H /* === H E A D E R S ======================================================= */ #include #include #include /* === M A C R O S ========================================================= */ /* === T Y P E D E F S ===================================================== */ /* === C L A S S E S & S T R U C T S ======================================= */ namespace synfigapp { class Instance; namespace Action { class LayerPaint : public Undoable, public CanvasSpecific { public: struct PaintPoint { float x, y, pressure; double dtime; PaintPoint(): x(0), y(0), pressure(0), dtime(0) { } PaintPoint(float x, float y, float pressure, double dtime): x(x), y(y), pressure(pressure), dtime(dtime) { } }; class PaintStroke { private: static PaintStroke *first, *last; PaintStroke *prev, *next; PaintStroke *prevSameLayer, *nextSameLayer; etl::handle layer; brushlib::Brush brush_; synfig::Surface surface; synfig::Point tl; synfig::Point br; synfig::Point new_tl; synfig::Point new_br; std::vector points; bool prepared; bool applied; void copy_to_cairo_surface(const synfig::Surface &surface, synfig::CairoSurface &csurface); void paint_prev(synfig::Surface &surface); void paint_self(synfig::Surface &surface); void reset(const PaintPoint &point); public: PaintStroke(); ~PaintStroke(); void set_layer(etl::handle layer) { assert(!prepared); this->layer = layer; } etl::handle get_layer() const { return layer; } brushlib::Brush &brush() { assert(!prepared); return brush_; } const brushlib::Brush &get_brush() const { return brush_; } bool is_prepared() const { return prepared; } void prepare(); void undo(); void apply(); void add_point_and_apply(const PaintPoint &point); }; PaintStroke stroke; LayerPaint(); static ParamVocab get_param_vocab(); static bool is_candidate(const ParamList &x); virtual bool set_param(const synfig::String& name, const Param &); virtual bool is_ready()const; virtual void perform(); virtual void undo(); ACTION_MODULE_EXT }; }; // END of namespace action }; // END of namespace studio /* === E N D =============================================================== */ #endif