15#include <QApplication>
97#include "config-qt-patches-present.h"
100#include <config-use-surface-color-management-api.h>
101#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
117 ShapeLifetimeWrapper(
KoShape *shape, std::function<
void()> destructionHandler)
119 m_destructionHandler(destructionHandler)
129 m_destructionHandler();
140 std::function<
void()> m_destructionHandler;
153 KisCanvas2Private * m_canvasPrivateRef =
nullptr;
156 :m_canvasPrivateRef(canvasPrivateRef)
160 Q_ASSERT(m_canvasPrivateRef);
161 return m_canvasPrivateRef->inputActionGroupsMask;
165 if(m_canvasPrivateRef)
166 m_canvasPrivateRef->inputActionGroupsMask = mask;
176 , coordinatesConverter(coordConverter)
178 , shapeManager(parent)
179 , selectedShapesProxy(&shapeManager)
182 , displayColorConverter(resourceManager, view)
187#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
190 multiSurfaceSetupManager.setRootSurfaceInfoProxy(rootSurfaceInfoProxy);
191 connect(rootSurfaceInfoProxy,
195 if (!multiSurfaceState)
197 auto newState = multiSurfaceSetupManager.onGuiSurfaceFormatChanged(*multiSurfaceState, profile);
198 assignChangedMultiSurfaceState(newState);
206 inputActionGroupsMaskInterface->m_canvasPrivateRef =
nullptr;
212 animationPlayer.reset();
222 bool currentCanvasIsOpenGL =
true;
225 int openGLFilterMode = 0;
229#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
234 bool updateSceneRequested =
false;
238 bool proofingConfigUpdated =
false;
246 bool lodPreferredInImage =
false;
247 bool bootstrapLodBlocked =
false;
258 qreal regionOfInterestMargin = 0.25;
261 int isBatchUpdateActive = 0;
264#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
265 QScopedPointer<KisCanvasSurfaceColorSpaceManager> surfaceColorManager;
272 return lodPreferredInImage && !bootstrapLodBlocked;
276 return currentCanvasIsOpenGL &&
287 int canvasScreenNumber = qApp->screens().indexOf(view->currentScreen());
289 if (canvasScreenNumber < 0) {
290 warnKrita <<
"Couldn't detect screen that Krita belongs to..." <<
ppVar(view->currentScreen());
291 canvasScreenNumber = 0;
293 return canvasScreenNumber;
313 selection = mask->selection();
329 , m_d(new KisCanvas2Private(this, coordConverter, view, resourceManager))
336 m_d->bootstrapLodBlocked =
true;
341#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
342 m_d->canvasUpdateCompressor.setDelay(1000 / config.
fpsLimit());
346 m_d->frameRenderStartCompressor.setDelay(1000 / config.
fpsLimit());
385 connect(kritaShapeController, SIGNAL(selectionChanged()),
387 connect(kritaShapeController, SIGNAL(selectionContentChanged()),
389 connect(kritaShapeController, SIGNAL(currentLayerChanged(
const KoShapeLayer*)),
392#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
404 connect(
m_d->view->document(), SIGNAL(sigReferenceImagesChanged()), &
m_d->referencesBoundsUpdateCompressor, SLOT(start()));
415 const bool shouldShowDebugOverlay =
438 if (
m_d->popupPalette) {
439 m_d->popupPalette->setParent(widget->
widget());
442 if (
m_d->canvasWidget) {
452 m_d->canvasWidget = widget;
455 m_d->canvasWidget = widget;
458 m_d->canvasWidget = widget;
464 m_d->canvasWidget->addDecoration(manager);
467 widget->
widget()->setAutoFillBackground(
false);
468 widget->
widget()->setAttribute(Qt::WA_OpaquePaintEvent);
469 widget->
widget()->setMouseTracking(
true);
470 widget->
widget()->setAcceptDrops(
true);
478#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
484 m_d->surfaceColorManager.reset();
486 QWindow *mainWindowNativeWindow =
m_d->view->mainWindow()->windowHandle();
487 QWindow *nativeWindow = widget->
widget()->windowHandle();
489 if (nativeWindow && nativeWindow != mainWindowNativeWindow) {
490 std::unique_ptr<KisSurfaceColorManagerInterface> iface(
498 m_d->surfaceColorManager.reset(
500 m_d->multiSurfaceState->surfaceMode,
501 m_d->multiSurfaceState->multiConfig.options(),
504 connect(
m_d->surfaceColorManager.data(),
510 qWarning() <<
"WARNING: created non-native Krita canvas on managed platform,"
511 <<
"its color space will be limited to sRGB";
519 return m_d->currentCanvasIsOpenGL;
531 const QPoint intSpacing =
m_d->view->document()->gridConfig().spacing();
532 const QPoint intOffset =
m_d->view->document()->gridConfig().offset();
534 QPointF size = transform.map(QPointF(intSpacing));
535 spacing->rwidth() = size.x();
536 spacing->rheight() = size.y();
538 *offset = transform.map(QPointF(intOffset));
543 return m_d->view->document()->gridConfig().snapToGrid();
548 return m_d->coordinatesConverter->rotationAngle();
553 return m_d->coordinatesConverter->xAxisMirrored();
558 return m_d->coordinatesConverter->yAxisMirrored();
566 m_d->view->viewManager()->blockUntilOperationsFinishedForced(
image);
569 m_d->canvasWidget->channelSelectionChanged(
m_d->channelFlags);
577 m_d->view->image()->undoAdapter()->addCommand(command);
580void KisCanvas2::KisCanvas2Private::setActiveShapeManager(
KoShapeManager *shapeManager)
582 if (shapeManager != currentlyActiveShapeManager) {
583 currentlyActiveShapeManager = shapeManager;
584 selectedShapesProxy.setShapeManager(shapeManager);
602 return &
m_d->selectedShapesProxy;
607 return &
m_d->shapeManager;
612 return m_d->groupModeShapeWrapper ?
m_d->groupModeShapeWrapper->shape() :
nullptr;
619 m_d->groupModeShapeWrapper = std::nullopt;
623 m_d->groupModeShapeWrapper.emplace(
source, [
this] () {
644 !
m_d->groupModeShapeWrapper ||
648 m_d->groupModeShapeWrapper = std::nullopt;
651 if (
m_d->groupModeShapeWrapper) {
652 auto textShape =
dynamic_cast<KoSvgTextShape*
>(
m_d->groupModeShapeWrapper->shape());
656 m_d->groupModeShapeWrapper = std::nullopt;
673 return m_d->coordinatesConverter;
678 return m_d->coordinatesConverter;
683 return m_d->coordinatesConverter;
688 return m_d->view->globalInputManager();
693 return m_d->canvasWidget->widget();
698 return m_d->canvasWidget->widget();
709 warnKrita <<
"WARNING: resolution of the image is anisotropic"
723 return &
m_d->toolProxy;
728 m_d->currentCanvasIsOpenGL =
false;
730 m_d->multiSurfaceState =
731 m_d->multiSurfaceSetupManager.createInitializingConfig(
false,
m_d->currentScreenId(),
m_d->proofingConfig);
735 m_d->prescaledProjection->setCoordinatesConverter(
m_d->coordinatesConverter);
736 m_d->prescaledProjection->setDisplayConfig(
m_d->multiSurfaceState->multiConfig.canvasDisplayConfig());
737 m_d->prescaledProjection->setDisplayFilter(
m_d->displayColorConverter.displayFilter());
746 m_d->currentCanvasIsOpenGL =
true;
748 m_d->multiSurfaceState =
749 m_d->multiSurfaceSetupManager.createInitializingConfig(
true,
m_d->currentScreenId(),
m_d->proofingConfig);
758 m_d->coordinatesConverter,
761 m_d->multiSurfaceState->multiConfig.canvasDisplayConfig(),
762 m_d->displayColorConverter.displayFilter(),
772 m_d->prescaledProjection = 0;
778 warnKrita <<
"Tried to create OpenGL widget when system doesn't have OpenGL\n";
786 warnKrita <<
"OpenGL Canvas initialization returned OPENGL_FAILED. Falling back to QPainter.";
794 m_d->displayColorConverter.setMultiSurfaceDisplayConfig(
m_d->multiSurfaceState->multiConfig);
796 if (
m_d->popupPalette) {
797 m_d->popupPalette->setParent(
m_d->canvasWidget->widget());
807 m_d->coordinatesConverter->setImage(
image);
808 m_d->toolProxy.initializeImage(
image);
846 if (!
m_d->currentCanvasIsOpenGL) {
847 Q_ASSERT(
m_d->prescaledProjection);
848 m_d->prescaledProjection->setImage(
image);
861 if (!
m_d->canvasWidget) {
867 const bool canvasHasNativeSurface = bool(
m_d->canvasWidget->widget()->windowHandle());
868 const bool canvasNeedsNativeSurface =
872 bool needReset = (
m_d->currentCanvasIsOpenGL != useOpenGL) ||
873 (
m_d->currentCanvasIsOpenGL &&
875 canvasHasNativeSurface != canvasNeedsNativeSurface;
892 if (
m_d->currentCanvasIsOpenGL) {
899 for (
int y = 0; y < imageRect.height(); y += patchHeight) {
900 for (
int x = 0; x < imageRect.width(); x += patchWidth) {
901 QRect patchRect(x, y, patchWidth, patchHeight);
913 m_d->view->viewManager()->blockUntilOperationsFinishedForced(image);
922 return m_d->displayColorConverter.displayFilter();
929 m_d->view->viewManager()->blockUntilOperationsFinishedForced(image);
933 m_d->canvasWidget->channelSelectionChanged(
m_d->channelFlags);
947 return &
m_d->displayColorConverter;
965 *
m_d->proofingConfig = *baseConfig;
972 KoColorConversionTransformation::ConversionFlags displayFlags =
m_d->proofingConfig->displayFlags;
975 if (
image()->colorSpace()->colorDepthId().
id().contains(
"U")) {
979 m_d->proofingConfig->displayFlags = displayFlags;
980 m_d->proofingConfigUpdated =
true;
983 auto newState =
m_d->multiSurfaceSetupManager.onProofingChanged(*
m_d->multiSurfaceState,
m_d->proofingConfig);
984 m_d->assignChangedMultiSurfaceState(newState);
1020 m_d->proofingConfigUpdated = updated;
1025 return m_d->proofingConfigUpdated;
1030 return m_d->proofingConfig;
1041 QRect imageBounds(0, 0, w, h);
1047 m_d->canvasWidget->finishResizingImage(w, h);
1053 if (
m_d->projectionUpdatesCompressor.putUpdateInfo(info)) {
1060 auto tryIssueCanvasUpdates = [
this](
const QRect &vRect) {
1061 if (!
m_d->isBatchUpdateActive) {
1063 if (
m_d->currentCanvasIsOpenGL) {
1064 m_d->savedCanvasProjectionUpdateRect |= vRect;
1068 }
else if ( !vRect.isEmpty()) {
1069 m_d->savedCanvasProjectionUpdateRect |=
m_d->coordinatesConverter->viewportToWidget(vRect).toAlignedRect();
1078 QVector<QRect> viewportRects =
m_d->canvasWidget->updateCanvasProjection(infoObjects);
1079 const QRect vRect = std::accumulate(viewportRects.constBegin(), viewportRects.constEnd(),
1080 QRect(), std::bit_or<QRect>());
1082 tryIssueCanvasUpdates(vRect);
1085 bool shouldExplicitlyIssueUpdates =
false;
1089 m_d->projectionUpdatesCompressor.takeUpdateInfo(originalInfoObjects);
1091 for (
auto it = originalInfoObjects.constBegin();
1092 it != originalInfoObjects.constEnd();
1099 if (!infoObjects.isEmpty()) {
1100 uploadData(infoObjects);
1101 infoObjects.clear();
1105 m_d->isBatchUpdateActive++;
1107 m_d->isBatchUpdateActive--;
1109 if (
m_d->isBatchUpdateActive == 0) {
1110 shouldExplicitlyIssueUpdates =
true;
1113 m_d->canvasWidget->setLodResetInProgress(
true);
1115 m_d->canvasWidget->setLodResetInProgress(
false);
1116 shouldExplicitlyIssueUpdates =
true;
1119 infoObjects << info;
1123 if (!infoObjects.isEmpty()) {
1124 uploadData(infoObjects);
1125 }
else if (shouldExplicitlyIssueUpdates) {
1126 tryIssueCanvasUpdates(
m_d->coordinatesConverter->imageRectInImagePixels());
1134 m_d->coordinatesConverter->imageRectInImagePixels());
1135 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1143 m_d->coordinatesConverter->imageRectInImagePixels());
1144 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1154 m_d->coordinatesConverter->imageRectInImagePixels());
1155 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1165#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
1166 m_d->canvasUpdateCompressor.start();
1175#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
1181 if (
m_d->canvasWidget->isBusy()) {
1183 m_d->canvasUpdateCompressor.start();
1188 QRect combinedUpdateRect =
m_d->savedCanvasProjectionUpdateRect |
m_d->savedOverlayUpdateRect;
1189 if (!combinedUpdateRect.isEmpty()) {
1194 const QRect widgetRect =
m_d->canvasWidget->widget()->rect();
1195 const QRect imageRect =
m_d->coordinatesConverter->imageRectInImagePixels();
1197 const QRect widgetRectInImagePixels =
1198 m_d->coordinatesConverter->widgetToImage(widgetRect).toAlignedRect();
1200 const QRect rc =
m_d->coordinatesConverter->widgetToImage(
m_d->savedCanvasProjectionUpdateRect).toAlignedRect();
1205 Q_FOREACH(
const QRect &rc, updateRects) {
1206 const QRect widgetUpdateRect =
1207 m_d->coordinatesConverter->imageToWidget(rc).toAlignedRect() & widgetRect;
1208 m_d->canvasWidget->updateCanvasImage(widgetUpdateRect);
1210 m_d->canvasWidget->updateCanvasDecorations(
m_d->savedOverlayUpdateRect);
1212 m_d->canvasWidget->updateCanvasImage(
m_d->savedCanvasProjectionUpdateRect);
1213 m_d->canvasWidget->updateCanvasDecorations(
m_d->savedOverlayUpdateRect);
1215 }
else if (
m_d->updateSceneRequested) {
1216 m_d->canvasWidget->widget()->update();
1219 m_d->savedCanvasProjectionUpdateRect = QRect();
1220 m_d->savedOverlayUpdateRect = QRect();
1221 m_d->updateSceneRequested =
false;
1226 QRect
rect =
m_d->canvasWidget->widget()->rect();
1227 if (!rc.isEmpty()) {
1229 if (
rect.isEmpty()) {
1235 m_d->savedCanvasProjectionUpdateRect |=
rect;
1236 m_d->savedOverlayUpdateRect |=
rect;
1245QRect KisCanvas2::KisCanvas2Private::docUpdateRectToWidget(
const QRectF &docRect)
1247 QRect widgetRect = coordinatesConverter->documentToWidget(docRect).toAlignedRect();
1248 widgetRect.adjust(-2, -2, 2, 2);
1249 return widgetRect & canvasWidget->widget()->rect();
1256 QRect widgetRect =
m_d->docUpdateRectToWidget(documentRect);
1257 if (!widgetRect.isEmpty()) {
1264 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1265 if (!widgetRect.isEmpty()) {
1266 m_d->savedCanvasProjectionUpdateRect |= widgetRect;
1273 m_d->savedOverlayUpdateRect =
m_d->canvasWidget->widget()->rect();
1279 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1280 if (!widgetRect.isEmpty()) {
1281 m_d->savedOverlayUpdateRect |= widgetRect;
1288 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1289 if (!widgetRect.isEmpty()) {
1296 QRect
rect = widgetRect &
m_d->canvasWidget->widget()->rect();
1297 if (!
rect.isEmpty()) {
1298 m_d->savedOverlayUpdateRect |=
rect;
1299#ifdef HAVE_NO_QT_UPDATE_COMPRESSIO
1300 m_d->canvasUpdateCompressor.start();
1309 m_d->updateSceneRequested =
true;
1316 m_d->view->disconnect(
object);
1330 return m_d->regionOfInterest;
1335 const QRect oldRegionOfInterest =
m_d->regionOfInterest;
1337 const qreal ratio =
m_d->regionOfInterestMargin;
1338 const QRect proposedRoi =
KisAlgebra2D::blowRect(
m_d->coordinatesConverter->widgetRectInImagePixels(), ratio).toAlignedRect();
1340 const QRect imageRect =
m_d->coordinatesConverter->imageRectInImagePixels();
1342 m_d->regionOfInterest = proposedRoi & imageRect;
1344 if (
m_d->regionOfInterest != oldRegionOfInterest) {
1351 QRectF referencesRect;
1357 m_d->view->canvasController()->syncOnReferencesChange(referencesRect);
1362 m_d->renderingLimit = rc;
1367 return m_d->renderingLimit;
1372 return m_d->popupPalette;
1384 if (
m_d->bootstrapLodBlocked || !
m_d->lodIsSupported()) {
1387 const qreal effectiveZoom =
m_d->coordinatesConverter->effectiveZoom();
1394 if (
m_d->lodPreferredInImage) {
1404 return m_d->view->viewManager();
1416 return m_d->view->image();
1422 return m_d->view->image();
1427 if (!
m_d->currentCanvasIsOpenGL) {
1428 Q_ASSERT(
m_d->prescaledProjection);
1430 m_d->prescaledProjection->notifyCanvasStateChanged(state);
1434 m_d->regionOfInterestUpdateCompressor.start();
1446 QWidget *mainWindow =
m_d->view->mainWindow();
1449 QWidget *topLevelWidget = mainWindow->topLevelWidget();
1453 auto newState =
m_d->multiSurfaceSetupManager.onConfigChanged(*
m_d->multiSurfaceState,
1454 m_d->currentScreenId(),
1457 m_d->assignChangedMultiSurfaceState(newState);
1464 const int screenId = qApp->screens().indexOf(screen);
1467 warnUI <<
"Failed to get screenNumber for updating display profile.";
1472 auto newState =
m_d->multiSurfaceSetupManager.onScreenChanged(*
m_d->multiSurfaceState,
1474 m_d->assignChangedMultiSurfaceState(newState);
1480 KisImageReadOnlyBarrierLock l(
image);
1489 if (*multiSurfaceState == newState)
return;
1492 this->multiSurfaceState = newState;
1494 displayColorConverter.setMultiSurfaceDisplayConfig(newState.
multiConfig);
1498 KisImageReadOnlyBarrierLock l(image);
1499 canvasWidget->setDisplayConfig(multiSurfaceState->multiConfig.canvasDisplayConfig());
1501 q->refetchDataFromImage();
1511 assignChangedMultiSurfaceStateSkipCanvasSurface(newState);
1513#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1515 if (surfaceColorManager) {
1524#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1527 if (
m_d->multiSurfaceState->multiConfig.canvasDisplayConfig() == config)
return;
1529 if (
m_d->multiSurfaceState->isCanvasOpenGL) {
1533 const QString warningMessage = i18n(
1534 "WARNING: HDR mode was activated on surface working in 8-bit mode!\n"
1535 "Please activate 10-bit mode in Krita's Preferences dialog and restart "
1536 "Krita to avoid color banding!");
1539 warnOpenGL.noquote() << QString(warningMessage).replace(
'\n',
' ');
1544 auto newState =
m_d->multiSurfaceSetupManager.onCanvasSurfaceFormatChanged(*
m_d->multiSurfaceState, config);
1545 m_d->assignChangedMultiSurfaceStateSkipCanvasSurface(newState);
1551 m_d->canvasWidget->addDecoration(deco);
1556 return m_d->canvasWidget->decoration(
id);
1573 return m_d->coordinatesConverter->documentOffset();
1579 m_d->canvasWidget->widget());
1581 connect(
m_d->popupPalette, SIGNAL(sigUpdateCanvas()),
this, SLOT(
updateCanvas()));
1582 connect(
m_d->view->mainWindow(), SIGNAL(themeChanged()),
m_d->popupPalette, SLOT(slotUpdateIcons()));
1596 return m_d->frameCache;
1601 return m_d->animationPlayer.data();
1610 m_d->shapeManager.selection()->deselectAll();
1612 m_d->shapeManager.selection()->select(shape);
1621 if (infinityDecoration) {
1622 infinityDecoration->setVisible(!
value);
1625 m_d->canvasWidget->setWrapAroundViewingMode(
value);
1630 return m_d->canvasWidget->wrapAroundViewingMode();
1635 m_d->canvasWidget->setWrapAroundViewingModeAxis(
value);
1641 return m_d->canvasWidget->wrapAroundViewingModeAxis();
1646 if (!
m_d->bootstrapLodBlocked)
return;
1648 m_d->bootstrapLodBlocked =
false;
1652 m_d->animationPlayer->setupAudioTracks();
1658 qWarning() <<
"WARNING: Level of Detail functionality is available only with openGL + GLSL 1.3 support";
1661 m_d->lodPreferredInImage =
1672 return m_d->lodPreferredInImage;
1678 return qobject_cast<KisPaintingAssistantsDecoration*>(deco.
data());
1684 return qobject_cast<KisReferenceImagesDecoration*>(deco.
data());
1689 return m_d->inputActionGroupsMaskInterface;
1694#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1696 QDebug str(&report);
1698 if (
m_d->canvasWidget) {
1699 str <<
"(canvas bit depth report)" << Qt::endl;
1701 str.noquote().nospace() <<
m_d->canvasWidget->currentBitDepthUserReport();
1706 if (
m_d->surfaceColorManager) {
1707 str.noquote().nospace() << QString(
"(canvas surface color manager)\n");
1708 str.noquote().nospace() << QString(
"\n");
1709 str.noquote().nospace() <<
m_d->surfaceColorManager->colorManagementReport();
1711 str.noquote().nospace() << QString(
"Surface color management is not supported on this platform\n");
1716 return "Surface color management is disabled\n";
float value(const T *src, size_t ch)
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
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 setCurrentShapeManagerOwnerShape(KoShape *source) override
sets the group shape that is supposed to be "entered"
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()
KoShape * currentShapeManagerOwnerShape() const override
the shape that owns the currently active shape manager
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()
std::optional< ShapeLifetimeWrapper > groupModeShapeWrapper
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
QList< KoShape * > shapes
void addShapeChangeListener(ShapeChangeListener *listener)
ChangeType
Used by shapeChanged() to select which change was made.
@ Deleted
the shape was deleted
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
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
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)