/*
* Class for pure transformations, such as translating, scaling, stretching, skewing, and rotating. Pure means that they cannot
* be combined. This is what makes them different from affine transformations. Pure transformations are being used in the selector
* tool and node tool
*
* Authors:
* Diederik van Lierop <mail@diedenrezi.nl>
*
* Copyright (C) 2015 Diederik van Lierop
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#ifndef SEEN_PURE_TRANSFORM_H
#define SEEN_PURE_TRANSFORM_H
#include <glib.h> // for g_warning
#include "snapper.h" // for SnapConstraint
virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const = 0;
virtual void storeTransform(SnapCandidatePoint const original_point, SnappedPoint snapped_point) = 0;
//PureTransform();
virtual ~PureTransform() {};
// virtual PureTransform * clone () const = 0; // https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Virtual_Constructor
// Snap a group of points
void snap(::SnapManager *sm, std::vector<Inkscape::SnapCandidatePoint> const &points, Geom::Point const &pointer);
};
// **************************************************************************************************************
virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const;
// PureTranslate(); // Default constructor
// PureTranslate(PureTranslate const &); // Copy constructor
virtual ~PureTranslate() {};
// PureTranslate * clone () const {return new PureTranslate(*this);}
};
virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const;
virtual ~PureTranslateConstrained() {};
PureTranslate() {
}
// PureTranslateConstrained * clone () const {return new PureTranslateConstrained(*this);}
};
// **************************************************************************************************************
bool _uniform;
virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const;
// PureScale(); // Default constructor
// PureScale(PureScale const &); // Copy constructor
{}
// PureScale * clone () const {return new PureScale (*this);}
};
//Magnitude of the scale components will be the same, but the sign could still be different ()
virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const;
virtual ~PureScaleConstrained() {};
// PureScaleConstrained * clone () const {return new PureScaleConstrained(*this);}
};
// **************************************************************************************************************
// A stretch is always implicitly constrained
bool _uniform;
virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const;
virtual ~PureStretchConstrained() {};
PureStretchConstrained(Geom::Coord magnitude, Geom::Point origin, Geom::Dim2 direction, bool uniform) :
{
}
}
// PureStretchConstrained * clone () const {return new PureStretchConstrained(*this);}
};
// **************************************************************************************************************
// A skew is always implicitly constrained
virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const;
virtual ~PureSkewConstrained() {};
PureSkewConstrained(Geom::Coord skew, Geom::Coord scale, Geom::Point origin, Geom::Dim2 direction) :
{};
// PureSkewConstrained * clone () const {return new PureSkewConstrained(*this);}
};
// **************************************************************************************************************
// A rotation is always implicitly constrained, so we will hide the constructor by making it protected; devs should use PureRotateConstrained instead
// It's _constraint member variable though will be empty
double _angle_snapped;
bool _uniform;
virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const;
// PureRotate(); // Default constructor
// PureRotate(PureRotate const &); // Copy constructor
virtual ~PureRotateConstrained() {};
_uniform (true) // We do not yet allow for simultaneous rotation and scaling
{}
// PureRotate * clone () const {return new PureRotate(*this);}
};
}
#endif // !SEEN_PURE_TRANSFORM_H