diff --git a/benchmarks/KisAnimationRenderingBenchmark.cpp b/benchmarks/KisAnimationRenderingBenchmark.cpp --- a/benchmarks/KisAnimationRenderingBenchmark.cpp +++ b/benchmarks/KisAnimationRenderingBenchmark.cpp @@ -47,7 +47,7 @@ void runRenderingTest(KisImageSP image, int numCores, int numClones) { { - KisImageConfig cfg(false); + KisImageConfigMutable cfg; cfg.setMaxNumberOfThreads(numCores); cfg.setFrameRenderingClones(numClones); } diff --git a/benchmarks/kis_low_memory_benchmark.cpp b/benchmarks/kis_low_memory_benchmark.cpp --- a/benchmarks/kis_low_memory_benchmark.cpp +++ b/benchmarks/kis_low_memory_benchmark.cpp @@ -89,7 +89,7 @@ /** * Reset configuration to the desired settings */ - KisImageConfig config(false); + KisImageConfigMutable config; qreal oldHardLimit = config.memoryHardLimitPercent(); qreal oldSoftLimit = config.memorySoftLimitPercent(); qreal oldPoolLimit = config.memoryPoolLimitPercent(); diff --git a/libs/global/KisCpp14Quirks.h b/libs/global/KisCpp14Quirks.h new file mode 100644 --- /dev/null +++ b/libs/global/KisCpp14Quirks.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018 Dmitry Kazakov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KIS_CPP14_QUIRKS_H +#define KIS_CPP14_QUIRKS_H + + +#if __cplusplus < 201402L + +#include + +namespace std { +template< class T > +using decay_t = typename decay::type; +} + +#endif /* __cplusplus < 201402L */ + +#endif // KIS_CPP14_QUIRKS_H diff --git a/libs/image/CMakeLists.txt b/libs/image/CMakeLists.txt --- a/libs/image/CMakeLists.txt +++ b/libs/image/CMakeLists.txt @@ -198,6 +198,7 @@ kis_node_graph_listener.cpp kis_image.cc kis_image_signal_router.cpp + KisKConfigWrapper.cpp kis_image_config.cpp kis_projection_updates_filter.cpp kis_suspend_projection_updates_stroke_strategy.cpp diff --git a/libs/image/KisKConfigWrapper.h b/libs/image/KisKConfigWrapper.h new file mode 100644 --- /dev/null +++ b/libs/image/KisKConfigWrapper.h @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2018 Dmitry Kazakov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef KISKCONFIGWRAPPER_H +#define KISKCONFIGWRAPPER_H + +#include +#include "kritaimage_export.h" + +#include +#include + + +struct KRITAIMAGE_EXPORT KisKConfigWrapper { + KisKConfigWrapper(const KConfigGroup &group) + : m_config(group) + { + } + + template + QString readEntry(K key, const char *defaultValue) const { + return m_config.readEntry(key, defaultValue); + } + + template + std::decay_t readEntry(K key, T defaultValue) const { + return m_config.readEntry(key, defaultValue); + } + +protected: + KConfigGroup m_config; +}; + +struct KRITAIMAGE_EXPORT KisKConfigMutableWrapper : public KisKConfigWrapper +{ + KisKConfigMutableWrapper(const KConfigGroup &group); + + ~KisKConfigMutableWrapper(); + + template + void writeEntry(K key, T value) { + return m_config.writeEntry(key, value); + } + + template + void deleteEntry(K key) { + return m_config.deleteEntry(key); + } +}; + +#endif // KISKCONFIGWRAPPER_H diff --git a/libs/image/KisKConfigWrapper.cpp b/libs/image/KisKConfigWrapper.cpp new file mode 100644 --- /dev/null +++ b/libs/image/KisKConfigWrapper.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018 Dmitry Kazakov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "KisKConfigWrapper.h" + +#include +#include + +#include "kis_debug.h" + + +KisKConfigMutableWrapper::KisKConfigMutableWrapper(const KConfigGroup &group) + : KisKConfigWrapper(group) +{ + KIS_SAFE_ASSERT_RECOVER_RETURN(qApp->thread() == QThread::currentThread()); +} + +KisKConfigMutableWrapper::~KisKConfigMutableWrapper() { + if (qApp->thread() != QThread::currentThread()) { + dbgKrita << "WriteConfigPolicy: requested config synchronization from nonGUI thread! Called from" << kisBacktrace(); + return; + } + + m_config.sync(); +} diff --git a/libs/image/kis_image.cc b/libs/image/kis_image.cc --- a/libs/image/kis_image.cc +++ b/libs/image/kis_image.cc @@ -144,7 +144,7 @@ , axesCenter(QPointF(0.5, 0.5)) { { - KisImageConfig cfg(true); + KisImageConfig cfg; if (cfg.enableProgressReporting()) { scheduler.setProgressProxy(&compositeProgressProxy); } @@ -1349,7 +1349,7 @@ void KisImage::KisImagePrivate::notifyProjectionUpdatedInPatches(const QRect &rc) { - KisImageConfig imageConfig(true); + KisImageConfig imageConfig; int patchWidth = imageConfig.updatePatchWidth(); int patchHeight = imageConfig.updatePatchHeight(); diff --git a/libs/image/kis_image_config.h b/libs/image/kis_image_config.h --- a/libs/image/kis_image_config.h +++ b/libs/image/kis_image_config.h @@ -23,134 +23,230 @@ #include "kritaimage_export.h" #include "KisProofingConfiguration.h" #include "kis_types.h" +#include "kis_global.h" -class KRITAIMAGE_EXPORT KisImageConfig -{ -public: - KisImageConfig(bool readOnly); - ~KisImageConfig(); - - bool enableProgressReporting(bool requestDefault = false) const; - void setEnableProgressReporting(bool value); - - bool enablePerfLog(bool requestDefault = false) const; - void setEnablePerfLog(bool value); - - qreal transformMaskOffBoundsReadArea() const; - - int updatePatchHeight() const; - void setUpdatePatchHeight(int value); - int updatePatchWidth() const; - void setUpdatePatchWidth(int value); - - qreal maxCollectAlpha() const; - qreal maxMergeAlpha() const; - qreal maxMergeCollectAlpha() const; - qreal schedulerBalancingRatio() const; - void setSchedulerBalancingRatio(qreal value); - - int maxSwapSize(bool requestDefault = false) const; - void setMaxSwapSize(int value); - - int swapSlabSize() const; - void setSwapSlabSize(int value); - - int swapWindowSize() const; - void setSwapWindowSize(int value); +#include +#include "KoColorProfile.h" +#include - int tilesHardLimit() const; // MiB - int tilesSoftLimit() const; // MiB - int poolLimit() const; // MiB +#define DECL_PROPERTY_RW(getter, Type, defValue, setter) \ + Type getter(bool requestDefault = false) const { \ + return !requestDefault ? \ + Type(m_config.readEntry(#getter, defValue)) : Type(defValue); \ + } \ + void setter(Type value) { \ + m_config.writeEntry(#getter, value); \ + } - qreal memoryHardLimitPercent(bool requestDefault = false) const; // % of total RAM - qreal memorySoftLimitPercent(bool requestDefault = false) const; // % of memoryHardLimitPercent() * (1 - 0.01 * memoryPoolLimitPercent()) - qreal memoryPoolLimitPercent(bool requestDefault = false) const; // % of memoryHardLimitPercent() - void setMemoryHardLimitPercent(qreal value); - void setMemorySoftLimitPercent(qreal value); - void setMemoryPoolLimitPercent(qreal value); +#define DECL_PROPERTY_R(getter, Type, defValue) \ + Type getter(bool requestDefault = false) const { \ + return !requestDefault ? \ + Type(m_config.readEntry(#getter, defValue)) : Type(defValue); \ + } - static int totalRAM(); // MiB - /** - * @return a specific directory for the swapfile, if set. If not set, return an - * empty QString and use the default KDE directory. - */ - QString swapDir(bool requestDefault = false); - void setSwapDir(const QString &swapDir); - - int numberOfOnionSkins() const; - void setNumberOfOnionSkins(int value); +namespace KisImageConfigImplPrivate +{ +int KRITAIMAGE_EXPORT totalRAM(); // MiB +QString KRITAIMAGE_EXPORT safelyGetWritableTempLocation(const QString &suffix, const QString &userValue, bool requestDefault); +} - int onionSkinTintFactor() const; - void setOnionSkinTintFactor(int value); - int onionSkinOpacity(int offset) const; - void setOnionSkinOpacity(int offset, int value); +template +class KRITAIMAGE_EXPORT KisImageConfigImpl +{ +public: + KisImageConfigImpl(); - bool onionSkinState(int offset) const; - void setOnionSkinState(int offset, bool value); + DECL_PROPERTY_RW(enableProgressReporting, bool, true, setEnableProgressReporting) + DECL_PROPERTY_RW(enablePerfLog, bool, false, setEnablePerfLog) + DECL_PROPERTY_R(transformMaskOffBoundsReadArea, qreal, 0.5) + DECL_PROPERTY_RW(updatePatchHeight, int, 512, setUpdatePatchHeight) + DECL_PROPERTY_RW(updatePatchWidth, int, 512, setUpdatePatchWidth) - QColor onionSkinTintColorBackward() const; - void setOnionSkinTintColorBackward(const QColor &value); + DECL_PROPERTY_R(maxCollectAlpha, qreal, 2.5) + DECL_PROPERTY_R(maxMergeAlpha, qreal, 1.0) + DECL_PROPERTY_R(maxMergeCollectAlpha, qreal, 1.5) + DECL_PROPERTY_RW(schedulerBalancingRatio, qreal, 100, setSchedulerBalancingRatio) - QColor onionSkinTintColorForward() const; - void setOnionSkinTintColorForward(const QColor &value); + DECL_PROPERTY_RW(maxSwapSize, int, 4096, setMaxSwapSize) // in MiB + DECL_PROPERTY_RW(swapSlabSize, int, 64, setSwapSlabSize) // in MiB + DECL_PROPERTY_RW(swapWindowSize, int, 16, setSwapWindowSize) // in MiB - bool lazyFrameCreationEnabled(bool requestDefault = false) const; - void setLazyFrameCreationEnabled(bool value); + DECL_PROPERTY_RW(memoryHardLimitPercent, qreal, 50.0, setMemoryHardLimitPercent) + DECL_PROPERTY_RW(memorySoftLimitPercent, qreal, 2.0, setMemorySoftLimitPercent) + DECL_PROPERTY_RW(memoryPoolLimitPercent, qreal, 0.0, setMemoryPoolLimitPercent) - bool showAdditionalOnionSkinsSettings(bool requestDefault = false) const; - void setShowAdditionalOnionSkinsSettings(bool value); + DECL_PROPERTY_RW(numberOfOnionSkins, int, 10, setNumberOfOnionSkins) + DECL_PROPERTY_RW(onionSkinTintFactor, int, 192, setOnionSkinTintFactor) - int defaultFrameColorLabel() const; - void setDefaultFrameColorLabel(int label); + DECL_PROPERTY_RW(onionSkinTintColorBackward, QColor, QColor(Qt::red), setOnionSkinTintColorBackward) + DECL_PROPERTY_RW(onionSkinTintColorForward, QColor, QColor(Qt::green), setOnionSkinTintColorForward) + DECL_PROPERTY_RW(lazyFrameCreationEnabled, bool, true, setLazyFrameCreationEnabled) + DECL_PROPERTY_RW(showAdditionalOnionSkinsSettings, bool, true, setShowAdditionalOnionSkinsSettings) + DECL_PROPERTY_RW(defaultFrameColorLabel, int, 0, setDefaultFrameColorLabel) - KisProofingConfigurationSP defaultProofingconfiguration(); - void setDefaultProofingConfig(const KoColorSpace *proofingSpace, int proofingIntent, bool blackPointCompensation, KoColor warningColor, double adaptationState); + DECL_PROPERTY_RW(fpsLimit, int, 100, setFpsLimit) + DECL_PROPERTY_RW(useOnDiskAnimationCacheSwapping, bool, true, setUseOnDiskAnimationCacheSwapping) + DECL_PROPERTY_RW(useAnimationCacheFrameSizeLimit, bool, true, setUseAnimationCacheFrameSizeLimit) + DECL_PROPERTY_RW(animationCacheFrameSizeLimit, int, 2500, setAnimationCacheFrameSizeLimit) + DECL_PROPERTY_RW(useAnimationCacheRegionOfInterest, bool, true, setUseAnimationCacheRegionOfInterest) - bool useLodForColorizeMask(bool requestDefault = false) const; - void setUseLodForColorizeMask(bool value); + DECL_PROPERTY_RW(animationCacheRegionOfInterestMargin, qreal, 0.25, setAnimationCacheRegionOfInterestMargin) + DECL_PROPERTY_RW(selectionOverlayMaskColor, QColor, QColor(255, 0, 0, 220), setSelectionOverlayMaskColor) - int maxNumberOfThreads(bool defaultValue = false) const; - void setMaxNumberOfThreads(int value); + DECL_PROPERTY_RW(useLodForColorizeMask, bool, false, setUseLodForColorizeMask) - int frameRenderingClones(bool defaultValue = false) const; - void setFrameRenderingClones(int value); - int fpsLimit(bool defaultValue = false) const; - void setFpsLimit(int value); + int tilesHardLimit() const + { + qreal hp = qreal(memoryHardLimitPercent()) / 100.0; + qreal pp = qreal(memoryPoolLimitPercent()) / 100.0; - bool useOnDiskAnimationCacheSwapping(bool defaultValue = false) const; - void setUseOnDiskAnimationCacheSwapping(bool value); + return KisImageConfigImplPrivate::totalRAM() * hp * (1 - pp); + } - QString animationCacheDir(bool defaultValue = false) const; - void setAnimationCacheDir(const QString &value); + int tilesSoftLimit() const + { + qreal sp = qreal(memorySoftLimitPercent()) / 100.0; - bool useAnimationCacheFrameSizeLimit(bool defaultValue = false) const; - void setUseAnimationCacheFrameSizeLimit(bool value); + return tilesHardLimit() * sp; + } - int animationCacheFrameSizeLimit(bool defaultValue = false) const; - void setAnimationCacheFrameSizeLimit(int value); + int poolLimit() const + { + qreal hp = qreal(memoryHardLimitPercent()) / 100.0; + qreal pp = qreal(memoryPoolLimitPercent()) / 100.0; - bool useAnimationCacheRegionOfInterest(bool defaultValue = false) const; - void setUseAnimationCacheRegionOfInterest(bool value); + return KisImageConfigImplPrivate::totalRAM() * hp * pp; + } - qreal animationCacheRegionOfInterestMargin(bool defaultValue = false) const; - void setAnimationCacheRegionOfInterestMargin(qreal value); + static int totalRAM() { + return KisImageConfigImplPrivate::totalRAM(); // in MiB + } - QColor selectionOverlayMaskColor(bool defaultValue = false) const; - void setSelectionOverlayMaskColor(const QColor &color); + /** + * @return a specific directory for the swapfile, if set. If not set, + * returns system's temporary writable location + */ + QString swapDir(bool requestDefault = false) { + const QString configuredValue = m_config.readEntry("swaplocation", ""); + return KisImageConfigImplPrivate::safelyGetWritableTempLocation("swap", configuredValue, requestDefault); + } + + void setSwapDir(const QString &swapDir) { + m_config.writeEntry("swaplocation", swapDir); + } + + int onionSkinOpacity(int offset) const + { + int value = m_config.readEntry("onionSkinOpacity_" + QString::number(offset), -1); + + if (value < 0) { + const int num = numberOfOnionSkins(); + const qreal dx = qreal(qAbs(offset)) / num; + value = 0.7 * exp(-pow2(dx) / 0.5) * 255; + } + + return value; + } + + void setOnionSkinOpacity(int offset, int value) + { + m_config.writeEntry("onionSkinOpacity_" + QString::number(offset), value); + } + + bool onionSkinState(int offset) const + { + bool enableByDefault = (qAbs(offset) <= 2); + return m_config.readEntry("onionSkinState_" + QString::number(offset), enableByDefault); + } + + void setOnionSkinState(int offset, bool value) + { + m_config.writeEntry("onionSkinState_" + QString::number(offset), value); + } + + KisProofingConfigurationSP defaultProofingconfiguration() + { + KisProofingConfiguration *proofingConfig= new KisProofingConfiguration(); + proofingConfig->proofingProfile = m_config.readEntry("defaultProofingProfileName", "Chemical proof"); + proofingConfig->proofingModel = m_config.readEntry("defaultProofingProfileModel", "CMYKA"); + proofingConfig->proofingDepth = m_config.readEntry("defaultProofingProfileDepth", "U8"); + proofingConfig->intent = (KoColorConversionTransformation::Intent)m_config.readEntry("defaultProofingProfileIntent", 3); + if (m_config.readEntry("defaultProofingBlackpointCompensation", true)) { + proofingConfig->conversionFlags |= KoColorConversionTransformation::ConversionFlag::BlackpointCompensation; + } else { + proofingConfig->conversionFlags = proofingConfig->conversionFlags & ~KoColorConversionTransformation::ConversionFlag::BlackpointCompensation; + } + QColor def(Qt::green); + m_config.readEntry("defaultProofingGamutwarning", def); + KoColor col(KoColorSpaceRegistry::instance()->rgb8()); + col.fromQColor(def); + col.setOpacity(1.0); + proofingConfig->warningColor = col; + proofingConfig->adaptationState = (double)m_config.readEntry("defaultProofingAdaptationState", 1.0); + return toQShared(proofingConfig); + } + + void setDefaultProofingConfig(const KoColorSpace *proofingSpace, int proofingIntent, bool blackPointCompensation, KoColor warningColor, double adaptationState) + { + m_config.writeEntry("defaultProofingProfileName", proofingSpace->profile()->name()); + m_config.writeEntry("defaultProofingProfileModel", proofingSpace->colorModelId().id()); + m_config.writeEntry("defaultProofingProfileDepth", proofingSpace->colorDepthId().id()); + m_config.writeEntry("defaultProofingProfileIntent", proofingIntent); + m_config.writeEntry("defaultProofingBlackpointCompensation", blackPointCompensation); + QColor c; + c = warningColor.toQColor(); + m_config.writeEntry("defaultProofingGamutwarning", c); + m_config.writeEntry("defaultProofingAdaptationState",adaptationState); + } + + int maxNumberOfThreads(bool requestDefalt = false) const + { + return (requestDefalt ? QThread::idealThreadCount() : m_config.readEntry("maxNumberOfThreads", QThread::idealThreadCount())); + } + + void setMaxNumberOfThreads(int value) + { + if (value == QThread::idealThreadCount()) { + m_config.deleteEntry("maxNumberOfThreads"); + } else { + m_config.writeEntry("maxNumberOfThreads", value); + } + } + + int frameRenderingClones(bool requestDefalt = false) const + { + const int defaultClonesCount = qMax(1, maxNumberOfThreads(requestDefalt) / 2); + return requestDefalt ? defaultClonesCount : m_config.readEntry("frameRenderingClones", defaultClonesCount); + } + + void setFrameRenderingClones(int value) + { + m_config.writeEntry("frameRenderingClones", value); + } + + QString animationCacheDir(bool requestDefalt = false) const + { + const QString configuredValue = m_config.readValue("animationCacheDir", ""); + return KisImageConfigImplPrivate::safelyGetWritableTempLocation("animation_cache", configuredValue, requestDefalt); + } + + void setAnimationCacheDir(const QString &value) + { + m_config.writeEntry("animationCacheDir", value); + } private: - Q_DISABLE_COPY(KisImageConfig) - - QString safelyGetWritableTempLocation(const QString &suffix, const QString &configKey, bool requestDefault) const; + Q_DISABLE_COPY(KisImageConfigImpl) private: - KConfigGroup m_config; - bool m_readOnly; + ConfigClass m_config; }; +using KisImageConfig = KisImageConfigImpl; +using KisImageConfigMutable = KisImageConfigImpl; #endif /* KIS_IMAGE_CONFIG_H_ */ diff --git a/libs/image/kis_image_config.cpp b/libs/image/kis_image_config.cpp --- a/libs/image/kis_image_config.cpp +++ b/libs/image/kis_image_config.cpp @@ -39,13 +39,16 @@ #include #endif -KisImageConfig::KisImageConfig(bool readOnly) +template<> +KisImageConfigImpl::KisImageConfigImpl() + : m_config(KSharedConfig::openConfig()->group(QString())) +{ +} + +template<> +KisImageConfigImpl::KisImageConfigImpl() : m_config(KSharedConfig::openConfig()->group(QString())) - , m_readOnly(readOnly) { - if (!readOnly) { - KIS_SAFE_ASSERT_RECOVER_RETURN(qApp->thread() == QThread::currentThread()); - } #ifdef Q_OS_OSX // clear /var/folders/ swap path set by old broken Krita swap implementation in order to use new default swap dir. QString swap = m_config.readEntry("swaplocation", ""); @@ -55,181 +58,11 @@ #endif } -KisImageConfig::~KisImageConfig() -{ - if (m_readOnly) return; - - if (qApp->thread() != QThread::currentThread()) { - dbgKrita << "KisImageConfig: requested config synchronization from nonGUI thread! Called from" << kisBacktrace(); - return; - } - - m_config.sync(); -} - -bool KisImageConfig::enableProgressReporting(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("enableProgressReporting", true) : true; -} - -void KisImageConfig::setEnableProgressReporting(bool value) -{ - m_config.writeEntry("enableProgressReporting", value); -} - -bool KisImageConfig::enablePerfLog(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("enablePerfLog", false) :false; -} - -void KisImageConfig::setEnablePerfLog(bool value) -{ - m_config.writeEntry("enablePerfLog", value); -} - -qreal KisImageConfig::transformMaskOffBoundsReadArea() const -{ - return m_config.readEntry("transformMaskOffBoundsReadArea", 0.5); -} - -int KisImageConfig::updatePatchHeight() const -{ - return m_config.readEntry("updatePatchHeight", 512); -} - -void KisImageConfig::setUpdatePatchHeight(int value) -{ - m_config.writeEntry("updatePatchHeight", value); -} - -int KisImageConfig::updatePatchWidth() const -{ - return m_config.readEntry("updatePatchWidth", 512); -} - -void KisImageConfig::setUpdatePatchWidth(int value) -{ - m_config.writeEntry("updatePatchWidth", value); -} - -qreal KisImageConfig::maxCollectAlpha() const -{ - return m_config.readEntry("maxCollectAlpha", 2.5); -} - -qreal KisImageConfig::maxMergeAlpha() const -{ - return m_config.readEntry("maxMergeAlpha", 1.); -} - -qreal KisImageConfig::maxMergeCollectAlpha() const -{ - return m_config.readEntry("maxMergeCollectAlpha", 1.5); -} - -qreal KisImageConfig::schedulerBalancingRatio() const -{ - /** - * updates-queue-size / strokes-queue-size - */ - return m_config.readEntry("schedulerBalancingRatio", 100.); -} - -void KisImageConfig::setSchedulerBalancingRatio(qreal value) -{ - m_config.writeEntry("schedulerBalancingRatio", value); -} - -int KisImageConfig::maxSwapSize(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("maxSwapSize", 4096) : 4096; // in MiB -} - -void KisImageConfig::setMaxSwapSize(int value) -{ - m_config.writeEntry("maxSwapSize", value); -} - -int KisImageConfig::swapSlabSize() const -{ - return m_config.readEntry("swapSlabSize", 64); // in MiB -} - -void KisImageConfig::setSwapSlabSize(int value) -{ - m_config.writeEntry("swapSlabSize", value); -} - -int KisImageConfig::swapWindowSize() const -{ - return m_config.readEntry("swapWindowSize", 16); // in MiB -} - -void KisImageConfig::setSwapWindowSize(int value) -{ - m_config.writeEntry("swapWindowSize", value); -} - -int KisImageConfig::tilesHardLimit() const -{ - qreal hp = qreal(memoryHardLimitPercent()) / 100.0; - qreal pp = qreal(memoryPoolLimitPercent()) / 100.0; - - return totalRAM() * hp * (1 - pp); -} - -int KisImageConfig::tilesSoftLimit() const -{ - qreal sp = qreal(memorySoftLimitPercent()) / 100.0; - - return tilesHardLimit() * sp; -} - -int KisImageConfig::poolLimit() const -{ - qreal hp = qreal(memoryHardLimitPercent()) / 100.0; - qreal pp = qreal(memoryPoolLimitPercent()) / 100.0; - - return totalRAM() * hp * pp; -} - -qreal KisImageConfig::memoryHardLimitPercent(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("memoryHardLimitPercent", 50.) : 50.; -} - -void KisImageConfig::setMemoryHardLimitPercent(qreal value) -{ - m_config.writeEntry("memoryHardLimitPercent", value); -} - -qreal KisImageConfig::memorySoftLimitPercent(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("memorySoftLimitPercent", 2.) : 2.; -} - -void KisImageConfig::setMemorySoftLimitPercent(qreal value) -{ - m_config.writeEntry("memorySoftLimitPercent", value); -} +template KisImageConfigImpl::KisImageConfigImpl(); +template KisImageConfigImpl::KisImageConfigImpl(); -qreal KisImageConfig::memoryPoolLimitPercent(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("memoryPoolLimitPercent", 0.0) : 0.0; -} -void KisImageConfig::setMemoryPoolLimitPercent(qreal value) -{ - m_config.writeEntry("memoryPoolLimitPercent", value); -} - -QString KisImageConfig::safelyGetWritableTempLocation(const QString &suffix, const QString &configKey, bool requestDefault) const +QString KisImageConfigImplPrivate::safelyGetWritableTempLocation(const QString &suffix, const QString &userValue, bool requestDefault) { #ifdef Q_OS_OSX // On OSX, QDir::tempPath() gives us a folder we cannot reply upon (usually @@ -254,105 +87,21 @@ if (requestDefault) { return swap; } - const QString configuredSwap = m_config.readEntry(configKey, swap); + const QString configuredSwap = userValue.isEmpty() ? swap : userValue; if (!configuredSwap.isEmpty()) { +#ifdef Q_OS_OSX + // clear /var/folders/ swap path set by old broken Krita swap implementation in order to use new default swap dir. + if (!configuredSwap.startsWith("/var/folders/")) { + swap = configuredSwap; + } +#else swap = configuredSwap; +#endif } return swap; } -QString KisImageConfig::swapDir(bool requestDefault) -{ - return safelyGetWritableTempLocation("swap", "swaplocation", requestDefault); -} - -void KisImageConfig::setSwapDir(const QString &swapDir) -{ - m_config.writeEntry("swaplocation", swapDir); -} - -int KisImageConfig::numberOfOnionSkins() const -{ - return m_config.readEntry("numberOfOnionSkins", 10); -} - -void KisImageConfig::setNumberOfOnionSkins(int value) -{ - m_config.writeEntry("numberOfOnionSkins", value); -} - -int KisImageConfig::onionSkinTintFactor() const -{ - return m_config.readEntry("onionSkinTintFactor", 192); -} - -void KisImageConfig::setOnionSkinTintFactor(int value) -{ - m_config.writeEntry("onionSkinTintFactor", value); -} - -int KisImageConfig::onionSkinOpacity(int offset) const -{ - int value = m_config.readEntry("onionSkinOpacity_" + QString::number(offset), -1); - - if (value < 0) { - const int num = numberOfOnionSkins(); - const qreal dx = qreal(qAbs(offset)) / num; - value = 0.7 * exp(-pow2(dx) / 0.5) * 255; - } - - return value; -} - -void KisImageConfig::setOnionSkinOpacity(int offset, int value) -{ - m_config.writeEntry("onionSkinOpacity_" + QString::number(offset), value); -} - -bool KisImageConfig::onionSkinState(int offset) const -{ - bool enableByDefault = (qAbs(offset) <= 2); - return m_config.readEntry("onionSkinState_" + QString::number(offset), enableByDefault); -} - -void KisImageConfig::setOnionSkinState(int offset, bool value) -{ - m_config.writeEntry("onionSkinState_" + QString::number(offset), value); -} - -QColor KisImageConfig::onionSkinTintColorBackward() const -{ - return m_config.readEntry("onionSkinTintColorBackward", QColor(Qt::red)); -} - -void KisImageConfig::setOnionSkinTintColorBackward(const QColor &value) -{ - m_config.writeEntry("onionSkinTintColorBackward", value); -} - -QColor KisImageConfig::onionSkinTintColorForward() const -{ - return m_config.readEntry("oninSkinTintColorForward", QColor(Qt::green)); -} - -void KisImageConfig::setOnionSkinTintColorForward(const QColor &value) -{ - m_config.writeEntry("oninSkinTintColorForward", value); -} - -bool KisImageConfig::lazyFrameCreationEnabled(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("lazyFrameCreationEnabled", true) : true; -} - -void KisImageConfig::setLazyFrameCreationEnabled(bool value) -{ - m_config.writeEntry("lazyFrameCreationEnabled", value); -} - - #if defined Q_OS_LINUX #include #elif defined Q_OS_FREEBSD || defined Q_OS_NETBSD || defined Q_OS_OPENBSD @@ -364,7 +113,7 @@ #include #endif -int KisImageConfig::totalRAM() +int KisImageConfigImplPrivate::totalRAM() { // let's think that default memory size is 1000MiB int totalMemory = 1000; // MiB @@ -426,175 +175,3 @@ return totalMemory; } -bool KisImageConfig::showAdditionalOnionSkinsSettings(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("showAdditionalOnionSkinsSettings", true) : true; -} - -void KisImageConfig::setShowAdditionalOnionSkinsSettings(bool value) -{ - m_config.writeEntry("showAdditionalOnionSkinsSettings", value); -} - -int KisImageConfig::defaultFrameColorLabel() const -{ - return m_config.readEntry("defaultFrameColorLabel", 0); -} - -void KisImageConfig::setDefaultFrameColorLabel(int label) -{ - m_config.writeEntry("defaultFrameColorLabel", label); -} - -KisProofingConfigurationSP KisImageConfig::defaultProofingconfiguration() -{ - KisProofingConfiguration *proofingConfig= new KisProofingConfiguration(); - proofingConfig->proofingProfile = m_config.readEntry("defaultProofingProfileName", "Chemical proof"); - proofingConfig->proofingModel = m_config.readEntry("defaultProofingProfileModel", "CMYKA"); - proofingConfig->proofingDepth = m_config.readEntry("defaultProofingProfileDepth", "U8"); - proofingConfig->intent = (KoColorConversionTransformation::Intent)m_config.readEntry("defaultProofingProfileIntent", 3); - if (m_config.readEntry("defaultProofingBlackpointCompensation", true)) { - proofingConfig->conversionFlags |= KoColorConversionTransformation::ConversionFlag::BlackpointCompensation; - } else { - proofingConfig->conversionFlags = proofingConfig->conversionFlags & ~KoColorConversionTransformation::ConversionFlag::BlackpointCompensation; - } - QColor def(Qt::green); - m_config.readEntry("defaultProofingGamutwarning", def); - KoColor col(KoColorSpaceRegistry::instance()->rgb8()); - col.fromQColor(def); - col.setOpacity(1.0); - proofingConfig->warningColor = col; - proofingConfig->adaptationState = (double)m_config.readEntry("defaultProofingAdaptationState", 1.0); - return toQShared(proofingConfig); -} - -void KisImageConfig::setDefaultProofingConfig(const KoColorSpace *proofingSpace, int proofingIntent, bool blackPointCompensation, KoColor warningColor, double adaptationState) -{ - m_config.writeEntry("defaultProofingProfileName", proofingSpace->profile()->name()); - m_config.writeEntry("defaultProofingProfileModel", proofingSpace->colorModelId().id()); - m_config.writeEntry("defaultProofingProfileDepth", proofingSpace->colorDepthId().id()); - m_config.writeEntry("defaultProofingProfileIntent", proofingIntent); - m_config.writeEntry("defaultProofingBlackpointCompensation", blackPointCompensation); - QColor c; - c = warningColor.toQColor(); - m_config.writeEntry("defaultProofingGamutwarning", c); - m_config.writeEntry("defaultProofingAdaptationState",adaptationState); -} - -bool KisImageConfig::useLodForColorizeMask(bool requestDefault) const -{ - return !requestDefault ? - m_config.readEntry("useLodForColorizeMask", false) : false; -} - -void KisImageConfig::setUseLodForColorizeMask(bool value) -{ - m_config.writeEntry("useLodForColorizeMask", value); -} - -int KisImageConfig::maxNumberOfThreads(bool defaultValue) const -{ - return (defaultValue ? QThread::idealThreadCount() : m_config.readEntry("maxNumberOfThreads", QThread::idealThreadCount())); -} - -void KisImageConfig::setMaxNumberOfThreads(int value) -{ - if (value == QThread::idealThreadCount()) { - m_config.deleteEntry("maxNumberOfThreads"); - } else { - m_config.writeEntry("maxNumberOfThreads", value); - } -} - -int KisImageConfig::frameRenderingClones(bool defaultValue) const -{ - const int defaultClonesCount = qMax(1, maxNumberOfThreads(defaultValue) / 2); - return defaultValue ? defaultClonesCount : m_config.readEntry("frameRenderingClones", defaultClonesCount); -} - -void KisImageConfig::setFrameRenderingClones(int value) -{ - m_config.writeEntry("frameRenderingClones", value); -} - -int KisImageConfig::fpsLimit(bool defaultValue) const -{ - return defaultValue ? 100 : m_config.readEntry("fpsLimit", 100); -} - -void KisImageConfig::setFpsLimit(int value) -{ - m_config.writeEntry("fpsLimit", value); -} - -bool KisImageConfig::useOnDiskAnimationCacheSwapping(bool defaultValue) const -{ - return defaultValue ? true : m_config.readEntry("useOnDiskAnimationCacheSwapping", true); -} - -void KisImageConfig::setUseOnDiskAnimationCacheSwapping(bool value) -{ - m_config.writeEntry("useOnDiskAnimationCacheSwapping", value); -} - -QString KisImageConfig::animationCacheDir(bool defaultValue) const -{ - return safelyGetWritableTempLocation("animation_cache", "animationCacheDir", defaultValue); -} - -void KisImageConfig::setAnimationCacheDir(const QString &value) -{ - m_config.writeEntry("animationCacheDir", value); -} - -bool KisImageConfig::useAnimationCacheFrameSizeLimit(bool defaultValue) const -{ - return defaultValue ? true : m_config.readEntry("useAnimationCacheFrameSizeLimit", true); -} - -void KisImageConfig::setUseAnimationCacheFrameSizeLimit(bool value) -{ - m_config.writeEntry("useAnimationCacheFrameSizeLimit", value); -} - -int KisImageConfig::animationCacheFrameSizeLimit(bool defaultValue) const -{ - return defaultValue ? 2500 : m_config.readEntry("animationCacheFrameSizeLimit", 2500); -} - -void KisImageConfig::setAnimationCacheFrameSizeLimit(int value) -{ - m_config.writeEntry("animationCacheFrameSizeLimit", value); -} - -bool KisImageConfig::useAnimationCacheRegionOfInterest(bool defaultValue) const -{ - return defaultValue ? true : m_config.readEntry("useAnimationCacheRegionOfInterest", true); -} - -void KisImageConfig::setUseAnimationCacheRegionOfInterest(bool value) -{ - m_config.writeEntry("useAnimationCacheRegionOfInterest", value); -} - -qreal KisImageConfig::animationCacheRegionOfInterestMargin(bool defaultValue) const -{ - return defaultValue ? 0.25 : m_config.readEntry("animationCacheRegionOfInterestMargin", 0.25); -} - -void KisImageConfig::setAnimationCacheRegionOfInterestMargin(qreal value) -{ - m_config.writeEntry("animationCacheRegionOfInterestMargin", value); -} - -QColor KisImageConfig::selectionOverlayMaskColor(bool defaultValue) const -{ - QColor def(255, 0, 0, 220); - return (defaultValue ? def : m_config.readEntry("selectionOverlayMaskColor", def)); -} - -void KisImageConfig::setSelectionOverlayMaskColor(const QColor &color) -{ - m_config.writeEntry("selectionOverlayMaskColor", color); -} diff --git a/libs/image/kis_keyframe.cpp b/libs/image/kis_keyframe.cpp --- a/libs/image/kis_keyframe.cpp +++ b/libs/image/kis_keyframe.cpp @@ -50,7 +50,7 @@ KisKeyframe::KisKeyframe(KisKeyframeChannel *channel, int time) : m_d(new Private(channel, time)) { - m_d->colorLabel = KisImageConfig(true).defaultFrameColorLabel(); + m_d->colorLabel = KisImageConfig().defaultFrameColorLabel(); } KisKeyframe::KisKeyframe(const KisKeyframe *rhs, KisKeyframeChannel *channel) diff --git a/libs/image/kis_memory_statistics_server.cpp b/libs/image/kis_memory_statistics_server.cpp --- a/libs/image/kis_memory_statistics_server.cpp +++ b/libs/image/kis_memory_statistics_server.cpp @@ -157,7 +157,7 @@ stats.swapSize = tileStats.swapSize; - KisImageConfig cfg(true); + KisImageConfig cfg; stats.tilesHardLimit = cfg.tilesHardLimit() * MiB; stats.tilesSoftLimit = cfg.tilesSoftLimit() * MiB; diff --git a/libs/image/kis_onion_skin_compositor.cpp b/libs/image/kis_onion_skin_compositor.cpp --- a/libs/image/kis_onion_skin_compositor.cpp +++ b/libs/image/kis_onion_skin_compositor.cpp @@ -87,7 +87,7 @@ void refreshConfig() { - KisImageConfig config(true); + KisImageConfig config; numberOfSkins = config.numberOfOnionSkins(); tintFactor = config.onionSkinTintFactor(); diff --git a/libs/image/kis_selection_mask.cpp b/libs/image/kis_selection_mask.cpp --- a/libs/image/kis_selection_mask.cpp +++ b/libs/image/kis_selection_mask.cpp @@ -296,7 +296,7 @@ image->colorSpace() : KoColorSpaceRegistry::instance()->rgb8(); - KisImageConfig cfg(true); + KisImageConfig cfg; maskColor = KoColor(cfg.selectionOverlayMaskColor(), cs); diff --git a/libs/image/kis_simple_update_queue.cpp b/libs/image/kis_simple_update_queue.cpp --- a/libs/image/kis_simple_update_queue.cpp +++ b/libs/image/kis_simple_update_queue.cpp @@ -72,7 +72,7 @@ { QMutexLocker locker(&m_lock); - KisImageConfig config(true); + KisImageConfig config; m_patchWidth = config.updatePatchWidth(); m_patchHeight = config.updatePatchHeight(); diff --git a/libs/image/kis_transaction_data.cpp b/libs/image/kis_transaction_data.cpp --- a/libs/image/kis_transaction_data.cpp +++ b/libs/image/kis_transaction_data.cpp @@ -80,7 +80,7 @@ { if (!device->framesInterface()) return; - KisImageConfig cfg(true); + KisImageConfig cfg; if (!cfg.lazyFrameCreationEnabled()) return; KisRasterKeyframeChannel *channel = device->keyframeChannel(); diff --git a/libs/image/kis_transform_mask.cpp b/libs/image/kis_transform_mask.cpp --- a/libs/image/kis_transform_mask.cpp +++ b/libs/image/kis_transform_mask.cpp @@ -108,7 +108,7 @@ connect(&m_d->updateSignalCompressor, SIGNAL(timeout()), SLOT(slotDelayedStaticUpdate())); connect(this, SIGNAL(sigInternalForceStaticImageUpdate()), SLOT(slotInternalForceStaticImageUpdate())); - m_d->offBoundsReadArea = KisImageConfig(true).transformMaskOffBoundsReadArea(); + m_d->offBoundsReadArea = KisImageConfig().transformMaskOffBoundsReadArea(); } KisTransformMask::~KisTransformMask() diff --git a/libs/image/kis_update_scheduler.cpp b/libs/image/kis_update_scheduler.cpp --- a/libs/image/kis_update_scheduler.cpp +++ b/libs/image/kis_update_scheduler.cpp @@ -50,7 +50,7 @@ struct Q_DECL_HIDDEN KisUpdateScheduler::Private { Private(KisUpdateScheduler *_q, KisProjectionUpdateListener *p) : q(_q) - , updaterContext(KisImageConfig(true).maxNumberOfThreads(), q) + , updaterContext(KisImageConfig().maxNumberOfThreads(), q) , projectionUpdateListener(p) {} @@ -304,7 +304,7 @@ void KisUpdateScheduler::updateSettings() { m_d->updatesQueue.updateSettings(); - KisImageConfig config(true); + KisImageConfig config; m_d->defaultBalancingRatio = config.schedulerBalancingRatio(); setThreadsLimit(config.maxNumberOfThreads()); } diff --git a/libs/image/kis_update_time_monitor.cpp b/libs/image/kis_update_time_monitor.cpp --- a/libs/image/kis_update_time_monitor.cpp +++ b/libs/image/kis_update_time_monitor.cpp @@ -87,7 +87,7 @@ mousePath(0.0), loggingEnabled(false) { - loggingEnabled = KisImageConfig(true).enablePerfLog(); + loggingEnabled = KisImageConfig().enablePerfLog(); } QHash preliminaryTickets; diff --git a/libs/image/krita_utils.cpp b/libs/image/krita_utils.cpp --- a/libs/image/krita_utils.cpp +++ b/libs/image/krita_utils.cpp @@ -45,7 +45,7 @@ QSize optimalPatchSize() { - KisImageConfig cfg(true); + KisImageConfig cfg; return QSize(cfg.updatePatchWidth(), cfg.updatePatchHeight()); } diff --git a/libs/image/lazybrush/kis_colorize_stroke_strategy.cpp b/libs/image/lazybrush/kis_colorize_stroke_strategy.cpp --- a/libs/image/lazybrush/kis_colorize_stroke_strategy.cpp +++ b/libs/image/lazybrush/kis_colorize_stroke_strategy.cpp @@ -274,7 +274,7 @@ KisStrokeStrategy* KisColorizeStrokeStrategy::createLodClone(int levelOfDetail) { - KisImageConfig cfg(true); + KisImageConfig cfg; if (!cfg.useLodForColorizeMask()) return 0; KisColorizeStrokeStrategy *clone = new KisColorizeStrokeStrategy(*this, levelOfDetail); diff --git a/libs/image/tests/kis_onion_skin_compositor_test.cpp b/libs/image/tests/kis_onion_skin_compositor_test.cpp --- a/libs/image/tests/kis_onion_skin_compositor_test.cpp +++ b/libs/image/tests/kis_onion_skin_compositor_test.cpp @@ -32,7 +32,7 @@ { TestUtil::ReferenceImageChecker chk("composite", "onion_skins", TestUtil::ReferenceImageChecker::InternalStorage); - KisImageConfig config(false); + KisImageConfigMutable config; config.setOnionSkinTintFactor(64); config.setOnionSkinTintColorBackward(Qt::blue); config.setOnionSkinTintColorForward(Qt::red); @@ -126,7 +126,7 @@ i->switchCurrentTimeAsync(1); p.image->waitForDone(); - KisImageConfig config(false); + KisImageConfigMutable config; config.setOnionSkinOpacity(-1, 32); config.setOnionSkinOpacity(1, 192); config.setOnionSkinOpacity(2, 64); diff --git a/libs/image/tiles3/kis_tile_data_pooler.cc b/libs/image/tiles3/kis_tile_data_pooler.cc --- a/libs/image/tiles3/kis_tile_data_pooler.cc +++ b/libs/image/tiles3/kis_tile_data_pooler.cc @@ -99,7 +99,7 @@ m_memoryLimit = memoryLimit; } else { - m_memoryLimit = MiB_TO_METRIC(KisImageConfig(true).poolLimit()); + m_memoryLimit = MiB_TO_METRIC(KisImageConfig().poolLimit()); } } @@ -416,5 +416,5 @@ void KisTileDataPooler::testingRereadConfig() { - m_memoryLimit = MiB_TO_METRIC(KisImageConfig(true).poolLimit()); + m_memoryLimit = MiB_TO_METRIC(KisImageConfig().poolLimit()); } diff --git a/libs/image/tiles3/swap/kis_swapped_data_store.cpp b/libs/image/tiles3/swap/kis_swapped_data_store.cpp --- a/libs/image/tiles3/swap/kis_swapped_data_store.cpp +++ b/libs/image/tiles3/swap/kis_swapped_data_store.cpp @@ -28,7 +28,7 @@ KisSwappedDataStore::KisSwappedDataStore() : m_memoryMetric(0) { - KisImageConfig config(true); + KisImageConfig config; const quint64 maxSwapSize = config.maxSwapSize() * MiB; const quint64 swapSlabSize = config.swapSlabSize() * MiB; const quint64 swapWindowSize = config.swapWindowSize() * MiB; diff --git a/libs/image/tiles3/swap/kis_tile_data_swapper_p.h b/libs/image/tiles3/swap/kis_tile_data_swapper_p.h --- a/libs/image/tiles3/swap/kis_tile_data_swapper_p.h +++ b/libs/image/tiles3/swap/kis_tile_data_swapper_p.h @@ -60,7 +60,7 @@ { public: KisStoreLimits() { - KisImageConfig config(true); + KisImageConfig config; m_emergencyThreshold = MiB_TO_METRIC(config.tilesHardLimit()); diff --git a/libs/image/tiles3/tests/kis_low_memory_tests.cpp b/libs/image/tiles3/tests/kis_low_memory_tests.cpp --- a/libs/image/tiles3/tests/kis_low_memory_tests.cpp +++ b/libs/image/tiles3/tests/kis_low_memory_tests.cpp @@ -32,7 +32,7 @@ void KisLowMemoryTests::initTestCase() { // hard limit of 1MiB, no undo in memory, no clones - KisImageConfig config(false); + KisImageConfigMutable config; config.setMemoryHardLimitPercent(1.1 * 100.0 / KisImageConfig::totalRAM()); config.setMemorySoftLimitPercent(0); config.setMemoryPoolLimitPercent(0); diff --git a/libs/image/tiles3/tests/kis_store_limits_test.cpp b/libs/image/tiles3/tests/kis_store_limits_test.cpp --- a/libs/image/tiles3/tests/kis_store_limits_test.cpp +++ b/libs/image/tiles3/tests/kis_store_limits_test.cpp @@ -26,7 +26,7 @@ void KisStoreLimitsTest::testLimits() { - KisImageConfig config(false); + KisImageConfigMutable config; config.setMemoryHardLimitPercent(50); config.setMemorySoftLimitPercent(25); config.setMemoryPoolLimitPercent(10); diff --git a/libs/image/tiles3/tests/kis_swapped_data_store_test.cpp b/libs/image/tiles3/tests/kis_swapped_data_store_test.cpp --- a/libs/image/tiles3/tests/kis_swapped_data_store_test.cpp +++ b/libs/image/tiles3/tests/kis_swapped_data_store_test.cpp @@ -37,7 +37,7 @@ const quint8 defaultPixel = 128; const qint32 NUM_TILES = 10000; - KisImageConfig config(false); + KisImageConfigMutable config; config.setMaxSwapSize(4); config.setSwapSlabSize(1); config.setSwapWindowSize(1); @@ -103,7 +103,7 @@ const qint32 NUM_CYCLES = 50000; const qint32 NUM_TILES = 10000; - KisImageConfig config(false); + KisImageConfigMutable config; config.setMaxSwapSize(40); config.setSwapSlabSize(1); config.setSwapWindowSize(1); diff --git a/libs/image/tiles3/tests/kis_tile_data_store_test.cpp b/libs/image/tiles3/tests/kis_tile_data_store_test.cpp --- a/libs/image/tiles3/tests/kis_tile_data_store_test.cpp +++ b/libs/image/tiles3/tests/kis_tile_data_store_test.cpp @@ -151,7 +151,7 @@ void KisTileDataStoreTest::testSwapping() { - KisImageConfig config(false); + KisImageConfigMutable config; config.setMemoryHardLimitPercent(100.0 / KisImageConfig::totalRAM()); config.setMemorySoftLimitPercent(0); diff --git a/libs/ui/canvas/kis_animation_player.cpp b/libs/ui/canvas/kis_animation_player.cpp --- a/libs/ui/canvas/kis_animation_player.cpp +++ b/libs/ui/canvas/kis_animation_player.cpp @@ -334,7 +334,7 @@ // when openGL is disabled, there is no animation cache if (m_d->canvas->frameCache()) { - KisImageConfig cfg(true); + KisImageConfig cfg; const int dimensionLimit = cfg.useAnimationCacheFrameSizeLimit() ? diff --git a/libs/ui/canvas/kis_canvas2.cpp b/libs/ui/canvas/kis_canvas2.cpp --- a/libs/ui/canvas/kis_canvas2.cpp +++ b/libs/ui/canvas/kis_canvas2.cpp @@ -195,7 +195,7 @@ m_d->bootstrapLodBlocked = true; connect(view->mainWindow(), SIGNAL(guiLoadingFinished()), SLOT(bootstrapFinished())); - KisImageConfig config(false); + KisImageConfig config; m_d->canvasUpdateCompressor.setDelay(1000 / config.fpsLimit()); m_d->canvasUpdateCompressor.setMode(KisSignalCompressor::FIRST_ACTIVE); @@ -600,7 +600,7 @@ if (m_d->currentCanvasIsOpenGL) { startUpdateCanvasProjection(imageRect); } else { - KisImageConfig imageConfig(true); + KisImageConfig imageConfig; int patchWidth = imageConfig.updatePatchWidth(); int patchHeight = imageConfig.updatePatchHeight(); @@ -649,7 +649,7 @@ m_d->proofingConfig = this->image()->proofingConfiguration(); if (!m_d->proofingConfig) { qDebug()<<"Canvas: No proofing config found, generating one."; - KisImageConfig cfg(false); + KisImageConfig cfg; m_d->proofingConfig = cfg.defaultProofingconfiguration(); } KoColorConversionTransformation::ConversionFlags conversionFlags = m_d->proofingConfig->conversionFlags; @@ -712,7 +712,7 @@ if (!m_d->proofingConfig) { m_d->proofingConfig = this->image()->proofingConfiguration(); if (!m_d->proofingConfig) { - m_d->proofingConfig = KisImageConfig(true).defaultProofingconfiguration(); + m_d->proofingConfig = KisImageConfig().defaultProofingconfiguration(); } } return m_d->proofingConfig; diff --git a/libs/ui/canvas/kis_image_pyramid.cpp b/libs/ui/canvas/kis_image_pyramid.cpp --- a/libs/ui/canvas/kis_image_pyramid.cpp +++ b/libs/ui/canvas/kis_image_pyramid.cpp @@ -182,7 +182,7 @@ // Get the full image size QRect rc = m_originalImage->projection()->exactBounds(); - KisImageConfig config(true); + KisImageConfig config; int patchWidth = config.updatePatchWidth(); int patchHeight = config.updatePatchHeight(); diff --git a/libs/ui/canvas/kis_prescaled_projection.cpp b/libs/ui/canvas/kis_prescaled_projection.cpp --- a/libs/ui/canvas/kis_prescaled_projection.cpp +++ b/libs/ui/canvas/kis_prescaled_projection.cpp @@ -128,7 +128,7 @@ void KisPrescaledProjection::updateSettings() { - KisImageConfig imageConfig(false); + KisImageConfig imageConfig; m_d->updatePatchSize.setWidth(imageConfig.updatePatchWidth()); m_d->updatePatchSize.setHeight(imageConfig.updatePatchHeight()); } diff --git a/libs/ui/dialogs/KisAsyncAnimationRenderDialogBase.cpp b/libs/ui/dialogs/KisAsyncAnimationRenderDialogBase.cpp --- a/libs/ui/dialogs/KisAsyncAnimationRenderDialogBase.cpp +++ b/libs/ui/dialogs/KisAsyncAnimationRenderDialogBase.cpp @@ -160,7 +160,7 @@ m_d->processingTime.start(); - KisImageConfig cfg(true); + KisImageConfig cfg; const int maxThreads = cfg.maxNumberOfThreads(); const int numAllowedWorker = 1 + calculateNumberMemoryAllowedClones(m_d->image); diff --git a/libs/ui/dialogs/kis_dlg_image_properties.cc b/libs/ui/dialogs/kis_dlg_image_properties.cc --- a/libs/ui/dialogs/kis_dlg_image_properties.cc +++ b/libs/ui/dialogs/kis_dlg_image_properties.cc @@ -89,7 +89,7 @@ m_proofingConfig = m_image->proofingConfiguration(); if (!m_proofingConfig) { m_page->chkSaveProofing->setChecked(false); - m_proofingConfig = KisImageConfig(true).defaultProofingconfiguration(); + m_proofingConfig = KisImageConfig().defaultProofingconfiguration(); } else { m_page->chkSaveProofing->setChecked(true); diff --git a/libs/ui/dialogs/kis_dlg_preferences.cc b/libs/ui/dialogs/kis_dlg_preferences.cc --- a/libs/ui/dialogs/kis_dlg_preferences.cc +++ b/libs/ui/dialogs/kis_dlg_preferences.cc @@ -465,7 +465,7 @@ m_page->chkBlackpoint->setChecked(cfg.useBlackPointCompensation()); m_page->chkAllowLCMSOptimization->setChecked(cfg.allowLCMSOptimization()); - KisImageConfig cfgImage(true); + KisImageConfig cfgImage; KisProofingConfigurationSP proofingConfig = cfgImage.defaultProofingconfiguration(); m_page->sldAdaptationState->setMaximum(20); @@ -574,7 +574,7 @@ refillMonitorProfiles(KoID("RGBA")); KisConfig cfg(true); - KisImageConfig cfgImage(true); + KisImageConfig cfgImage; KisProofingConfigurationSP proofingConfig = cfgImage.defaultProofingconfiguration(); const KoColorSpace *proofingSpace = KoColorSpaceRegistry::instance()->colorSpace(proofingConfig->proofingModel,proofingConfig->proofingDepth,proofingConfig->proofingProfile); if (proofingSpace) { @@ -691,7 +691,7 @@ int getTotalRAM() { - return KisImageConfig(true).totalRAM(); + return KisImageConfig().totalRAM(); } int PerformanceTab::realTilesRAM() @@ -702,7 +702,7 @@ PerformanceTab::PerformanceTab(QWidget *parent, const char *name) : WdgPerformanceSettings(parent, name) { - KisImageConfig cfg(true); + KisImageConfig cfg; const double totalRAM = cfg.totalRAM(); lblTotalMemory->setText(KFormat().formatByteSize(totalRAM * 1024 * 1024, 0, KFormat::IECBinaryDialect, KFormat::UnitMegaByte)); @@ -800,7 +800,7 @@ void PerformanceTab::load(bool requestDefault) { - KisImageConfig cfg(true); + KisImageConfig cfg; sliderMemoryLimit->setValue(cfg.memoryHardLimitPercent(requestDefault)); sliderPoolLimit->setValue(cfg.memoryPoolLimitPercent(requestDefault)); @@ -845,7 +845,7 @@ void PerformanceTab::save() { - KisImageConfig cfg(false); + KisImageConfigMutable cfg; cfg.setMemoryHardLimitPercent(sliderMemoryLimit->value()); cfg.setMemorySoftLimitPercent(sliderUndoLimit->value()); @@ -882,7 +882,7 @@ void PerformanceTab::selectSwapDir() { - KisImageConfig cfg(true); + KisImageConfig cfg; QString swapDir = cfg.swapDir(); swapDir = QFileDialog::getExistingDirectory(0, i18nc("@title:window", "Select a swap directory"), swapDir); if (swapDir.isEmpty()) { @@ -995,7 +995,7 @@ grpOpenGL->setMaximumHeight(0); } - KisImageConfig imageCfg(false); + KisImageConfig imageCfg; KoColor c; c.fromQColor(imageCfg.selectionOverlayMaskColor()); @@ -1324,7 +1324,7 @@ } cfg.setWorkingColorSpace(dialog->m_colorSettings->m_page->cmbWorkingColorSpace->currentItem().id()); - KisImageConfig cfgImage(false); + KisImageConfigMutable cfgImage; cfgImage.setDefaultProofingConfig(dialog->m_colorSettings->m_page->proofingSpaceSelector->currentColorSpace(), dialog->m_colorSettings->m_page->cmbProofingIntent->currentIndex(), dialog->m_colorSettings->m_page->ckbProofBlackPoint->isChecked(), diff --git a/libs/ui/kis_animation_frame_cache.cpp b/libs/ui/kis_animation_frame_cache.cpp --- a/libs/ui/kis_animation_frame_cache.cpp +++ b/libs/ui/kis_animation_frame_cache.cpp @@ -281,7 +281,7 @@ { m_d->newFrames.clear(); - KisImageConfig cfg(true); + KisImageConfig cfg; if (cfg.useOnDiskAnimationCacheSwapping()) { m_d->swapper.reset(new KisFrameCacheSwapper(m_d->textures->updateInfoBuilder(), cfg.swapDir())); diff --git a/libs/ui/kis_selection_decoration.cc b/libs/ui/kis_selection_decoration.cc --- a/libs/ui/kis_selection_decoration.cc +++ b/libs/ui/kis_selection_decoration.cc @@ -149,7 +149,7 @@ void KisSelectionDecoration::slotConfigChanged() { - KisImageConfig imageConfig(true); + KisImageConfig imageConfig; KisConfig cfg(true); m_maskColor = imageConfig.selectionOverlayMaskColor(); diff --git a/plugins/dockers/animation/animation_docker.cpp b/plugins/dockers/animation/animation_docker.cpp --- a/plugins/dockers/animation/animation_docker.cpp +++ b/plugins/dockers/animation/animation_docker.cpp @@ -354,7 +354,7 @@ void AnimationDocker::updateLazyFrameIcon() { - KisImageConfig cfg(true); + KisImageConfig cfg; const bool value = cfg.lazyFrameCreationEnabled(); @@ -450,7 +450,7 @@ void AnimationDocker::slotLazyFrameChanged(bool value) { - KisImageConfig cfg(false); + KisImageConfigMutable cfg; if (value != cfg.lazyFrameCreationEnabled()) { cfg.setLazyFrameCreationEnabled(value); @@ -601,7 +601,7 @@ m_actionManager->addAction("last_frame", m_lastFrameAction); { - KisImageConfig cfg(true); + KisImageConfig cfg; setupActionButton(KisAnimationUtils::lazyFrameCreationActionName, KisAction::ACTIVE_IMAGE, cfg.lazyFrameCreationEnabled(), diff --git a/plugins/dockers/animation/onion_skins_docker.cpp b/plugins/dockers/animation/onion_skins_docker.cpp --- a/plugins/dockers/animation/onion_skins_docker.cpp +++ b/plugins/dockers/animation/onion_skins_docker.cpp @@ -45,7 +45,7 @@ QWidget* mainWidget = new QWidget(this); setWidget(mainWidget); - KisImageConfig config(true); + KisImageConfig config; ui->setupUi(mainWidget); ui->doubleTintFactor->setMinimum(0); @@ -145,12 +145,12 @@ QIcon icon = KisIconUtils::loadIcon(value ? "arrow-down" : "arrow-up"); ui->btnShowHide->setIcon(icon); - KisImageConfig(false).setShowAdditionalOnionSkinsSettings(value); + KisImageConfigMutable().setShowAdditionalOnionSkinsSettings(value); } void OnionSkinsDocker::changed() { - KisImageConfig config(false); + KisImageConfigMutable config; KisEqualizerWidget::EqualizerValues v = m_equalizerWidget->getValues(); config.setNumberOfOnionSkins(v.maxDistance); @@ -169,7 +169,7 @@ void OnionSkinsDocker::loadSettings() { - KisImageConfig config(true); + KisImageConfig config; KisSignalsBlocker b(ui->doubleTintFactor, ui->btnBackwardColor, diff --git a/plugins/dockers/animation/timeline_frames_view.cpp b/plugins/dockers/animation/timeline_frames_view.cpp --- a/plugins/dockers/animation/timeline_frames_view.cpp +++ b/plugins/dockers/animation/timeline_frames_view.cpp @@ -456,7 +456,7 @@ Q_FOREACH(QModelIndex index, selectedIndexes()) { m_d->model->setData(index, label, TimelineFramesModel::FrameColorLabelIndexRole); } - KisImageConfig(false).setDefaultFrameColorLabel(label); + KisImageConfigMutable().setDefaultFrameColorLabel(label); } void TimelineFramesView::slotSelectAudioChannelFile() @@ -1017,7 +1017,7 @@ } else { { KisSignalsBlocker b(m_d->colorSelector); - const int labelIndex = KisImageConfig(true).defaultFrameColorLabel(); + const int labelIndex = KisImageConfig().defaultFrameColorLabel(); m_d->colorSelector->setCurrentIndex(labelIndex); } diff --git a/plugins/impex/libkra/kis_kra_loader.cpp b/plugins/impex/libkra/kis_kra_loader.cpp --- a/plugins/impex/libkra/kis_kra_loader.cpp +++ b/plugins/impex/libkra/kis_kra_loader.cpp @@ -275,7 +275,7 @@ return KisImageSP(0); } } - KisProofingConfigurationSP proofingConfig = KisImageConfig(true).defaultProofingconfiguration(); + KisProofingConfigurationSP proofingConfig = KisImageConfig().defaultProofingconfiguration(); if (!(attr = element.attribute(PROOFINGPROFILENAME)).isNull()) { proofingConfig->proofingProfile = attr; } @@ -399,7 +399,7 @@ KisProofingConfigurationSP proofingConfig = image->proofingConfiguration(); if (!proofingConfig) { - proofingConfig = KisImageConfig(true).defaultProofingconfiguration(); + proofingConfig = KisImageConfig().defaultProofingconfiguration(); } if (proofingProfileRes) { diff --git a/plugins/paintops/defaultpaintops/brush/kis_brushop.cpp b/plugins/paintops/defaultpaintops/brush/kis_brushop.cpp --- a/plugins/paintops/defaultpaintops/brush/kis_brushop.cpp +++ b/plugins/paintops/defaultpaintops/brush/kis_brushop.cpp @@ -62,7 +62,7 @@ , m_avgSpacing(50) , m_avgNumDabs(50) , m_avgUpdateTimePerDab(50) - , m_idealNumRects(KisImageConfig(true).maxNumberOfThreads()) + , m_idealNumRects(KisImageConfig().maxNumberOfThreads()) , m_minUpdatePeriod(10) , m_maxUpdatePeriod(100) { diff --git a/plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp b/plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp --- a/plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp +++ b/plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp @@ -88,7 +88,7 @@ const int pixelSize = m_previewDevice->colorSpace()->pixelSize(); - KisImageConfig cfg(true); + KisImageConfig cfg; KoColor pixel(cfg.selectionOverlayMaskColor(), m_previewDevice->colorSpace()); const qreal coeff = 1.0 / 255.0;