[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/krita/image
From: Cyrille Berger <cyb () lepi ! org>
Date: 2010-01-23 12:51:28
Message-ID: 1264251088.703346.3584.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 1079043 by berger:
add function to compute transfer to CubicCurve
M +77 -10 kis_cubic_curve.cpp
M +3 -0 kis_cubic_curve.h
--- trunk/koffice/krita/image/kis_cubic_curve.cpp #1079042:1079043
@@ -236,11 +236,36 @@
}
struct KisCubicCurve::Data : public QSharedData {
+ Data() : u16Transfer(0), validU16Transfer(false), fTransfer(0), \
validFTransfer(false) { + }
+ Data(const Data& data) {
+ init();
+ points = data.points;
+ }
+ void init() {
+ validSpline = false;
+ u16Transfer = 0;
+ validU16Transfer = false;
+ fTransfer = 0;
+ validFTransfer = false;
+ }
+ ~Data() {
+ delete u16Transfer;
+ delete fTransfer;
+ }
mutable KisCubicSpline<QPointF, qreal> spline;
QList<QPointF> points;
mutable bool validSpline;
+ mutable quint16* u16Transfer;
+ mutable bool validU16Transfer;
+ mutable qreal* fTransfer;
+ mutable bool validFTransfer;
void updateSpline();
void keepSorted();
+ qreal value(qreal x);
+ void invalidate();
+ template<typename _T_, typename _T2_>
+ void updateTransfer(_T_** transfer, bool& valid, _T2_ min, _T2_ max);
};
void KisCubicCurve::Data::updateSpline()
@@ -250,11 +275,46 @@
spline.createSpline(points);
}
+void KisCubicCurve::Data::invalidate()
+{
+ validSpline = false;
+ validFTransfer = false;
+ validU16Transfer = false;
+}
+
void KisCubicCurve::Data::keepSorted()
{
qSort(points.begin(), points.end(), pointLessThan);
}
+qreal KisCubicCurve::Data::value(qreal x)
+{
+ updateSpline();
+ /* Automatically extend non-existing parts of the curve
+ * (e.g. before the first point) and cut off big y-values
+ */
+ x = qBound(spline.begin(), x, spline.end());
+ qreal y = spline.getValue(x);
+ return qBound(0.0, y, 1.0);
+}
+
+template<typename _T_, typename _T2_>
+void KisCubicCurve::Data::updateTransfer(_T_** transfer, bool& valid, _T2_ min, _T2_ \
max) +{
+ if (!valid) {
+ if (!transfer) {
+ *transfer = new _T_[256];
+ }
+ for (int i = 0; i < 256; ++i) {
+ /* Direct uncached version */
+ _T2_ val = value(i / 255.0);
+ val = qBound(max, val, min);
+ (*transfer)[i] = val;
+ }
+ valid = true;
+ }
+}
+
struct KisCubicCurve::Private {
QSharedDataPointer<Data> data;
};
@@ -267,14 +327,12 @@
d->data->points.append(p);
p.rx() = 1.0; p.ry() = 1.0;
d->data->points.append(p);
- d->data->validSpline = false;
}
KisCubicCurve::KisCubicCurve(const QList<QPointF>& points) : d(new Private)
{
d->data = new Data;
d->data->points = points;
- d->data->validSpline = false;
d->data->keepSorted();
}
@@ -296,13 +354,7 @@
qreal KisCubicCurve::value(qreal x) const
{
- d->data->updateSpline();
- /* Automatically extend non-existing parts of the curve
- * (e.g. before the first point) and cut off big y-values
- */
- x = qBound(d->data->spline.begin(), x, d->data->spline.end());
- qreal y = d->data->spline.getValue(x);
- return qBound(0.0, y, 1.0);
+ return d->data->value(x);
}
QList<QPointF> KisCubicCurve::points() const
@@ -314,7 +366,7 @@
{
d->data.detach();
d->data->points = points;
- d->data->validSpline = false;
+ d->data->invalidate();
}
void KisCubicCurve::setPoint(int idx, const QPointF& point)
@@ -322,6 +374,7 @@
d->data.detach();
d->data->points[idx] = point;
d->data->keepSorted();
+ d->data->invalidate();
}
int KisCubicCurve::addPoint(const QPointF& point)
@@ -329,6 +382,7 @@
d->data.detach();
d->data->points.append(point);
d->data->keepSorted();
+ d->data->invalidate();
return d->data->points.indexOf(point);
}
@@ -336,6 +390,7 @@
{
d->data.detach();
d->data->points.removeAt(idx);
+ d->data->invalidate();
}
QString KisCubicCurve::toString() const
@@ -366,3 +421,15 @@
}
setPoints(points);
}
+
+const quint16* KisCubicCurve::uint16Transfer() const
+{
+ d->data->updateTransfer<quint16, int>(&d->data->u16Transfer, \
d->data->validU16Transfer, 0x0, 0xFFFF); + return d->data->u16Transfer;
+}
+
+const qreal* KisCubicCurve::floatTransfer() const
+{
+ d->data->updateTransfer<qreal, qreal>(&d->data->fTransfer, \
d->data->validFTransfer, 0.0, 1.0); + return d->data->fTransfer;
+}
--- trunk/koffice/krita/image/kis_cubic_curve.h #1079042:1079043
@@ -51,6 +51,9 @@
int addPoint(const QPointF& point);
void removePoint(int idx);
public:
+ const quint16* uint16Transfer() const;
+ const qreal* floatTransfer() const;
+public:
QString toString() const;
void fromString(const QString&);
private:
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic