File indexing completed on 2024-05-26 04:34:49

0001 /*
0002  *  SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef __TRANSFORM_TRANSACTION_PROPERTIES_H
0008 #define __TRANSFORM_TRANSACTION_PROPERTIES_H
0009 
0010 #include <QRectF>
0011 #include <QPointF>
0012 #include "kis_node.h"
0013 #include "kis_layer_utils.h"
0014 #include "kis_external_layer_iface.h"
0015 
0016 class ToolTransformArgs;
0017 
0018 class TransformTransactionProperties
0019 {
0020 public:
0021     TransformTransactionProperties()
0022     {
0023     }
0024 
0025 TransformTransactionProperties(const QRectF &originalRect,
0026                                ToolTransformArgs *currentConfig,
0027                                KisNodeList rootNodes,
0028                                const QList<KisNodeSP> &transformedNodes)
0029         : m_originalRect(originalRect),
0030           m_currentConfig(currentConfig),
0031           m_rootNodes(rootNodes),
0032           m_transformedNodes(transformedNodes),
0033           m_shouldAvoidPerspectiveTransform(false)
0034     {
0035         m_hasInvisibleNodes = false;
0036         Q_FOREACH (KisNodeSP node, transformedNodes) {
0037             if (KisExternalLayer *extLayer = dynamic_cast<KisExternalLayer*>(node.data())) {
0038                 if (!extLayer->supportsPerspectiveTransform()) {
0039                     m_shouldAvoidPerspectiveTransform = true;
0040                     break;
0041                 }
0042             }
0043 
0044             m_hasInvisibleNodes |= !node->visible(false);
0045         }
0046     }
0047 
0048     qreal originalHalfWidth() const {
0049         return m_originalRect.width() / 2.0;
0050     }
0051 
0052     qreal originalHalfHeight() const {
0053         return m_originalRect.height() / 2.0;
0054     }
0055 
0056     QRectF originalRect() const {
0057         return m_originalRect;
0058     }
0059 
0060     QPointF originalCenterGeometric() const {
0061         return m_originalRect.center();
0062     }
0063 
0064     QPointF originalTopLeft() const {
0065         return m_originalRect.topLeft();
0066     }
0067 
0068     QPointF originalBottomLeft() const {
0069         return m_originalRect.bottomLeft();
0070     }
0071 
0072     QPointF originalBottomRight() const {
0073         return m_originalRect.bottomRight();
0074     }
0075 
0076     QPointF originalTopRight() const {
0077         return m_originalRect.topRight();
0078     }
0079 
0080     QPointF originalMiddleLeft() const {
0081         return QPointF(m_originalRect.left(), (m_originalRect.top() + m_originalRect.bottom()) / 2.0);
0082     }
0083 
0084     QPointF originalMiddleRight() const {
0085         return QPointF(m_originalRect.right(), (m_originalRect.top() + m_originalRect.bottom()) / 2.0);
0086     }
0087 
0088     QPointF originalMiddleTop() const {
0089         return QPointF((m_originalRect.left() + m_originalRect.right()) / 2.0, m_originalRect.top());
0090     }
0091 
0092     QPointF originalMiddleBottom() const {
0093         return QPointF((m_originalRect.left() + m_originalRect.right()) / 2.0, m_originalRect.bottom());
0094     }
0095 
0096     QPoint originalTopLeftAligned() const {
0097         return m_originalRect.toAlignedRect().topLeft();
0098     }
0099 
0100     QPoint originalBottomRightAligned() const {
0101         return m_originalRect.toAlignedRect().bottomRight();
0102     }
0103 
0104     ToolTransformArgs* currentConfig() const {
0105         return m_currentConfig;
0106     }
0107 
0108     KisNodeList rootNodes() const {
0109         return m_rootNodes;
0110     }
0111 
0112     KisNodeList transformedNodes() const {
0113         return m_transformedNodes;
0114     }
0115 
0116     qreal basePreviewOpacity() const {
0117         // Todo: this doesn't work for multiple layers
0118         return 0.9 * qreal(m_rootNodes[0]->opacity()) / 255.0;
0119     }
0120 
0121     bool shouldAvoidPerspectiveTransform() const {
0122         return m_shouldAvoidPerspectiveTransform;
0123     }
0124 
0125     bool hasInvisibleNodes() const {
0126         return m_hasInvisibleNodes;
0127     }
0128 
0129     void setCurrentConfigLocation(ToolTransformArgs *config) {
0130         m_currentConfig = config;
0131     }
0132 
0133 private:
0134     /**
0135      * Information about the original selected rect
0136      * (before any transformations)
0137      */
0138     QRectF m_originalRect;
0139     ToolTransformArgs *m_currentConfig {0};
0140     KisNodeList m_rootNodes;
0141     KisNodeList m_transformedNodes;
0142     bool m_shouldAvoidPerspectiveTransform {false};
0143     bool m_hasInvisibleNodes {false};
0144 };
0145 
0146 #endif /* __TRANSFORM_TRANSACTION_PROPERTIES_H */