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 }