15#include <QApplication>
96#include "config-qt-patches-present.h"
99#include <config-use-surface-color-management-api.h>
100#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
122 KisCanvas2Private * m_canvasPrivateRef =
nullptr;
125 :m_canvasPrivateRef(canvasPrivateRef)
129 Q_ASSERT(m_canvasPrivateRef);
130 return m_canvasPrivateRef->inputActionGroupsMask;
134 if(m_canvasPrivateRef)
135 m_canvasPrivateRef->inputActionGroupsMask = mask;
145 , coordinatesConverter(coordConverter)
147 , shapeManager(parent)
148 , selectedShapesProxy(&shapeManager)
151 , displayColorConverter(resourceManager, view)
156#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
159 multiSurfaceSetupManager.setRootSurfaceInfoProxy(rootSurfaceInfoProxy);
164 if (!multiSurfaceState)
166 auto newState = multiSurfaceSetupManager.onGuiSurfaceFormatChanged(*multiSurfaceState, profile);
167 assignChangedMultiSurfaceState(newState);
175 inputActionGroupsMaskInterface->m_canvasPrivateRef =
nullptr;
181 animationPlayer.reset();
191 bool currentCanvasIsOpenGL =
true;
192 int openGLFilterMode = 0;
196#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
201 bool updateSceneRequested =
false;
205 bool proofingConfigUpdated =
false;
213 bool lodPreferredInImage =
false;
214 bool bootstrapLodBlocked =
false;
225 qreal regionOfInterestMargin = 0.25;
228 int isBatchUpdateActive = 0;
231#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
232 QScopedPointer<KisCanvasSurfaceColorSpaceManager> surfaceColorManager;
239 return lodPreferredInImage && !bootstrapLodBlocked;
243 return currentCanvasIsOpenGL &&
254 int canvasScreenNumber = qApp->screens().indexOf(view->currentScreen());
256 if (canvasScreenNumber < 0) {
257 warnKrita <<
"Couldn't detect screen that Krita belongs to..." <<
ppVar(view->currentScreen());
258 canvasScreenNumber = 0;
260 return canvasScreenNumber;
280 selection = mask->selection();
296 , m_d(new KisCanvas2Private(this, coordConverter, view, resourceManager))
303 m_d->bootstrapLodBlocked =
true;
308#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
309 m_d->canvasUpdateCompressor.setDelay(1000 / config.
fpsLimit());
313 m_d->frameRenderStartCompressor.setDelay(1000 / config.
fpsLimit());
352 connect(kritaShapeController, SIGNAL(selectionChanged()),
354 connect(kritaShapeController, SIGNAL(selectionContentChanged()),
359#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
371 connect(
m_d->view->document(), SIGNAL(sigReferenceImagesChanged()), &
m_d->referencesBoundsUpdateCompressor, SLOT(start()));
382 const bool shouldShowDebugOverlay =
405 if (
m_d->popupPalette) {
406 m_d->popupPalette->setParent(widget->
widget());
409 if (
m_d->canvasWidget) {
419 m_d->canvasWidget = widget;
422 m_d->canvasWidget = widget;
425 m_d->canvasWidget = widget;
431 m_d->canvasWidget->addDecoration(manager);
434 widget->
widget()->setAutoFillBackground(
false);
435 widget->
widget()->setAttribute(Qt::WA_OpaquePaintEvent);
436 widget->
widget()->setMouseTracking(
true);
437 widget->
widget()->setAcceptDrops(
true);
445#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
451 m_d->surfaceColorManager.reset();
453 QWindow *mainWindowNativeWindow =
m_d->view->mainWindow()->windowHandle();
454 QWindow *nativeWindow = widget->
widget()->windowHandle();
456 if (nativeWindow && nativeWindow != mainWindowNativeWindow) {
457 std::unique_ptr<KisSurfaceColorManagerInterface> iface(
465 m_d->surfaceColorManager.reset(
467 m_d->multiSurfaceState->surfaceMode,
468 m_d->multiSurfaceState->multiConfig.options(),
477 qWarning() <<
"WARNING: created non-native Krita canvas on managed platform,"
478 <<
"its color space will be limited to sRGB";
486 return m_d->currentCanvasIsOpenGL;
498 const QPoint intSpacing =
m_d->view->document()->gridConfig().spacing();
499 const QPoint intOffset =
m_d->view->document()->gridConfig().offset();
501 QPointF size = transform.map(QPointF(intSpacing));
502 spacing->rwidth() = size.x();
503 spacing->rheight() = size.y();
505 *offset = transform.map(QPointF(intOffset));
510 return m_d->view->document()->gridConfig().snapToGrid();
515 return m_d->coordinatesConverter->rotationAngle();
520 return m_d->coordinatesConverter->xAxisMirrored();
525 return m_d->coordinatesConverter->yAxisMirrored();
533 m_d->view->viewManager()->blockUntilOperationsFinishedForced(
image);
536 m_d->canvasWidget->channelSelectionChanged(
m_d->channelFlags);
544 m_d->view->image()->undoAdapter()->addCommand(command);
547void KisCanvas2::KisCanvas2Private::setActiveShapeManager(
KoShapeManager *shapeManager)
549 if (shapeManager != currentlyActiveShapeManager) {
550 currentlyActiveShapeManager = shapeManager;
551 selectedShapesProxy.setShapeManager(shapeManager);
569 return &
m_d->selectedShapesProxy;
574 return &
m_d->shapeManager;
591 return m_d->coordinatesConverter;
596 return m_d->coordinatesConverter;
601 return m_d->coordinatesConverter;
606 return m_d->view->globalInputManager();
611 return m_d->canvasWidget->widget();
616 return m_d->canvasWidget->widget();
627 warnKrita <<
"WARNING: resolution of the image is anisotropic"
641 return &
m_d->toolProxy;
646 m_d->currentCanvasIsOpenGL =
false;
648 m_d->multiSurfaceState =
649 m_d->multiSurfaceSetupManager.createInitializingConfig(
false,
m_d->currentScreenId(),
m_d->proofingConfig);
653 m_d->prescaledProjection->setCoordinatesConverter(
m_d->coordinatesConverter);
654 m_d->prescaledProjection->setDisplayConfig(
m_d->displayColorConverter.displayConfig());
655 m_d->prescaledProjection->setDisplayFilter(
m_d->displayColorConverter.displayFilter());
664 m_d->currentCanvasIsOpenGL =
true;
666 m_d->multiSurfaceState =
667 m_d->multiSurfaceSetupManager.createInitializingConfig(
true,
m_d->currentScreenId(),
m_d->proofingConfig);
676 m_d->coordinatesConverter,
679 m_d->multiSurfaceState->multiConfig.canvasDisplayConfig(),
680 m_d->displayColorConverter.displayFilter(),
690 m_d->prescaledProjection = 0;
696 warnKrita <<
"Tried to create OpenGL widget when system doesn't have OpenGL\n";
704 warnKrita <<
"OpenGL Canvas initialization returned OPENGL_FAILED. Falling back to QPainter.";
712 m_d->displayColorConverter.setMultiSurfaceDisplayConfig(
m_d->multiSurfaceState->multiConfig);
714 if (
m_d->popupPalette) {
715 m_d->popupPalette->setParent(
m_d->canvasWidget->widget());
725 m_d->coordinatesConverter->setImage(
image);
726 m_d->toolProxy.initializeImage(
image);
764 if (!
m_d->currentCanvasIsOpenGL) {
765 Q_ASSERT(
m_d->prescaledProjection);
766 m_d->prescaledProjection->setImage(
image);
779 if (!
m_d->canvasWidget) {
785 const bool canvasHasNativeSurface = bool(
m_d->canvasWidget->widget()->windowHandle());
786 const bool canvasNeedsNativeSurface =
790 bool needReset = (
m_d->currentCanvasIsOpenGL != useOpenGL) ||
791 (
m_d->currentCanvasIsOpenGL &&
793 canvasHasNativeSurface != canvasNeedsNativeSurface;
810 if (
m_d->currentCanvasIsOpenGL) {
817 for (
int y = 0; y < imageRect.height(); y += patchHeight) {
818 for (
int x = 0; x < imageRect.width(); x += patchWidth) {
819 QRect patchRect(x, y, patchWidth, patchHeight);
831 m_d->view->viewManager()->blockUntilOperationsFinishedForced(image);
840 return m_d->displayColorConverter.displayFilter();
847 m_d->view->viewManager()->blockUntilOperationsFinishedForced(image);
851 m_d->canvasWidget->channelSelectionChanged(
m_d->channelFlags);
865 return &
m_d->displayColorConverter;
883 *
m_d->proofingConfig = *baseConfig;
890 KoColorConversionTransformation::ConversionFlags displayFlags =
m_d->proofingConfig->displayFlags;
893 if (
image()->colorSpace()->colorDepthId().
id().contains(
"U")) {
897 m_d->proofingConfig->displayFlags = displayFlags;
898 m_d->proofingConfigUpdated =
true;
901 auto newState =
m_d->multiSurfaceSetupManager.onProofingChanged(*
m_d->multiSurfaceState,
m_d->proofingConfig);
902 m_d->assignChangedMultiSurfaceState(newState);
938 m_d->proofingConfigUpdated = updated;
943 return m_d->proofingConfigUpdated;
948 return m_d->proofingConfig;
959 QRect imageBounds(0, 0, w, h);
965 m_d->canvasWidget->finishResizingImage(w, h);
971 if (
m_d->projectionUpdatesCompressor.putUpdateInfo(info)) {
978 auto tryIssueCanvasUpdates = [
this](
const QRect &vRect) {
979 if (!
m_d->isBatchUpdateActive) {
981 if (
m_d->currentCanvasIsOpenGL) {
982 m_d->savedCanvasProjectionUpdateRect |= vRect;
986 }
else if ( !vRect.isEmpty()) {
987 m_d->savedCanvasProjectionUpdateRect |=
m_d->coordinatesConverter->viewportToWidget(vRect).toAlignedRect();
996 QVector<QRect> viewportRects =
m_d->canvasWidget->updateCanvasProjection(infoObjects);
997 const QRect vRect = std::accumulate(viewportRects.constBegin(), viewportRects.constEnd(),
998 QRect(), std::bit_or<QRect>());
1000 tryIssueCanvasUpdates(vRect);
1003 bool shouldExplicitlyIssueUpdates =
false;
1007 m_d->projectionUpdatesCompressor.takeUpdateInfo(originalInfoObjects);
1009 for (
auto it = originalInfoObjects.constBegin();
1010 it != originalInfoObjects.constEnd();
1017 if (!infoObjects.isEmpty()) {
1018 uploadData(infoObjects);
1019 infoObjects.clear();
1023 m_d->isBatchUpdateActive++;
1025 m_d->isBatchUpdateActive--;
1027 if (
m_d->isBatchUpdateActive == 0) {
1028 shouldExplicitlyIssueUpdates =
true;
1031 m_d->canvasWidget->setLodResetInProgress(
true);
1033 m_d->canvasWidget->setLodResetInProgress(
false);
1034 shouldExplicitlyIssueUpdates =
true;
1037 infoObjects << info;
1041 if (!infoObjects.isEmpty()) {
1042 uploadData(infoObjects);
1043 }
else if (shouldExplicitlyIssueUpdates) {
1044 tryIssueCanvasUpdates(
m_d->coordinatesConverter->imageRectInImagePixels());
1052 m_d->coordinatesConverter->imageRectInImagePixels());
1053 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1061 m_d->coordinatesConverter->imageRectInImagePixels());
1062 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1072 m_d->coordinatesConverter->imageRectInImagePixels());
1073 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1083#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
1084 m_d->canvasUpdateCompressor.start();
1093#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
1099 if (
m_d->canvasWidget->isBusy()) {
1101 m_d->canvasUpdateCompressor.start();
1106 QRect combinedUpdateRect =
m_d->savedCanvasProjectionUpdateRect |
m_d->savedOverlayUpdateRect;
1107 if (!combinedUpdateRect.isEmpty()) {
1112 const QRect widgetRect =
m_d->canvasWidget->widget()->rect();
1113 const QRect imageRect =
m_d->coordinatesConverter->imageRectInImagePixels();
1115 const QRect widgetRectInImagePixels =
1116 m_d->coordinatesConverter->widgetToImage(widgetRect).toAlignedRect();
1118 const QRect rc =
m_d->coordinatesConverter->widgetToImage(
m_d->savedCanvasProjectionUpdateRect).toAlignedRect();
1123 Q_FOREACH(
const QRect &rc, updateRects) {
1124 const QRect widgetUpdateRect =
1125 m_d->coordinatesConverter->imageToWidget(rc).toAlignedRect() & widgetRect;
1126 m_d->canvasWidget->updateCanvasImage(widgetUpdateRect);
1128 m_d->canvasWidget->updateCanvasDecorations(
m_d->savedOverlayUpdateRect);
1130 m_d->canvasWidget->updateCanvasImage(
m_d->savedCanvasProjectionUpdateRect);
1131 m_d->canvasWidget->updateCanvasDecorations(
m_d->savedOverlayUpdateRect);
1133 }
else if (
m_d->updateSceneRequested) {
1134 m_d->canvasWidget->widget()->update();
1137 m_d->savedCanvasProjectionUpdateRect = QRect();
1138 m_d->savedOverlayUpdateRect = QRect();
1139 m_d->updateSceneRequested =
false;
1144 QRect
rect =
m_d->canvasWidget->widget()->rect();
1145 if (!rc.isEmpty()) {
1147 if (
rect.isEmpty()) {
1153 m_d->savedCanvasProjectionUpdateRect |=
rect;
1154 m_d->savedOverlayUpdateRect |=
rect;
1163QRect KisCanvas2::KisCanvas2Private::docUpdateRectToWidget(
const QRectF &docRect)
1165 QRect widgetRect = coordinatesConverter->documentToWidget(docRect).toAlignedRect();
1166 widgetRect.adjust(-2, -2, 2, 2);
1167 return widgetRect & canvasWidget->widget()->rect();
1174 QRect widgetRect =
m_d->docUpdateRectToWidget(documentRect);
1175 if (!widgetRect.isEmpty()) {
1182 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1183 if (!widgetRect.isEmpty()) {
1184 m_d->savedCanvasProjectionUpdateRect |= widgetRect;
1191 m_d->savedOverlayUpdateRect =
m_d->canvasWidget->widget()->rect();
1197 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1198 if (!widgetRect.isEmpty()) {
1199 m_d->savedOverlayUpdateRect |= widgetRect;
1206 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1207 if (!widgetRect.isEmpty()) {
1214 QRect
rect = widgetRect &
m_d->canvasWidget->widget()->rect();
1215 if (!
rect.isEmpty()) {
1216 m_d->savedOverlayUpdateRect |=
rect;
1217#ifdef HAVE_NO_QT_UPDATE_COMPRESSIO
1218 m_d->canvasUpdateCompressor.start();
1227 m_d->updateSceneRequested =
true;
1234 m_d->view->disconnect(
object);
1248 return m_d->regionOfInterest;
1253 const QRect oldRegionOfInterest =
m_d->regionOfInterest;
1255 const qreal ratio =
m_d->regionOfInterestMargin;
1256 const QRect proposedRoi =
KisAlgebra2D::blowRect(
m_d->coordinatesConverter->widgetRectInImagePixels(), ratio).toAlignedRect();
1258 const QRect imageRect =
m_d->coordinatesConverter->imageRectInImagePixels();
1260 m_d->regionOfInterest = proposedRoi & imageRect;
1262 if (
m_d->regionOfInterest != oldRegionOfInterest) {
1269 QRectF referencesRect;
1275 m_d->view->canvasController()->syncOnReferencesChange(referencesRect);
1280 m_d->renderingLimit = rc;
1285 return m_d->renderingLimit;
1290 return m_d->popupPalette;
1298 newManager = fetchShapeManagerFromNode(node);
1300 m_d->setActiveShapeManager(newManager);
1307 if (
m_d->bootstrapLodBlocked || !
m_d->lodIsSupported()) {
1310 const qreal effectiveZoom =
m_d->coordinatesConverter->effectiveZoom();
1317 if (
m_d->lodPreferredInImage) {
1327 return m_d->view->viewManager();
1339 return m_d->view->image();
1345 return m_d->view->image();
1350 if (!
m_d->currentCanvasIsOpenGL) {
1351 Q_ASSERT(
m_d->prescaledProjection);
1353 m_d->prescaledProjection->notifyCanvasStateChanged(state);
1357 m_d->regionOfInterestUpdateCompressor.start();
1369 QWidget *mainWindow =
m_d->view->mainWindow();
1372 QWidget *topLevelWidget = mainWindow->topLevelWidget();
1376 auto newState =
m_d->multiSurfaceSetupManager.onConfigChanged(*
m_d->multiSurfaceState,
1377 m_d->currentScreenId(),
1380 m_d->assignChangedMultiSurfaceState(newState);
1387 const int screenId = qApp->screens().indexOf(screen);
1390 warnUI <<
"Failed to get screenNumber for updating display profile.";
1395 auto newState =
m_d->multiSurfaceSetupManager.onScreenChanged(*
m_d->multiSurfaceState,
1397 m_d->assignChangedMultiSurfaceState(newState);
1403 KisImageReadOnlyBarrierLock l(
image);
1412 if (*multiSurfaceState == newState)
return;
1415 this->multiSurfaceState = newState;
1417 displayColorConverter.setMultiSurfaceDisplayConfig(newState.
multiConfig);
1421 KisImageReadOnlyBarrierLock l(image);
1422 canvasWidget->setDisplayConfig(multiSurfaceState->multiConfig.canvasDisplayConfig());
1424 q->refetchDataFromImage();
1434 assignChangedMultiSurfaceStateSkipCanvasSurface(newState);
1436#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1438 if (surfaceColorManager) {
1447#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1450 if (
m_d->multiSurfaceState->multiConfig.canvasDisplayConfig() == config)
return;
1452 if (
m_d->multiSurfaceState->isCanvasOpenGL) {
1456 const QString warningMessage = i18n(
1457 "WARNING: HDR mode was activated on surface working in 8-bit mode!\n"
1458 "Please activate 10-bit mode in Krita's Preferences dialog and restart "
1459 "Krita to avoid color banding!");
1462 warnOpenGL.noquote() << QString(warningMessage).replace(
'\n',
' ');
1467 auto newState =
m_d->multiSurfaceSetupManager.onCanvasSurfaceFormatChanged(*
m_d->multiSurfaceState, config);
1468 m_d->assignChangedMultiSurfaceStateSkipCanvasSurface(newState);
1474 m_d->canvasWidget->addDecoration(deco);
1479 return m_d->canvasWidget->decoration(
id);
1496 return m_d->coordinatesConverter->documentOffset();
1502 m_d->canvasWidget->widget());
1505 connect(
m_d->view->mainWindow(), SIGNAL(themeChanged()),
m_d->popupPalette, SLOT(slotUpdateIcons()));
1519 return m_d->frameCache;
1524 return m_d->animationPlayer.data();
1533 m_d->shapeManager.selection()->deselectAll();
1535 m_d->shapeManager.selection()->select(shape);
1544 if (infinityDecoration) {
1545 infinityDecoration->setVisible(!
value);
1548 m_d->canvasWidget->setWrapAroundViewingMode(
value);
1553 return m_d->canvasWidget->wrapAroundViewingMode();
1558 m_d->canvasWidget->setWrapAroundViewingModeAxis(
value);
1564 return m_d->canvasWidget->wrapAroundViewingModeAxis();
1569 if (!
m_d->bootstrapLodBlocked)
return;
1571 m_d->bootstrapLodBlocked =
false;
1575 m_d->animationPlayer->setupAudioTracks();
1581 qWarning() <<
"WARNING: Level of Detail functionality is available only with openGL + GLSL 1.3 support";
1584 m_d->lodPreferredInImage =
1595 return m_d->lodPreferredInImage;
1601 return qobject_cast<KisPaintingAssistantsDecoration*>(deco.
data());
1607 return qobject_cast<KisReferenceImagesDecoration*>(deco.
data());
1612 return m_d->inputActionGroupsMaskInterface;
1617#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1619 QDebug str(&report);
1621 if (
m_d->canvasWidget) {
1622 str <<
"(canvas bit depth report)" << Qt::endl;
1624 str.noquote().nospace() <<
m_d->canvasWidget->currentBitDepthUserReport();
1629 if (
m_d->surfaceColorManager) {
1630 str.noquote().nospace() << QString(
"(canvas surface color manager)\n");
1631 str.noquote().nospace() << QString(
"\n");
1632 str.noquote().nospace() <<
m_d->surfaceColorManager->colorManagementReport();
1634 str.noquote().nospace() << QString(
"Surface color management is not supported on this platform\n");
1639 return "Surface color management is disabled\n";
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
static KisAnimationFrameCacheSP getFrameCache(KisOpenGLImageTexturesSP textures)
KisReferenceImagesDecorationSP referenceImagesDecoration() const
qreal rotationAngle() const
canvas rotation in degrees
KisSelectedShapesProxy selectedShapesProxy
void startUpdateInPatches(const QRect &imageRect)
bool effectiveLodAllowedInImage() const
void slotScreenChanged(QScreen *screen)
void setLodPreferredInCanvas(bool value)
KisPopupPalette * popupPalette
KisCanvas2Private *const m_d
KisCanvasAnimationState * animationState() const
void refetchDataFromImage()
void slotBeginUpdatesBatch()
QScopedPointer< KisCanvasAnimationState > animationPlayer
void updateCanvasToolOutlineDoc(const QRectF &docRect)
void initializeFpsDecoration()
bool proofingConfigUpdated
void assignChangedMultiSurfaceStateSkipCanvasSurface(const KisMultiSurfaceStateManager::State &newState)
void setFavoriteResourceManager(KisFavoriteResourceManager *favoriteResourceManager)
KoUnit unit() const override
KisExposureGammaCorrectionInterface * exposureGammaCorrectionInterface() const
void slotCanvasStateChanged()
void fetchProofingOptions()
fetchProofingOptions Get the options for softproofing, and apply the view-specific state without affe...
void sigCanvasStateChanged()
KisDisplayColorConverter displayColorConverter
void sigContinueResizeImage(qint32 w, qint32 h)
void startResizingImage()
void setCursor(const QCursor &cursor) override
void gridSize(QPointF *offset, QSizeF *spacing) const override
bool xAxisMirrored() const
Bools indicating canvasmirroring.
void slotUpdateReferencesBounds()
void setDisplayFilter(QSharedPointer< KisDisplayFilter > displayFilter)
bool wrapAroundViewingMode() const
KisInputManager * globalInputManager() const
void slotEndUpdatesBatch()
KisAnimationFrameCacheSP frameCache
KisImageWSP currentImage() const
void slotSelectionChanged()
void setWrapAroundViewingMode(bool value)
QRect savedCanvasProjectionUpdateRect
void createQPainterCanvas()
std::optional< KisMultiSurfaceStateManager::State > multiSurfaceState
void resetCanvas(bool useOpenGL)
KisProofingConfigurationSP proofingConfig
KisCoordinatesConverter * coordinatesConverter
void setProofingConfigUpdated(bool updated)
setProofingConfigUpdated This function is to set whether the proofing config is updated,...
QRect savedOverlayUpdateRect
KisImageWSP image() const
void addCommand(KUndo2Command *command) override
void updateProofingState()
KoShapeManager * localShapeManager() const
WrapAroundAxis wrapAroundViewingModeAxis() const
void addDecoration(KisCanvasDecorationSP deco)
KoShapeManager shapeManager
KisViewManager * viewManager() const
void slotSurfaceFormatChanged(const KisDisplayConfig &config)
QSharedPointer< CanvasInputActionGroupsMaskInterface > inputActionGroupsMaskInterface
bool canvasIsOpenGL() const override
void slotPopupPaletteRequestedZoomChange(int zoom)
int currentScreenId() const
QPointer< KisView > imageView() const
void setRenderingLimit(const QRect &rc)
void createCanvas(bool useOpenGL)
QRect docUpdateRectToWidget(const QRectF &docRect)
QPointer< KoShapeManager > currentlyActiveShapeManager
KisAbstractCanvasWidget * canvasWidget
void assignChangedMultiSurfaceState(const KisMultiSurfaceStateManager::State &newState)
KisCanvas2(KisCoordinatesConverter *coordConverter, KoCanvasResourceProvider *resourceManager, KisMainWindow *mainWindow, KisView *view, KoShapeControllerBase *sc)
bool lodPreferredInCanvas() const
void requestCanvasUpdateMaybeCompressed()
KoShapeManager * globalShapeManager() const
void updateCanvasProjection()
KisSignalCompressor referencesBoundsUpdateCompressor
KisCanvasDecorationSP decoration(const QString &id) const
KisCanvasUpdatesCompressor projectionUpdatesCompressor
QPoint documentOrigin() const override
void slotSetLodUpdatesBlocked(bool value)
void startUpdateCanvasProjection(const QRect &rc)
QPoint documentOffset() const
KisSignalCompressor canvasUpdateCompressor
void setCanvasWidget(KisAbstractCanvasWidget *widget)
KisPaintingAssistantsDecorationSP paintingAssistantsDecoration() const
void slotImageColorSpaceChanged()
void disconnectCanvasObserver(QObject *object) override
void updateCanvasDecorations()
void notifyLevelOfDetailChange()
void slotChangeGlobalProofingConfig()
void finishResizingImage(qint32 w, qint32 h)
bool yAxisMirrored() const
void slotChangeProofingConfig()
void slotDoCanvasUpdate()
KisProofingConfigurationSP proofingConfiguration() const
bool lodIsSupported() const
void connectCurrentCanvas()
void slotUpdateRegionOfInterest()
void updateCanvas()
Update the entire canvas area.
void setActiveShapeManager(KoShapeManager *shapeManager)
void updateCanvasWidgetImpl(const QRect &rc=QRect())
KisCanvas2Private(KisCanvas2 *parent, KisCoordinatesConverter *coordConverter, QPointer< KisView > view, KoCanvasResourceProvider *resourceManager)
void updateCanvasToolOutlineWdg(const QRect &widgetRect)
void createOpenGLCanvas()
void channelSelectionChanged()
KisMultiSurfaceStateManager multiSurfaceSetupManager
QString colorManagementReport() const
void sigCanvasEngineChanged()
void slotEffectiveZoomChanged(qreal newZoom)
void slotTrySwitchShapeManager()
KisSignalCompressor regionOfInterestUpdateCompressor
KisPrescaledProjectionSP prescaledProjection
const KoViewConverter * viewConverter() const override
void sigRegionOfInterestChanged(const QRect &roi)
QSharedPointer< KisDisplayFilter > displayFilter() const
bool snapToGrid() const override
void sigCanvasCacheUpdated()
KisSignalCompressor frameRenderStartCompressor
void updateCanvasRequested(const QRect &rc)
void setWrapAroundViewingModeAxis(WrapAroundAxis value)
The KisCanvasAnimationState class stores all of the canvas-specific animation state.
virtual void setVisible(bool v)
static KisCanvasState fromConverter(const KisCoordinatesConverter &converter)
static KisConfigNotifier * instance()
int openGLFilteringMode(bool defaultValue=false) const
CanvasSurfaceBitDepthMode effectiveCanvasSurfaceBitDepthMode(const QSurfaceFormat &format) const
int numMipmapLevels(bool defaultValue=false) const
bool levelOfDetailEnabled(bool defaultValue=false) const
bool enableOpenGLFramerateLogging(bool defaultValue=false) const
CanvasSurfaceMode canvasSurfaceColorSpaceManagementMode(bool defaultValue=false) const
void setLevelOfDetailEnabled(bool value)
bool enableCanvasSurfaceColorSpaceManagement(bool defaultValue=false) const
bool enableBrushSpeedLogging(bool defaultValue=false) const
QString canvasState(bool defaultValue=false) const
bool useOpenGL(bool defaultValue=false) const
QTransform imageToDocumentTransform() const
KisDisplayConfig This class keeps track of the color management configuration for image to display....
static Options optionsFromKisConfig(const KisConfig &cfg)
static const QString idTag
static KisImageConfigNotifier * instance()
void globalProofingConfigChanged()
int updatePatchWidth() const
KisProofingConfigurationSP defaultProofingconfiguration(bool requestDefault=false)
int updatePatchHeight() const
int fpsLimit(bool defaultValue=false) const
qreal animationCacheRegionOfInterestMargin(bool defaultValue=false) const
KisUndoAdapter * undoAdapter() const
void setLodPreferences(const KisLodPreferences &value)
KisGroupLayerSP rootLayer() const
const KoColorSpace * colorSpace() const
void barrierLock(bool readOnly=false)
Wait until all the queued background jobs are completed and lock the image.
void immediateLockForReadOnly()
KisImageSignalRouter * signalRouter()
QRect bounds() const override
KisProofingConfigurationSP proofingConfiguration() const
proofingConfiguration
KisDisplayConfig canvasDisplayConfig() const
static bool hasOpenGL()
Check for OpenGL.
static bool supportsLoD()
The KisProofingConfiguration struct Little struct that stores the proofing configuration for a given ...
QRectF boundingImageRect() const
void sigRootSurfaceProfileChanged(const KoColorProfile *profile) const
KoShapeManager * shapeManager() const
KoShapeManager * shapeManager() const
static KisStrokeSpeedMonitor * instance()
KisLayerSP activeLayer()
Convenience method to get at the active layer.
KisInputManager * inputManager() const
Filters events and sends them to canvas actions.
virtual void disconnectCanvasObserver(QObject *object)
QPointer< KoShapeController > shapeController
KoCanvasController * controller
KoCanvasController * canvasController() const
void canvasStateChanged()
virtual KoCanvasBase * canvas() const
The KoSelectedShapesProxy class is a special interface of KoCanvasBase to have a stable connection to...
const QList< KoShape * > selectedShapes() const
void overrideSnapStrategy(Strategy type, KoSnapStrategy *strategy)
void setFactor(qreal factor)
static bool qFuzzyCompare(half p1, half p2)
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER(cond)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
#define koIcon(name)
Use these macros for icons without any issues.
static const QString INFINITY_DECORATION_ID
Rect blowRect(const Rect &rect, qreal coeff)
void sigDisplayConfigChanged(const KisDisplayConfig &config)
static KisDumbExposureGammaCorrectionInterface * instance()
KisMultiSurfaceDisplayConfig multiConfig
KisConfig::CanvasSurfaceMode surfaceMode
KisSelectionComponent * shapeSelection
bool hasShapeSelection() const
static QVector< QRect > multiplyWrappedRect(const QRect &rc, const QRect &wrapRect, const QRect &limitRect, WrapAroundAxis wrapAxis)