Segfault on EAHD, fixes #3474, kudos to Floessie

This commit is contained in:
heckflosse
2016-10-21 12:09:47 +02:00
parent 17ea8b162c
commit 968f2b06ca

View File

@@ -140,7 +140,21 @@ inline void RawImageSource::interpolate_row_g (float* agh, float* agv, int i)
inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i) inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg, float* cg, float* ng, int i)
{ {
if ((ri->ISRED(i, 0) || ri->ISRED(i, 1)) && pg && ng) { const auto getPg = [pg](int index) {
return
pg
? pg[index]
: 0.f;
};
const auto getNg = [ng](int index) {
return
ng
? ng[index]
: 0.f;
};
if ((ri->ISRED(i, 0) || ri->ISRED(i, 1))) {
// RGRGR or GRGRGR line // RGRGR or GRGRGR line
for (int j = 0; j < W; j++) { for (int j = 0; j < W; j++) {
if (ri->ISRED(i, j)) { if (ri->ISRED(i, j)) {
@@ -151,28 +165,28 @@ inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg,
int n = 0; int n = 0;
if (i > 0 && j > 0) { if (i > 0 && j > 0) {
b += rawData[i - 1][j - 1] - pg[j - 1]; b += rawData[i - 1][j - 1] - getPg(j - 1);
n++; n++;
} }
if (i > 0 && j < W - 1) { if (i > 0 && j < W - 1) {
b += rawData[i - 1][j + 1] - pg[j + 1]; b += rawData[i - 1][j + 1] - getPg(j + 1);
n++; n++;
} }
if (i < H - 1 && j > 0) { if (i < H - 1 && j > 0) {
b += rawData[i + 1][j - 1] - ng[j - 1]; b += rawData[i + 1][j - 1] - getNg(j - 1);
n++; n++;
} }
if (i < H - 1 && j < W - 1) { if (i < H - 1 && j < W - 1) {
b += rawData[i + 1][j + 1] - ng[j + 1]; b += rawData[i + 1][j + 1] - getNg(j + 1);
n++; n++;
} }
b = cg[j] + b / n; b = cg[j] + b / n;
ab[j] = b; ab[j] = b;
} else if(ng && pg) { } else {
// linear R-G interp. horizontally // linear R-G interp. horizontally
int r; int r;
@@ -189,17 +203,17 @@ inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg,
int b; int b;
if (i == 0) { if (i == 0) {
b = ng[j] + rawData[1][j] - cg[j]; b = getNg(j) + rawData[1][j] - cg[j];
} else if (i == H - 1) { } else if (i == H - 1) {
b = pg[j] + rawData[H - 2][j] - cg[j]; b = getPg(j) + rawData[H - 2][j] - cg[j];
} else { } else {
b = cg[j] + (rawData[i - 1][j] - pg[j] + rawData[i + 1][j] - ng[j]) / 2; b = cg[j] + (rawData[i - 1][j] - getPg(j) + rawData[i + 1][j] - getNg(j)) / 2;
} }
ab[j] = b; ab[j] = b;
} }
} }
} else if(ng && pg) { } else {
// BGBGB or GBGBGB line // BGBGB or GBGBGB line
for (int j = 0; j < W; j++) { for (int j = 0; j < W; j++) {
if (ri->ISBLUE(i, j)) { if (ri->ISBLUE(i, j)) {
@@ -210,22 +224,22 @@ inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg,
int n = 0; int n = 0;
if (i > 0 && j > 0) { if (i > 0 && j > 0) {
r += rawData[i - 1][j - 1] - pg[j - 1]; r += rawData[i - 1][j - 1] - getPg(j - 1);
n++; n++;
} }
if (i > 0 && j < W - 1) { if (i > 0 && j < W - 1) {
r += rawData[i - 1][j + 1] - pg[j + 1]; r += rawData[i - 1][j + 1] - getPg(j + 1);
n++; n++;
} }
if (i < H - 1 && j > 0) { if (i < H - 1 && j > 0) {
r += rawData[i + 1][j - 1] - ng[j - 1]; r += rawData[i + 1][j - 1] - getNg(j - 1);
n++; n++;
} }
if (i < H - 1 && j < W - 1) { if (i < H - 1 && j < W - 1) {
r += rawData[i + 1][j + 1] - ng[j + 1]; r += rawData[i + 1][j + 1] - getNg(j + 1);
n++; n++;
} }
@@ -249,11 +263,11 @@ inline void RawImageSource::interpolate_row_rb (float* ar, float* ab, float* pg,
int r; int r;
if (i == 0) { if (i == 0) {
r = ng[j] + rawData[1][j] - cg[j]; r = getNg(j) + rawData[1][j] - cg[j];
} else if (i == H - 1) { } else if (i == H - 1) {
r = pg[j] + rawData[H - 2][j] - cg[j]; r = getPg(j) + rawData[H - 2][j] - cg[j];
} else { } else {
r = cg[j] + (rawData[i - 1][j] - pg[j] + rawData[i + 1][j] - ng[j]) / 2; r = cg[j] + (rawData[i - 1][j] - getPg(j) + rawData[i + 1][j] - getNg(j)) / 2;
} }
ar[j] = r; ar[j] = r;