File indexing completed on 2024-05-26 04:34:08
0001 /* 0002 * SPDX-FileCopyrightText: 2022 Dmitry Kazakov <dimula73@gmail.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 #include "KisTextureOptionModel.h" 0007 0008 #include <kis_assert.h> 0009 #include <KisLager.h> 0010 0011 #include <KoResourceLoadResult.h> 0012 #include <KisResourcesInterface.h> 0013 0014 namespace { 0015 0016 auto patternResourceLens = [] (KisResourcesInterfaceSP resourcesInterface) { 0017 return lager::lenses::getset( 0018 [resourcesInterface] (const KisEmbeddedTextureData &data) { 0019 KoResourceLoadResult result = data.loadLinkedPattern(resourcesInterface); 0020 0021 KoResourceSP resource; 0022 0023 if (result.type() != KoResourceLoadResult::ExistingResource) { 0024 if (!data.isNull()) { 0025 qWarning() << "Failed to load embedded resource" << result.signature(); 0026 } 0027 resource = resourcesInterface->source(ResourceType::Patterns).fallbackResource(); 0028 } else { 0029 resource = result.resource(); 0030 } 0031 0032 return resource; 0033 }, 0034 [] (const KisEmbeddedTextureData &, KoResourceSP resource) { 0035 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(resource, KisEmbeddedTextureData()); 0036 return KisEmbeddedTextureData::fromPattern(resource.dynamicCast<KoPattern>()); 0037 }); 0038 }; 0039 0040 } 0041 0042 KisTextureOptionModel::KisTextureOptionModel(lager::cursor<KisTextureOptionData> _optionData, KisResourcesInterfaceSP resourcesInterface) 0043 : optionData(_optionData) 0044 , LAGER_QT(isEnabled) {optionData[&KisTextureOptionData::isEnabled]} 0045 , LAGER_QT(textureResource) {optionData[&KisTextureOptionData::textureData].zoom(patternResourceLens(resourcesInterface))} 0046 , LAGER_QT(scale) {optionData[&KisTextureOptionData::scale]} 0047 , LAGER_QT(brightness) {optionData[&KisTextureOptionData::brightness]} 0048 , LAGER_QT(contrast) {optionData[&KisTextureOptionData::contrast]} 0049 , LAGER_QT(neutralPoint) {optionData[&KisTextureOptionData::neutralPoint]} 0050 , LAGER_QT(offsetX) {optionData[&KisTextureOptionData::offsetX]} 0051 , LAGER_QT(offsetY) {optionData[&KisTextureOptionData::offsetY]} 0052 , LAGER_QT(maximumOffsetX) {optionData[&KisTextureOptionData::maximumOffsetX]} 0053 , LAGER_QT(maximumOffsetY) {optionData[&KisTextureOptionData::maximumOffsetY]} 0054 , LAGER_QT(isRandomOffsetX) {optionData[&KisTextureOptionData::isRandomOffsetX]} 0055 , LAGER_QT(isRandomOffsetY) {optionData[&KisTextureOptionData::isRandomOffsetY]} 0056 , LAGER_QT(texturingMode) {optionData[&KisTextureOptionData::texturingMode] 0057 .zoom(kislager::lenses::do_static_cast<KisTextureOptionData::TexturingMode, int>)} 0058 , LAGER_QT(cutOffPolicy) {optionData[&KisTextureOptionData::cutOffPolicy]} 0059 , LAGER_QT(cutOffLeftNormalized) {optionData[&KisTextureOptionData::cutOffLeft] 0060 .zoom(kislager::lenses::scale_int_to_real(1.0/255.0))} 0061 , LAGER_QT(cutOffRightNormalized) {optionData[&KisTextureOptionData::cutOffRight] 0062 .zoom(kislager::lenses::scale_int_to_real(1.0/255.0))} 0063 , LAGER_QT(invert) {optionData[&KisTextureOptionData::invert]} 0064 { 0065 LAGER_QT(textureResource).bind(std::bind(&KisTextureOptionModel::updateOffsetLimits, this, std::placeholders::_1)); 0066 } 0067 0068 KisTextureOptionData KisTextureOptionModel::bakedOptionData() const 0069 { 0070 KisTextureOptionData data = optionData.get(); 0071 data.textureData = KisEmbeddedTextureData::fromPattern(textureResource().dynamicCast<KoPattern>()); 0072 return data; 0073 } 0074 0075 void KisTextureOptionModel::updateOffsetLimits(KoResourceSP resource) 0076 { 0077 KoPatternSP pattern = resource.dynamicCast<KoPattern>(); 0078 KIS_SAFE_ASSERT_RECOVER_RETURN(pattern); 0079 0080 setmaximumOffsetX(pattern->width() / 2); 0081 setmaximumOffsetY(pattern->height() / 2); 0082 }