📄 jas_icc.c
字号:
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 + -