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 }