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