#include "../../internal/libraw_cxx_defs.h"
int LibRaw::subtract_black()
{
adjust_bl();
return subtract_black_internal();
}
int LibRaw::subtract_black_internal()
{
CHECK_ORDER_LOW(LIBRAW_PROGRESS_RAW2_IMAGE);
try
{
if (!is_phaseone_compressed() &&
(C.cblack[0] || C.cblack[1] || C.cblack[2] || C.cblack[3] ||
(C.cblack[4] && C.cblack[5])))
{
int cblk[4], i;
for (i = 0; i < 4; i++)
cblk[i] = C.cblack[i];
int size = S.iheight * S.iwidth;
int dmax = 0;
if (C.cblack[4] && C.cblack[5])
{
for (unsigned i = 0; i < (unsigned)size; i++)
{
for (unsigned c = 0; c < 4; c++)
{
int val = imgdata.image[i][c];
val -= C.cblack[6 + i / S.iwidth % C.cblack[4] * C.cblack[5] +
i % S.iwidth % C.cblack[5]];
val -= cblk[c];
imgdata.image[i][c] = CLIP(val);
if (dmax < val) dmax = val;
}
}
}
else
{
for (unsigned i = 0; i < (unsigned)size; i++)
{
for (unsigned c = 0; c < 4; c++)
{
int val = imgdata.image[i][c];
val -= cblk[c];
imgdata.image[i][c] = CLIP(val);
if (dmax < val) dmax = val;
}
}
}
C.data_maximum = dmax & 0xffff;
C.maximum -= C.black;
ZERO(C.cblack); C.black = 0;
}
else
{
int idx;
ushort *p = (ushort *)imgdata.image;
int dmax = 0;
for (idx = 0; idx < S.iheight * S.iwidth * 4; idx++)
if (dmax < p[idx])
dmax = p[idx];
C.data_maximum = dmax;
}
return 0;
}
catch (LibRaw_exceptions err)
{
EXCEPTION_HANDLER(err);
}
}