Backed out changeset ec2a74c86e53

This commit is contained in:
Alberto Griggio
2017-06-09 08:45:57 +02:00
parent 84ff861934
commit dd14de75f6

View File

@@ -492,43 +492,6 @@ void LCPProfile::calcParams(int mode, float focalLength, float focusDist, float
float focalLengthLog = log(focalLength); //, apertureLog=aperture>0 ? log(aperture) : 0; float focalLengthLog = log(focalLength); //, apertureLog=aperture>0 ? log(aperture) : 0;
float focusDistLog = focusDist > 0 ? log(focusDist) + euler : 0; float focusDistLog = focusDist > 0 ? log(focusDist) + euler : 0;
if (mode > 0) {
// matching logic taken from lensfun-convert-lcp
// see https://github.com/lensfun/lensfun
std::map<float, LCPPersModel *> m;
for (int pm = 0; pm < persModelCount; pm++) {
auto cur = aPersModel[pm];
if (cur->hasModeData(mode)) {
float f = cur->focLen;
auto it = m.find(f);
if (it == m.end()) {
m[f] = cur;
} else {
auto prev = it->second;
float curdist = cur->focDist ? cur->focDist : -1;
float prevdist = prev->focDist ? prev->focDist : -2;
if (curdist > prevdist) {
float curaper = cur->aperture > 0 ? cur->aperture : 1000;
float prevaper = prev->aperture > 0 ? prev->aperture : 1000;
if (std::abs(curaper - 8) < std::abs(prevaper - 8)) {
m[f] = cur;
}
}
}
}
}
auto it = m.lower_bound(focalLength);
if (it != m.end()) {
pLow = it->second;
}
it = m.upper_bound(focalLength);
if (it != m.end()) {
pHigh = it->second;
}
if ((pLow == nullptr) != (pHigh == nullptr)) {
pLow = pHigh;
}
} else {
// Pass 1: determining best focal length, if possible different focusDistances (for the focDist is not given case) // Pass 1: determining best focal length, if possible different focusDistances (for the focDist is not given case)
for (int pm = 0; pm < persModelCount; pm++) { for (int pm = 0; pm < persModelCount; pm++) {
float f = aPersModel[pm]->focLen; float f = aPersModel[pm]->focLen;
@@ -556,14 +519,30 @@ void LCPProfile::calcParams(int mode, float focalLength, float focusDist, float
for (int pm = 0; pm < persModelCount; pm++) { for (int pm = 0; pm < persModelCount; pm++) {
float aper = aPersModel[pm]->aperture; // float aperLog=log(aper); float aper = aPersModel[pm]->aperture; // float aperLog=log(aper);
// float focDist = aPersModel[pm]->focDist; float focDist = aPersModel[pm]->focDist;
// float focDistLog = log(focDist) + euler; float focDistLog = log(focDist) + euler;
double meanErr;
if (aPersModel[pm]->hasModeData(mode)) { if (aPersModel[pm]->hasModeData(mode)) {
double meanErr = aPersModel[pm]->vignette.mean_error; double lowMeanErr, highMeanErr;
double lowMeanErr = pLow->vignette.mean_error; switch (mode) {
double highMeanErr = pHigh->vignette.mean_error; case 0:
meanErr = aPersModel[pm]->vignette.mean_error;
lowMeanErr = pLow->vignette.mean_error;
highMeanErr = pHigh->vignette.mean_error;
break;
case 1:
meanErr = aPersModel[pm]->base.mean_error;
lowMeanErr = pLow->base.mean_error;
highMeanErr = pHigh->base.mean_error;
break;
default: //case 2:
meanErr = aPersModel[pm]->chromG.mean_error;
lowMeanErr = pLow->chromG.mean_error;
highMeanErr = pHigh->chromG.mean_error;
break;
}
if (aperture > 0) { if (aperture > 0 && mode != 2) {
if (aPersModel[pm]->focLen == bestFocLenLow && ( if (aPersModel[pm]->focLen == bestFocLenLow && (
(aper == aperture && lowMeanErr > meanErr) (aper == aperture && lowMeanErr > meanErr)
|| (aper >= aperture && aper < pLow->aperture && pLow->aperture > aperture) || (aper >= aperture && aper < pLow->aperture && pLow->aperture > aperture)
@@ -577,6 +556,21 @@ void LCPProfile::calcParams(int mode, float focalLength, float focusDist, float
|| (aper >= aperture && (pHigh->aperture < aperture || fabs(aperture - aper) < fabs(aperture - pHigh->aperture))))) { || (aper >= aperture && (pHigh->aperture < aperture || fabs(aperture - aper) < fabs(aperture - pHigh->aperture))))) {
pHigh = aPersModel[pm]; pHigh = aPersModel[pm];
} }
} else if (focusDist > 0 && mode != 0) {
// by focus distance
if (aPersModel[pm]->focLen == bestFocLenLow && (
(focDist == focusDist && lowMeanErr > meanErr)
|| (focDist >= focusDist && focDist < pLow->focDist && pLow->focDist > focusDist)
|| (focDist <= focusDist && (pLow->focDist > focusDist || fabs(focusDistLog - focDistLog) < fabs(focusDistLog - (log(pLow->focDist) + euler)))))) {
pLow = aPersModel[pm];
}
if (aPersModel[pm]->focLen == bestFocLenHigh && (
(focDist == focusDist && highMeanErr > meanErr)
|| (focDist <= focusDist && focDist > pHigh->focDist && pHigh->focDist < focusDist)
|| (focDist >= focusDist && (pHigh->focDist < focusDist || fabs(focusDistLog - focDistLog) < fabs(focusDistLog - (log(pHigh->focDist) + euler)))))) {
pHigh = aPersModel[pm];
}
} else { } else {
// no focus distance available, just error // no focus distance available, just error
if (aPersModel[pm]->focLen == bestFocLenLow && lowMeanErr > meanErr) { if (aPersModel[pm]->focLen == bestFocLenLow && lowMeanErr > meanErr) {
@@ -591,7 +585,6 @@ void LCPProfile::calcParams(int mode, float focalLength, float focusDist, float
} }
} }
} }
}
if (pLow != nullptr && pHigh != nullptr) { if (pLow != nullptr && pHigh != nullptr) {
// average out the factors, linear interpolation in logarithmic scale // average out the factors, linear interpolation in logarithmic scale