curves: restored the old DCT_Spline implementation (cubic splines), and added new DCT_CatumullRom curve type

This commit is contained in:
Alberto Griggio
2018-12-06 14:11:49 +01:00
parent 1bf837d5b1
commit fd48b34cd5
10 changed files with 138 additions and 80 deletions

View File

@@ -393,6 +393,7 @@ DiagonalCurveEditor* DiagonalCurveEditorSubGroup::addCurve(Glib::ustring curveLa
storeCurveValues(newCE, getCurveFromGUI(DCT_Spline));
storeCurveValues(newCE, getCurveFromGUI(DCT_Parametric));
storeCurveValues(newCE, getCurveFromGUI(DCT_NURBS));
storeCurveValues(newCE, getCurveFromGUI(DCT_CatumullRom));
return newCE;
}
@@ -437,6 +438,7 @@ void DiagonalCurveEditorSubGroup::pipetteMouseOver(EditDataProvider *provider, i
switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
customCurve->pipetteMouseOver(curveEditor, provider, modifierKey);
customCurve->setDirty(true);
break;
@@ -511,6 +513,7 @@ bool DiagonalCurveEditorSubGroup::pipetteButton1Pressed(EditDataProvider *provid
switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
isDragging = customCurve->pipetteButton1Pressed(provider, modifierKey);
break;
@@ -539,6 +542,7 @@ void DiagonalCurveEditorSubGroup::pipetteButton1Released(EditDataProvider *provi
switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
customCurve->pipetteButton1Released(provider);
break;
@@ -562,6 +566,7 @@ void DiagonalCurveEditorSubGroup::pipetteDrag(EditDataProvider *provider, int mo
switch((DiagonalCurveType)(curveEditor->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
customCurve->pipetteDrag(provider, modifierKey);
break;
@@ -615,6 +620,7 @@ void DiagonalCurveEditorSubGroup::refresh(CurveEditor *curveToRefresh)
if (curveToRefresh != nullptr && curveToRefresh == static_cast<DiagonalCurveEditor*>(parent->displayedCurve)) {
switch((DiagonalCurveType)(curveToRefresh->curveType->getSelected())) {
case (DCT_Spline):
case (DCT_CatumullRom):
customCurve->refresh();
break;
@@ -703,9 +709,10 @@ void DiagonalCurveEditorSubGroup::switchGUI()
}
}
switch((DiagonalCurveType)(dCurve->curveType->getSelected())) {
switch(auto tp = (DiagonalCurveType)(dCurve->curveType->getSelected())) {
case (DCT_Spline):
customCurve->setPoints (dCurve->customCurveEd);
case (DCT_CatumullRom):
customCurve->setPoints(tp == DCT_Spline ? dCurve->customCurveEd : dCurve->catmullRomCurveEd);
customCurve->setColorProvider(dCurve->getCurveColorProvider(), dCurve->getCurveCallerId());
customCurve->setColoredBar(leftBar, bottomBar);
customCurve->queue_resize_no_redraw();
@@ -776,6 +783,7 @@ void DiagonalCurveEditorSubGroup::savePressed ()
switch (parent->displayedCurve->selected) {
case DCT_Spline: // custom
case DCT_CatumullRom:
p = customCurve->getPoints ();
break;
@@ -797,6 +805,8 @@ void DiagonalCurveEditorSubGroup::savePressed ()
f << "Linear" << std::endl;
} else if (p[ix] == (double)(DCT_Spline)) {
f << "Spline" << std::endl;
} else if (p[ix] == (double)(DCT_CatumullRom)) {
f << "CatmullRom" << std::endl;
} else if (p[ix] == (double)(DCT_NURBS)) {
f << "NURBS" << std::endl;
} else if (p[ix] == (double)(DCT_Parametric)) {
@@ -838,6 +848,8 @@ void DiagonalCurveEditorSubGroup::loadPressed ()
p.push_back ((double)(DCT_Linear));
} else if (s == "Spline") {
p.push_back ((double)(DCT_Spline));
} else if (s == "CatmullRom") {
p.push_back ((double)(DCT_CatumullRom));
} else if (s == "NURBS") {
p.push_back ((double)(DCT_NURBS));
} else if (s == "Parametric") {
@@ -858,7 +870,7 @@ void DiagonalCurveEditorSubGroup::loadPressed ()
rtengine::sanitizeCurve(p);
if (p[0] == (double)(DCT_Spline)) {
if (p[0] == (double)(DCT_Spline) || p[0] == (double)(DCT_CatumullRom)) {
customCurve->setPoints (p);
customCurve->queue_draw ();
customCurve->notifyListener ();
@@ -903,6 +915,12 @@ void DiagonalCurveEditorSubGroup::copyPressed ()
clipboard.setDiagonalCurveData (curve, DCT_NURBS);
break;
case DCT_CatumullRom:
curve = customCurve->getPoints ();
curve[0] = DCT_CatumullRom;
clipboard.setDiagonalCurveData (curve, DCT_CatumullRom);
break;
default: // (DCT_Linear, DCT_Unchanged)
// ... do nothing
break;
@@ -923,6 +941,7 @@ void DiagonalCurveEditorSubGroup::pastePressed ()
switch (type) {
case DCT_Spline: // custom
case DCT_CatumullRom:
customCurve->setPoints (curve);
customCurve->queue_draw ();
customCurve->notifyListener ();
@@ -1060,6 +1079,10 @@ void DiagonalCurveEditorSubGroup::storeDisplayedCurve()
storeCurveValues(parent->displayedCurve, getCurveFromGUI(DCT_NURBS));
break;
case (DCT_CatumullRom):
storeCurveValues(parent->displayedCurve, getCurveFromGUI(DCT_CatumullRom));
break;
default:
break;
}
@@ -1097,6 +1120,10 @@ void DiagonalCurveEditorSubGroup::storeCurveValues (CurveEditor* ce, const std::
(static_cast<DiagonalCurveEditor*>(ce))->NURBSCurveEd = p;
break;
case (DCT_CatumullRom):
(static_cast<DiagonalCurveEditor*>(ce))->catmullRomCurveEd = p;
break;
default:
break;
}
@@ -1126,6 +1153,14 @@ const std::vector<double> DiagonalCurveEditorSubGroup::getCurveFromGUI (int type
case (DCT_NURBS):
return NURBSCurve->getPoints ();
case (DCT_CatumullRom): {
auto ret = customCurve->getPoints();
if (!ret.empty()) {
ret[0] = DCT_CatumullRom;
}
return ret;
}
default: {
// linear and other solutions
std::vector<double> lcurve (1);
@@ -1162,6 +1197,10 @@ bool DiagonalCurveEditorSubGroup::curveReset(CurveEditor *ce)
customCurve->reset (dce->customResetCurve, dce->getIdentityValue());
return true;
case (DCT_CatumullRom) :
customCurve->reset (dce->catmullRomResetCurve, dce->getIdentityValue());
return true;
case (DCT_Parametric) : {
DiagonalCurveEditor* dCurve = static_cast<DiagonalCurveEditor*>(parent->displayedCurve);
double mileStone[3];