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);
407 if (keepBlendingOptions) {
427 if (!keepBlendingOptions) {
443 if (!skipPaintingThisLayer) {
445 if (alphaDisabled == prevAlphaDisabled) {
460 if (!skipPaintingThisLayer) {
463 gc.
bitBlt(layerProjectionExtent.topLeft(), this->projection(), layerProjectionExtent);
480 return m_d->clonesList.registeredClones();
485 return m_d->clonesList.hasClones();
490 m_d->clonesList.setDirty(
rect, dontInvalidateFrames);
495 m_d->masksCache.setDirty();
500 return m_d->masksCache.selectionMask();
523 return m_d->masksCache.effectMasks();
544 if (child->node() == lastNode)
break;
549 if (child->visible()) {
556 child = child->nextSibling();
564 return !
m_d->masksCache.effectMasks().isEmpty();
572 for (
auto iter = allMasks.rbegin(); iter != allMasks.rend(); ++iter) {
573 if ((*iter)->inherits(
"KisFilterMask")) {
574 KisFilterMaskSP filterMask = qobject_cast<KisFilterMask*>((*iter).data());
575 if (filterMask->filter()->name() ==
"fastcoloroverlay") {
585 const QRect &requestedRect,
586 bool &rectVariesFlag)
const
588 rectVariesFlag =
false;
590 QRect prevChangeRect = requestedRect;
599 changeRect = mask->changeRect(prevChangeRect);
602 rectVariesFlag =
true;
611 const QRect &changeRect,
613 bool &rectVariesFlag)
const
615 rectVariesFlag =
false;
620 for (qint32 i = masks.size() - 1; i >= 0; i--) {
621 applyRects.push(prevNeedRect);
623 needRect = masks[i]->needRect(prevNeedRect);
626 rectVariesFlag =
true;
638 if (parent == filthy || parent != filthy->
parent()) {
642 if (nodeInQuestion == filthy) {
648 if (node == filthy) {
659 const QRect &requestedRect,
662 KisRenderPassFlags flags)
const
665 Q_ASSERT(destination);
671 if (masks.isEmpty()) {
673 if (
source != destination) {
678 bool changeRectVaries;
685 changeRectVaries =
false;
691 applyRects, needRectVaries);
693 if (!changeRectVaries && !needRectVaries) {
700 Q_ASSERT(
needRect == requestedRect);
702 if (
source != destination) {
707 const QRect maskApplyRect = applyRects.pop();
708 const QRect maskNeedRect =
709 applyRects.isEmpty() ?
needRect : applyRects.top();
712 mask->apply(destination, maskApplyRect, maskNeedRect, maskPosition, flags);
714 Q_ASSERT(applyRects.isEmpty());
726 QRect maskApplyRect = applyRects.pop();
731 mask->apply(tempDevice, maskApplyRect, maskNeedRect, maskPosition, flags);
733 if (!applyRects.isEmpty()) {
734 maskNeedRect = maskApplyRect;
735 maskApplyRect = applyRects.pop();
738 Q_ASSERT(applyRects.isEmpty());
749 QRect updatedRect =
rect;
751 if (!
rect.isValid() ||
753 !originalDevice)
return QRect();
756 m_d->safeProjection->releaseDevice();
759 if (!updatedRect.isEmpty()) {
762 updatedRect, filthyNode, 0, flags);
771 bool changeRectVaries =
false;
803 const QRect&
rect)
const
810 return m_d->layerStyleProjectionPlane ?
817 return m_d->projectionPlane;
825 m_d->safeProjection->getDeviceLazy(originalDevice) : originalDevice;
836 bool changeRectVaries;
867 bool changeRectVaries;
878 if (!projectionToBeUpdated.isEmpty() &&
879 !
changeRect.contains(projectionToBeUpdated)) {
898 if (
dynamic_cast<KisMask*
>(changedChildNode.
data())) {
919 if (!masks.isEmpty()) {
924 applyRects, needRectVaries);
932 if (w == 0 || h == 0) {
938 return originalDevice ?
952 if (w == 0 || h == 0) {
957 if (originalDevice ) {
963 keyframe->writeFrameToDevice(targetDevice);
976 return originalDevice ? originalDevice->
x() : 0;
981 return originalDevice ? originalDevice->
y() : 0;
987 originalDevice->
setX(
x);
993 originalDevice->
setY(
y);
998 QRect additionalMaskExtent = QRect();
1002 additionalMaskExtent |= mask->nonDependentExtent();
1008 if (originalDevice) {
1009 layerExtent = needExactBounds ?
1011 originalDevice->
extent();
1014 QRect additionalCompositeOpExtent;
1022 return layerExtent | additionalMaskExtent | additionalCompositeOpExtent;
1037 return qobject_cast<KisLayer*>(
parent().data());
1042 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, QRect rect, 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)
QImage createThumbnail(qint32 w, qint32 h, Qt::AspectRatioMode aspectRatioMode=Qt::IgnoreAspectRatio) override
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
QImage createThumbnailForFrame(qint32 w, qint32 h, int time, Qt::AspectRatioMode aspectRatioMode=Qt::IgnoreAspectRatio) override
virtual KisLayerSP createMergedLayerTemplate(KisLayerSP prevLayer)
void childNodeChanged(KisNodeSP changedChildNode) 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()
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
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()