📄 jas_icc.c
字号:
jas_iccattrval_t *jas_iccattrval_clone(jas_iccattrval_t *attrval)
{
++attrval->refcnt;
return attrval;
}
void jas_iccattrval_destroy(jas_iccattrval_t *attrval)
{
#if 0
jas_eprintf("refcnt=%d\n", attrval->refcnt);
#endif
if (--attrval->refcnt <= 0) {
if (attrval->ops->destroy)
(*attrval->ops->destroy)(attrval);
jas_free(attrval);
}
}
void jas_iccattrval_dump(jas_iccattrval_t *attrval, FILE *out)
{
char buf[8];
jas_iccsigtostr(attrval->type, buf);
fprintf(out, "refcnt = %d; type = 0x%08x %s\n", attrval->refcnt,
attrval->type, jas_iccsigtostr(attrval->type, &buf[0]));
if (attrval->ops->dump) {
(*attrval->ops->dump)(attrval, out);
}
}
int jas_iccattrval_allowmodify(jas_iccattrval_t **attrvalx)
{
jas_iccattrval_t *newattrval;
jas_iccattrval_t *attrval = *attrvalx;
newattrval = 0;
if (attrval->refcnt > 1) {
if (!(newattrval = jas_iccattrval_create0()))
goto error;
newattrval->ops = attrval->ops;
newattrval->type = attrval->type;
++newattrval->refcnt;
if (newattrval->ops->copy) {
if ((*newattrval->ops->copy)(newattrval, attrval))
goto error;
} else {
memcpy(&newattrval->data, &attrval->data,
sizeof(newattrval->data));
}
*attrvalx = newattrval;
}
return 0;
error:
if (newattrval) {
jas_free(newattrval);
}
return -1;
}
static jas_iccattrval_t *jas_iccattrval_create0()
{
jas_iccattrval_t *attrval;
if (!(attrval = jas_malloc(sizeof(jas_iccattrval_t))))
return 0;
memset(attrval, 0, sizeof(jas_iccattrval_t));
attrval->refcnt = 0;
attrval->ops = 0;
attrval->type = 0;
return attrval;
}
/******************************************************************************\
*
\******************************************************************************/
static int jas_iccxyz_input(jas_iccattrval_t *attrval, jas_stream_t *in,
int len)
{
if (len != 4 * 3) abort();
return jas_iccgetxyz(in, &attrval->data.xyz);
}
static int jas_iccxyz_output(jas_iccattrval_t *attrval, jas_stream_t *out)
{
jas_iccxyz_t *xyz = &attrval->data.xyz;
if (jas_iccputuint32(out, xyz->x) ||
jas_iccputuint32(out, xyz->y) ||
jas_iccputuint32(out, xyz->z))
return -1;
return 0;
}
static int jas_iccxyz_getsize(jas_iccattrval_t *attrval)
{
/* Avoid compiler warnings about unused parameters. */
attrval = 0;
return 12;
}
static void jas_iccxyz_dump(jas_iccattrval_t *attrval, FILE *out)
{
jas_iccxyz_t *xyz = &attrval->data.xyz;
fprintf(out, "(%f, %f, %f)\n", xyz->x / 65536.0, xyz->y / 65536.0, xyz->z / 65536.0);
}
/******************************************************************************\
* attribute table class
\******************************************************************************/
static void jas_icccurv_destroy(jas_iccattrval_t *attrval)
{
jas_icccurv_t *curv = &attrval->data.curv;
if (curv->ents)
jas_free(curv->ents);
}
static int jas_icccurv_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_icccurv_input(jas_iccattrval_t *attrval, jas_stream_t *in,
int cnt)
{
jas_icccurv_t *curv = &attrval->data.curv;
unsigned int i;
curv->numents = 0;
curv->ents = 0;
if (jas_iccgetuint32(in, &curv->numents))
goto error;
if (!(curv->ents = jas_malloc(curv->numents * sizeof(jas_iccuint16_t))))
goto error;
for (i = 0; i < curv->numents; ++i) {
if (jas_iccgetuint16(in, &curv->ents[i]))
goto error;
}
if (JAS_CAST(int, 4 + 2 * curv->numents) != cnt)
goto error;
return 0;
error:
jas_icccurv_destroy(attrval);
return -1;
}
static int jas_icccurv_getsize(jas_iccattrval_t *attrval)
{
jas_icccurv_t *curv = &attrval->data.curv;
return 4 + 2 * curv->numents;
}
static int jas_icccurv_output(jas_iccattrval_t *attrval, jas_stream_t *out)
{
jas_icccurv_t *curv = &attrval->data.curv;
unsigned int i;
if (jas_iccputuint32(out, curv->numents))
goto error;
for (i = 0; i < curv->numents; ++i) {
if (jas_iccputuint16(out, curv->ents[i]))
goto error;
}
return 0;
error:
return -1;
}
static void jas_icccurv_dump(jas_iccattrval_t *attrval, FILE *out)
{
int i;
jas_icccurv_t *curv = &attrval->data.curv;
fprintf(out, "number of entires = %d\n", curv->numents);
if (curv->numents == 1) {
fprintf(out, "gamma = %f\n", curv->ents[0] / 256.0);
} else {
for (i = 0; i < JAS_CAST(int, curv->numents); ++i) {
if (i < 3 || i >= JAS_CAST(int, curv->numents) - 3) {
fprintf(out, "entry[%d] = %f\n", i, curv->ents[i] / 65535.0);
}
}
}
}
/******************************************************************************\
*
\******************************************************************************/
static void jas_icctxtdesc_destroy(jas_iccattrval_t *attrval)
{
jas_icctxtdesc_t *txtdesc = &attrval->data.txtdesc;
if (txtdesc->ascdata)
jas_free(txtdesc->ascdata);
if (txtdesc->ucdata)
jas_free(txtdesc->ucdata);
}
static int jas_icctxtdesc_copy(jas_iccattrval_t *attrval,
jas_iccattrval_t *othattrval)
{
jas_icctxtdesc_t *txtdesc = &attrval->data.txtdesc;
/* Avoid compiler warnings about unused parameters. */
attrval = 0;
othattrval = 0;
txtdesc = 0;
/* Not yet implemented. */
abort();
return -1;
}
static int jas_icctxtdesc_input(jas_iccattrval_t *attrval, jas_stream_t *in,
int cnt)
{
int n;
int c;
jas_icctxtdesc_t *txtdesc = &attrval->data.txtdesc;
txtdesc->ascdata = 0;
txtdesc->ucdata = 0;
if (jas_iccgetuint32(in, &txtdesc->asclen))
goto error;
if (!(txtdesc->ascdata = jas_malloc(txtdesc->asclen)))
goto error;
if (jas_stream_read(in, txtdesc->ascdata, txtdesc->asclen) !=
JAS_CAST(int, txtdesc->asclen))
goto error;
txtdesc->ascdata[txtdesc->asclen - 1] = '\0';
if (jas_iccgetuint32(in, &txtdesc->uclangcode) ||
jas_iccgetuint32(in, &txtdesc->uclen))
goto error;
if (!(txtdesc->ucdata = jas_malloc(txtdesc->uclen * 2)))
goto error;
if (jas_stream_read(in, txtdesc->ucdata, txtdesc->uclen * 2) !=
JAS_CAST(int, txtdesc->uclen * 2))
goto error;
if (jas_iccgetuint16(in, &txtdesc->sccode))
goto error;
if ((c = jas_stream_getc(in)) == EOF)
goto error;
txtdesc->maclen = c;
if (jas_stream_read(in, txtdesc->macdata, 67) != 67)
goto error;
txtdesc->asclen = strlen(txtdesc->ascdata) + 1;
#define WORKAROUND_BAD_PROFILES
#ifdef WORKAROUND_BAD_PROFILES
n = txtdesc->asclen + txtdesc->uclen * 2 + 15 + 67;
if (n > cnt) {
return -1;
}
if (n < cnt) {
if (jas_stream_gobble(in, cnt - n) != cnt - n)
goto error;
}
#else
if (txtdesc->asclen + txtdesc->uclen * 2 + 15 + 67 != cnt)
return -1;
#endif
return 0;
error:
jas_icctxtdesc_destroy(attrval);
return -1;
}
static int jas_icctxtdesc_getsize(jas_iccattrval_t *attrval)
{
jas_icctxtdesc_t *txtdesc = &attrval->data.txtdesc;
return strlen(txtdesc->ascdata) + 1 + txtdesc->uclen * 2 + 15 + 67;
}
static int jas_icctxtdesc_output(jas_iccattrval_t *attrval, jas_stream_t *out)
{
jas_icctxtdesc_t *txtdesc = &attrval->data.txtdesc;
if (jas_iccputuint32(out, txtdesc->asclen) ||
jas_stream_puts(out, txtdesc->ascdata) ||
jas_stream_putc(out, 0) == EOF ||
jas_iccputuint32(out, txtdesc->uclangcode) ||
jas_iccputuint32(out, txtdesc->uclen) ||
jas_stream_write(out, txtdesc->ucdata, txtdesc->uclen * 2) != JAS_CAST(int, txtdesc->uclen * 2) ||
jas_iccputuint16(out, txtdesc->sccode) ||
jas_stream_putc(out, txtdesc->maclen) == EOF)
goto error;
if (txtdesc->maclen > 0) {
if (jas_stream_write(out, txtdesc->macdata, 67) != 67)
goto error;
} else {
if (jas_stream_pad(out, 67, 0) != 67)
goto error;
}
return 0;
error:
return -1;
}
static void jas_icctxtdesc_dump(jas_iccattrval_t *attrval, FILE *out)
{
jas_icctxtdesc_t *txtdesc = &attrval->data.txtdesc;
fprintf(out, "ascii = \"%s\"\n", txtdesc->ascdata);
fprintf(out, "uclangcode = %d; uclen = %d\n", txtdesc->uclangcode,
txtdesc->uclen);
fprintf(out, "sccode = %d\n", txtdesc->sccode);
fprintf(out, "maclen = %d\n", txtdesc->maclen);
}
/******************************************************************************\
*
\******************************************************************************/
static void jas_icctxt_destroy(jas_iccattrval_t *attrval)
{
jas_icctxt_t *txt = &attrval->data.txt;
if (txt->string)
jas_free(txt->string);
}
static int jas_icctxt_copy(jas_iccattrval_t *attrval,
jas_iccattrval_t *othattrval)
{
jas_icctxt_t *txt = &attrval->data.txt;
jas_icctxt_t *othtxt = &othattrval->data.txt;
if (!(txt->string = jas_strdup(othtxt->string)))
return -1;
return 0;
}
static int jas_icctxt_input(jas_iccattrval_t *attrval, jas_stream_t *in,
int cnt)
{
jas_icctxt_t *txt = &attrval->data.txt;
txt->string = 0;
if (!(txt->string = jas_malloc(cnt)))
goto error;
if (jas_stream_read(in, txt->string, cnt) != cnt)
goto error;
txt->string[cnt - 1] = '\0';
if (JAS_CAST(int, strlen(txt->string)) + 1 != cnt)
goto error;
return 0;
error:
if (txt->string)
jas_free(txt->string);
return -1;
}
static int jas_icctxt_getsize(jas_iccattrval_t *attrval)
{
jas_icctxt_t *txt = &attrval->data.txt;
return strlen(txt->string) + 1;
}
static int jas_icctxt_output(jas_iccattrval_t *attrval, jas_stream_t *out)
{
jas_icctxt_t *txt = &attrval->data.txt;
if (jas_stream_puts(out, txt->string) ||
jas_stream_putc(out, 0) == EOF)
return -1;
return 0;
}
static void jas_icctxt_dump(jas_iccattrval_t *attrval, FILE *out)
{
jas_icctxt_t *txt = &attrval->data.txt;
fprintf(out, "string = \"%s\"\n", txt->string);
}
/******************************************************************************\
*
\******************************************************************************/
static void jas_icclut8_destroy(jas_iccattrval_t *attrval)
{
jas_icclut8_t *lut8 = &attrval->data.lut8;
if (lut8->clut)
jas_free(lut8->clut);
if (lut8->intabs)
jas_free(lut8->intabs);
if (lut8->intabsbuf)
jas_free(lut8->intabsbuf);
if (lut8->outtabs)
jas_free(lut8->outtabs);
if (lut8->outtabsbuf)
jas_free(lut8->outtabsbuf);
}
static int jas_icclut8_copy(jas_iccattrval_t *attrval,
jas_iccattrval_t *othattrval)
{
jas_icclut8_t *lut8 = &attrval->data.lut8;
/* Avoid compiler warnings about unused parameters. */
attrval = 0;
othattrval = 0;
lut8 = 0;
abort();
return -1;
}
static int jas_icclut8_input(jas_iccattrval_t *attrval, jas_stream_t *in,
int cnt)
{
int i;
int j;
int clutsize;
jas_icclut8_t *lut8 = &attrval->data.lut8;
lut8->clut = 0;
lut8->intabs = 0;
lut8->intabsbuf = 0;
lut8->outtabs = 0;
lut8->outtabsbuf = 0;
if (jas_iccgetuint8(in, &lut8->numinchans) ||
jas_iccgetuint8(in, &lut8->numoutchans) ||
jas_iccgetuint8(in, &lut8->clutlen) ||
jas_stream_getc(in) == EOF)
goto error;
for (i = 0; i < 3; ++i) {
for (j = 0; j < 3; ++j) {
if (jas_iccgetsint32(in, &lut8->e[i][j]))
goto error;
}
}
if (jas_iccgetuint16(in, &lut8->numintabents) ||
jas_iccgetuint16(in, &lut8->numouttabents))
goto error;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -