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

0001 /*
0002  * SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #ifndef PSDLayerStyleCHECK_H
0008 #define PSDLayerStyleCHECK_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 <kis_node_visitor.h>
0016 #include "kis_node.h"
0017 #include "kis_paint_layer.h"
0018 #include "kis_group_layer.h"
0019 #include "kis_adjustment_layer.h"
0020 #include "kis_external_layer_iface.h"
0021 #include "kis_clone_layer.h"
0022 #include "generator/kis_generator_layer.h"
0023 
0024 class KisLayerStyleVisitor : public KisNodeVisitor
0025 {
0026 public:
0027 
0028     using KisNodeVisitor::visit;
0029 
0030     KisLayerStyleVisitor()
0031         : m_count(0)
0032     {
0033     }
0034 
0035     quint32 count() {
0036         return m_count;
0037     }
0038 
0039     bool visit(KisNode* node) override {
0040         return check(node);
0041     }
0042 
0043     bool visit(KisPaintLayer *layer) override {
0044         return check(layer);
0045     }
0046 
0047     bool visit(KisGroupLayer *layer) override {
0048         return check(layer);
0049     }
0050 
0051 
0052     bool visit(KisAdjustmentLayer *layer) override {
0053         return check(layer);
0054     }
0055 
0056     bool visit(KisExternalLayer *layer) override {
0057         return check(layer);
0058     }
0059 
0060     bool visit(KisCloneLayer *layer) override {
0061         return check(layer);
0062     }
0063 
0064     bool visit(KisGeneratorLayer * layer) override {
0065         return check(layer);
0066     }
0067 
0068     bool visit(KisFilterMask *) override {return true;}
0069 
0070     bool visit(KisTransformMask *) override {return true;}
0071 
0072     bool visit(KisTransparencyMask *) override {return true;}
0073 
0074     bool visit(KisSelectionMask *) override {return true;}
0075 
0076     bool visit(KisColorizeMask *) override {return true;}
0077 
0078 
0079 private:
0080     bool check(KisNode * node)
0081     {
0082         KisLayer *layer = dynamic_cast<KisLayer*>(node);
0083         if (layer) {
0084             if (layer->layerStyle()) {
0085                 m_count++;
0086             }
0087         }
0088         visitAll(node);
0089         return true;
0090     }
0091 
0092     quint32 m_count;
0093 };
0094 
0095 
0096 class PSDLayerStyleCheck : public KisExportCheckBase
0097 {
0098 public:
0099 
0100     PSDLayerStyleCheck(const QString &id, Level level, const QString &customWarning = QString())
0101         : KisExportCheckBase(id, level, customWarning, true)
0102     {
0103         if (customWarning.isEmpty()) {
0104             m_warning = i18nc("image conversion warning", "The image contains <b>layer styles</b>. The layer styles will not be saved.");
0105         }
0106     }
0107 
0108     bool checkNeeded(KisImageSP image) const override
0109     {
0110         KisLayerStyleVisitor  v;
0111         image->rootLayer()->accept(v);
0112         return (v.count() > 0);
0113     }
0114 
0115     Level check(KisImageSP /*image*/) const override
0116     {
0117         return m_level;
0118     }
0119 };
0120 
0121 class PSDLayerStyleCheckFactory : public KisExportCheckFactory
0122 {
0123 public:
0124 
0125     PSDLayerStyleCheckFactory() {}
0126 
0127     ~PSDLayerStyleCheckFactory() override {}
0128 
0129     KisExportCheckBase *create(KisExportCheckBase::Level level, const QString &customWarning) override
0130     {
0131         return new PSDLayerStyleCheck(id(), level, customWarning);
0132     }
0133 
0134     QString id() const override {
0135         return "PSDLayerStyleCheck";
0136     }
0137 };
0138 
0139 #endif // PSDLayerStyleCHECK_H