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