File indexing completed on 2024-05-12 15:59:02

0001 /*
0002  * SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #ifndef ColorModelPerLayerCHECK_H
0008 #define ColorModelPerLayerCHECK_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 KisColorModelCheckVisitor : public KisNodeVisitor
0027 {
0028 public:
0029 
0030     using KisNodeVisitor::visit;
0031 
0032     KisColorModelCheckVisitor (KoID colorModelID, KoID colorDepthID)
0033         : m_count(0)
0034         , m_colorModelID(colorModelID)
0035         , m_colorDepthID(colorDepthID)
0036     {
0037     }
0038 
0039     quint32 count() {
0040         return m_count;
0041     }
0042 
0043     bool visit(KisNode* node) override {
0044         return check(node);
0045     }
0046 
0047     bool visit(KisPaintLayer *layer) override {
0048         return check(layer);
0049     }
0050 
0051     bool visit(KisGroupLayer *layer) override {
0052         return check(layer);
0053     }
0054 
0055 
0056     bool visit(KisAdjustmentLayer *layer) override {
0057         return check(layer);
0058     }
0059 
0060     bool visit(KisExternalLayer *layer) override {
0061         return check(layer);
0062     }
0063 
0064     bool visit(KisCloneLayer *layer) override {
0065         return check(layer);
0066     }
0067 
0068     bool visit(KisGeneratorLayer * layer) override {
0069         return check(layer);
0070     }
0071 
0072     bool visit(KisFilterMask *) override {return true;}
0073 
0074     bool visit(KisTransformMask *) override {return true;}
0075 
0076     bool visit(KisTransparencyMask *) override {return true;}
0077 
0078     bool visit(KisSelectionMask *) override {return true;}
0079 
0080     bool visit(KisColorizeMask *) override {return true;}
0081 
0082 
0083 private:
0084     bool check(KisNode * node)
0085     {
0086         KisLayer *layer = dynamic_cast<KisLayer*>(node);
0087         if (layer) {
0088             const KoColorSpace * cs = layer->colorSpace();
0089             if (cs->colorModelId() == m_colorModelID && cs->colorDepthId() == m_colorDepthID) {
0090                 m_count++;
0091             }
0092         }
0093         visitAll(node);
0094         return true;
0095     }
0096 
0097     quint32 m_count;
0098     const KoID m_colorModelID;
0099     const KoID m_colorDepthID;
0100 
0101 };
0102 
0103 class ColorModelPerLayerCheck : public KisExportCheckBase
0104 {
0105 public:
0106 
0107     ColorModelPerLayerCheck(const KoID &colorModelID, const KoID &colorDepthID, const QString &id, Level level, const QString &customWarning = QString())
0108         : KisExportCheckBase(id, level, customWarning, true)
0109         , m_ColorModelID(colorModelID)
0110         , m_colorDepthID(colorDepthID)
0111     {
0112         Q_ASSERT(!colorModelID.name().isEmpty());
0113         Q_ASSERT(!colorDepthID.name().isEmpty());
0114 
0115         if (customWarning.isEmpty()) {
0116             m_warning = i18nc("image conversion warning", "Your image contains layers with the color model <b>%1</b> and channel depth <b>%2</b> which cannot be saved to this format. The layers will be converted."
0117             , m_ColorModelID.name()
0118             ,m_colorDepthID.name());
0119         }
0120     }
0121 
0122     bool checkNeeded(KisImageSP image) const override
0123     {
0124         KisColorModelCheckVisitor v(m_ColorModelID, m_colorDepthID);
0125         image->rootLayer()->accept(v);
0126         return (v.count() > 0);
0127     }
0128 
0129     Level check(KisImageSP /*image*/) const override
0130     {
0131         return m_level;
0132     }
0133 
0134     const KoID m_ColorModelID;
0135     const KoID m_colorDepthID;
0136 };
0137 
0138 class ColorModelPerLayerCheckFactory : public KisExportCheckFactory
0139 {
0140 public:
0141 
0142     ColorModelPerLayerCheckFactory(const KoID &ColorModelID, const KoID &colorDepthId)
0143         : m_colorModelID(ColorModelID)
0144         , m_colorDepthID(colorDepthId)
0145     {
0146     }
0147 
0148     ~ColorModelPerLayerCheckFactory() override {}
0149 
0150     KisExportCheckBase *create(KisExportCheckBase::Level level, const QString &customWarning) override
0151     {
0152         return new ColorModelPerLayerCheck(m_colorModelID, m_colorDepthID, id(), level, customWarning);
0153     }
0154 
0155     QString id() const override {
0156         return "ColorModelPerLayerCheck/" + m_colorModelID.id() + "/" + m_colorDepthID.id();
0157     }
0158 
0159     const KoID m_colorModelID;
0160     const KoID m_colorDepthID;
0161 };
0162 
0163 #endif // ColorModelPerLayerCHECK_H