File indexing completed on 2024-05-12 15:58:36

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 private:
0044     void init(const QTransform &transform);
0045 
0046     void fillParams(const QRectF &srcRect,
0047                     const QRect &dstBaseClipRect,
0048                     KisRegion *dstRegion,
0049                     QPolygonF *dstClipPolygon);
0050 
0051     template <class SrcAccessorPolicy>
0052     void runImpl();
0053 
0054 private:
0055     KisPaintDeviceSP m_dev;
0056     KoUpdaterPtr m_progressUpdater;
0057     KisRegion m_dstRegion;
0058     QRectF m_srcRect;
0059     QTransform m_backwardTransform;
0060     QTransform m_forwardTransform;
0061     bool m_isIdentity;
0062     bool m_isTranslating;
0063     bool m_cropDst;
0064 };
0065 
0066 #endif