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