File indexing completed on 2024-05-19 04:26:52

0001 /*
0002  * SPDX-FileCopyrightText: 2023 Rasyuqa A. H. <qampidh@gmail.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #ifndef LAYEROPACITYCHECK_H
0008 #define LAYEROPACITYCHECK_H
0009 
0010 #include "KisExportCheckRegistry.h"
0011 #include <KoID.h>
0012 #include <klocalizedstring.h>
0013 #include <kis_image.h>
0014 #include <KoColorSpace.h>
0015 #include <KoColorModelStandardIds.h>
0016 #include <kis_layer.h>
0017 #include <kis_node_visitor.h>
0018 #include "kis_node.h"
0019 #include "kis_paint_layer.h"
0020 #include "kis_group_layer.h"
0021 #include "kis_adjustment_layer.h"
0022 #include "kis_external_layer_iface.h"
0023 #include "kis_clone_layer.h"
0024 #include "generator/kis_generator_layer.h"
0025 
0026 class KisLayerOpacityCheckVisitor : public KisNodeVisitor
0027 {
0028 public:
0029 
0030     using KisNodeVisitor::visit;
0031 
0032     KisLayerOpacityCheckVisitor()
0033         : m_count(0)
0034     {
0035     }
0036 
0037     quint32 count() {
0038         return m_count;
0039     }
0040 
0041     bool visit(KisNode* node) override {
0042         return check(node);
0043     }
0044 
0045     bool visit(KisPaintLayer *layer) override {
0046         return check(layer);
0047     }
0048 
0049     bool visit(KisGroupLayer *layer) override {
0050         return check(layer);
0051     }
0052 
0053 
0054     bool visit(KisAdjustmentLayer *layer) override {
0055         return check(layer);
0056     }
0057 
0058     bool visit(KisExternalLayer *layer) override {
0059         return check(layer);
0060     }
0061 
0062     bool visit(KisCloneLayer *layer) override {
0063         return check(layer);
0064     }
0065 
0066     bool visit(KisGeneratorLayer * layer) override {
0067         return check(layer);
0068     }
0069 
0070     bool visit(KisFilterMask *) override {return true;}
0071 
0072     bool visit(KisTransformMask *) override {return true;}
0073 
0074     bool visit(KisTransparencyMask *) override {return true;}
0075 
0076     bool visit(KisSelectionMask *) override {return true;}
0077 
0078     bool visit(KisColorizeMask *) override {return true;}
0079 
0080 
0081 private:
0082     bool check(KisNode * node)
0083     {
0084         KisLayer *layer = dynamic_cast<KisLayer*>(node);
0085         if (layer) {
0086             // XXX: This need to be rewritten if true float opacity is implemented
0087             if (layer->opacity() < OPACITY_OPAQUE_U8) {
0088                 m_count++;
0089             }
0090         }
0091         visitAll(node);
0092         return true;
0093     }
0094 
0095     quint32 m_count;
0096 
0097 };
0098 
0099 class LayerOpacityCheck : public KisExportCheckBase
0100 {
0101 public:
0102 
0103     LayerOpacityCheck(const QString &id, Level level, const QString &customWarning = QString())
0104         : KisExportCheckBase(id, level, customWarning, true)
0105     {
0106         if (customWarning.isEmpty()) {
0107             m_warning = i18nc(
0108                 "image conversion warning",
0109                 "Your image contains layers with a partial opacity. The layers will be exported at full opacity.");
0110         }
0111     }
0112 
0113     bool checkNeeded(KisImageSP image) const override
0114     {
0115         KisLayerOpacityCheckVisitor v;
0116         image->rootLayer()->accept(v);
0117         return (v.count() > 0);
0118     }
0119 
0120     Level check(KisImageSP /*image*/) const override
0121     {
0122         return m_level;
0123     }
0124 
0125 };
0126 
0127 class LayerOpacityCheckFactory : public KisExportCheckFactory
0128 {
0129 public:
0130 
0131     LayerOpacityCheckFactory()
0132     {
0133     }
0134 
0135     ~LayerOpacityCheckFactory() override {}
0136 
0137     KisExportCheckBase *create(KisExportCheckBase::Level level, const QString &customWarning) override
0138     {
0139         return new LayerOpacityCheck(id(), level, customWarning);
0140     }
0141 
0142     QString id() const override {
0143         return "LayerOpacityCheck";
0144     }
0145 
0146 };
0147 
0148 
0149 #endif // LAYEROPACITYCHECK_H