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

0001 /*
0002  *  SPDX-FileCopyrightText: 2007 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #ifndef _KIS_TRANSFORM_MASK_
0007 #define _KIS_TRANSFORM_MASK_
0008 
0009 #include <QScopedPointer>
0010 
0011 #include "kis_types.h"
0012 #include "kis_effect_mask.h"
0013 #include "KisDelayedUpdateNodeInterface.h"
0014 
0015 class KisTransformMaskTestingInterface;
0016 
0017 /**
0018    Transform a layer according to a matrix transform
0019 */
0020 
0021 class KRITAIMAGE_EXPORT KisTransformMask : public KisEffectMask, public KisDelayedUpdateNodeInterface
0022 {
0023     Q_OBJECT
0024 
0025 public:
0026 
0027     /**
0028      * Create an empty transform mask.
0029      */
0030     KisTransformMask(KisImageWSP image, const QString &name);
0031 
0032     ~KisTransformMask() override;
0033 
0034     QIcon icon() const override;
0035 
0036     KisNodeSP clone() const override {
0037         return KisNodeSP(new KisTransformMask(*this));
0038     }
0039 
0040     KisPaintDeviceSP paintDevice() const override;
0041 
0042     bool accept(KisNodeVisitor &v) override;
0043     void accept(KisProcessingVisitor &visitor, KisUndoAdapter *undoAdapter) override;
0044 
0045     KisTransformMask(const KisTransformMask& rhs);
0046 
0047     QRect decorateRect(KisPaintDeviceSP &src,
0048                        KisPaintDeviceSP &dst,
0049                        const QRect & rc,
0050                        PositionToFilthy maskPos) const override;
0051 
0052     QRect changeRect(const QRect &rect, PositionToFilthy pos = N_FILTHY) const override;
0053     QRect needRect(const QRect &rect, PositionToFilthy pos = N_FILTHY) const override;
0054 
0055     QRect extent() const override;
0056     QRect exactBounds() const override;
0057     QRect sourceDataBounds() const;
0058 
0059     void setImage(KisImageWSP image) override;
0060 
0061     void setTransformParamsWithUndo(KisTransformMaskParamsInterfaceSP params, KUndo2Command *parentCommand);
0062     void setTransformParams(KisTransformMaskParamsInterfaceSP params);
0063     KisTransformMaskParamsInterfaceSP transformParams() const;
0064 
0065     bool staticImageCacheIsValid() const;
0066     void recalculateStaticImage();
0067     KisPaintDeviceSP buildPreviewDevice();
0068     KisPaintDeviceSP buildSourcePreviewDevice();
0069 
0070     /**
0071      * Transform Tool may override mask's device for the sake of
0072      * in-stack preview
0073      */
0074     void overrideStaticCacheDevice(KisPaintDeviceSP device);
0075 
0076     qint32 x() const override;
0077     qint32 y() const override;
0078 
0079     void setX(qint32 x) override;
0080     void setY(qint32 y) override;
0081 
0082     void forceUpdateTimedNode() override;
0083     bool hasPendingTimedUpdates() const override;
0084 
0085     void threadSafeForceStaticImageUpdate(const QRect &extraUpdateRect);
0086     void threadSafeForceStaticImageUpdate();
0087 
0088     void syncLodCache() override;
0089 
0090     KisPaintDeviceList getLodCapableDevices() const override;
0091 
0092     void setTestingInterface(KisTransformMaskTestingInterface *interface);
0093     KisTransformMaskTestingInterface* testingInterface() const;
0094 
0095 protected:
0096     KisKeyframeChannel *requestKeyframeChannel(const QString &id) override;
0097     bool supportsKeyframeChannel(const QString &id) override;
0098 
0099 Q_SIGNALS:
0100     void sigInternalForceStaticImageUpdate();
0101 
0102 private Q_SLOTS:
0103     void slotDelayedStaticUpdate();
0104     void slotInternalForceStaticImageUpdate();
0105 
0106  private:
0107     void startAsyncRegenerationJob();
0108     void forceStartAsyncRegenerationJob();
0109 
0110 private:
0111     struct Private;
0112     const QScopedPointer<Private> m_d;
0113 };
0114 
0115 #endif //_KIS_TRANSFORM_MASK_