File indexing completed on 2024-05-12 15:58:28
0001 /* 0002 * SPDX-FileCopyrightText: 2008 Cyrille Berger <cberger@cberger.net> 0003 * SPDX-FileCopyrightText: 2012 Dmitry Kazakov <dimula73@gmail.com> 0004 * 0005 * SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "kis_node_filter_interface.h" 0009 0010 #include "filter/kis_filter.h" 0011 #include "generator/kis_generator.h" 0012 #include "filter/kis_filter_registry.h" 0013 #include "filter/kis_filter_configuration.h" 0014 #include "generator/kis_generator_registry.h" 0015 0016 #ifdef SANITY_CHECK_FILTER_CONFIGURATION_OWNER 0017 0018 #define SANITY_ACQUIRE_FILTER(filter) \ 0019 do { \ 0020 if ((filter)) { \ 0021 (filter)->sanityRefUsageCounter(); \ 0022 } \ 0023 } while (0) 0024 0025 #define SANITY_RELEASE_FILTER(filter) \ 0026 do { \ 0027 if (m_filterConfiguration && m_filterConfiguration->sanityDerefUsageCounter()) { \ 0028 warnKrita; \ 0029 warnKrita << "WARNING: filter configuration has more than one user! Krita will probably crash soon!"; \ 0030 warnKrita << "WARNING:" << ppVar(this); \ 0031 warnKrita << "WARNING:" << ppVar(filter.data()); \ 0032 warnKrita; \ 0033 } \ 0034 } while (0) 0035 0036 #else /* SANITY_CHECK_FILTER_CONFIGURATION_OWNER */ 0037 0038 #define SANITY_ACQUIRE_FILTER(filter) 0039 #define SANITY_RELEASE_FILTER(filter) 0040 0041 #endif /* SANITY_CHECK_FILTER_CONFIGURATION_OWNER*/ 0042 0043 KisNodeFilterInterface::KisNodeFilterInterface(KisFilterConfigurationSP filterConfig) 0044 : m_filterConfiguration(filterConfig) 0045 { 0046 SANITY_ACQUIRE_FILTER(m_filterConfiguration); 0047 KIS_SAFE_ASSERT_RECOVER_NOOP(!filterConfig || filterConfig->hasLocalResourcesSnapshot()); 0048 } 0049 0050 KisNodeFilterInterface::KisNodeFilterInterface(const KisNodeFilterInterface &rhs) 0051 : m_filterConfiguration(rhs.m_filterConfiguration->clone()) 0052 0053 { 0054 SANITY_ACQUIRE_FILTER(m_filterConfiguration); 0055 } 0056 0057 KisNodeFilterInterface::~KisNodeFilterInterface() 0058 { 0059 SANITY_RELEASE_FILTER(m_filterConfiguration); 0060 } 0061 0062 KisFilterConfigurationSP KisNodeFilterInterface::filter() const 0063 { 0064 return m_filterConfiguration; 0065 } 0066 0067 void KisNodeFilterInterface::setFilter(KisFilterConfigurationSP filterConfig, bool /*checkCompareConfig*/) 0068 { 0069 SANITY_RELEASE_FILTER(m_filterConfiguration); 0070 0071 KIS_SAFE_ASSERT_RECOVER_RETURN(filterConfig); 0072 KIS_SAFE_ASSERT_RECOVER_NOOP(filterConfig->hasLocalResourcesSnapshot()); 0073 m_filterConfiguration = filterConfig; 0074 0075 SANITY_ACQUIRE_FILTER(m_filterConfiguration); 0076 } 0077 0078 void KisNodeFilterInterface::notifyColorSpaceChanged() 0079 { 0080 /** 0081 * On a color space change we need to reset all the 0082 * caches stored inside filter configuration. The 0083 * current "standard" way for doing that is just to 0084 * clone the configuration (which clones everything 0085 * except of the caches). We should probably invent 0086 * a better approach for that cache resetting later. 0087 */ 0088 0089 if (m_filterConfiguration) { 0090 m_filterConfiguration = m_filterConfiguration->clone(); 0091 } 0092 }