File indexing completed on 2024-05-12 15:56:40

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2009 Cyrille Berger <cberger@cberger.net>
0003  * SPDX-FileCopyrightText: 2009 Jan Hambrecht <jaham@gmx.net>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-or-later
0006  */
0007 
0008 #include "KoFilterEffect.h"
0009 #include "KoXmlWriter.h"
0010 
0011 #include <QImage>
0012 #include <QString>
0013 #include <QRectF>
0014 
0015 class Q_DECL_HIDDEN KoFilterEffect::Private
0016 {
0017 public:
0018     Private()
0019         : filterRect(0, 0, 1, 1)
0020         , requiredInputCount(1), maximalInputCount(1)
0021     {
0022         // add the default input
0023         inputs.append(QString());
0024     }
0025 
0026     QString id;
0027     QString name;
0028     QRectF filterRect;
0029     QList<QString> inputs;
0030     QString output;
0031     int requiredInputCount;
0032     int maximalInputCount;
0033 };
0034 
0035 KoFilterEffect::KoFilterEffect(const QString &id, const QString &name)
0036     : d(new Private)
0037 {
0038     d->id = id;
0039     d->name = name;
0040 }
0041 
0042 KoFilterEffect::~KoFilterEffect()
0043 {
0044     delete d;
0045 }
0046 
0047 QString KoFilterEffect::name() const
0048 {
0049     return d->name;
0050 }
0051 
0052 QString KoFilterEffect::id() const
0053 {
0054     return d->id;
0055 }
0056 
0057 void KoFilterEffect::setFilterRect(const QRectF &filterRect)
0058 {
0059     d->filterRect = filterRect;
0060 }
0061 
0062 QRectF KoFilterEffect::filterRect() const
0063 {
0064     return d->filterRect;
0065 }
0066 
0067 QRectF KoFilterEffect::filterRectForBoundingRect(const QRectF &boundingRect) const
0068 {
0069     qreal x = boundingRect.x() + d->filterRect.x() * boundingRect.width();
0070     qreal y = boundingRect.y() + d->filterRect.y() * boundingRect.height();
0071     qreal w = d->filterRect.width() * boundingRect.width();
0072     qreal h = d->filterRect.height() * boundingRect.height();
0073     return QRectF(x, y, w, h);
0074 }
0075 
0076 QList<QString> KoFilterEffect::inputs() const
0077 {
0078     return d->inputs;
0079 }
0080 
0081 void KoFilterEffect::addInput(const QString &input)
0082 {
0083     if (d->inputs.count() < d->maximalInputCount)
0084         d->inputs.append(input);
0085 }
0086 
0087 void KoFilterEffect::insertInput(int index, const QString &input)
0088 {
0089     if (d->inputs.count() < d->maximalInputCount)
0090         d->inputs.insert(index, input);
0091 }
0092 
0093 void KoFilterEffect::setInput(int index, const QString &input)
0094 {
0095     if (index < d->inputs.count())
0096         d->inputs[index] = input;
0097 }
0098 
0099 void KoFilterEffect::removeInput(int index)
0100 {
0101     if (d->inputs.count() > d->requiredInputCount)
0102         d->inputs.removeAt(index);
0103 }
0104 
0105 void KoFilterEffect::setOutput(const QString &output)
0106 {
0107     d->output = output;
0108 }
0109 
0110 QString KoFilterEffect::output() const
0111 {
0112     return d->output;
0113 }
0114 
0115 int KoFilterEffect::requiredInputCount() const
0116 {
0117     return d->requiredInputCount;
0118 }
0119 
0120 int KoFilterEffect::maximalInputCount() const
0121 {
0122     return qMax(d->maximalInputCount, d->requiredInputCount);
0123 }
0124 
0125 QImage KoFilterEffect::processImages(const QList<QImage> &images, const KoFilterEffectRenderContext &/*context*/) const
0126 {
0127     Q_ASSERT(images.count());
0128     return images.first();
0129 }
0130 
0131 void KoFilterEffect::setRequiredInputCount(int count)
0132 {
0133     d->requiredInputCount = qMax(0, count);
0134     for (int i = d->inputs.count(); i < d->requiredInputCount; ++i)
0135         d->inputs.append(QString());
0136 }
0137 
0138 void KoFilterEffect::setMaximalInputCount(int count)
0139 {
0140     d->maximalInputCount = qMax(0,count);
0141     if (d->inputs.count() > maximalInputCount()) {
0142         int removeCount = d->inputs.count()-maximalInputCount();
0143         for (int i = 0; i < removeCount; ++i)
0144             d->inputs.pop_back();
0145     }
0146 }
0147 
0148 void KoFilterEffect::saveCommonAttributes(KoXmlWriter &writer)
0149 {
0150     writer.addAttribute("result", output());
0151     if (requiredInputCount() == 1 && maximalInputCount() == 1 && d->inputs.count() == 1) {
0152         writer.addAttribute("in", d->inputs[0]);
0153     }
0154     writer.addAttribute("x", d->filterRect.x());
0155     writer.addAttribute("y", d->filterRect.y());
0156     writer.addAttribute("width", d->filterRect.width());
0157     writer.addAttribute("height", d->filterRect.height());
0158 }