Krita Source Code Documentation
Loading...
Searching...
No Matches
KoFilterEffectStack.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 * SPDX-FileCopyrightText: 2009-2010 Jan Hambrecht <jaham@gmx.net>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-or-later
5 */
6
8#include "KoFilterEffect.h"
9#include "KoXmlWriter.h"
10
11#include <QRectF>
12#include <QAtomicInt>
13#include <QSet>
14#include <QDebug>
15
16class Q_DECL_HIDDEN KoFilterEffectStack::Private
17{
18public:
20 : clipRect(-0.1, -0.1, 1.2, 1.2) // initialize as per svg spec
21 {
22 }
23
25 {
26 qDeleteAll(filterEffects);
27 }
28
30 QRectF clipRect;
31 QAtomicInt refCount;
32};
33
38
43
45{
46 return d->filterEffects;
47}
48
50{
51 return d->filterEffects.isEmpty();
52}
53
55{
56 if (filter)
57 d->filterEffects.insert(index, filter);
58}
59
61{
62 if (filter)
63 d->filterEffects.append(filter);
64}
65
67{
68 KoFilterEffect * filter = takeFilterEffect(index);
69 delete filter;
70}
71
73{
74 if (index >= d->filterEffects.size())
75 return 0;
76 return d->filterEffects.takeAt(index);
77}
78
79void KoFilterEffectStack::setClipRect(const QRectF &clipRect)
80{
81 d->clipRect = clipRect;
82}
83
85{
86 return d->clipRect;
87}
88
89QRectF KoFilterEffectStack::clipRectForBoundingRect(const QRectF &boundingRect) const
90{
91 qreal x = boundingRect.x() + d->clipRect.x() * boundingRect.width();
92 qreal y = boundingRect.y() + d->clipRect.y() * boundingRect.height();
93 qreal w = d->clipRect.width() * boundingRect.width();
94 qreal h = d->clipRect.height() * boundingRect.height();
95 return QRectF(x, y, w, h);
96}
97
99{
100 return d->refCount.ref();
101}
102
104{
105 return d->refCount.deref();
106}
107
109{
110 return d->refCount;
111}
112
113void KoFilterEffectStack::save(KoXmlWriter &writer, const QString &filterId)
114{
115 writer.startElement("filter");
116 writer.addAttribute("id", filterId);
117 writer.addAttribute("filterUnits", "objectBoundingBox");
118 writer.addAttribute("primitiveUnits", "objectBoundingBox");
119 writer.addAttribute("x", d->clipRect.x());
120 writer.addAttribute("y", d->clipRect.y());
121 writer.addAttribute("width", d->clipRect.width());
122 writer.addAttribute("height", d->clipRect.height());
123
124 Q_FOREACH (KoFilterEffect *effect, d->filterEffects) {
125 effect->save(writer);
126 }
127
128 writer.endElement();
129}
130
132{
133 static QSet<QString> stdInputs = QSet<QString>()
134 << "SourceGraphic"
135 << "SourceAlpha"
136 << "BackgroundImage"
137 << "BackgroundAlpha"
138 << "FillPaint"
139 << "StrokePaint";
140
141 QSet<QString> requiredInputs;
142 if (isEmpty())
143 return requiredInputs;
144
145 if (d->filterEffects.first()->inputs().contains(QString()))
146 requiredInputs.insert("SourceGraphic");
147
148 Q_FOREACH (KoFilterEffect *effect, d->filterEffects) {
149 Q_FOREACH (const QString &input, effect->inputs()) {
150 if (stdInputs.contains(input))
151 requiredInputs.insert(input);
152 }
153 }
154
155 return requiredInputs;
156}
This class manages a stack of filter effects.
KoFilterEffectStack()
Creates an empty filter effect stack.
~KoFilterEffectStack()
Destroys the filter effect stack, deleting all filter effects.
void insertFilterEffect(int index, KoFilterEffect *filter)
void setClipRect(const QRectF &clipRect)
Sets the clipping rectangle used for this filter in bounding box units.
int useCount() const
Return reference counter.
void appendFilterEffect(KoFilterEffect *filter)
QSet< QString > requiredStandardsInputs() const
Returns list of required standard inputs.
KoFilterEffect * takeFilterEffect(int index)
void save(KoXmlWriter &writer, const QString &filterId)
void removeFilterEffect(int index)
QRectF clipRectForBoundingRect(const QRectF &boundingRect) const
Returns the clipping rectangle for the given bounding rect.
QList< KoFilterEffect * > filterEffects
virtual void save(KoXmlWriter &writer)=0
QList< QString > inputs
void startElement(const char *tagName, bool indentInside=true)
void endElement()
void addAttribute(const char *attrName, const QString &value)
Definition KoXmlWriter.h:61