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 COLORMODELHOMOGENOUSCHECK_H
0008 #define COLORMODELHOMOGENOUSCHECK_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 KisColorModelHomogenousCheckVisitor : public KisNodeVisitor
0027 {
0028 public:
0029 
0030     using KisNodeVisitor::visit;
0031 
0032     KisColorModelHomogenousCheckVisitor(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 
0089             const KoColorSpace * cs = layer->colorSpace();
0090             if (cs->colorModelId() != m_colorModelID || cs->colorDepthId() != m_colorDepthID) {
0091                 m_count++;
0092             }
0093         }
0094         visitAll(node);
0095         return true;
0096     }
0097 
0098     quint32 m_count;
0099     const KoID m_colorModelID;
0100     const KoID m_colorDepthID;
0101 
0102 };
0103 
0104 class ColorModelHomogenousCheck : public KisExportCheckBase
0105 {
0106 public:
0107 
0108     ColorModelHomogenousCheck(const QString &id, Level level, const QString &customWarning = QString())
0109         : KisExportCheckBase(id, level, customWarning, true)
0110     {
0111         if (customWarning.isEmpty()) {
0112             m_warning = i18nc("image conversion warning", "Your image contains layers with a color model that is different from the image. The layers will be converted.");
0113         }
0114     }
0115 
0116     bool checkNeeded(KisImageSP image) const override
0117     {
0118         const KoColorSpace *cs = image->colorSpace();
0119         KisColorModelHomogenousCheckVisitor v(cs->colorModelId(), cs->colorDepthId());
0120         image->rootLayer()->accept(v);
0121         return (v.count() > 0);
0122     }
0123 
0124     Level check(KisImageSP /*image*/) const override
0125     {
0126         return m_level;
0127     }
0128 
0129 };
0130 
0131 class ColorModelHomogenousCheckFactory : public KisExportCheckFactory
0132 {
0133 public:
0134 
0135     ColorModelHomogenousCheckFactory()
0136     {
0137     }
0138 
0139     ~ColorModelHomogenousCheckFactory() override {}
0140 
0141     KisExportCheckBase *create(KisExportCheckBase::Level level, const QString &customWarning) override
0142     {
0143         return new ColorModelHomogenousCheck(id(), level, customWarning);
0144     }
0145 
0146     QString id() const override {
0147         return "ColorModelHomogenousCheck";
0148     }
0149 
0150 };
0151 
0152 
0153 #endif // COLORMODELHOMOGENOUSCHECK_H