File indexing completed on 2024-05-19 04:28:53

0001 /*
0002  *  SPDX-FileCopyrightText: 2006 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "kis_canvas_resource_provider.h"
0007 
0008 #include <QImage>
0009 #include <QPainter>
0010 
0011 #include <KoCanvasBase.h>
0012 #include <KoID.h>
0013 #include <KoColorModelStandardIds.h>
0014 #include <KoColorProfile.h>
0015 #include <resources/KoAbstractGradient.h>
0016 #include <KoCompositeOpRegistry.h>
0017 #include <KoResourceServerProvider.h>
0018 #include <resources/KoStopGradient.h>
0019 #include <KoColorSpaceRegistry.h>
0020 #include <KoResource.h>
0021 
0022 #include <resources/KoPattern.h>
0023 #include <kis_paint_device.h>
0024 #include <filter/kis_filter_configuration.h>
0025 #include <kis_image.h>
0026 #include <kis_group_layer.h>
0027 #include <brushengine/kis_paintop_preset.h>
0028 #include <brushengine/kis_paintop_settings.h>
0029 #include "kis_favorite_resource_manager.h"
0030 
0031 #include "kis_config.h"
0032 #include "KisViewManager.h"
0033 #include "canvas/kis_canvas2.h"
0034 
0035 
0036 KisCanvasResourceProvider::KisCanvasResourceProvider(KisViewManager * view)
0037     : m_view(view),
0038       m_presetShadowUpdater(view)
0039 {
0040 }
0041 
0042 KisCanvasResourceProvider::~KisCanvasResourceProvider()
0043 {
0044     disconnect(); // in case Qt gets confused
0045 }
0046 
0047 KoCanvasResourceProvider* KisCanvasResourceProvider::resourceManager()
0048 {
0049     return m_resourceManager;
0050 }
0051 
0052 void KisCanvasResourceProvider::setResourceManager(KoCanvasResourceProvider *resourceManager)
0053 {
0054     m_resourceManager = resourceManager;
0055 
0056     QVariant v;
0057     v.setValue(KoColor(Qt::black, KoColorSpaceRegistry::instance()->rgb8()));
0058     m_resourceManager->setResource(KoCanvasResource::ForegroundColor, v);
0059 
0060     v.setValue(KoColor(Qt::white, KoColorSpaceRegistry::instance()->rgb8()));
0061     m_resourceManager->setResource(KoCanvasResource::BackgroundColor, v);
0062 
0063     setCurrentCompositeOp(COMPOSITE_OVER);
0064 
0065     setMirrorHorizontal(false);
0066     setMirrorVertical(false);
0067 
0068     m_resourceManager->setResource(KoCanvasResource::HdrExposure, 0.0);
0069     m_resourceManager->setResource(KoCanvasResource::HdrGamma, 1.0);
0070     m_resourceManager->setResource(KoCanvasResource::EffectiveZoom, 1.0);
0071     m_resourceManager->setResource(KoCanvasResource::EffectivePhysicalZoom, 1.0);
0072 
0073     connect(m_resourceManager, SIGNAL(canvasResourceChanged(int,QVariant)),
0074             this, SLOT(slotCanvasResourceChanged(int,QVariant)));
0075 
0076     m_resourceManager->setResource(KoCanvasResource::GamutMaskActive, false);
0077 
0078     connect(m_resourceManager, SIGNAL(canvasResourceChanged(int,QVariant)),
0079             &m_presetShadowUpdater, SLOT(slotCanvasResourceChanged(int,QVariant)));
0080 }
0081 
0082 
0083 KoCanvasBase * KisCanvasResourceProvider::canvas() const
0084 {
0085     return m_view->canvasBase();
0086 }
0087 
0088 KoColor KisCanvasResourceProvider::bgColor() const
0089 {
0090     QVariant c = m_resourceManager->resource(KoCanvasResource::BackgroundColor);
0091     if (c.isValid()) {
0092         return c.value<KoColor>();
0093     }
0094     else {
0095         return KoColor();
0096     }
0097 }
0098 
0099 KoColor KisCanvasResourceProvider::fgColor() const
0100 {
0101     QVariant c = m_resourceManager->resource(KoCanvasResource::ForegroundColor);
0102     if (c.isValid()) {
0103         return c.value<KoColor>();
0104     }
0105     else {
0106         return KoColor();
0107     }
0108 }
0109 
0110 float KisCanvasResourceProvider::HDRExposure() const
0111 {
0112     return static_cast<float>(m_resourceManager->resource(KoCanvasResource::HdrExposure).toDouble());
0113 }
0114 
0115 void KisCanvasResourceProvider::setHDRExposure(float exposure)
0116 {
0117     m_resourceManager->setResource(KoCanvasResource::HdrExposure, static_cast<double>(exposure));
0118 }
0119 
0120 float KisCanvasResourceProvider::HDRGamma() const
0121 {
0122     return static_cast<float>(m_resourceManager->resource(KoCanvasResource::HdrGamma).toDouble());
0123 }
0124 
0125 void KisCanvasResourceProvider::setHDRGamma(float gamma)
0126 {
0127     m_resourceManager->setResource(KoCanvasResource::HdrGamma, static_cast<double>(gamma));
0128 }
0129 
0130 
0131 KoPatternSP KisCanvasResourceProvider::currentPattern() const
0132 {
0133     if (m_resourceManager->hasResource(KoCanvasResource::CurrentPattern)) {
0134         return m_resourceManager->resource(KoCanvasResource::CurrentPattern).value<KoPatternSP>();
0135     }
0136     else {
0137         return 0;
0138     }
0139 }
0140 
0141 KoAbstractGradientSP KisCanvasResourceProvider::currentGradient() const
0142 {
0143     if (m_resourceManager->hasResource(KoCanvasResource::CurrentGradient)) {
0144         return m_resourceManager->resource(KoCanvasResource::CurrentGradient).value<KoAbstractGradientSP>();
0145     }
0146     else {
0147         return 0;
0148     }
0149 }
0150 
0151 KisImageWSP KisCanvasResourceProvider::currentImage() const
0152 {
0153     return m_view->image();
0154 }
0155 
0156 KisNodeSP KisCanvasResourceProvider::currentNode() const
0157 {
0158     return m_view->activeNode();
0159 }
0160 
0161 KoGamutMaskSP KisCanvasResourceProvider::currentGamutMask() const
0162 {
0163     if (m_resourceManager->hasResource(KoCanvasResource::CurrentGamutMask)) {
0164         return m_resourceManager->resource(KoCanvasResource::CurrentGamutMask).value<KoGamutMaskSP>();
0165     }
0166     else {
0167         return nullptr;
0168     }
0169 }
0170 
0171 bool KisCanvasResourceProvider::gamutMaskActive() const
0172 {
0173     return m_resourceManager->resource(KoCanvasResource::GamutMaskActive).toBool();
0174 }
0175 
0176 KisPaintOpPresetSP KisCanvasResourceProvider::currentPreset() const
0177 {
0178     KisPaintOpPresetSP preset = m_resourceManager->resource(KoCanvasResource::CurrentPaintOpPreset).value<KisPaintOpPresetSP>();
0179     return preset;
0180 }
0181 
0182 void KisCanvasResourceProvider::setPaintOpPreset(const KisPaintOpPresetSP preset)
0183 {
0184     if (!preset) return;
0185     QVariant v;
0186     v.setValue(preset);
0187     m_resourceManager->setResource(KoCanvasResource::CurrentPaintOpPreset, v);
0188 
0189     emit sigPaintOpPresetChanged(preset);
0190 }
0191 
0192 KisPaintOpPresetSP KisCanvasResourceProvider::previousPreset() const
0193 {
0194     KisPaintOpPresetSP preset = m_resourceManager->resource(KoCanvasResource::PreviousPaintOpPreset).value<KisPaintOpPresetSP>();
0195     return preset;
0196 }
0197 
0198 void KisCanvasResourceProvider::setPreviousPaintOpPreset(const KisPaintOpPresetSP preset)
0199 {
0200     if (!preset) return;
0201 
0202     dbgUI << "setPreviousPaintOpPreset" << preset->paintOp();
0203 
0204     QVariant v;
0205     v.setValue(preset);
0206     m_resourceManager->setResource(KoCanvasResource::PreviousPaintOpPreset, v);
0207 }
0208 
0209 void KisCanvasResourceProvider::slotPatternActivated(KoResourceSP res)
0210 {
0211     KoPatternSP pattern = res.dynamicCast<KoPattern>();
0212     QVariant v;
0213     v.setValue<KoPatternSP>(pattern);
0214     m_resourceManager->setResource(KoCanvasResource::CurrentPattern, v);
0215     emit sigPatternChanged(pattern);
0216 }
0217 
0218 void KisCanvasResourceProvider::slotGradientActivated(KoResourceSP res)
0219 {
0220 
0221     KoAbstractGradientSP gradient = res.dynamicCast<KoAbstractGradient>();
0222     QVariant v;
0223     v.setValue<KoAbstractGradientSP>(gradient);
0224     m_resourceManager->setResource(KoCanvasResource::CurrentGradient, v);
0225     emit sigGradientChanged(gradient);
0226 }
0227 
0228 
0229 void KisCanvasResourceProvider::setBGColor(const KoColor& c)
0230 {
0231     QVariant v;
0232     v.setValue(c);
0233     m_resourceManager->setResource(KoCanvasResource::BackgroundColor, v);
0234     emit sigBGColorChanged(c);
0235 }
0236 
0237 void KisCanvasResourceProvider::setFGColor(const KoColor& c)
0238 {
0239     m_fGChanged = true;
0240 
0241     QVariant v;
0242     v.setValue(c);
0243     m_resourceManager->setResource(KoCanvasResource::ForegroundColor, v);
0244     emit sigFGColorChanged(c);
0245 }
0246 
0247 void KisCanvasResourceProvider::slotSetFGColor(const KoColor& c)
0248 {
0249     setFGColor(c);
0250 }
0251 
0252 void KisCanvasResourceProvider::slotSetBGColor(const KoColor& c)
0253 {
0254     setBGColor(c);
0255 }
0256 
0257 void KisCanvasResourceProvider::slotNodeActivated(const KisNodeSP node)
0258 {
0259     QVariant v;
0260     v.setValue(KisNodeWSP(node));
0261     m_resourceManager->setResource(KoCanvasResource::CurrentKritaNode, v);
0262     emit sigNodeChanged(currentNode());
0263 }
0264 
0265 
0266 void KisCanvasResourceProvider::slotImageSizeChanged()
0267 {
0268     if (KisImageWSP image = m_view->image()) {
0269         float fw = image->width() / image->xRes();
0270         float fh = image->height() / image->yRes();
0271 
0272         QSizeF postscriptSize(fw, fh);
0273         m_resourceManager->setResource(KoCanvasResource::PageSize, postscriptSize);
0274     }
0275 }
0276 
0277 void KisCanvasResourceProvider::slotOnScreenResolutionChanged()
0278 {
0279     KisImageWSP image = m_view->image();
0280     KisCanvas2 *canvas = m_view->canvasBase();
0281 
0282     if(!image || !canvas) return;
0283 
0284     qreal zoomX, zoomY;
0285     canvas->coordinatesConverter()->zoom(&zoomX, &zoomY);
0286 
0287     qreal scaleX = zoomX / image->xRes();
0288     qreal scaleY = zoomY / image->yRes();
0289 
0290     emit sigOnScreenResolutionChanged(scaleX, scaleY);
0291 }
0292 
0293 void KisCanvasResourceProvider::slotCanvasResourceChanged(int key, const QVariant & res)
0294 {
0295     switch (key) {
0296     case(KoCanvasResource::ForegroundColor):
0297         m_fGChanged = true;
0298         emit sigFGColorChanged(res.value<KoColor>());
0299         break;
0300     case(KoCanvasResource::BackgroundColor):
0301         emit sigBGColorChanged(res.value<KoColor>());
0302         break;
0303     case(KoCanvasResource::CurrentPattern):
0304         emit sigPatternChanged(res.value<KoPatternSP>());
0305         break;
0306     case(KoCanvasResource::CurrentGradient):
0307         emit sigGradientChanged(res.value<KoAbstractGradientSP>());
0308         break;
0309     case(KoCanvasResource::CurrentKritaNode) :
0310         emit sigNodeChanged(currentNode());
0311         break;
0312     case(KoCanvasResource::CurrentEffectiveCompositeOp) :
0313         emit sigEffectiveCompositeOpChanged();
0314         break;
0315     case (KoCanvasResource::Opacity):
0316     {
0317         emit sigOpacityChanged(res.toDouble());
0318     }
0319     default:
0320         ;
0321         // Do nothing
0322     };
0323 }
0324 
0325 void KisCanvasResourceProvider::setCurrentCompositeOp(const QString& compositeOp)
0326 {
0327     m_resourceManager->setResource(KoCanvasResource::CurrentCompositeOp,
0328                                    QVariant::fromValue(compositeOp));
0329 }
0330 
0331 QString KisCanvasResourceProvider::currentCompositeOp() const
0332 {
0333     return m_resourceManager->resource(KoCanvasResource::CurrentCompositeOp).value<QString>();
0334 }
0335 
0336 bool KisCanvasResourceProvider::eraserMode() const
0337 {
0338     return m_resourceManager->resource(KoCanvasResource::EraserMode).toBool();
0339 }
0340 
0341 void KisCanvasResourceProvider::setEraserMode(bool value)
0342 {
0343     m_resourceManager->setResource(KoCanvasResource::EraserMode,
0344                                    QVariant::fromValue(value));
0345 }
0346 
0347 void KisCanvasResourceProvider::slotPainting()
0348 {
0349     if (m_fGChanged) {
0350         emit sigFGColorUsed(fgColor());
0351         m_fGChanged = false;
0352     }
0353 }
0354 
0355 void KisCanvasResourceProvider::slotGamutMaskActivated(KoGamutMaskSP mask)
0356 {
0357     QVariant v;
0358     v.setValue<KoGamutMaskSP>(mask);
0359     m_resourceManager->setResource(KoCanvasResource::CurrentGamutMask, v);
0360 
0361     m_resourceManager->setResource(KoCanvasResource::GamutMaskActive, QVariant::fromValue(true));
0362 
0363     emit sigGamutMaskChanged(mask);
0364 }
0365 
0366 void KisCanvasResourceProvider::slotGamutMaskUnset()
0367 {
0368     m_resourceManager->setResource(KoCanvasResource::GamutMaskActive, QVariant::fromValue(false));
0369     m_resourceManager->clearResource(KoCanvasResource::CurrentGamutMask);
0370     emit sigGamutMaskUnset();
0371 }
0372 
0373 void KisCanvasResourceProvider::slotGamutMaskPreviewUpdate()
0374 {
0375     emit sigGamutMaskPreviewUpdate();
0376 }
0377 
0378 void KisCanvasResourceProvider::slotGamutMaskDeactivate()
0379 {
0380     m_resourceManager->setResource(KoCanvasResource::GamutMaskActive, QVariant::fromValue(false));
0381     emit sigGamutMaskDeactivated();
0382 }
0383 
0384 void KisCanvasResourceProvider::setMirrorHorizontal(bool mirrorHorizontal)
0385 {
0386     m_resourceManager->setResource(KoCanvasResource::MirrorHorizontal, mirrorHorizontal);
0387     emit mirrorModeChanged();
0388 }
0389 
0390 bool KisCanvasResourceProvider::mirrorHorizontal() const
0391 {
0392     return m_resourceManager->resource(KoCanvasResource::MirrorHorizontal).toBool();
0393 }
0394 
0395 void KisCanvasResourceProvider::setMirrorVertical(bool mirrorVertical)
0396 {
0397     m_resourceManager->setResource(KoCanvasResource::MirrorVertical, mirrorVertical);
0398     emit mirrorModeChanged();
0399 }
0400 
0401 bool KisCanvasResourceProvider::mirrorVertical() const
0402 {
0403     return m_resourceManager->resource(KoCanvasResource::MirrorVertical).toBool();
0404 }
0405 
0406 void KisCanvasResourceProvider::setMirrorHorizontalLock(bool isLocked)
0407 {
0408     m_resourceManager->setResource(KoCanvasResource::MirrorHorizontalLock, isLocked);
0409     emit mirrorModeChanged();
0410 }
0411 
0412 bool KisCanvasResourceProvider::mirrorHorizontalLock() {
0413      return m_resourceManager->resource(KoCanvasResource::MirrorHorizontalLock).toBool();
0414 }
0415 
0416 void KisCanvasResourceProvider::setMirrorVerticalLock(bool isLocked)
0417 {
0418     m_resourceManager->setResource(KoCanvasResource::MirrorVerticalLock, isLocked);
0419     emit mirrorModeChanged();
0420 }
0421 
0422 
0423 
0424 bool KisCanvasResourceProvider::mirrorVerticalHideDecorations() {
0425      return m_resourceManager->resource(KoCanvasResource::MirrorVerticalHideDecorations).toBool();
0426 }
0427 
0428 void KisCanvasResourceProvider::setMirrorVerticalHideDecorations(bool hide)
0429 {
0430     m_resourceManager->setResource(KoCanvasResource::MirrorVerticalHideDecorations, hide);
0431     emit mirrorModeChanged();
0432 }
0433 
0434 
0435 bool KisCanvasResourceProvider::mirrorHorizontalHideDecorations() {
0436      return m_resourceManager->resource(KoCanvasResource::MirrorHorizontalHideDecorations).toBool();
0437 }
0438 
0439 void KisCanvasResourceProvider::setMirrorHorizontalHideDecorations(bool hide)
0440 {
0441     m_resourceManager->setResource(KoCanvasResource::MirrorHorizontalHideDecorations, hide);
0442     emit mirrorModeChanged();
0443 }
0444 
0445 
0446 bool KisCanvasResourceProvider::mirrorVerticalLock() {
0447      return m_resourceManager->resource(KoCanvasResource::MirrorVerticalLock).toBool();
0448 }
0449 
0450 void KisCanvasResourceProvider::mirrorVerticalMoveCanvasToCenter() {
0451      emit moveMirrorVerticalCenter();
0452 }
0453 
0454 void KisCanvasResourceProvider::mirrorHorizontalMoveCanvasToCenter() {
0455      emit moveMirrorHorizontalCenter();
0456 }
0457 
0458 
0459 
0460 void KisCanvasResourceProvider::setOpacity(qreal opacity)
0461 {
0462     m_resourceManager->setResource(KoCanvasResource::Opacity, opacity);
0463 }
0464 
0465 qreal KisCanvasResourceProvider::opacity() const
0466 {
0467     return m_resourceManager->resource(KoCanvasResource::Opacity).toReal();
0468 }
0469 
0470 void KisCanvasResourceProvider::setFlow(qreal flow)
0471 {
0472     m_resourceManager->setResource(KoCanvasResource::Flow, flow);
0473 }
0474 
0475 qreal KisCanvasResourceProvider::flow() const
0476 {
0477     return m_resourceManager->resource(KoCanvasResource::Flow).toReal();
0478 }
0479 
0480 void KisCanvasResourceProvider::setSize(qreal size)
0481 {
0482     m_resourceManager->setResource(KoCanvasResource::Size, size);
0483 }
0484 
0485 qreal KisCanvasResourceProvider::size() const
0486 {
0487     return m_resourceManager->resource(KoCanvasResource::Size).toReal();
0488 }
0489 
0490 void KisCanvasResourceProvider::setBrushRotation(qreal rotation)
0491 {
0492     m_resourceManager->setResource(KoCanvasResource::BrushRotation, rotation);
0493 }
0494 
0495 qreal KisCanvasResourceProvider::brushRotation() const
0496 {
0497     return m_resourceManager->resource(KoCanvasResource::BrushRotation).toReal();
0498 }
0499 
0500 void KisCanvasResourceProvider::setPatternSize(qreal size)
0501 {
0502     m_resourceManager->setResource(KoCanvasResource::PatternSize, size);
0503 }
0504 
0505 qreal KisCanvasResourceProvider::patternSize() const
0506 {
0507     return m_resourceManager->resource(KoCanvasResource::PatternSize).toReal();
0508 }
0509 
0510 void KisCanvasResourceProvider::setGlobalAlphaLock(bool lock)
0511 {
0512     m_resourceManager->setResource(KoCanvasResource::GlobalAlphaLock, lock);
0513 }
0514 
0515 bool KisCanvasResourceProvider::globalAlphaLock() const
0516 {
0517     return m_resourceManager->resource(KoCanvasResource::GlobalAlphaLock).toBool();
0518 }
0519 
0520 void KisCanvasResourceProvider::setDisablePressure(bool value)
0521 {
0522     m_resourceManager->setResource(KoCanvasResource::DisablePressure, value);
0523 }
0524 
0525 bool KisCanvasResourceProvider::disablePressure() const
0526 {
0527     return m_resourceManager->resource(KoCanvasResource::DisablePressure).toBool();
0528 }
0529 
0530 void KisCanvasResourceProvider::notifyLoadingWorkspace(KisWorkspaceResourceSP workspace)
0531 {
0532     emit sigLoadingWorkspace(workspace);
0533 }
0534 
0535 void KisCanvasResourceProvider::notifySavingWorkspace(KisWorkspaceResourceSP workspace)
0536 {
0537     emit sigSavingWorkspace(workspace);
0538 }
0539