Merge pull request #5464 from Beep6581/hasselblad_load_review
Improve readability of hasselblad_load_raw() code, #5434
This commit is contained in:
commit
eae86cbd35
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user