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

📄 jas_icc.c

📁 DIGITAL IMAGERY is pervasive in our world today. Consequently, standards for the efficient represen
💻 C
📖 第 1 页 / 共 4 页
字号:
	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;}jas_iccattrval_t *jas_iccattrval_clone(jas_iccattrval_t *attrval){	++attrval->refcnt;	return attrval;}void jas_iccattrval_destroy(jas_iccattrval_t *attrval){#if 0fprintf(stderr, "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 = 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) ||

⌨️ 快捷键说明

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