📄 jas_icc.c
字号:
clutsize = jas_iccpowi(lut8->clutlen, lut8->numinchans) * lut8->numoutchans;
if (!(lut8->clut = jas_malloc(clutsize * sizeof(jas_iccuint8_t))) ||
!(lut8->intabsbuf = jas_malloc(lut8->numinchans *
lut8->numintabents * sizeof(jas_iccuint8_t))) ||
!(lut8->intabs = jas_malloc(lut8->numinchans *
sizeof(jas_iccuint8_t *))))
goto error;
for (i = 0; i < lut8->numinchans; ++i)
lut8->intabs[i] = &lut8->intabsbuf[i * lut8->numintabents];
if (!(lut8->outtabsbuf = jas_malloc(lut8->numoutchans *
lut8->numouttabents * sizeof(jas_iccuint8_t))) ||
!(lut8->outtabs = jas_malloc(lut8->numoutchans *
sizeof(jas_iccuint8_t *))))
goto error;
for (i = 0; i < lut8->numoutchans; ++i)
lut8->outtabs[i] = &lut8->outtabsbuf[i * lut8->numouttabents];
for (i = 0; i < lut8->numinchans; ++i) {
for (j = 0; j < JAS_CAST(int, lut8->numintabents); ++j) {
if (jas_iccgetuint8(in, &lut8->intabs[i][j]))
goto error;
}
}
for (i = 0; i < lut8->numoutchans; ++i) {
for (j = 0; j < JAS_CAST(int, lut8->numouttabents); ++j) {
if (jas_iccgetuint8(in, &lut8->outtabs[i][j]))
goto error;
}
}
for (i = 0; i < clutsize; ++i) {
if (jas_iccgetuint8(in, &lut8->clut[i]))
goto error;
}
if (JAS_CAST(int, 44 + lut8->numinchans * lut8->numintabents +
lut8->numoutchans * lut8->numouttabents +
jas_iccpowi(lut8->clutlen, lut8->numinchans) * lut8->numoutchans) !=
cnt)
goto error;
return 0;
error:
jas_icclut8_destroy(attrval);
return -1;
}
static int jas_icclut8_getsize(jas_iccattrval_t *attrval)
{
jas_icclut8_t *lut8 = &attrval->data.lut8;
return 44 + lut8->numinchans * lut8->numintabents +
lut8->numoutchans * lut8->numouttabents +
jas_iccpowi(lut8->clutlen, lut8->numinchans) * lut8->numoutchans;
}
static int jas_icclut8_output(jas_iccattrval_t *attrval, jas_stream_t *out)
{
jas_icclut8_t *lut8 = &attrval->data.lut8;
int i;
int j;
int n;
lut8->clut = 0;
lut8->intabs = 0;
lut8->intabsbuf = 0;
lut8->outtabs = 0;
lut8->outtabsbuf = 0;
if (jas_stream_putc(out, lut8->numinchans) == EOF ||
jas_stream_putc(out, lut8->numoutchans) == EOF ||
jas_stream_putc(out, lut8->clutlen) == EOF ||
jas_stream_putc(out, 0) == EOF)
goto error;
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
if (jas_iccputsint32(out, lut8->e[i][j]))
goto error;
}
}
if (jas_iccputuint16(out, lut8->numintabents) ||
jas_iccputuint16(out, lut8->numouttabents))
goto error;
n = lut8->numinchans * lut8->numintabents;
for (i = 0; i < n; ++i) {
if (jas_iccputuint8(out, lut8->intabsbuf[i]))
goto error;
}
n = lut8->numoutchans * lut8->numouttabents;
for (i = 0; i < n; ++i) {
if (jas_iccputuint8(out, lut8->outtabsbuf[i]))
goto error;
}
n = jas_iccpowi(lut8->clutlen, lut8->numinchans) * lut8->numoutchans;
for (i = 0; i < n; ++i) {
if (jas_iccputuint8(out, lut8->clut[i]))
goto error;
}
return 0;
error:
return -1;
}
static void jas_icclut8_dump(jas_iccattrval_t *attrval, FILE *out)
{
jas_icclut8_t *lut8 = &attrval->data.lut8;
int i;
int j;
fprintf(out, "numinchans=%d, numoutchans=%d, clutlen=%d\n",
lut8->numinchans, lut8->numoutchans, lut8->clutlen);
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
fprintf(out, "e[%d][%d]=%f ", i, j, lut8->e[i][j] / 65536.0);
}
fprintf(out, "\n");
}
fprintf(out, "numintabents=%d, numouttabents=%d\n",
lut8->numintabents, lut8->numouttabents);
}
/******************************************************************************\
*
\******************************************************************************/
static void jas_icclut16_destroy(jas_iccattrval_t *attrval)
{
jas_icclut16_t *lut16 = &attrval->data.lut16;
if (lut16->clut)
jas_free(lut16->clut);
if (lut16->intabs)
jas_free(lut16->intabs);
if (lut16->intabsbuf)
jas_free(lut16->intabsbuf);
if (lut16->outtabs)
jas_free(lut16->outtabs);
if (lut16->outtabsbuf)
jas_free(lut16->outtabsbuf);
}
static int jas_icclut16_copy(jas_iccattrval_t *attrval,
jas_iccattrval_t *othattrval)
{
/* Avoid compiler warnings about unused parameters. */
attrval = 0;
othattrval = 0;
/* Not yet implemented. */
abort();
return -1;
}
static int jas_icclut16_input(jas_iccattrval_t *attrval, jas_stream_t *in,
int cnt)
{
int i;
int j;
int clutsize;
jas_icclut16_t *lut16 = &attrval->data.lut16;
lut16->clut = 0;
lut16->intabs = 0;
lut16->intabsbuf = 0;
lut16->outtabs = 0;
lut16->outtabsbuf = 0;
if (jas_iccgetuint8(in, &lut16->numinchans) ||
jas_iccgetuint8(in, &lut16->numoutchans) ||
jas_iccgetuint8(in, &lut16->clutlen) ||
jas_stream_getc(in) == EOF)
goto error;
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
if (jas_iccgetsint32(in, &lut16->e[i][j]))
goto error;
}
}
if (jas_iccgetuint16(in, &lut16->numintabents) ||
jas_iccgetuint16(in, &lut16->numouttabents))
goto error;
clutsize = jas_iccpowi(lut16->clutlen, lut16->numinchans) * lut16->numoutchans;
if (!(lut16->clut = jas_malloc(clutsize * sizeof(jas_iccuint16_t))) ||
!(lut16->intabsbuf = jas_malloc(lut16->numinchans *
lut16->numintabents * sizeof(jas_iccuint16_t))) ||
!(lut16->intabs = jas_malloc(lut16->numinchans *
sizeof(jas_iccuint16_t *))))
goto error;
for (i = 0; i < lut16->numinchans; ++i)
lut16->intabs[i] = &lut16->intabsbuf[i * lut16->numintabents];
if (!(lut16->outtabsbuf = jas_malloc(lut16->numoutchans *
lut16->numouttabents * sizeof(jas_iccuint16_t))) ||
!(lut16->outtabs = jas_malloc(lut16->numoutchans *
sizeof(jas_iccuint16_t *))))
goto error;
for (i = 0; i < lut16->numoutchans; ++i)
lut16->outtabs[i] = &lut16->outtabsbuf[i * lut16->numouttabents];
for (i = 0; i < lut16->numinchans; ++i) {
for (j = 0; j < JAS_CAST(int, lut16->numintabents); ++j) {
if (jas_iccgetuint16(in, &lut16->intabs[i][j]))
goto error;
}
}
for (i = 0; i < lut16->numoutchans; ++i) {
for (j = 0; j < JAS_CAST(int, lut16->numouttabents); ++j) {
if (jas_iccgetuint16(in, &lut16->outtabs[i][j]))
goto error;
}
}
for (i = 0; i < clutsize; ++i) {
if (jas_iccgetuint16(in, &lut16->clut[i]))
goto error;
}
if (JAS_CAST(int, 44 + 2 * (lut16->numinchans * lut16->numintabents +
lut16->numoutchans * lut16->numouttabents +
jas_iccpowi(lut16->clutlen, lut16->numinchans) *
lut16->numoutchans)) != cnt)
goto error;
return 0;
error:
jas_icclut16_destroy(attrval);
return -1;
}
static int jas_icclut16_getsize(jas_iccattrval_t *attrval)
{
jas_icclut16_t *lut16 = &attrval->data.lut16;
return 44 + 2 * (lut16->numinchans * lut16->numintabents +
lut16->numoutchans * lut16->numouttabents +
jas_iccpowi(lut16->clutlen, lut16->numinchans) * lut16->numoutchans);
}
static int jas_icclut16_output(jas_iccattrval_t *attrval, jas_stream_t *out)
{
jas_icclut16_t *lut16 = &attrval->data.lut16;
int i;
int j;
int n;
if (jas_stream_putc(out, lut16->numinchans) == EOF ||
jas_stream_putc(out, lut16->numoutchans) == EOF ||
jas_stream_putc(out, lut16->clutlen) == EOF ||
jas_stream_putc(out, 0) == EOF)
goto error;
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
if (jas_iccputsint32(out, lut16->e[i][j]))
goto error;
}
}
if (jas_iccputuint16(out, lut16->numintabents) ||
jas_iccputuint16(out, lut16->numouttabents))
goto error;
n = lut16->numinchans * lut16->numintabents;
for (i = 0; i < n; ++i) {
if (jas_iccputuint16(out, lut16->intabsbuf[i]))
goto error;
}
n = lut16->numoutchans * lut16->numouttabents;
for (i = 0; i < n; ++i) {
if (jas_iccputuint16(out, lut16->outtabsbuf[i]))
goto error;
}
n = jas_iccpowi(lut16->clutlen, lut16->numinchans) * lut16->numoutchans;
for (i = 0; i < n; ++i) {
if (jas_iccputuint16(out, lut16->clut[i]))
goto error;
}
return 0;
error:
return -1;
}
static void jas_icclut16_dump(jas_iccattrval_t *attrval, FILE *out)
{
jas_icclut16_t *lut16 = &attrval->data.lut16;
int i;
int j;
fprintf(out, "numinchans=%d, numoutchans=%d, clutlen=%d\n",
lut16->numinchans, lut16->numoutchans, lut16->clutlen);
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
fprintf(out, "e[%d][%d]=%f ", i, j, lut16->e[i][j] / 65536.0);
}
fprintf(out, "\n");
}
fprintf(out, "numintabents=%d, numouttabents=%d\n",
lut16->numintabents, lut16->numouttabents);
}
/******************************************************************************\
*
\******************************************************************************/
static int jas_iccgetuint(jas_stream_t *in, int n, ulonglong *val)
{
int i;
int c;
ulonglong v;
v = 0;
for (i = n; i > 0; --i) {
if ((c = jas_stream_getc(in)) == EOF)
return -1;
v = (v << 8) | c;
}
*val = v;
return 0;
}
static int jas_iccgetuint8(jas_stream_t *in, jas_iccuint8_t *val)
{
int c;
if ((c = jas_stream_getc(in)) == EOF)
return -1;
*val = c;
return 0;
}
static int jas_iccgetuint16(jas_stream_t *in, jas_iccuint16_t *val)
{
ulonglong tmp;
if (jas_iccgetuint(in, 2, &tmp))
return -1;
*val = tmp;
return 0;
}
static int jas_iccgetsint32(jas_stream_t *in, jas_iccsint32_t *val)
{
ulonglong tmp;
if (jas_iccgetuint(in, 4, &tmp))
return -1;
*val = (tmp & 0x80000000) ? (-JAS_CAST(longlong, (((~tmp) &
0x7fffffff) + 1))) : JAS_CAST(longlong, tmp);
return 0;
}
static int jas_iccgetuint32(jas_stream_t *in, jas_iccuint32_t *val)
{
ulonglong tmp;
if (jas_iccgetuint(in, 4, &tmp))
return -1;
*val = tmp;
return 0;
}
static int jas_iccgetuint64(jas_stream_t *in, jas_iccuint64_t *val)
{
ulonglong tmp;
if (jas_iccgetuint(in, 8, &tmp))
return -1;
*val = tmp;
return 0;
}
static int jas_iccputuint(jas_stream_t *out, int n, ulonglong val)
{
int i;
int c;
for (i = n; i > 0; --i) {
c = (val >> (8 * (i - 1))) & 0xff;
if (jas_stream_putc(out, c) == EOF)
return -1;
}
return 0;
}
static int jas_iccputsint(jas_stream_t *out, int n, longlong val)
{
ulonglong tmp;
tmp = (val < 0) ? (abort(), 0) : val;
return jas_iccputuint(out, n, tmp);
}
/******************************************************************************\
*
\******************************************************************************/
static char *jas_iccsigtostr(int sig, char *buf)
{
int n;
int c;
char *bufptr;
bufptr = buf;
for (n = 4; n > 0; --n) {
c = (sig >> 24) & 0xff;
if (isalpha(c) || isdigit(c)) {
*bufptr++ = c;
}
sig <<= 8;
}
*bufptr = '\0';
return buf;
}
static long jas_iccpadtomult(long x, long y)
{
return ((x + y - 1) / y) * y;
}
static long jas_iccpowi(int x, int n)
{
long y;
y = 1;
while (--n >= 0)
y *= x;
return y;
}
jas_iccprof_t *jas_iccprof_createfrombuf(uchar *buf, int len)
{
jas_stream_t *in;
jas_iccprof_t *prof;
if (!(in = jas_stream_memopen(JAS_CAST(char *, buf), len)))
goto error;
if (!(prof = jas_iccprof_load(in)))
goto error;
jas_stream_close(in);
return prof;
error:
return 0;
}
jas_iccprof_t *jas_iccprof_createfromclrspc(int clrspc)
{
jas_iccprof_t *prof;
switch (clrspc) {
case JAS_CLRSPC_SRGB:
prof = jas_iccprof_createfrombuf(jas_iccprofdata_srgb,
jas_iccprofdata_srgblen);
break;
case JAS_CLRSPC_SGRAY:
prof = jas_iccprof_createfrombuf(jas_iccprofdata_sgray,
jas_iccprofdata_sgraylen);
break;
default:
prof = 0;
break;
}
return prof;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -