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->displayColorConverter.displayRendererInterface();
693 return m_d->view->globalInputManager();
698 return m_d->canvasWidget->widget();
703 return m_d->canvasWidget->widget();
714 warnKrita <<
"WARNING: resolution of the image is anisotropic"
728 return &
m_d->toolProxy;
733 m_d->currentCanvasIsOpenGL =
false;
735 m_d->multiSurfaceState =
736 m_d->multiSurfaceSetupManager.createInitializingConfig(
false,
m_d->currentScreenId(),
m_d->proofingConfig);
740 m_d->prescaledProjection->setCoordinatesConverter(
m_d->coordinatesConverter);
741 m_d->prescaledProjection->setDisplayConfig(
m_d->multiSurfaceState->multiConfig.canvasDisplayConfig());
742 m_d->prescaledProjection->setDisplayFilter(
m_d->displayColorConverter.displayFilter());
751 m_d->currentCanvasIsOpenGL =
true;
753 m_d->multiSurfaceState =
754 m_d->multiSurfaceSetupManager.createInitializingConfig(
true,
m_d->currentScreenId(),
m_d->proofingConfig);
763 m_d->coordinatesConverter,
766 m_d->multiSurfaceState->multiConfig.canvasDisplayConfig(),
767 m_d->displayColorConverter.displayFilter(),
777 m_d->prescaledProjection = 0;
783 warnKrita <<
"Tried to create OpenGL widget when system doesn't have OpenGL\n";
791 warnKrita <<
"OpenGL Canvas initialization returned OPENGL_FAILED. Falling back to QPainter.";
799 m_d->displayColorConverter.setMultiSurfaceDisplayConfig(
m_d->multiSurfaceState->multiConfig);
801 if (
m_d->popupPalette) {
802 m_d->popupPalette->setParent(
m_d->canvasWidget->widget());
812 m_d->coordinatesConverter->setImage(
image);
813 m_d->toolProxy.initializeImage(
image);
851 if (!
m_d->currentCanvasIsOpenGL) {
852 Q_ASSERT(
m_d->prescaledProjection);
853 m_d->prescaledProjection->setImage(
image);
866 if (!
m_d->canvasWidget) {
872 const bool canvasHasNativeSurface = bool(
m_d->canvasWidget->widget()->windowHandle());
873 const bool canvasNeedsNativeSurface =
877 bool needReset = (
m_d->currentCanvasIsOpenGL != useOpenGL) ||
878 (
m_d->currentCanvasIsOpenGL &&
880 canvasHasNativeSurface != canvasNeedsNativeSurface;
897 if (
m_d->currentCanvasIsOpenGL) {
904 for (
int y = 0; y < imageRect.height(); y += patchHeight) {
905 for (
int x = 0; x < imageRect.width(); x += patchWidth) {
906 QRect patchRect(x, y, patchWidth, patchHeight);
918 m_d->view->viewManager()->blockUntilOperationsFinishedForced(image);
927 return m_d->displayColorConverter.displayFilter();
934 m_d->view->viewManager()->blockUntilOperationsFinishedForced(image);
938 m_d->canvasWidget->channelSelectionChanged(
m_d->channelFlags);
952 return &
m_d->displayColorConverter;
970 *
m_d->proofingConfig = *baseConfig;
977 KoColorConversionTransformation::ConversionFlags displayFlags =
m_d->proofingConfig->displayFlags;
980 if (
image()->colorSpace()->colorDepthId().
id().contains(
"U")) {
984 m_d->proofingConfig->displayFlags = displayFlags;
985 m_d->proofingConfigUpdated =
true;
988 auto newState =
m_d->multiSurfaceSetupManager.onProofingChanged(*
m_d->multiSurfaceState,
m_d->proofingConfig);
989 m_d->assignChangedMultiSurfaceState(newState);
1025 m_d->proofingConfigUpdated = updated;
1030 return m_d->proofingConfigUpdated;
1035 return m_d->proofingConfig;
1046 QRect imageBounds(0, 0, w, h);
1052 m_d->canvasWidget->finishResizingImage(w, h);
1058 if (
m_d->projectionUpdatesCompressor.putUpdateInfo(info)) {
1065 auto tryIssueCanvasUpdates = [
this](
const QRect &vRect) {
1066 if (!
m_d->isBatchUpdateActive) {
1068 if (
m_d->currentCanvasIsOpenGL) {
1069 m_d->savedCanvasProjectionUpdateRect |= vRect;
1073 }
else if ( !vRect.isEmpty()) {
1074 m_d->savedCanvasProjectionUpdateRect |=
m_d->coordinatesConverter->viewportToWidget(vRect).toAlignedRect();
1083 QVector<QRect> viewportRects =
m_d->canvasWidget->updateCanvasProjection(infoObjects);
1084 const QRect vRect = std::accumulate(viewportRects.constBegin(), viewportRects.constEnd(),
1085 QRect(), std::bit_or<QRect>());
1087 tryIssueCanvasUpdates(vRect);
1090 bool shouldExplicitlyIssueUpdates =
false;
1094 m_d->projectionUpdatesCompressor.takeUpdateInfo(originalInfoObjects);
1096 for (
auto it = originalInfoObjects.constBegin();
1097 it != originalInfoObjects.constEnd();
1104 if (!infoObjects.isEmpty()) {
1105 uploadData(infoObjects);
1106 infoObjects.clear();
1110 m_d->isBatchUpdateActive++;
1112 m_d->isBatchUpdateActive--;
1114 if (
m_d->isBatchUpdateActive == 0) {
1115 shouldExplicitlyIssueUpdates =
true;
1118 m_d->canvasWidget->setLodResetInProgress(
true);
1120 m_d->canvasWidget->setLodResetInProgress(
false);
1121 shouldExplicitlyIssueUpdates =
true;
1124 infoObjects << info;
1128 if (!infoObjects.isEmpty()) {
1129 uploadData(infoObjects);
1130 }
else if (shouldExplicitlyIssueUpdates) {
1131 tryIssueCanvasUpdates(
m_d->coordinatesConverter->imageRectInImagePixels());
1139 m_d->coordinatesConverter->imageRectInImagePixels());
1140 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1148 m_d->coordinatesConverter->imageRectInImagePixels());
1149 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1159 m_d->coordinatesConverter->imageRectInImagePixels());
1160 m_d->projectionUpdatesCompressor.putUpdateInfo(info);
1170#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
1171 m_d->canvasUpdateCompressor.start();
1180#if !KRITA_QT_HAS_UPDATE_COMPRESSION_PATCH
1186 if (
m_d->canvasWidget->isBusy()) {
1188 m_d->canvasUpdateCompressor.start();
1193 QRect combinedUpdateRect =
m_d->savedCanvasProjectionUpdateRect |
m_d->savedOverlayUpdateRect;
1194 if (!combinedUpdateRect.isEmpty()) {
1199 const QRect widgetRect =
m_d->canvasWidget->widget()->rect();
1200 const QRect imageRect =
m_d->coordinatesConverter->imageRectInImagePixels();
1202 const QRect widgetRectInImagePixels =
1203 m_d->coordinatesConverter->widgetToImage(widgetRect).toAlignedRect();
1205 const QRect rc =
m_d->coordinatesConverter->widgetToImage(
m_d->savedCanvasProjectionUpdateRect).toAlignedRect();
1210 Q_FOREACH(
const QRect &rc, updateRects) {
1211 const QRect widgetUpdateRect =
1212 m_d->coordinatesConverter->imageToWidget(rc).toAlignedRect() & widgetRect;
1213 m_d->canvasWidget->updateCanvasImage(widgetUpdateRect);
1215 m_d->canvasWidget->updateCanvasDecorations(
m_d->savedOverlayUpdateRect);
1217 m_d->canvasWidget->updateCanvasImage(
m_d->savedCanvasProjectionUpdateRect);
1218 m_d->canvasWidget->updateCanvasDecorations(
m_d->savedOverlayUpdateRect);
1220 }
else if (
m_d->updateSceneRequested) {
1221 m_d->canvasWidget->widget()->update();
1224 m_d->savedCanvasProjectionUpdateRect = QRect();
1225 m_d->savedOverlayUpdateRect = QRect();
1226 m_d->updateSceneRequested =
false;
1231 QRect
rect =
m_d->canvasWidget->widget()->rect();
1232 if (!rc.isEmpty()) {
1234 if (
rect.isEmpty()) {
1240 m_d->savedCanvasProjectionUpdateRect |=
rect;
1241 m_d->savedOverlayUpdateRect |=
rect;
1250QRect KisCanvas2::KisCanvas2Private::docUpdateRectToWidget(
const QRectF &docRect)
1252 QRect widgetRect = coordinatesConverter->documentToWidget(docRect).toAlignedRect();
1253 widgetRect.adjust(-2, -2, 2, 2);
1254 return widgetRect & canvasWidget->widget()->rect();
1261 QRect widgetRect =
m_d->docUpdateRectToWidget(documentRect);
1262 if (!widgetRect.isEmpty()) {
1269 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1270 if (!widgetRect.isEmpty()) {
1271 m_d->savedCanvasProjectionUpdateRect |= widgetRect;
1278 m_d->savedOverlayUpdateRect =
m_d->canvasWidget->widget()->rect();
1284 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1285 if (!widgetRect.isEmpty()) {
1286 m_d->savedOverlayUpdateRect |= widgetRect;
1293 QRect widgetRect =
m_d->docUpdateRectToWidget(docRect);
1294 if (!widgetRect.isEmpty()) {
1301 QRect
rect = widgetRect &
m_d->canvasWidget->widget()->rect();
1302 if (!
rect.isEmpty()) {
1303 m_d->savedOverlayUpdateRect |=
rect;
1304#ifdef HAVE_NO_QT_UPDATE_COMPRESSIO
1305 m_d->canvasUpdateCompressor.start();
1314 m_d->updateSceneRequested =
true;
1321 m_d->view->disconnect(
object);
1335 return m_d->regionOfInterest;
1340 const QRect oldRegionOfInterest =
m_d->regionOfInterest;
1342 const qreal ratio =
m_d->regionOfInterestMargin;
1343 const QRect proposedRoi =
KisAlgebra2D::blowRect(
m_d->coordinatesConverter->widgetRectInImagePixels(), ratio).toAlignedRect();
1345 const QRect imageRect =
m_d->coordinatesConverter->imageRectInImagePixels();
1347 m_d->regionOfInterest = proposedRoi & imageRect;
1349 if (
m_d->regionOfInterest != oldRegionOfInterest) {
1356 QRectF referencesRect;
1362 m_d->view->canvasController()->syncOnReferencesChange(referencesRect);
1367 m_d->renderingLimit = rc;
1372 return m_d->renderingLimit;
1377 return m_d->popupPalette;
1390 if (
m_d->bootstrapLodBlocked || !
m_d->lodIsSupported()) {
1393 const qreal effectiveZoom =
m_d->coordinatesConverter->effectiveZoom();
1400 if (
m_d->lodPreferredInImage) {
1410 return m_d->view->viewManager();
1422 return m_d->view->image();
1428 return m_d->view->image();
1433 if (!
m_d->currentCanvasIsOpenGL) {
1434 Q_ASSERT(
m_d->prescaledProjection);
1436 m_d->prescaledProjection->notifyCanvasStateChanged(state);
1440 m_d->regionOfInterestUpdateCompressor.start();
1452 QWidget *mainWindow =
m_d->view->mainWindow();
1455 QWidget *topLevelWidget = mainWindow->topLevelWidget();
1459 auto newState =
m_d->multiSurfaceSetupManager.onConfigChanged(*
m_d->multiSurfaceState,
1460 m_d->currentScreenId(),
1463 m_d->assignChangedMultiSurfaceState(newState);
1470 const int screenId = qApp->screens().indexOf(screen);
1473 warnUI <<
"Failed to get screenNumber for updating display profile.";
1478 auto newState =
m_d->multiSurfaceSetupManager.onScreenChanged(*
m_d->multiSurfaceState,
1480 m_d->assignChangedMultiSurfaceState(newState);
1486 KisImageReadOnlyBarrierLock l(
image);
1495 if (*multiSurfaceState == newState)
return;
1498 this->multiSurfaceState = newState;
1500 displayColorConverter.setMultiSurfaceDisplayConfig(newState.
multiConfig);
1504 KisImageReadOnlyBarrierLock l(image);
1505 canvasWidget->setDisplayConfig(multiSurfaceState->multiConfig.canvasDisplayConfig());
1507 q->refetchDataFromImage();
1517 assignChangedMultiSurfaceStateSkipCanvasSurface(newState);
1519#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1521 if (surfaceColorManager) {
1530#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1533 if (
m_d->multiSurfaceState->multiConfig.canvasDisplayConfig() == config)
return;
1535 if (
m_d->multiSurfaceState->isCanvasOpenGL) {
1539 const QString warningMessage = i18n(
1540 "WARNING: HDR mode was activated on surface working in 8-bit mode!\n"
1541 "Please activate 10-bit mode in Krita's Preferences dialog and restart "
1542 "Krita to avoid color banding!");
1545 warnOpenGL.noquote() << QString(warningMessage).replace(
'\n',
' ');
1550 auto newState =
m_d->multiSurfaceSetupManager.onCanvasSurfaceFormatChanged(*
m_d->multiSurfaceState, config);
1551 m_d->assignChangedMultiSurfaceStateSkipCanvasSurface(newState);
1559 m_d->canvasWidget->addDecoration(deco);
1564 return m_d->canvasWidget->decoration(
id);
1581 return m_d->coordinatesConverter->documentOffset();
1587 m_d->canvasWidget->widget());
1589 connect(
m_d->popupPalette, SIGNAL(sigUpdateCanvas()),
this, SLOT(
updateCanvas()));
1590 connect(
m_d->view->mainWindow(), SIGNAL(themeChanged()),
m_d->popupPalette, SLOT(slotUpdateIcons()));
1604 return m_d->frameCache;
1609 return m_d->animationPlayer.data();
1618 m_d->shapeManager.selection()->deselectAll();
1620 m_d->shapeManager.selection()->select(shape);
1629 if (infinityDecoration) {
1630 infinityDecoration->setVisible(!
value);
1633 m_d->canvasWidget->setWrapAroundViewingMode(
value);
1638 return m_d->canvasWidget->wrapAroundViewingMode();
1643 m_d->canvasWidget->setWrapAroundViewingModeAxis(
value);
1649 return m_d->canvasWidget->wrapAroundViewingModeAxis();
1654 if (!
m_d->bootstrapLodBlocked)
return;
1656 m_d->bootstrapLodBlocked =
false;
1660 m_d->animationPlayer->setupAudioTracks();
1666 qWarning() <<
"WARNING: Level of Detail functionality is available only with openGL + GLSL 1.3 support";
1669 m_d->lodPreferredInImage =
1680 return m_d->lodPreferredInImage;
1686 return qobject_cast<KisPaintingAssistantsDecoration*>(deco.
data());
1692 return qobject_cast<KisReferenceImagesDecoration*>(deco.
data());
1697 return m_d->inputActionGroupsMaskInterface;
1702#if KRITA_USE_SURFACE_COLOR_MANAGEMENT_API
1704 QDebug str(&report);
1706 if (
m_d->canvasWidget) {
1707 str <<
"(canvas bit depth report)" << Qt::endl;
1709 str.noquote().nospace() <<
m_d->canvasWidget->currentBitDepthUserReport();
1714 if (
m_d->surfaceColorManager) {
1715 str.noquote().nospace() << QString(
"(canvas surface color manager)\n");
1716 str.noquote().nospace() << QString(
"\n");
1717 str.noquote().nospace() <<
m_d->surfaceColorManager->colorManagementReport();
1719 str.noquote().nospace() << QString(
"Surface color management is not supported on this platform\n");
1724 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()
KoColorDisplayRendererInterface * displayRendererInterface() const override
displayRendererInterface The display renderer interface has a number of color conversion functions wh...
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)