File indexing completed on 2024-05-19 04:26:29

0001 /*
0002  *  SPDX-FileCopyrightText: 2006 Cyrille Berger <cberger@cberger.net>
0003  *  SPDX-FileCopyrightText: 2010 Marc Pegon <pe.marc@free.fr>
0004  *
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 #ifndef KIS_PERSPECTIVETRANSFORM_WORKER_H
0009 #define KIS_PERSPECTIVETRANSFORM_WORKER_H
0010 
0011 #include "kis_types.h"
0012 #include "kritaimage_export.h"
0013 
0014 #include <QRect>
0015 #include <KisRegion.h>
0016 #include <QTransform>
0017 #include <KoUpdater.h>
0018 
0019 
0020 class KRITAIMAGE_EXPORT KisPerspectiveTransformWorker
0021 {
0022 public:
0023     KisPerspectiveTransformWorker(KisPaintDeviceSP dev, QPointF center, double aX, double aY, double distance, bool cropDst, KoUpdaterPtr progress);
0024     KisPerspectiveTransformWorker(KisPaintDeviceSP dev, const QTransform &transform, bool cropDst, KoUpdaterPtr progress);
0025 
0026     ~KisPerspectiveTransformWorker();
0027 
0028     enum SampleType {
0029         NearestNeighbour = 0,
0030         Bilinear
0031     };
0032 
0033     void run(SampleType sampleType = Bilinear);
0034     void runPartialDst(KisPaintDeviceSP srcDev,
0035                        KisPaintDeviceSP dstDev,
0036                        const QRect &dstRect);
0037 
0038     void setForwardTransform(const QTransform &transform);
0039 
0040     QTransform forwardTransform() const;
0041     QTransform backwardTransform() const;
0042 
0043     bool forceSubPixelTranslation() const;
0044     void setForceSubPixelTranslation(bool value);
0045 
0046 private:
0047     void init(const QTransform &transform);
0048 
0049     void fillParams(const QRectF &srcRect,
0050                     const QRect &dstBaseClipRect,
0051                     KisRegion *dstRegion,
0052                     QPolygonF *dstClipPolygon);
0053 
0054     template <class SrcAccessorPolicy>
0055     void runImpl();
0056 
0057 private:
0058     KisPaintDeviceSP m_dev;
0059     KoUpdaterPtr m_progressUpdater;
0060     KisRegion m_dstRegion;
0061     QRectF m_srcRect;
0062     QTransform m_backwardTransform;
0063     QTransform m_forwardTransform;
0064     bool m_isIdentity;
0065     bool m_isTranslating;
0066     bool m_cropDst;
0067     bool m_forceSubPixelTranslation {false};
0068 };
0069 
0070 #endif