📄 jas_icc.c
字号:
tagtab->ents[i].first)
++i;
newoff = (i < JAS_CAST(int, tagtab->numents)) ?
tagtab->ents[i].off : prof->hdr.size;
reloff = newoff - curoff;
assert(reloff >= 0);
if (reloff > 0) {
if (jas_stream_pad(out, reloff, 0) != reloff)
goto error;
curoff += reloff;
}
}
return 0;
error:
/* XXX - need to free some resources here */
return -1;
}
static int jas_iccprof_writehdr(jas_stream_t *out, jas_icchdr_t *hdr)
{
if (jas_iccputuint32(out, hdr->size) ||
jas_iccputuint32(out, hdr->cmmtype) ||
jas_iccputuint32(out, hdr->version) ||
jas_iccputuint32(out, hdr->clas) ||
jas_iccputuint32(out, hdr->colorspc) ||
jas_iccputuint32(out, hdr->refcolorspc) ||
jas_iccputtime(out, &hdr->ctime) ||
jas_iccputuint32(out, hdr->magic) ||
jas_iccputuint32(out, hdr->platform) ||
jas_iccputuint32(out, hdr->flags) ||
jas_iccputuint32(out, hdr->maker) ||
jas_iccputuint32(out, hdr->model) ||
jas_iccputuint64(out, hdr->attr) ||
jas_iccputuint32(out, hdr->intent) ||
jas_iccputxyz(out, &hdr->illum) ||
jas_iccputuint32(out, hdr->creator) ||
jas_stream_pad(out, 44, 0) != 44)
return -1;
return 0;
}
static int jas_iccprof_puttagtab(jas_stream_t *out, jas_icctagtab_t *tagtab)
{
int i;
jas_icctagtabent_t *tagtabent;
if (jas_iccputuint32(out, tagtab->numents))
goto error;
for (i = 0; i < JAS_CAST(int, tagtab->numents); ++i) {
tagtabent = &tagtab->ents[i];
if (jas_iccputuint32(out, tagtabent->tag) ||
jas_iccputuint32(out, tagtabent->off) ||
jas_iccputuint32(out, tagtabent->len))
goto error;
}
return 0;
error:
return -1;
}
static int jas_iccprof_readhdr(jas_stream_t *in, jas_icchdr_t *hdr)
{
if (jas_iccgetuint32(in, &hdr->size) ||
jas_iccgetuint32(in, &hdr->cmmtype) ||
jas_iccgetuint32(in, &hdr->version) ||
jas_iccgetuint32(in, &hdr->clas) ||
jas_iccgetuint32(in, &hdr->colorspc) ||
jas_iccgetuint32(in, &hdr->refcolorspc) ||
jas_iccgettime(in, &hdr->ctime) ||
jas_iccgetuint32(in, &hdr->magic) ||
jas_iccgetuint32(in, &hdr->platform) ||
jas_iccgetuint32(in, &hdr->flags) ||
jas_iccgetuint32(in, &hdr->maker) ||
jas_iccgetuint32(in, &hdr->model) ||
jas_iccgetuint64(in, &hdr->attr) ||
jas_iccgetuint32(in, &hdr->intent) ||
jas_iccgetxyz(in, &hdr->illum) ||
jas_iccgetuint32(in, &hdr->creator) ||
jas_stream_gobble(in, 44) != 44)
return -1;
return 0;
}
static int jas_iccprof_gettagtab(jas_stream_t *in, jas_icctagtab_t *tagtab)
{
int i;
jas_icctagtabent_t *tagtabent;
if (tagtab->ents) {
jas_free(tagtab->ents);
tagtab->ents = 0;
}
if (jas_iccgetuint32(in, &tagtab->numents))
goto error;
if (!(tagtab->ents = jas_malloc(tagtab->numents *
sizeof(jas_icctagtabent_t))))
goto error;
tagtabent = tagtab->ents;
for (i = 0; i < JAS_CAST(long, tagtab->numents); ++i) {
if (jas_iccgetuint32(in, &tagtabent->tag) ||
jas_iccgetuint32(in, &tagtabent->off) ||
jas_iccgetuint32(in, &tagtabent->len))
goto error;
++tagtabent;
}
return 0;
error:
if (tagtab->ents) {
jas_free(tagtab->ents);
tagtab->ents = 0;
}
return -1;
}
jas_iccattrval_t *jas_iccprof_getattr(jas_iccprof_t *prof,
jas_iccattrname_t name)
{
int i;
jas_iccattrval_t *attrval;
if ((i = jas_iccattrtab_lookup(prof->attrtab, name)) < 0)
goto error;
if (!(attrval = jas_iccattrval_clone(prof->attrtab->attrs[i].val)))
goto error;
return attrval;
error:
return 0;
}
int jas_iccprof_setattr(jas_iccprof_t *prof, jas_iccattrname_t name,
jas_iccattrval_t *val)
{
int i;
if ((i = jas_iccattrtab_lookup(prof->attrtab, name)) >= 0) {
if (val) {
if (jas_iccattrtab_replace(prof->attrtab, i, name, val))
goto error;
} else {
jas_iccattrtab_delete(prof->attrtab, i);
}
} else {
if (val) {
if (jas_iccattrtab_add(prof->attrtab, -1, name, val))
goto error;
} else {
/* NOP */
}
}
return 0;
error:
return -1;
}
int jas_iccprof_gethdr(jas_iccprof_t *prof, jas_icchdr_t *hdr)
{
*hdr = prof->hdr;
return 0;
}
int jas_iccprof_sethdr(jas_iccprof_t *prof, jas_icchdr_t *hdr)
{
prof->hdr = *hdr;
return 0;
}
static void jas_iccprof_sorttagtab(jas_icctagtab_t *tagtab)
{
qsort(tagtab->ents, tagtab->numents, sizeof(jas_icctagtabent_t),
jas_icctagtabent_cmp);
}
static int jas_icctagtabent_cmp(const void *src, const void *dst)
{
jas_icctagtabent_t *srctagtabent = JAS_CAST(jas_icctagtabent_t *, src);
jas_icctagtabent_t *dsttagtabent = JAS_CAST(jas_icctagtabent_t *, dst);
if (srctagtabent->off > dsttagtabent->off) {
return 1;
} else if (srctagtabent->off < dsttagtabent->off) {
return -1;
}
return 0;
}
static jas_iccattrvalinfo_t *jas_iccattrvalinfo_lookup(jas_iccsig_t type)
{
jas_iccattrvalinfo_t *info;
info = jas_iccattrvalinfos;
for (info = jas_iccattrvalinfos; info->type; ++info) {
if (info->type == type) {
return info;
}
}
return 0;
}
static int jas_iccgettime(jas_stream_t *in, jas_icctime_t *time)
{
if (jas_iccgetuint16(in, &time->year) ||
jas_iccgetuint16(in, &time->month) ||
jas_iccgetuint16(in, &time->day) ||
jas_iccgetuint16(in, &time->hour) ||
jas_iccgetuint16(in, &time->min) ||
jas_iccgetuint16(in, &time->sec)) {
return -1;
}
return 0;
}
static int jas_iccgetxyz(jas_stream_t *in, jas_iccxyz_t *xyz)
{
if (jas_iccgetsint32(in, &xyz->x) ||
jas_iccgetsint32(in, &xyz->y) ||
jas_iccgetsint32(in, &xyz->z)) {
return -1;
}
return 0;
}
static int jas_iccputtime(jas_stream_t *out, jas_icctime_t *time)
{
jas_iccputuint16(out, time->year);
jas_iccputuint16(out, time->month);
jas_iccputuint16(out, time->day);
jas_iccputuint16(out, time->hour);
jas_iccputuint16(out, time->min);
jas_iccputuint16(out, time->sec);
return 0;
}
static int jas_iccputxyz(jas_stream_t *out, jas_iccxyz_t *xyz)
{
jas_iccputuint32(out, xyz->x);
jas_iccputuint32(out, xyz->y);
jas_iccputuint32(out, xyz->z);
return 0;
}
/******************************************************************************\
* attribute table class
\******************************************************************************/
static jas_iccattrtab_t *jas_iccattrtab_create()
{
jas_iccattrtab_t *tab;
tab = 0;
if (!(tab = jas_malloc(sizeof(jas_iccattrtab_t))))
goto error;
tab->maxattrs = 0;
tab->numattrs = 0;
tab->attrs = 0;
if (jas_iccattrtab_resize(tab, 32))
goto error;
return tab;
error:
if (tab)
jas_iccattrtab_destroy(tab);
return 0;
}
static jas_iccattrtab_t *jas_iccattrtab_copy(jas_iccattrtab_t *attrtab)
{
jas_iccattrtab_t *newattrtab;
int i;
if (!(newattrtab = jas_iccattrtab_create()))
goto error;
for (i = 0; i < attrtab->numattrs; ++i) {
if (jas_iccattrtab_add(newattrtab, i, attrtab->attrs[i].name,
attrtab->attrs[i].val))
goto error;
}
return newattrtab;
error:
return 0;
}
static void jas_iccattrtab_destroy(jas_iccattrtab_t *tab)
{
if (tab->attrs) {
while (tab->numattrs > 0) {
jas_iccattrtab_delete(tab, 0);
}
jas_free(tab->attrs);
}
jas_free(tab);
}
void jas_iccattrtab_dump(jas_iccattrtab_t *attrtab, FILE *out)
{
int i;
jas_iccattr_t *attr;
jas_iccattrval_t *attrval;
jas_iccattrvalinfo_t *info;
char buf[16];
fprintf(out, "numattrs=%d\n", attrtab->numattrs);
fprintf(out, "---\n");
for (i = 0; i < attrtab->numattrs; ++i) {
attr = &attrtab->attrs[i];
attrval = attr->val;
info = jas_iccattrvalinfo_lookup(attrval->type);
if (!info) abort();
fprintf(out, "attrno=%d; attrname=\"%s\"(0x%08x); attrtype=\"%s\"(0x%08x)\n",
i,
jas_iccsigtostr(attr->name, &buf[0]),
attr->name,
jas_iccsigtostr(attrval->type, &buf[8]),
attrval->type
);
jas_iccattrval_dump(attrval, out);
fprintf(out, "---\n");
}
}
static int jas_iccattrtab_resize(jas_iccattrtab_t *tab, int maxents)
{
jas_iccattr_t *newattrs;
assert(maxents >= tab->numattrs);
newattrs = tab->attrs ? jas_realloc(tab->attrs, maxents *
sizeof(jas_iccattr_t)) : jas_malloc(maxents * sizeof(jas_iccattr_t));
if (!newattrs)
return -1;
tab->attrs = newattrs;
tab->maxattrs = maxents;
return 0;
}
static int jas_iccattrtab_add(jas_iccattrtab_t *attrtab, int i,
jas_iccuint32_t name, jas_iccattrval_t *val)
{
int n;
jas_iccattr_t *attr;
jas_iccattrval_t *tmpattrval;
tmpattrval = 0;
if (i < 0) {
i = attrtab->numattrs;
}
assert(i >= 0 && i <= attrtab->numattrs);
if (attrtab->numattrs >= attrtab->maxattrs) {
if (jas_iccattrtab_resize(attrtab, attrtab->numattrs + 32)) {
goto error;
}
}
if (!(tmpattrval = jas_iccattrval_clone(val)))
goto error;
n = attrtab->numattrs - i;
if (n > 0)
memmove(&attrtab->attrs[i + 1], &attrtab->attrs[i],
n * sizeof(jas_iccattr_t));
attr = &attrtab->attrs[i];
attr->name = name;
attr->val = tmpattrval;
++attrtab->numattrs;
return 0;
error:
if (tmpattrval)
jas_iccattrval_destroy(tmpattrval);
return -1;
}
static int jas_iccattrtab_replace(jas_iccattrtab_t *attrtab, int i,
jas_iccuint32_t name, jas_iccattrval_t *val)
{
jas_iccattrval_t *newval;
jas_iccattr_t *attr;
if (!(newval = jas_iccattrval_clone(val)))
goto error;
attr = &attrtab->attrs[i];
jas_iccattrval_destroy(attr->val);
attr->name = name;
attr->val = newval;
return 0;
error:
return -1;
}
static void jas_iccattrtab_delete(jas_iccattrtab_t *attrtab, int i)
{
int n;
jas_iccattrval_destroy(attrtab->attrs[i].val);
if ((n = attrtab->numattrs - i - 1) > 0)
memmove(&attrtab->attrs[i], &attrtab->attrs[i + 1],
n * sizeof(jas_iccattr_t));
--attrtab->numattrs;
}
static int jas_iccattrtab_get(jas_iccattrtab_t *attrtab, int i,
jas_iccattrname_t *name, jas_iccattrval_t **val)
{
jas_iccattr_t *attr;
if (i < 0 || i >= attrtab->numattrs)
goto error;
attr = &attrtab->attrs[i];
*name = attr->name;
if (!(*val = jas_iccattrval_clone(attr->val)))
goto error;
return 0;
error:
return -1;
}
static int jas_iccattrtab_lookup(jas_iccattrtab_t *attrtab,
jas_iccuint32_t name)
{
int i;
jas_iccattr_t *attr;
for (i = 0; i < attrtab->numattrs; ++i) {
attr = &attrtab->attrs[i];
if (attr->name == name)
return i;
}
return -1;
}
/******************************************************************************\
* attribute value class
\******************************************************************************/
jas_iccattrval_t *jas_iccattrval_create(jas_iccuint32_t type)
{
jas_iccattrval_t *attrval;
jas_iccattrvalinfo_t *info;
if (!(info = jas_iccattrvalinfo_lookup(type)))
goto error;
if (!(attrval = jas_iccattrval_create0()))
goto error;
attrval->ops = &info->ops;
attrval->type = type;
++attrval->refcnt;
memset(&attrval->data, 0, sizeof(attrval->data));
return attrval;
error:
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -