File indexing completed on 2024-06-16 04:18:02

0001 /*
0002  *  SPDX-FileCopyrightText: 2014 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_transform_mask_adapter.h"
0008 
0009 #include <QTransform>
0010 #include <QDomElement>
0011 
0012 #include "tool_transform_args.h"
0013 #include "kis_transform_utils.h"
0014 #include "KisAnimatedTransformMaskParamsHolder.h"
0015 
0016 #include "kis_node.h"
0017 
0018 
0019 struct KisTransformMaskAdapter::Private
0020 {
0021     QSharedPointer<ToolTransformArgs> args;
0022     bool isHidden {false};
0023     bool isInitialized {true};
0024 };
0025 
0026 
0027 KisTransformMaskAdapter::KisTransformMaskAdapter()
0028     : m_d(new Private)
0029 {
0030     m_d->args.reset(new ToolTransformArgs());
0031 }
0032 
0033 KisTransformMaskAdapter::KisTransformMaskAdapter(const ToolTransformArgs &args, bool isHidden, bool isInitialized)
0034     : m_d(new Private)
0035 {
0036     m_d->args = toQShared(new ToolTransformArgs(args));
0037     m_d->isHidden = isHidden;
0038     m_d->isInitialized = isInitialized;
0039 }
0040 
0041 KisTransformMaskAdapter::~KisTransformMaskAdapter()
0042 {
0043 }
0044 
0045 QTransform KisTransformMaskAdapter::finalAffineTransform() const
0046 {
0047     KisTransformUtils::MatricesPack m(*transformArgs());
0048     return m.finalTransform();
0049 }
0050 
0051 bool KisTransformMaskAdapter::isAffine() const
0052 {
0053     const ToolTransformArgs args = *transformArgs();
0054 
0055     return args.mode() == ToolTransformArgs::FREE_TRANSFORM ||
0056             args.mode() == ToolTransformArgs::PERSPECTIVE_4POINT;
0057 }
0058 
0059 bool KisTransformMaskAdapter::isInitialized() const
0060 {
0061     return m_d->isInitialized;
0062 }
0063 
0064 void KisTransformMaskAdapter::setHidden(bool value)
0065 {
0066     m_d->isHidden = value;
0067 }
0068 
0069 bool KisTransformMaskAdapter::isHidden() const
0070 {
0071     return m_d->isHidden;
0072 }
0073 
0074 void KisTransformMaskAdapter::transformDevice(KisNodeSP node, KisPaintDeviceSP src, KisPaintDeviceSP dst, bool forceSubPixelTranslation) const
0075 {
0076     dst->prepareClone(src);
0077 
0078     KisProcessingVisitor::ProgressHelper helper(node);
0079 
0080     KisTransformUtils::transformDeviceWithCroppedDst(*transformArgs(), src, dst, &helper, forceSubPixelTranslation);
0081 }
0082 
0083 const QSharedPointer<ToolTransformArgs> KisTransformMaskAdapter::transformArgs() const {
0084     return m_d->args;
0085 }
0086 
0087 void KisTransformMaskAdapter::setBaseArgs(const ToolTransformArgs &args)
0088 {
0089     *m_d->args = args;
0090 }
0091 
0092 QString KisTransformMaskAdapter::id() const
0093 {
0094     return "tooltransformparams";
0095 }
0096 
0097 void KisTransformMaskAdapter::toXML(QDomElement *e) const
0098 {
0099     m_d->args->toXML(e);
0100 }
0101 
0102 KisTransformMaskParamsInterfaceSP KisTransformMaskAdapter::fromXML(const QDomElement &e)
0103 {
0104     return KisTransformMaskParamsInterfaceSP(
0105         new KisTransformMaskAdapter(ToolTransformArgs::fromXML(e)));
0106 }
0107 
0108 void KisTransformMaskAdapter::translateSrcAndDst(const QPointF &offset)
0109 {
0110     m_d->args->translateSrcAndDst(offset);
0111 }
0112 
0113 void KisTransformMaskAdapter::transformSrcAndDst(const QTransform &t)
0114 {
0115     m_d->args->transformSrcAndDst(t);
0116 }
0117 
0118 void KisTransformMaskAdapter::translateDstSpace(const QPointF &offset)
0119 {
0120     m_d->args->translateDstSpace(offset);
0121 }
0122 
0123 QRect KisTransformMaskAdapter::nonAffineChangeRect(const QRect &rc)
0124 {
0125     return KisTransformUtils::changeRect(*transformArgs(), rc);
0126 }
0127 
0128 QRect KisTransformMaskAdapter::nonAffineNeedRect(const QRect &rc, const QRect &srcBounds)
0129 {
0130     return KisTransformUtils::needRect(*transformArgs(), rc, srcBounds);
0131 }
0132 
0133 KisKeyframeChannel *KisTransformMaskAdapter::getKeyframeChannel(const QString &id, KisDefaultBoundsBaseSP defaultBounds)
0134 {
0135     Q_UNUSED(id);
0136     Q_UNUSED(defaultBounds);
0137     return 0;
0138 }
0139 
0140 KisTransformMaskParamsInterfaceSP KisTransformMaskAdapter::clone() const {
0141     return toQShared(new KisTransformMaskAdapter(*this->transformArgs(), this->isHidden(), this->isInitialized()));
0142 }
0143 
0144 bool KisTransformMaskAdapter::compareTransform(KisTransformMaskParamsInterfaceSP rhs) const
0145 {
0146     QSharedPointer<KisTransformMaskAdapter> adapter = rhs.dynamicCast<KisTransformMaskAdapter>();
0147     KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(adapter, false);
0148 
0149     QSharedPointer<ToolTransformArgs> lhsArgs = transformArgs();
0150     QSharedPointer<ToolTransformArgs> rhsArgs = adapter->transformArgs();
0151 
0152     return lhsArgs->isSameMode(*rhsArgs);
0153 }