⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jas_icc.c

📁 DIGITAL IMAGERY is pervasive in our world today. Consequently, standards for the efficient represen
💻 C
📖 第 1 页 / 共 4 页
字号:
		if (sharedtagtabent) {			tagtabent->off = sharedtagtabent->off;			tagtabent->len = sharedtagtabent->len;			tagtabent->first = sharedtagtabent;		} else {			tagtabent->off = curoff;			tagtabent->len = (*attrval->ops->getsize)(attrval) + 8;			tagtabent->first = 0;			if (i < JAS_CAST(int, tagtab->numents - 1)) {				curoff = jas_iccpadtomult(curoff + tagtabent->len, 4);			} else {				curoff += tagtabent->len;			}		}		jas_iccattrval_destroy(attrval);	}	prof->hdr.size = curoff;	if (jas_iccprof_writehdr(out, &prof->hdr))		goto error;	if (jas_iccprof_puttagtab(out, &prof->tagtab))		goto error;	curoff = JAS_ICC_HDRLEN + 4 + 12 * tagtab->numents;	for (i = 0; i < JAS_CAST(int, tagtab->numents);) {		tagtabent = &tagtab->ents[i];		assert(curoff == JAS_CAST(long, tagtabent->off));		if (jas_iccattrtab_get(prof->attrtab, i, &attrname, &attrval))			goto error;		if (jas_iccputuint32(out, attrval->type) || jas_stream_pad(out,		  4, 0) != 4)			goto error;		if ((*attrval->ops->output)(attrval, out))			goto error;		jas_iccattrval_destroy(attrval);		curoff += tagtabent->len;		++i;		while (i < JAS_CAST(int, tagtab->numents) &&		  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;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -