Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
pure-transform.h
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Class for pure transformations, such as translating, scaling, stretching, skewing, and rotating. Pure means that they
4 * cannot be combined. This is what makes them different from affine transformations. Pure transformations are being
5 * used in the selector tool and node tool
6 *
7 * Authors:
8 * Diederik van Lierop <mail@diedenrezi.nl>
9 *
10 * Copyright (C) 2015 Diederik van Lierop
11 *
12 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
13 */
14
15#ifndef SEEN_PURE_TRANSFORM_H
16#define SEEN_PURE_TRANSFORM_H
17
18#include <glib.h> // for g_warning
19#include "snapper.h" // for SnapConstraint
20
21class SnapManager;
22
23namespace Inkscape {
24
26
27protected:
28 virtual SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const = 0;
30 virtual void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) = 0;
31
32public:
33 //PureTransform();
34 virtual ~PureTransform() = default;;
35// virtual PureTransform * clone () const = 0; // https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Virtual_Constructor
36
37 // Snap a group of points
39 void snap(::SnapManager *sm, std::vector<Inkscape::SnapCandidatePoint> const &points, Geom::Point const &pointer);
40};
41
42// **************************************************************************************************************
43
45
46protected:
49
50 SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override;
51 Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override;
52 void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override;
53
54public:
55// PureTranslate(); // Default constructor
56// PureTranslate(PureTranslate const &); // Copy constructor
57 ~PureTranslate() override = default;;
59
61// PureTranslate * clone () const {return new PureTranslate(*this);}
62};
63
64
66
67protected:
69 SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override;
70
71public:
72 ~PureTranslateConstrained() override = default;
75 _direction(direction)
76 {
77 _vector[direction] = displacement;
78 _vector[1-direction] = 0.0;
79 }
80 // PureTranslateConstrained * clone () const {return new PureTranslateConstrained(*this);}
81};
82
83// **************************************************************************************************************
84
85class PureScale: public PureTransform {
86
87protected:
92
93 SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override;
94 Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override;
95 void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override;
96
97public:
98// PureScale(); // Default constructor
99// PureScale(PureScale const &); // Copy constructor
100 ~PureScale() override = default;
101
108
110// PureScale * clone () const {return new PureScale (*this);}
111};
112
114//Magnitude of the scale components will be the same, but the sign could still be different ()
115protected:
116 SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override;
117
118public:
119 ~PureScaleConstrained() override = default;
121 PureScale(scale, origin, true) {}; // Non-uniform constrained scaling is not supported
122
123// PureScaleConstrained * clone () const {return new PureScaleConstrained(*this);}
124};
125
126// **************************************************************************************************************
127
129// A stretch is always implicitly constrained
130
131protected:
137
138 SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override;
139 Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override;
140 void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override;
141
142public:
143 ~PureStretchConstrained() override = default;;
147 _origin (origin),
148 _direction (direction),
150 {
151 if (not uniform) {
152 _stretch_snapped[1-direction] = 1.0;
153 }
154 }
155
159
160// PureStretchConstrained * clone () const {return new PureStretchConstrained(*this);}
161};
162
163// **************************************************************************************************************
164
166// A skew is always implicitly constrained
167
168protected:
174
175 SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override;
176 Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override;
177 void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override;
178
179public:
180 ~PureSkewConstrained() override = default;;
182 _skew (skew),
183 _skew_snapped (skew),
184 _scale (scale),
185 _origin (origin),
186 _direction (direction)
187 {};
188
190
191// PureSkewConstrained * clone () const {return new PureSkewConstrained(*this);}
192};
193
194// **************************************************************************************************************
195
197// A rotation is always implicitly constrained, so we will hide the constructor by making it protected; devs should use PureRotateConstrained instead
198// It's _constraint member variable though will be empty
199
200protected:
201 double _angle; // in radians
205
206 SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override;
207 Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override;
208 void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override;
209
210public:
211// PureRotate(); // Default constructor
212// PureRotate(PureRotate const &); // Copy constructor
213 ~PureRotateConstrained() override = default;;
214
216 _angle (angle), // in radians!
217 _angle_snapped (angle),
218 _origin (origin),
219 _uniform (true) // We do not yet allow for simultaneous rotation and scaling
220 {}
221
223
224// PureRotate * clone () const {return new PureRotate(*this);}
225};
226
227}
228
229#endif // !SEEN_PURE_TRANSFORM_H
230
gfloat magnitude(const vector_type)
double scale
Definition aa.cpp:228
Point origin
Definition aa.cpp:227
Axis-aligned rectangle that can be empty.
Definition rect.h:203
Two-dimensional point that doubles as a vector.
Definition point.h:66
Scaling from the origin.
Definition transforms.h:150
SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override
Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override
~PureRotateConstrained() override=default
void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override
PureRotateConstrained(double angle, Geom::Point origin)
PureScaleConstrained(Geom::Scale scale, Geom::Point origin)
SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override
~PureScaleConstrained() override=default
SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override
Geom::Scale getScaleSnapped()
PureScale(Geom::Scale scale, Geom::Point origin, bool uniform)
Geom::Scale _scale_snapped
~PureScale() override=default
void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override
Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override
void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override
PureSkewConstrained(Geom::Coord skew, Geom::Coord scale, Geom::Point origin, Geom::Dim2 direction)
SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override
Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override
~PureSkewConstrained() override=default
Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override
PureStretchConstrained(Geom::Coord magnitude, Geom::Point origin, Geom::Dim2 direction, bool uniform)
SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override
void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override
~PureStretchConstrained() override=default
SnappedPoint best_snapped_point
virtual Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const =0
virtual ~PureTransform()=default
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
SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override
PureTranslateConstrained(Geom::Coord displacement, Geom::Dim2 direction)
~PureTranslateConstrained() override=default
void storeTransform(SnapCandidatePoint const &original_point, SnappedPoint &snapped_point) override
SnappedPoint snap(::SnapManager *sm, SnapCandidatePoint const &p, Geom::Point pt_orig, Geom::OptRect const &bbox_to_snap) const override
PureTranslate(Geom::Point vector=Geom::Point())
Geom::Point getTransformedPoint(SnapCandidatePoint const &p) const override
Geom::Point getTranslationSnapped()
~PureTranslate() override=default
Class to store data for points which are snap candidates, either as a source or as a target.
Class describing the result of an attempt to snap.
Class to coordinate snapping operations.
Definition snap.h:80
Dim2
2D axis enumeration (X or Y).
Definition coord.h:48
double Coord
Floating point type used to store coordinates.
Definition coord.h:76
Various utility functions.
Definition affine.h:22
Helper class to stream background task notifications as a series of messages.
Snapper class.
double uniform()