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

0001 /*
0002  *  SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef __KIS_LIQUIFY_TRANSFORM_WORKER_H
0008 #define __KIS_LIQUIFY_TRANSFORM_WORKER_H
0009 
0010 #include <QScopedPointer>
0011 #include <boost/operators.hpp>
0012 
0013 #include <kritaimage_export.h>
0014 #include <kis_types.h>
0015 
0016 class QImage;
0017 class QRect;
0018 class QSize;
0019 class QTransform;
0020 class QDomElement;
0021 
0022 
0023 class KRITAIMAGE_EXPORT KisLiquifyTransformWorker : boost::equality_comparable<KisLiquifyTransformWorker>
0024 {
0025 public:
0026     KisLiquifyTransformWorker(const QRect &srcBounds,
0027                               KoUpdater *progress,
0028                               int pixelPrecision = 8);
0029 
0030     KisLiquifyTransformWorker(const KisLiquifyTransformWorker &rhs);
0031 
0032     ~KisLiquifyTransformWorker();
0033 
0034     bool operator==(const KisLiquifyTransformWorker &other) const;
0035     bool isIdentity() const;
0036 
0037 
0038     int pointToIndex(const QPoint &cellPt);
0039     QSize gridSize() const;
0040 
0041     void translatePoints(const QPointF &base,
0042                          const QPointF &offset,
0043                          qreal sigma,
0044                          bool useWashMode,
0045                          qreal flow);
0046 
0047     void scalePoints(const QPointF &base,
0048                      qreal scale,
0049                      qreal sigma,
0050                      bool useWashMode,
0051                      qreal flow);
0052 
0053     void rotatePoints(const QPointF &base,
0054                       qreal angle,
0055                       qreal sigma,
0056                       bool useWashMode,
0057                       qreal flow);
0058 
0059     void undoPoints(const QPointF &base,
0060                     qreal amount,
0061                     qreal sigma);
0062 
0063     const QVector<QPointF>& originalPoints() const;
0064     QVector<QPointF>& transformedPoints();
0065 
0066     void run(KisPaintDeviceSP srcDevice, KisPaintDeviceSP dstDevice);
0067     QImage runOnQImage(const QImage &srcImage,
0068                        const QPointF &srcImageOffset,
0069                        const QTransform &imageToThumbTransform,
0070                        QPointF *newOffset);
0071 
0072     void toXML(QDomElement *e) const;
0073     static KisLiquifyTransformWorker* fromXML(const QDomElement &e);
0074 
0075     void translate(const QPointF &offset);
0076     void translateDstSpace(const QPointF &offset);
0077 
0078     QRect approxChangeRect(const QRect &rc);
0079     QRect approxNeedRect(const QRect &rc, const QRect &fullBounds);
0080 
0081     void transformSrcAndDst(const QTransform &t);
0082 
0083 private:
0084     struct Private;
0085     const QScopedPointer<Private> m_d;
0086 };
0087 
0088 #endif /* __KIS_LIQUIFY_TRANSFORM_WORKER_H */