Merge pull request #5464 from Beep6581/hasselblad_load_review

Improve readability of hasselblad_load_raw() code, #5434
This commit is contained in:
Ingo Weyrich 2019-09-23 14:23:15 +02:00 committed by GitHub
commit eae86cbd35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2417,59 +2417,78 @@ void CLASS hasselblad_correct()
void CLASS hasselblad_load_raw() void CLASS hasselblad_load_raw()
{ {
struct jhead jh; struct jhead jh;
int shot, row, col, *back[5], len[2], diff[12], pred, sh, f, s, c; int *back[5], diff[12];
unsigned upix, urow, ucol;
ushort *ip;
if (!ljpeg_start (&jh, 0)) return; if (!ljpeg_start (&jh, 0)) {
order = 0x4949; return;
ph1_bithuff_t ph1_bithuff(this, ifp, order); }
hb_bits(-1); order = 0x4949;
back[4] = (int *) calloc (raw_width, 3*sizeof **back); ph1_bithuff_t ph1_bithuff(this, ifp, order);
merror (back[4], "hasselblad_load_raw()"); hb_bits(-1);
FORC3 back[c] = back[4] + c*raw_width; back[4] = (int *) calloc(raw_width, 3 * sizeof **back);
cblack[6] >>= sh = tiff_samples > 1; merror(back[4], "hasselblad_load_raw()");
shot = LIM(shot_select, 1, tiff_samples) - 1; for (int c = 0; c < 3; ++c) {
for (row=0; row < raw_height; row++) { back[c] = back[4] + c * raw_width;
FORC4 back[(c+3) & 3] = back[c]; }
for (col=0; col < raw_width; col+=2) { const int sh = tiff_samples > 1;
for (s=0; s < tiff_samples*2; s+=2) { cblack[6] >>= sh;
FORC(2) len[c] = ph1_huff(jh.huff[0]); const int shot = LIM(shot_select, 1, tiff_samples) - 1;
FORC(2) { for (int row = 0; row < raw_height; ++row) {
diff[s+c] = hb_bits(len[c]); for (int c = 0; c < 4; ++c) {
if ((diff[s+c] & (1 << (len[c]-1))) == 0) back[(c + 3) & 3] = back[c];
diff[s+c] -= (1 << len[c]) - 1; }
if (diff[s+c] == 65535) diff[s+c] = -32768; for (int col = 0; col < raw_width; col += 2) {
} for (int s = 0; s < tiff_samples * 2; s += 2) {
} const int len[2]= {
for (s=col; s < col+2; s++) { ph1_huff(jh.huff[0]),
pred = 0x8000 + load_flags; ph1_huff(jh.huff[0])
if (col) pred = back[2][s-2]; };
if (col && row > 1) switch (jh.psv) { for (int c = 0; c < 2; ++c) {
case 11: pred += back[0][s]/2 - back[0][s-2]/2; break; diff[s + c] = hb_bits(len[c]);
} if ((diff[s + c] & (1 << (len[c] - 1))) == 0) {
f = (row & 1)*3 ^ ((col+s) & 1); diff[s + c] -= (1 << len[c]) - 1;
FORC (tiff_samples) { }
pred += diff[(s & 1)*tiff_samples+c]; if (diff[s + c] == 65535) {
upix = pred >> sh & 0xffff; diff[s + c] = -32768;
if (raw_image && c == shot) }
RAW(row,s) = upix; }
if (image) { }
urow = row-top_margin + (c & 1); for (int s = col; s < col + 2; ++s) {
ucol = col-left_margin - ((c >> 1) & 1); int pred;
ip = &image[urow*width+ucol][f]; if (col) {
if (urow < height && ucol < width) pred = back[2][s - 2];
*ip = c < 4 ? upix : (*ip + upix) >> 1; if (row > 1 && jh.psv == 11) {
} pred += back[0][s] / 2 - back[0][s - 2] / 2;
} }
back[2][s] = pred; } else {
} pred = 0x8000 + load_flags;
}
for (int c = 0; c < tiff_samples; ++c) {
pred += diff[(s & 1) * tiff_samples + c];
const unsigned upix = pred >> sh & 0xffff;
if (raw_image && c == shot) {
RAW(row, s) = upix;
}
if (image) {
const int f = (row & 1) * 3 ^ ((col + s) & 1);
const unsigned urow = row - top_margin + (c & 1);
const unsigned ucol = col - left_margin - ((c >> 1) & 1);
ushort* const ip = &image[urow * width + ucol][f];
if (urow < height && ucol < width) {
*ip = c < 4 ? upix : (*ip + upix) >> 1;
}
}
}
back[2][s] = pred;
}
}
}
free(back[4]);
ljpeg_end(&jh);
if (image) {
mix_green = 1;
} }
}
free (back[4]);
ljpeg_end (&jh);
if (image) mix_green = 1;
} }
void CLASS leaf_hdr_load_raw() void CLASS leaf_hdr_load_raw()