Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_coordinates_converter.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2010 Dmitry Kazakov <dimula73@gmail.com>
3 * SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassy@web.de>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
8#ifndef KIS_COORDINATES_CONVERTER_H
9#define KIS_COORDINATES_CONVERTER_H
10
11#include <optional>
12
13#include <QTransform>
14#include <KoZoomHandler.h>
15
16#include "kritaui_export.h"
17#include "kis_types.h"
18
20
21#define EPSILON 1e-6
22
23#define SCALE_LESS_THAN(scX, scY, value) \
24 (scX < (value) - EPSILON && scY < (value) - EPSILON)
25#define SCALE_MORE_OR_EQUAL_TO(scX, scY, value) \
26 (scX > (value) - EPSILON && scY > (value) - EPSILON)
27
28namespace _Private
29{
30 template<class T> struct Traits
31 {
32 typedef T Result;
33 static T map(const QTransform& transform, const T& obj) { return transform.map(obj); }
34 };
35
36 template<> struct Traits<QRectF>
37 {
38 typedef QRectF Result;
39 static QRectF map(const QTransform& transform, const QRectF& rc) { return transform.mapRect(rc); }
40 };
41
42 template<> struct Traits<QRect>: public Traits<QRectF> { };
43 template<> struct Traits<QPoint>: public Traits<QPointF> { };
44 template<> struct Traits<QPolygon>: public Traits<QPolygonF> { };
45 template<> struct Traits<QLine>: public Traits<QLineF> { };
46}
47
48class KRITAUI_EXPORT KisCoordinatesConverter: public KoZoomHandler
49{
50public:
52 ~KisCoordinatesConverter() override;
53
54 QSizeF getCanvasWidgetSize() const;
55 QSize viewportDevicePixelSize() const;
56
57 void setCanvasWidgetSize(QSizeF size);
58 void setDevicePixelRatio(qreal value);
59 void setImage(KisImageWSP image);
60 void setExtraReferencesBounds(const QRect &imageRect);
61 void setImageBounds(const QRect &rect, const QPointF oldImageStillPoint, const QPointF newImageStillPoint);
62 void setImageResolution(qreal xRes, qreal yRes);
63 void setDocumentOffset(const QPointF &offset);
64
65 qreal devicePixelRatio() const;
66 QPoint documentOffset() const;
67 QPointF documentOffsetF() const;
68 qreal rotationAngle() const;
69
70
89 QPointF preferredTransformationCenter() const;
90
91 // Use the begin/end interface to rotate the canvas in one transformation.
92 // This method is more accurate and doesn't amplify numerical errors from very small angles.
93 void beginRotation();
94 void endRotation();
95
96 void enableNatureGestureFlag();
97
103 void rotate(const std::optional<KoViewTransformStillPoint> &stillPoint, qreal angle);
104
110 void mirror(const std::optional<KoViewTransformStillPoint> &stillPoint, bool mirrorXAxis, bool mirrorYAxis);
111
112 bool xAxisMirrored() const;
113 bool yAxisMirrored() const;
114
120 void resetRotation(const std::optional<KoViewTransformStillPoint> &stillPoint);
121
122 void setZoom(qreal zoom) override;
123
124 void zoomTo(const QRectF &widgetRect);
125
146 void setZoom(KoZoomMode::Mode mode, qreal zoom, qreal resolutionX, qreal resolutionY, const std::optional<KoViewTransformStillPoint> &stillPoint);
147
148 void setCanvasWidgetSizeKeepZoom(const QSizeF &size);
149
153 qreal effectiveZoom() const;
154 qreal effectivePhysicalZoom() const;
155
156 template<class T> typename _Private::Traits<T>::Result
157 imageToViewport(const T& obj) const { return _Private::Traits<T>::map(imageToViewportTransform(), obj); }
158 template<class T> typename _Private::Traits<T>::Result
159 viewportToImage(const T& obj) const { return _Private::Traits<T>::map(imageToViewportTransform().inverted(), obj); }
160
161 template<class T> typename _Private::Traits<T>::Result
162 flakeToWidget(const T& obj) const { return _Private::Traits<T>::map(flakeToWidgetTransform(), obj); }
163 template<class T> typename _Private::Traits<T>::Result
164 widgetToFlake(const T& obj) const { return _Private::Traits<T>::map(flakeToWidgetTransform().inverted(), obj); }
165
166 template<class T> typename _Private::Traits<T>::Result
167 widgetToViewport(const T& obj) const { return _Private::Traits<T>::map(viewportToWidgetTransform().inverted(), obj); }
168 template<class T> typename _Private::Traits<T>::Result
169 viewportToWidget(const T& obj) const { return _Private::Traits<T>::map(viewportToWidgetTransform(), obj); }
170
171 template<class T> typename _Private::Traits<T>::Result
172 documentToWidget(const T& obj) const { return _Private::Traits<T>::map(documentToWidgetTransform(), obj); }
173 template<class T> typename _Private::Traits<T>::Result
174 widgetToDocument(const T& obj) const { return _Private::Traits<T>::map(documentToWidgetTransform().inverted(), obj); }
175
176 template<class T> typename _Private::Traits<T>::Result
177 imageToDocument(const T& obj) const { return _Private::Traits<T>::map(imageToDocumentTransform(), obj); }
178 template<class T> typename _Private::Traits<T>::Result
179 documentToImage(const T& obj) const { return _Private::Traits<T>::map(imageToDocumentTransform().inverted(), obj); }
180
181 template<class T> typename _Private::Traits<T>::Result
182 documentToFlake(const T& obj) const { return _Private::Traits<T>::map(documentToFlakeTransform(), obj); }
183 template<class T> typename _Private::Traits<T>::Result
184 flakeToDocument(const T& obj) const { return _Private::Traits<T>::map(documentToFlakeTransform().inverted(), obj); }
185
186 template<class T> typename _Private::Traits<T>::Result
187 imageToWidget(const T& obj) const { return _Private::Traits<T>::map(imageToWidgetTransform(), obj); }
188 template<class T> typename _Private::Traits<T>::Result
189 widgetToImage(const T& obj) const { return _Private::Traits<T>::map(imageToWidgetTransform().inverted(), obj); }
190
191 QTransform imageToWidgetTransform() const;
192 QTransform imageToDocumentTransform() const;
193 QTransform documentToFlakeTransform() const;
194 QTransform imageToViewportTransform() const;
195 QTransform viewportToWidgetTransform() const;
196 QTransform flakeToWidgetTransform() const;
197 QTransform documentToWidgetTransform() const;
198
199 void getQPainterCheckersInfo(QTransform *transform,
200 QPointF *brushOrigin,
201 QPolygonF *polygon,
202 const bool scrollCheckers) const;
203
204 void getOpenGLCheckersInfo(const QRectF &viewportRect,
205 QTransform *textureTransform,
206 QTransform *modelTransform,
207 QRectF *textureRect,
208 QRectF *modelRect,
209 const bool scrollCheckers) const;
210
211 QPointF imageCenterInWidgetPixel() const;
212 QRectF imageRectInWidgetPixels() const;
213 QRectF imageRectInViewportPixels() const;
214 QSizeF imageSizeInFlakePixels() const;
215 QRectF widgetRectInFlakePixels() const;
216 QRectF widgetRectInImagePixels() const;
217 QRect imageRectInImagePixels() const;
218 QRectF imageRectInDocumentPixels() const;
219
220 QPointF flakeCenterPoint() const;
221 QPointF widgetCenterPoint() const;
222
223 void imageScale(qreal *scaleX, qreal *scaleY) const;
224 void imagePhysicalScale(qreal *scaleX, qreal *scaleY) const;
225
226 QPointF snapToDevicePixel(const QPointF &point) const;
227 QSizeF snapWidgetSizeToDevicePixel(const QSizeF &size) const;
228
229 QPoint minimumOffset() const;
230 QPoint maximumOffset() const;
231
232 qreal minZoom() const;
233 qreal maxZoom() const;
234 qreal clampZoom(qreal zoom) const;
235 QVector<qreal> standardZoomLevels() const;
236
237 static qreal findNextZoom(qreal currentZoom, const QVector<qreal> &zoomLevels);
238 static qreal findPrevZoom(qreal currentZoom, const QVector<qreal> &zoomLevels);
239
240 KoViewTransformStillPoint makeWidgetStillPoint(const QPointF &viewPoint) const override;
241 KoViewTransformStillPoint makeDocStillPoint(const QPointF &docPoint) const override;
242
243public:
244 // overrides from KoViewConverter
245 QTransform viewToWidget() const override;
246 QTransform widgetToView() const override;
247
248private:
249 friend class KisZoomAndPanTest;
250 friend class KisCoordinatesConverterTest;
251
252 QPointF centeringCorrection() const;
253 void correctOffsetToTransformationAndSnap();
254 void correctTransformationToOffset();
255 void resetPreferredTransformationCenter();
256 void recalculateTransformations();
257 void recalculateZoomLevelLimits();
258 void recalculateOffsetBoundsAndCrop();
259
260private:
261 struct Private;
262 Private * const m_d;
263};
264
265#endif /* KIS_COORDINATES_CONVERTER_H */
float value(const T *src, size_t ch)
_Private::Traits< T >::Result widgetToDocument(const T &obj) const
_Private::Traits< T >::Result viewportToWidget(const T &obj) const
_Private::Traits< T >::Result viewportToImage(const T &obj) const
_Private::Traits< T >::Result documentToWidget(const T &obj) const
_Private::Traits< T >::Result documentToFlake(const T &obj) const
_Private::Traits< T >::Result widgetToViewport(const T &obj) const
_Private::Traits< T >::Result widgetToFlake(const T &obj) const
_Private::Traits< T >::Result imageToWidget(const T &obj) const
_Private::Traits< T >::Result flakeToDocument(const T &obj) const
_Private::Traits< T >::Result flakeToWidget(const T &obj) const
_Private::Traits< T >::Result widgetToImage(const T &obj) const
_Private::Traits< T >::Result documentToImage(const T &obj) const
_Private::Traits< T >::Result imageToDocument(const T &obj) const
_Private::Traits< T >::Result imageToViewport(const T &obj) const
virtual QTransform viewToWidget() const
virtual KoViewTransformStillPoint makeDocStillPoint(const QPointF &docPoint) const
Creates a still point that links the docPoint of the image (in document pixels!) to the corresponding...
virtual QTransform widgetToView() const
virtual KoViewTransformStillPoint makeWidgetStillPoint(const QPointF &viewPoint) const
Creates a still point that links the viewPoint of the widget to the corresponding point of the image.
void setZoom(qreal zoom) override
static QRectF map(const QTransform &transform, const QRectF &rc)
static T map(const QTransform &transform, const T &obj)