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