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 }