12#include <klocalizedstring.h>
16#include <QReadWriteLock>
18#include <QWriteLocker>
65 clone->setDirtyOriginal(
rect, dontInvalidateFrames);
90 QReadLocker readLock(&
m_lock);
95 QWriteLocker writeLock(&
m_lock);
121 QReadLocker readLock(&
m_lock);
126 QWriteLocker writeLock(&
m_lock);
190 m_d->safeProjection->setImage(
image);
199 m_d->channelFlags = rhs.
m_d->channelFlags;
204 m_d->safeProjection->setImage(
image());
206 if (rhs.
m_d->layerStyle) {
209 if (rhs.
m_d->layerStyleProjectionPlane) {
221 delete m_d->metaDataStore;
242 if (!parentNode)
return 0;
251 return m_d->layerStyle;
265 m_d->layerStyleProjectionPlane = plane;
267 m_d->layerStyleProjectionPlane.clear();
268 m_d->layerStyle.clear();
283 if (
m_d->layerStyle && !
m_d->layerStyle->isEmpty()) {
307 if (
m_d->layerStyle &&
308 m_d->layerStyle->isEnabled() != property.
state.toBool()) {
310 m_d->layerStyle->setEnabled(property.
state.toBool());
321 QBitArray newChannelFlags =
m_d->channelFlags;
323 if(newChannelFlags.isEmpty())
338 return flags.count(
true) == 0 && !
m_d->channelFlags.isEmpty();
351 if (!channelFlags.isEmpty() &&
354 m_d->channelFlags.clear();
365 return m_d->channelFlags;
385 m_d->safeProjection->setImage(
image);
413 if (keepBlendingOptions) {
433 if (!keepBlendingOptions) {
449 if (!skipPaintingThisLayer) {
451 if (alphaDisabled == prevAlphaDisabled) {
466 if (!skipPaintingThisLayer) {
469 gc.
bitBlt(layerProjectionExtent.topLeft(), this->projection(), layerProjectionExtent);
486 return m_d->clonesList.registeredClones();
491 return m_d->clonesList.hasClones();
496 m_d->clonesList.setDirty(
rect, dontInvalidateFrames);
501 m_d->masksCache.setDirty();
506 return m_d->masksCache.selectionMask();
529 return m_d->masksCache.effectMasks();
550 if (child->node() == lastNode)
break;
555 if (child->visible()) {
562 child = child->nextSibling();
570 return !
m_d->masksCache.effectMasks().isEmpty();
578 for (
auto iter = allMasks.rbegin(); iter != allMasks.rend(); ++iter) {
579 if ((*iter)->inherits(
"KisFilterMask")) {
580 KisFilterMaskSP filterMask = qobject_cast<KisFilterMask*>((*iter).data());
581 if (filterMask->filter()->name() ==
"fastcoloroverlay") {
591 const QRect &requestedRect,
592 bool &rectVariesFlag)
const
594 rectVariesFlag =
false;
596 QRect prevChangeRect = requestedRect;
605 changeRect = mask->changeRect(prevChangeRect);
608 rectVariesFlag =
true;
617 const QRect &changeRect,
619 bool &rectVariesFlag)
const
621 rectVariesFlag =
false;
626 for (qint32 i = masks.size() - 1; i >= 0; i--) {
627 applyRects.push(prevNeedRect);
629 needRect = masks[i]->needRect(prevNeedRect);
632 rectVariesFlag =
true;
644 if (parent == filthy || parent != filthy->
parent()) {
648 if (nodeInQuestion == filthy) {
654 if (node == filthy) {
665 const QRect &requestedRect,
668 KisRenderPassFlags flags)
const
671 Q_ASSERT(destination);
677 if (masks.isEmpty()) {
679 if (
source != destination) {
684 bool changeRectVaries;
691 changeRectVaries =
false;
697 applyRects, needRectVaries);
699 if (!changeRectVaries && !needRectVaries) {
706 Q_ASSERT(
needRect == requestedRect);
708 if (
source != destination) {
713 const QRect maskApplyRect = applyRects.pop();
714 const QRect maskNeedRect =
715 applyRects.isEmpty() ?
needRect : applyRects.top();
718 mask->apply(destination, maskApplyRect, maskNeedRect, maskPosition, flags);
720 Q_ASSERT(applyRects.isEmpty());
732 QRect maskApplyRect = applyRects.pop();
737 mask->apply(tempDevice, maskApplyRect, maskNeedRect, maskPosition, flags);
739 if (!applyRects.isEmpty()) {
740 maskNeedRect = maskApplyRect;
741 maskApplyRect = applyRects.pop();
744 Q_ASSERT(applyRects.isEmpty());
755 QRect updatedRect =
rect;
757 if (!
rect.isValid() ||
759 !originalDevice)
return QRect();
762 m_d->safeProjection->releaseDevice();
765 if (!updatedRect.isEmpty()) {
768 updatedRect, filthyNode, 0, flags);
777 bool changeRectVaries =
false;
809 const QRect&
rect)
const
816 return m_d->layerStyleProjectionPlane ?
823 return m_d->projectionPlane;
831 m_d->safeProjection->getDeviceLazy(originalDevice) : originalDevice;
842 bool changeRectVaries;
873 bool changeRectVaries;
884 if (!projectionToBeUpdated.isEmpty() &&
885 !
changeRect.contains(projectionToBeUpdated)) {
904 if (
dynamic_cast<KisMask*
>(changedChildNode.
data())) {
925 if (!masks.isEmpty()) {
930 applyRects, needRectVaries);
938 if (w == 0 || h == 0) {
944 return originalDevice
957 if (w == 0 || h == 0) {
962 if (originalDevice ) {
968 keyframe->writeFrameToDevice(targetDevice);
969 return targetDevice->
createThumbnail(w, h, aspectRatioMode, boundsMode);
979 return originalDevice ? originalDevice->
x() : 0;
984 return originalDevice ? originalDevice->
y() : 0;
990 originalDevice->
setX(
x);
996 originalDevice->
setY(
y);
1001 QRect additionalMaskExtent = QRect();
1005 additionalMaskExtent |= mask->nonDependentExtent();
1011 if (originalDevice) {
1012 layerExtent = needExactBounds ?
1014 originalDevice->
extent();
1017 QRect additionalCompositeOpExtent;
1025 return layerExtent | additionalMaskExtent | additionalCompositeOpExtent;
1040 return qobject_cast<KisLayer*>(
parent().data());
1045 return m_d->metaDataStore;
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
QList< QString > QStringList
const quint8 OPACITY_OPAQUE_U8
const QString COMPOSITE_OVER
const QString COMPOSITE_COPY
const QString COMPOSITE_DESTINATION_ATOP
const QString COMPOSITE_DESTINATION_IN
void setDirty(const QRect &rect, bool dontInvalidateFrames)
const QList< KisCloneLayerWSP > registeredClones() const
QList< KisCloneLayerWSP > m_clonesList
void addClone(KisCloneLayerWSP cloneLayer)
void removeClone(KisCloneLayerWSP cloneLayer)
virtual QRect bounds() const =0
KisSelectionSP globalSelection() const
QRect bounds() const override
KisKeyframeSP activeKeyframeAt(int time) const
bool m_isEffectMasksValid
KisLayerMasksCache(KisLayer *parent)
KisSelectionMaskSP m_selectionMask
KisSelectionMaskSP selectionMask()
QList< KisEffectMaskSP > m_effectMasks
bool m_isSelectionMaskValid
QList< KisEffectMaskSP > effectMasks()
static const KoID layerStyle
static const KoID inheritAlpha
static const KoID colorOverlay
static KisBaseNode::Property getProperty(const KoID &id, bool state)
KisRasterKeyframeChannel * keyframeChannel() const
int sequenceNumber() const
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
QImage createThumbnail(qint32 maxw, qint32 maxh, KisThumbnailBoundsMode boundsMode=KisThumbnailBoundsMode::Precise, qreal oversample=1, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags())
QRect exactBounds() const
const KoColorSpace * colorSpace() const
QRect exactBoundsAmortized() const
KisDefaultBoundsBaseSP defaultBounds() const
void prepareClone(KisPaintDeviceSP src)
void makeCloneFrom(KisPaintDeviceSP src, const QRect &rect)
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
The KisRasterKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisRas...
The KisRasterKeyframe class is a concrete subclass of KisKeyframe that wraps a physical raster image ...
KisSharedPtr< T > toStrongRef() const
toStrongRef returns a KisSharedPtr which may be dereferenced.
QBitArray channelFlags(bool color=true, bool alpha=false) const
const KoCompositeOp * compositeOp(const QString &id, const KoColorSpace *srcSpace=nullptr) const
bool boolProperty(const QString &name, bool defaultValue=false) const
void setProperty(const QString &name, const QVariant &value)
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
KisNode::PositionToFilthy calculatePositionToFilthy(KisNodeSP nodeInQuestion, KisNodeSP filthy, KisNodeSP parent)
QSharedPointer< KisLayerStyleProjectionPlane > KisLayerStyleProjectionPlaneSP
QSharedPointer< T > toQShared(T *ptr)
KisSharedPtr< KisSelection > KisSelectionSP
QSharedPointer< KisAbstractProjectionPlane > KisAbstractProjectionPlaneSP
bool compareChannelFlags(QBitArray f1, QBitArray f2)
void setNodeProperty(const QString &name, const QVariant &value)
quint8 percentOpacity() const
bool isIsolatedRoot() const
const QString & compositeOpId() const
void setOpacity(quint8 val)
const KoProperties & nodeProperties() const
void setName(const QString &name)
virtual const KoColorSpace * colorSpace() const =0
virtual KisPaintDeviceSP paintDevice() const =0
virtual PropertyList sectionModelProperties() const
void setCompositeOpId(const QString &compositeOpId)
virtual bool visible(bool recursive=false) const
virtual void setSectionModelProperties(const PropertyList &properties)
KisPaintDeviceSP projection() const override
void setImage(KisImageWSP image) override
qint32 y() const override
void disableAlphaChannel(bool disable)
virtual void fillMergedLayerTemplate(KisLayerSP dstLayer, KisLayerSP prevLayer, bool skipPaintingThisLayer=false)
virtual QRect outgoingChangeRect(const QRect &rect) const
virtual QRect amortizedProjectionRectForCleanupInChangePass() const
QRect looseUserVisibleBounds() const
virtual KisLayerSP createMergedLayerTemplate(KisLayerSP prevLayer)
void childNodeChanged(KisNodeSP changedChildNode) override
QImage createThumbnailForFrame(qint32 w, qint32 h, int time, Qt::AspectRatioMode aspectRatioMode, KisThumbnailBoundsMode boundsMode) override
QRect needRectForOriginal(const QRect &rect) const
QList< KisEffectMaskSP > effectMasks() const
KisMetaData::Store * metaData()
KisCloneLayersList clonesList
bool canMergeAndKeepBlendOptions(KisLayerSP otherLayer)
bool hasEffectMasks() const
QRect exactBounds() const override
QRect updateProjection(const QRect &rect, KisNodeSP filthyNode, KisRenderPassFlags flags)
void registerClone(KisCloneLayerWSP clone)
QRect masksChangeRect(const QList< KisEffectMaskSP > &masks, const QRect &requestedRect, bool &rectVariesFlag) const
KisLayerMasksCache masksCache
int thumbnailSeqNo() const override
virtual KisLayerProjectionPlaneSP internalProjectionPlane() const
virtual KisSelectionMaskSP selectionMask() const
QRect tightUserVisibleBounds() const
const KoCompositeOp * compositeOp() const override
returns the layer's composite op for the colorspace of the layer's parent.
virtual QRect incomingChangeRect(const QRect &rect) const
bool alphaChannelDisabled() const
void buildProjectionUpToNode(KisPaintDeviceSP projection, KisNodeSP lastNode, const QRect &rect)
qint32 x() const override
KisPSDLayerStyleSP layerStyle
QRect partialChangeRect(KisNodeSP lastNode, const QRect &rect)
QRect extent() const override
QRect changeRect(const QRect &rect, PositionToFilthy pos=N_FILTHY) const override
QRect applyMasks(const KisPaintDeviceSP source, KisPaintDeviceSP destination, const QRect &requestedRect, KisNodeSP filthyNode, KisNodeSP lastNode, KisRenderPassFlags flags) const
const QList< KisCloneLayerWSP > registeredClones() const
friend class KisLayerProjectionPlane
void notifyChildMaskChanged()
virtual KisLayerSP tryCreateInternallyMergedLayerFromMutipleLayers(QList< KisLayerSP > layers)
QRect masksNeedRect(const QList< KisEffectMaskSP > &masks, const QRect &changeRect, QStack< QRect > &applyRects, bool &rectVariesFlag) const
QRect layerExtentImpl(bool exactBounds) const
KisLayerStyleProjectionPlaneSP layerStyleProjectionPlane
QList< KisEffectMaskSP > searchEffectMasks(KisNodeSP lastNode) const
QRect userVisibleBoundsImpl(bool exactBounds) const
QImage createThumbnail(qint32 w, qint32 h, Qt::AspectRatioMode aspectRatioMode, KisThumbnailBoundsMode boundsMode) override
const KoColorSpace * colorSpace() const override
returns the image's colorSpace or null, if there is no image
void setX(qint32 x) override
KisFilterMaskSP colorOverlayMask() const
void setSectionModelProperties(const KisBaseNode::PropertyList &properties) override
virtual void setChannelFlags(const QBitArray &channelFlags)
void unregisterClone(KisCloneLayerWSP clone)
void updateClones(const QRect &rect, bool dontInvalidateFrames)
KisLayerSP parentLayer() const
virtual KisSelectionSP selection() const
KisPaintDeviceSP original() const override=0
virtual void copyOriginalToProjection(const KisPaintDeviceSP original, KisPaintDeviceSP projection, const QRect &rect) const
void setTemporary(bool t)
KisBaseNode::PropertyList sectionModelProperties() const override
void setLayerStyle(KisPSDLayerStyleSP layerStyle)
KisSafeNodeProjectionStoreSP safeProjection
void setY(qint32 y) override
KisLayerProjectionPlaneSP projectionPlane
virtual bool needProjection() const
void baseNodeInvalidateAllFramesCallback() override
KisNodeSP prevSibling() const
void baseNodeChangedCallback() override
QList< KisNodeSP > childNodes(const QStringList &nodeTypes, const KoProperties &properties) const
void setImage(KisImageWSP newImage) override
KisProjectionLeafSP projectionLeaf
virtual QRect needRect(const QRect &rect, PositionToFilthy pos=N_FILTHY) const
virtual KisNodeSP clone() const =0
The KisPSDLayerStyle class implements loading, saving and applying the PSD layer effects.
static KoColorSpaceRegistry * instance()