[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