101 QPointF dPoint(documentSize.width(), documentSize.height());
105 QPointF maxOffset = dPoint - wPoint + cfg.
vastScrolling() * wPoint;
107 QPointF range = maxOffset - minOffset;
109 range.rx() = qMin(range.x(), (qreal)0.0);
110 range.ry() = qMin(range.y(), (qreal)0.0);
126 QPointF dPointMax(qMax(documentRect.width(), refRect.right() + 1 - documentRect.x()),
127 qMax(documentRect.height(), refRect.bottom() + 1 - documentRect.y()));
128 QPointF dPointMin(qMin(0, refRect.left() - documentRect.x()),
129 qMin(0, refRect.top() - documentRect.y()));
132 QPointF minOffset = dPointMin - cfg.
vastScrolling() * wPoint;
133 QPointF maxOffset = dPointMax - wPoint + cfg.
vastScrolling() * wPoint;
206 QRectF rrect = irect & wrect;
209 QRectF canvasBounds = reversedTransform.mapRect(rrect);
210 QPointF offset = canvasBounds.topLeft();
212 m_d->
widgetToViewport = reversedTransform * QTransform::fromTranslate(-offset.x(), -offset.y());
283 const QPointF oldWidgetStillPoint =
imageToWidget(oldImageStillPoint);
293 const QPointF newWidgetStillPoint =
imageToWidget(newImageStillPoint);
437 auto updateDisplayResolution = [&]() {
452 stillPoint ? *stillPoint :
455 updateDisplayResolution();
461 const QPointF offset = newStillPoint - effectiveStillPoint.
viewPoint();
470 updateDisplayResolution();
476 const qreal zoomCoeffX = (
m_d->
canvasWidgetSize.width() - 2 * cfgMargin) / documentSize.width();
477 const qreal zoomCoeffY = (
m_d->
canvasWidgetSize.height() - 2 * cfgMargin) / documentSize.height();
479 const bool fitToWidth = [&]() {
481 return zoomCoeffX < zoomCoeffY;
487 Q_UNREACHABLE_RETURN(
true);
501 newDocumentOffset.setX(-cfgMargin);
503 newDocumentOffset.setY(-cfgMargin);
517 const QPointF zoomPortionCenterInImagePixels =
widgetToImage(zoomRectWidget.center());
522 const bool fitToWidth = zoomCoeffX < zoomCoeffY;
539 qreal scaleX, scaleY;
542 if (scaleX != scaleY) {
547 return 0.5 * (scaleX + scaleY);
552 qreal scaleX, scaleY;
555 if (scaleX != scaleY) {
560 return 0.5 * (scaleX + scaleY);
591 stillPoint ? *stillPoint :
619 const QPointF offset = newStillPoint - effectiveStillPoint.
viewPoint();
630 bool keepOrientation =
false;
633 stillPoint ? *stillPoint :
646 qreal scaleX = doXMirroring ? -1.0 : 1.0;
647 qreal scaleY = doYMirroring ? -1.0 : 1.0;
648 QTransform
mirror = QTransform::fromScale(scaleX, scaleY);
655 if (keepOrientation) {
661 if (keepOrientation) {
668 if (!keepOrientation && (doXMirroring ^ doYMirroring)) {
683 const QPointF offset = newStillPoint - effectiveStillPoint.
viewPoint();
707 stillPoint ? *stillPoint :
721 const QPointF offset = newStillPoint - effectiveStillPoint.
viewPoint();
759 QPointF *brushOrigin,
761 const bool scrollCheckers)
const
773 imageRect.adjust(0,0,-0.5,-0.5);
775 if (scrollCheckers) {
777 *polygon = imageRect;
781 *transform = QTransform();
783 *brushOrigin = QPoint(0,0);
788 QTransform *textureTransform,
789 QTransform *modelTransform,
792 const bool scrollCheckers)
const
795 *textureTransform = QTransform();
796 *textureRect = QRectF(0, 0, viewportRect.width(),viewportRect.height());
800 *textureRect = viewportRect;
804 *modelRect = viewportRect;
810 return (poly[0] + poly[1] + poly[2] + poly[3]) / 4.0;
838 qreal scaleX, scaleY;
842 return QSizeF(imageSize.width() * scaleX, imageSize.height() * scaleY);
858 return QPointF(widgetRect.left() + widgetRect.width() / 2,
859 widgetRect.top() + widgetRect.height() / 2);
878 *scaleX = zoomX / resX;
879 *scaleY = zoomY / resY;
944 qreal minDimension = 0.0;
952 m_d->
minZoom = qMin(100.0 / minDimension, 0.1);
float value(const T *src, size_t ch)
qreal vastScrolling(bool defaultValue=false) const
QSizeF snapWidgetSizeToDevicePixel(const QSizeF &size) const
QTransform imageToDocumentTransform() const
QPoint documentOffset() const
QPointF widgetCenterPoint() const
QTransform documentToFlakeTransform() const
QSize viewportDevicePixelSize() const
QTransform flakeToWidgetTransform() const
void setDevicePixelRatio(qreal value)
QPointF preferredTransformationCenter() const
returns the point in image coordinates which is supposed to be the default still point for the transf...
bool xAxisMirrored() const
void imageScale(qreal *scaleX, qreal *scaleY) const
void recalculateZoomLevelLimits()
_Private::Traits< T >::Result widgetToDocument(const T &obj) const
void correctOffsetToTransformationAndSnap()
QTransform viewportToWidgetTransform() const
QPoint maximumOffset() const
void setZoom(qreal zoom) override
QTransform imageToViewportTransform() const
void resetRotation(const std::optional< KoViewTransformStillPoint > &stillPoint)
resets canvas rotation
bool yAxisMirrored() const
QPointF snapToDevicePixel(const QPointF &point) const
Adjust a given pair of coordinates to the nearest device pixel according to the value of devicePixelR...
QTransform documentToWidgetTransform() const
static qreal findNextZoom(qreal currentZoom, const QVector< qreal > &zoomLevels)
qreal effectiveZoom() const
QPointF documentOffsetF() const
QRectF imageRectInDocumentPixels() const
_Private::Traits< T >::Result documentToWidget(const T &obj) const
void enableNatureGestureFlag()
void setCanvasWidgetSizeKeepZoom(const QSizeF &size)
QRectF widgetRectInImagePixels() const
void correctTransformationToOffset()
QRectF imageRectInWidgetPixels() const
_Private::Traits< T >::Result widgetToFlake(const T &obj) const
void setCanvasWidgetSize(QSizeF size)
_Private::Traits< T >::Result imageToWidget(const T &obj) const
void imagePhysicalScale(qreal *scaleX, qreal *scaleY) const
qreal clampZoom(qreal zoom) const
QTransform imageToWidgetTransform() const
QSizeF imageSizeInFlakePixels() const
void getOpenGLCheckersInfo(const QRectF &viewportRect, QTransform *textureTransform, QTransform *modelTransform, QRectF *textureRect, QRectF *modelRect, const bool scrollCheckers) const
void getQPainterCheckersInfo(QTransform *transform, QPointF *brushOrigin, QPolygonF *polygon, const bool scrollCheckers) const
void setExtraReferencesBounds(const QRect &imageRect)
KisCoordinatesConverter()
void recalculateTransformations()
void setImageResolution(qreal xRes, qreal yRes)
QSizeF getCanvasWidgetSize() const
qreal effectivePhysicalZoom() const
void setImageBounds(const QRect &rect, const QPointF oldImageStillPoint, const QPointF newImageStillPoint)
void setDocumentOffset(const QPointF &offset)
QPointF flakeCenterPoint() const
void setImage(KisImageWSP image)
void recalculateOffsetBoundsAndCrop()
QVector< qreal > standardZoomLevels() const
_Private::Traits< T >::Result widgetToImage(const T &obj) const
qreal rotationAngle() const
qreal devicePixelRatio() const
void rotate(const std::optional< KoViewTransformStillPoint > &stillPoint, qreal angle)
rotates the canvas
void resetPreferredTransformationCenter()
~KisCoordinatesConverter() override
KoViewTransformStillPoint makeWidgetStillPoint(const QPointF &viewPoint) const override
Creates a still point that links the viewPoint of the widget to the corresponding point of the image.
QRectF imageRectInViewportPixels() const
QTransform viewToWidget() const override
_Private::Traits< T >::Result imageToDocument(const T &obj) const
KoViewTransformStillPoint makeDocStillPoint(const QPointF &docPoint) const override
Creates a still point that links the docPoint of the image (in document pixels!) to the corresponding...
static qreal findPrevZoom(qreal currentZoom, const QVector< qreal > &zoomLevels)
QRect imageRectInImagePixels() const
QRectF widgetRectInFlakePixels() const
void mirror(const std::optional< KoViewTransformStillPoint > &stillPoint, bool mirrorXAxis, bool mirrorYAxis)
mirrors the canvas
void zoomTo(const QRectF &widgetRect)
QPointF centeringCorrection() const
_Private::Traits< T >::Result imageToViewport(const T &obj) const
QPoint minimumOffset() const
QTransform widgetToView() const override
QPointF imageCenterInWidgetPixel() const
QRect bounds() const override
KoZoomMode::Mode zoomMode() const
int zoomMarginSize() const
void setZoom(qreal zoom) override
void setZoomMode(KoZoomMode::Mode zoomMode)
qreal resolutionX() const
qreal resolutionY() const
void setResolution(qreal resolutionX, qreal resolutionY)
@ ZOOM_WIDTH
zoom pagewidth
@ ZOOM_HEIGHT
zoom pageheight
static qreal findNextZoom(qreal currentZoom, const QVector< qreal > &zoomLevels)
static QVector< qreal > generateStandardZoomLevels(qreal minZoom, qreal maxZoom)
static qreal findPrevZoom(qreal currentZoom, const QVector< qreal > &zoomLevels)
static bool qFuzzyCompare(half p1, half p2)
static bool qFuzzyIsNull(half h)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
qreal kisSquareDistance(const QPointF &pt1, const QPointF &pt2)
Point clampPoint(Point pt, const Rect &bounds)
QVector< qreal > initialize() const
StandardZoomLevelsInitializer(Private *d)
QPointF preferredTransformationCenterImage
QTransform widgetToViewport
QTransform documentToFlake
QTransform imageToDocument
QTransform rotationBaseTransform
KisValueCache< StandardZoomLevelsInitializer > standardZoomLevels
bool rotationIsOrthogonal
QRect extraReferencesBounds
QPointF preferredTransformationCenterInDocumentPixels() const