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