File indexing completed on 2024-05-12 16:01:27

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::Opacity):
0313     {
0314         emit sigOpacityChanged(res.toDouble());
0315     }
0316     default:
0317         ;
0318         // Do nothing
0319     };
0320 }
0321 
0322 void KisCanvasResourceProvider::setCurrentCompositeOp(const QString& compositeOp)
0323 {
0324     m_resourceManager->setResource(KoCanvasResource::CurrentCompositeOp,
0325                                    QVariant::fromValue(compositeOp));
0326 }
0327 
0328 QString KisCanvasResourceProvider::currentCompositeOp() const
0329 {
0330     return m_resourceManager->resource(KoCanvasResource::CurrentCompositeOp).value<QString>();
0331 }
0332 
0333 bool KisCanvasResourceProvider::eraserMode() const
0334 {
0335     return m_resourceManager->resource(KoCanvasResource::EraserMode).toBool();
0336 }
0337 
0338 void KisCanvasResourceProvider::setEraserMode(bool value)
0339 {
0340     m_resourceManager->setResource(KoCanvasResource::EraserMode,
0341                                    QVariant::fromValue(value));
0342     emit sigEraserModeToggled(value);
0343 }
0344 
0345 void KisCanvasResourceProvider::slotPainting()
0346 {
0347     if (m_fGChanged) {
0348         emit sigFGColorUsed(fgColor());
0349         m_fGChanged = false;
0350     }
0351 }
0352 
0353 void KisCanvasResourceProvider::slotGamutMaskActivated(KoGamutMaskSP mask)
0354 {
0355     QVariant v;
0356     v.setValue<KoGamutMaskSP>(mask);
0357     m_resourceManager->setResource(KoCanvasResource::CurrentGamutMask, v);
0358 
0359     m_resourceManager->setResource(KoCanvasResource::GamutMaskActive, QVariant::fromValue(true));
0360 
0361     emit sigGamutMaskChanged(mask);
0362 }
0363 
0364 void KisCanvasResourceProvider::slotGamutMaskUnset()
0365 {
0366     m_resourceManager->setResource(KoCanvasResource::GamutMaskActive, QVariant::fromValue(false));
0367     m_resourceManager->clearResource(KoCanvasResource::CurrentGamutMask);
0368     emit sigGamutMaskUnset();
0369 }
0370 
0371 void KisCanvasResourceProvider::slotGamutMaskPreviewUpdate()
0372 {
0373     emit sigGamutMaskPreviewUpdate();
0374 }
0375 
0376 void KisCanvasResourceProvider::slotGamutMaskDeactivate()
0377 {
0378     m_resourceManager->setResource(KoCanvasResource::GamutMaskActive, QVariant::fromValue(false));
0379     emit sigGamutMaskDeactivated();
0380 }
0381 
0382 QList<QPointer<KisAbstractPerspectiveGrid> > KisCanvasResourceProvider::perspectiveGrids() const
0383 {
0384     return m_perspectiveGrids;
0385 }
0386 
0387 void KisCanvasResourceProvider::addPerspectiveGrid(KisAbstractPerspectiveGrid* grid)
0388 {
0389     m_perspectiveGrids.append(grid);
0390 }
0391 
0392 void KisCanvasResourceProvider::removePerspectiveGrid(KisAbstractPerspectiveGrid* grid)
0393 {
0394     m_perspectiveGrids.removeOne(grid);
0395 }
0396 
0397 void KisCanvasResourceProvider::clearPerspectiveGrids()
0398 {
0399     m_perspectiveGrids.clear();
0400 }
0401 
0402 void KisCanvasResourceProvider::setMirrorHorizontal(bool mirrorHorizontal)
0403 {
0404     m_resourceManager->setResource(KoCanvasResource::MirrorHorizontal, mirrorHorizontal);
0405     emit mirrorModeChanged();
0406 }
0407 
0408 bool KisCanvasResourceProvider::mirrorHorizontal() const
0409 {
0410     return m_resourceManager->resource(KoCanvasResource::MirrorHorizontal).toBool();
0411 }
0412 
0413 void KisCanvasResourceProvider::setMirrorVertical(bool mirrorVertical)
0414 {
0415     m_resourceManager->setResource(KoCanvasResource::MirrorVertical, mirrorVertical);
0416     emit mirrorModeChanged();
0417 }
0418 
0419 bool KisCanvasResourceProvider::mirrorVertical() const
0420 {
0421     return m_resourceManager->resource(KoCanvasResource::MirrorVertical).toBool();
0422 }
0423 
0424 void KisCanvasResourceProvider::setMirrorHorizontalLock(bool isLocked)
0425 {
0426     m_resourceManager->setResource(KoCanvasResource::MirrorHorizontalLock, isLocked);
0427     emit mirrorModeChanged();
0428 }
0429 
0430 bool KisCanvasResourceProvider::mirrorHorizontalLock() {
0431      return m_resourceManager->resource(KoCanvasResource::MirrorHorizontalLock).toBool();
0432 }
0433 
0434 void KisCanvasResourceProvider::setMirrorVerticalLock(bool isLocked)
0435 {
0436     m_resourceManager->setResource(KoCanvasResource::MirrorVerticalLock, isLocked);
0437     emit mirrorModeChanged();
0438 }
0439 
0440 
0441 
0442 bool KisCanvasResourceProvider::mirrorVerticalHideDecorations() {
0443      return m_resourceManager->resource(KoCanvasResource::MirrorVerticalHideDecorations).toBool();
0444 }
0445 
0446 void KisCanvasResourceProvider::setMirrorVerticalHideDecorations(bool hide)
0447 {
0448     m_resourceManager->setResource(KoCanvasResource::MirrorVerticalHideDecorations, hide);
0449     emit mirrorModeChanged();
0450 }
0451 
0452 
0453 bool KisCanvasResourceProvider::mirrorHorizontalHideDecorations() {
0454      return m_resourceManager->resource(KoCanvasResource::MirrorHorizontalHideDecorations).toBool();
0455 }
0456 
0457 void KisCanvasResourceProvider::setMirrorHorizontalHideDecorations(bool hide)
0458 {
0459     m_resourceManager->setResource(KoCanvasResource::MirrorHorizontalHideDecorations, hide);
0460     emit mirrorModeChanged();
0461 }
0462 
0463 
0464 bool KisCanvasResourceProvider::mirrorVerticalLock() {
0465      return m_resourceManager->resource(KoCanvasResource::MirrorVerticalLock).toBool();
0466 }
0467 
0468 void KisCanvasResourceProvider::mirrorVerticalMoveCanvasToCenter() {
0469      emit moveMirrorVerticalCenter();
0470 }
0471 
0472 void KisCanvasResourceProvider::mirrorHorizontalMoveCanvasToCenter() {
0473      emit moveMirrorHorizontalCenter();
0474 }
0475 
0476 
0477 
0478 void KisCanvasResourceProvider::setOpacity(qreal opacity)
0479 {
0480     m_resourceManager->setResource(KoCanvasResource::Opacity, opacity);
0481 }
0482 
0483 qreal KisCanvasResourceProvider::opacity() const
0484 {
0485     return m_resourceManager->resource(KoCanvasResource::Opacity).toReal();
0486 }
0487 
0488 void KisCanvasResourceProvider::setFlow(qreal flow)
0489 {
0490     m_resourceManager->setResource(KoCanvasResource::Flow, flow);
0491 }
0492 
0493 qreal KisCanvasResourceProvider::flow() const
0494 {
0495     return m_resourceManager->resource(KoCanvasResource::Flow).toReal();
0496 }
0497 
0498 void KisCanvasResourceProvider::setSize(qreal size)
0499 {
0500     m_resourceManager->setResource(KoCanvasResource::Size, size);
0501 }
0502 
0503 qreal KisCanvasResourceProvider::size() const
0504 {
0505     return m_resourceManager->resource(KoCanvasResource::Size).toReal();
0506 }
0507 
0508 void KisCanvasResourceProvider::setPatternSize(qreal size)
0509 {
0510     m_resourceManager->setResource(KoCanvasResource::PatternSize, size);
0511 }
0512 
0513 qreal KisCanvasResourceProvider::patternSize() const
0514 {
0515     return m_resourceManager->resource(KoCanvasResource::PatternSize).toReal();
0516 }
0517 
0518 void KisCanvasResourceProvider::setGlobalAlphaLock(bool lock)
0519 {
0520     m_resourceManager->setResource(KoCanvasResource::GlobalAlphaLock, lock);
0521 }
0522 
0523 bool KisCanvasResourceProvider::globalAlphaLock() const
0524 {
0525     return m_resourceManager->resource(KoCanvasResource::GlobalAlphaLock).toBool();
0526 }
0527 
0528 void KisCanvasResourceProvider::setDisablePressure(bool value)
0529 {
0530     m_resourceManager->setResource(KoCanvasResource::DisablePressure, value);
0531 }
0532 
0533 bool KisCanvasResourceProvider::disablePressure() const
0534 {
0535     return m_resourceManager->resource(KoCanvasResource::DisablePressure).toBool();
0536 }
0537 
0538 void KisCanvasResourceProvider::notifyLoadingWorkspace(KisWorkspaceResourceSP workspace)
0539 {
0540     emit sigLoadingWorkspace(workspace);
0541 }
0542 
0543 void KisCanvasResourceProvider::notifySavingWorkspace(KisWorkspaceResourceSP workspace)
0544 {
0545     emit sigSavingWorkspace(workspace);
0546 }
0547