File indexing completed on 2025-02-02 04:16:07

0001 /*
0002  *  SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_mirror_processing_visitor.h"
0008 
0009 #include "kis_paint_device.h"
0010 #include "kis_transaction.h"
0011 #include "kis_node.h"
0012 #include "kis_image.h"
0013 #include "kis_painter.h"
0014 
0015 #include "kis_transform_worker.h"
0016 #include "lazybrush/kis_colorize_mask.h"
0017 #include "processing/kis_transform_processing_visitor.h"
0018 
0019 #include "commands_new/kis_transaction_based_command.h"
0020 #include <functional>
0021 
0022 
0023 KisMirrorProcessingVisitor::KisMirrorProcessingVisitor(const QRect &bounds, Qt::Orientation orientation)
0024     : m_bounds(bounds),
0025       m_orientation(orientation),
0026       m_selectionHelper(0, std::bind(&KisMirrorProcessingVisitor::mirrorDevice, this, std::placeholders::_1))
0027 {
0028     m_axis = m_orientation == Qt::Horizontal ?
0029         m_bounds.x() + 0.5 * m_bounds.width() :
0030         m_bounds.y() + 0.5 * m_bounds.height();
0031 }
0032 
0033 KisMirrorProcessingVisitor::KisMirrorProcessingVisitor(KisSelectionSP selection, Qt::Orientation orientation)
0034     : KisMirrorProcessingVisitor(selection->selectedExactRect(), orientation)
0035 {
0036     m_selectionHelper.setSelection(selection);
0037 }
0038 
0039 KUndo2Command *KisMirrorProcessingVisitor::createInitCommand()
0040 {
0041     return m_selectionHelper.createInitCommand();
0042 }
0043 
0044 void KisMirrorProcessingVisitor::mirrorDevice(KisPaintDeviceSP device)
0045 {
0046     KisTransformWorker::mirror(device, m_axis, m_orientation);
0047 }
0048 
0049 void KisMirrorProcessingVisitor::transformPaintDevice(KisPaintDeviceSP device, KisUndoAdapter *undoAdapter)
0050 {
0051     m_selectionHelper.transformPaintDevice(device, undoAdapter);
0052 }
0053 
0054 void KisMirrorProcessingVisitor::visitNodeWithPaintDevice(KisNode *node, KisUndoAdapter *undoAdapter)
0055 {
0056     transformPaintDevice(node->paintDevice(), undoAdapter);
0057 }
0058 
0059 void KisMirrorProcessingVisitor::visitExternalLayer(KisExternalLayer *layer, KisUndoAdapter *undoAdapter)
0060 {
0061     if (m_orientation == Qt::Horizontal) {
0062         KisTransformProcessingVisitor visitor(-1.0, 1.0,
0063                                               0.0, 0.0,
0064                                               QPointF(), 0.0,
0065                                               m_bounds.width(), 0.0,
0066                                               0);
0067         visitor.visit(layer, undoAdapter);
0068     } else {
0069         KisTransformProcessingVisitor visitor(1.0, -1.0,
0070                                               0.0, 0.0,
0071                                               QPointF(), 0.0,
0072                                               0.0, m_bounds.height(),
0073                                               0);
0074         visitor.visit(layer, undoAdapter);
0075     }
0076 }
0077 
0078 void KisMirrorProcessingVisitor::visitColorizeMask(KisColorizeMask *node, KisUndoAdapter *undoAdapter)
0079 {
0080     QVector<KisPaintDeviceSP> devices = node->allPaintDevices();
0081 
0082     Q_FOREACH (KisPaintDeviceSP device, devices) {
0083         transformPaintDevice(device, undoAdapter);
0084     }
0085 }