File indexing completed on 2024-05-12 15:58:46

0001 /*
0002  *  SPDX-FileCopyrightText: 2006 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_transparency_mask.h"
0008 
0009 #include "kis_debug.h"
0010 
0011 #include <KoIcon.h>
0012 #include <kis_icon.h>
0013 #include <KoColor.h>
0014 #include <KoColorSpace.h>
0015 #include <KoCompositeOpRegistry.h>
0016 #include "kis_paint_device.h"
0017 #include "kis_painter.h"
0018 #include "kis_node_visitor.h"
0019 #include "kis_processing_visitor.h"
0020 #include "kis_image.h"
0021 
0022 KisTransparencyMask::KisTransparencyMask(KisImageWSP image, const QString &name)
0023         : KisEffectMask(image, name)
0024 {
0025 }
0026 
0027 KisTransparencyMask::KisTransparencyMask(const KisTransparencyMask& rhs)
0028         : KisEffectMask(rhs)
0029 {
0030 }
0031 
0032 KisTransparencyMask::~KisTransparencyMask()
0033 {
0034 }
0035 
0036 QRect KisTransparencyMask::decorateRect(KisPaintDeviceSP &src,
0037                                         KisPaintDeviceSP &dst,
0038                                         const QRect & rc,
0039                                         PositionToFilthy maskPos) const
0040 {
0041     Q_UNUSED(maskPos);
0042 
0043     if (src != dst) {
0044         KisPainter::copyAreaOptimized(rc.topLeft(), src, dst, rc);
0045         src->fill(rc, KoColor(Qt::transparent, src->colorSpace()));
0046     }
0047 
0048     return rc;
0049 }
0050 
0051 QRect KisTransparencyMask::extent() const
0052 {
0053     return parent() ? parent()->extent() : QRect();
0054 }
0055 
0056 QRect KisTransparencyMask::exactBounds() const
0057 {
0058     return parent() ? parent()->exactBounds() : QRect();
0059 }
0060 
0061 QRect KisTransparencyMask::changeRect(const QRect &rect, PositionToFilthy pos) const
0062 {
0063     /**
0064      * Selection on transparency masks have no special meaning:
0065      * They do crop both: change and need area
0066      */
0067     return KisMask::changeRect(rect, pos);
0068 }
0069 
0070 QRect KisTransparencyMask::needRect(const QRect &rect, PositionToFilthy pos) const
0071 {
0072     /**
0073      * Selection on transparency masks have no special meaning:
0074      * They do crop both: change and need area
0075      */
0076     return KisMask::needRect(rect, pos);
0077 }
0078 
0079 bool KisTransparencyMask::paintsOutsideSelection() const
0080 {
0081     return true;
0082 }
0083 
0084 QIcon KisTransparencyMask::icon() const
0085 {
0086     return KisIconUtils::loadIcon("transparencyMask");
0087 }
0088 
0089 bool KisTransparencyMask::accept(KisNodeVisitor &v)
0090 {
0091     return v.visit(this);
0092 }
0093 
0094 void KisTransparencyMask::accept(KisProcessingVisitor &visitor, KisUndoAdapter *undoAdapter)
0095 {
0096     return visitor.visit(this, undoAdapter);
0097 }
0098