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 }