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 }