📄 cctiff.c
字号:
/* Multi-dim table function */void md_table(void *cntx,double *out_vals,double *in_vals) { sucntx *rx = (sucntx *)cntx; double pcsv[3]; int i; if (rx->link) { double vals[MAX_CHAN]; switch(rx->in.alg) { case icmMonoFwdType: { icmLuMono *lu = (icmLuMono *)rx->in.luo; /* Safe to coerce */ if (rx->icombine) { lu->fwd_curve(lu, vals, in_vals); lu->fwd_map(lu, pcsv, vals); } else { lu->fwd_map(lu, pcsv, in_vals); } lu->fwd_abs(lu, pcsv, pcsv); break; } case icmMatrixFwdType: { icmLuMatrix *lu = (icmLuMatrix *)rx->in.luo; /* Safe to coerce */ if (rx->icombine) { lu->fwd_curve(lu, vals, in_vals); lu->fwd_matrix(lu, pcsv, vals); } else { lu->fwd_matrix(lu, pcsv, in_vals); } lu->fwd_abs(lu, pcsv, pcsv); break; } case icmLutType: { icmLuLut *lu = (icmLuLut *)rx->in.luo; /* Safe to coerce */ if (rx->icombine) { /* Since not PCS, in_abs and matrix cannot be valid, */ /* so input curve on own is ok to use. */ lu->input(lu, vals, in_vals); lu->clut(lu, pcsv, vals); } else { lu->clut(lu, pcsv, in_vals); } lu->output(lu, pcsv, pcsv); lu->out_abs(lu, pcsv, pcsv); break; } default: error("Unexpected algorithm type in clut lookup"); } switch(rx->out.alg) { case icmMonoBwdType: { icmLuMono *lu = (icmLuMono *)rx->out.luo; /* Safe to coerce */ lu->bwd_abs(lu, pcsv, pcsv); lu->bwd_map(lu, out_vals, pcsv); if (rx->ocombine) { lu->bwd_curve(lu, out_vals, out_vals); } break; } case icmMatrixBwdType: { icmLuMatrix *lu = (icmLuMatrix *)rx->out.luo; /* Safe to coerce */ lu->bwd_abs(lu, pcsv, pcsv); lu->bwd_matrix(lu, out_vals, pcsv); if (rx->ocombine) { lu->bwd_curve(lu, out_vals, out_vals); } break; } case icmLutType: { icmLuLut *lu = (icmLuLut *)rx->out.luo; /* Safe to coerce */ lu->in_abs(lu, pcsv, pcsv); lu->matrix(lu, pcsv, pcsv); lu->input(lu, pcsv, pcsv); lu->clut(lu, out_vals, pcsv); if (rx->ocombine) { lu->output(lu, out_vals, out_vals); /* Since not PCS, out_abs is never used */ } break; } default: error("Unexpected algorithm type in clut lookup"); } } else { icmLuLut *lu = (icmLuLut *)rx->dev.luo; /* Safe to coerce */ if (rx->icombine && rx->ocombine) { lu->lookup((icmLuBase *)lu, out_vals, in_vals); /* Do everything here */ } else { lu->clut(lu, out_vals, in_vals); } }}/* Output curve function */double output_curve(void *cntx,int ch,double in_val) { sucntx *rx = (sucntx *)cntx; int i; double vals[MAX_CHAN]; if (rx->ocombine) return in_val; if (rx->link) { for (i = 0; i < rx->od; i++) vals[i] = 0.0; vals[ch] = in_val; switch(rx->out.alg) { case icmMonoBwdType: { icmLuMono *lu = (icmLuMono *)rx->out.luo; /* Safe to coerce */ lu->bwd_curve(lu, vals, vals); break; } case icmMatrixBwdType: { icmLuMatrix *lu = (icmLuMatrix *)rx->out.luo; /* Safe to coerce */ lu->bwd_curve(lu, vals, vals); break; } case icmLutType: { icmLuLut *lu = (icmLuLut *)rx->out.luo; /* Safe to coerce */ lu->output(lu, vals, vals); /* Since not PCS, out_abs is never used */ break; } default: error("Unexpected algorithm type in devop_devo()"); } } else { icmLuLut *lu = (icmLuLut *)rx->dev.luo; /* Safe to coerce */ for (i = 0; i < rx->od; i++) vals[i] = 0.0; vals[ch] = in_val; /* Since output not PCS, out_abs cannot be valid, */ lu->output(lu, vals, vals); } return vals[ch];}intmain(int argc, char *argv[]) { int fa,nfa; /* argument we're looking at */ char in_name[100]; /* Raster file name */ char out_name[100]; /* Raster file name */ int slow = 0; int check = 0; int i, rv = 0; TIFF *rh = NULL, *wh = NULL; int x, y, width, height; /* Size of image */ uint16 samplesperpixel, bitspersample; int no_pmtc; /* Number of input photometrics */ uint16 photometric, pmtc[10]; /* Photometrics of input file, and input profile */ uint16 pconfig; /* Planar configuration */ uint16 resunits; float resx, resy; tdata_t *inbuf, *outbuf, *checkbuf; /* IMDI */ imdi *s = NULL; sucntx su; /* Setup context */ unsigned char *inp[MAX_CHAN]; unsigned char *outp[MAX_CHAN]; int clutres = 33; /* Error check */ int mxerr = 0; double avgerr = 0.0; double avgcount = 0.0; if (argc < 2) usage(); su.verb = 0; su.icombine = 0; su.ocombine = 0; su.link = 0; su.in.intent = icmDefaultIntent; su.out.intent = icmDefaultIntent; /* Process the arguments */ for(fa = 1;fa < argc;fa++) { nfa = fa; /* skip to nfa if next argument is used */ if (argv[fa][0] == '-') { /* Look for any flags */ char *na = NULL; /* next argument after flag, null if none */ if (argv[fa][2] != '\000') na = &argv[fa][2]; /* next is directly after flag */ else { if ((fa+1) < argc) { if (argv[fa+1][0] != '-') { nfa = fa + 1; na = argv[nfa]; /* next is seperate non-flag argument */ } } } if (argv[fa][1] == '?') usage(); /* Slow, Precise */ else if (argv[fa][1] == 'p' || argv[fa][1] == 'P') { slow = 1; } /* Combine per channel curves */ else if (argv[fa][1] == 'c' || argv[fa][1] == 'C') { su.icombine = 1; su.ocombine = 1; } /* Check curves */ else if (argv[fa][1] == 'k' || argv[fa][1] == 'K') { check = 1; } /* Link profiles */ else if (argv[fa][1] == 'l' || argv[fa][1] == 'L') { su.link = 1; } /* Input profile Intent */ else if (argv[fa][1] == 'i' || argv[fa][1] == 'I') { fa = nfa; if (na == NULL) usage(); switch (na[0]) { case 'p': case 'P': su.in.intent = icPerceptual; break; case 'r': case 'R': su.in.intent = icRelativeColorimetric; break; case 's': case 'S': su.in.intent = icSaturation; break; case 'a': case 'A': su.in.intent = icAbsoluteColorimetric; break; default: usage(); } } /* Output profile Intent */ else if (argv[fa][1] == 'o' || argv[fa][1] == 'O') { fa = nfa; if (na == NULL) usage(); switch (na[0]) { case 'p': case 'P': su.out.intent = icPerceptual; break; case 'r': case 'R': su.out.intent = icRelativeColorimetric; break; case 's': case 'S': su.out.intent = icSaturation; break; case 'a': case 'A': su.out.intent = icAbsoluteColorimetric; break; default: usage(); } } /* Verbosity */ else if (argv[fa][1] == 'v' || argv[fa][1] == 'V') { su.verb = 1; } else usage(); } else break; } if (su.link) { if (fa >= argc || argv[fa][0] == '-') usage(); strcpy(su.in.name,argv[fa++]); if (fa >= argc || argv[fa][0] == '-') usage(); strcpy(su.out.name,argv[fa++]); } else { if (fa >= argc || argv[fa][0] == '-') usage(); strcpy(su.dev.name,argv[fa++]); } if (fa >= argc || argv[fa][0] == '-') usage(); strcpy(in_name,argv[fa++]); if (fa >= argc || argv[fa][0] == '-') usage(); strcpy(out_name,argv[fa++]); /* - - - - - - - - - - - - - - - - */ if (su.link) { icColorSpaceSignature natpcs; /* Open up the input device profile for reading */ if ((su.in.fp = new_icmFileStd_name(su.in.name,"r")) == NULL) error ("Can't open file '%s'",su.in.name); if ((su.in.c = new_icc()) == NULL) error ("Creation of Input profile ICC object failed"); /* Read header etc. */ if ((rv = su.in.c->read(su.in.c,su.in.fp,0)) != 0) error ("%d, %s on file '%s'",rv,su.in.c->err,su.in.name); su.in.h = su.in.c->header; /* Check that it is a suitable device input icc */ if (su.in.h->deviceClass != icSigInputClass && su.in.h->deviceClass != icSigDisplayClass && su.in.h->deviceClass != icSigOutputClass && su.in.h->deviceClass != icSigColorSpaceClass) /* For sRGB etc. */ error("Input profile isn't a device profile"); /* Get a conversion object */ if ((su.in.luo = su.in.c->get_luobj(su.in.c, icmFwd, su.in.intent, icSigLabData, icmLuOrdNorm)) == NULL) error ("%d, %s for profile '%s'",su.in.c->errc, su.in.c->err, su.in.name); /* Get details of conversion (Arguments may be NULL if info not needed) */ su.in.luo->spaces(su.in.luo, &su.ins, &su.id, NULL, NULL, &su.in.alg, NULL, NULL, NULL); /* Get native PCS space */ su.in.luo->lutspaces(su.in.luo, NULL, NULL, NULL, NULL, &natpcs); if (natpcs == icSigXYZData) { su.icombine = 1; /* XYZ is to non-linear to be a benefit */ } /* Open up the output device profile for reading */ if ((su.out.fp = new_icmFileStd_name(su.out.name,"r")) == NULL) error ("Can't open file '%s'",su.out.name); if ((su.out.c = new_icc()) == NULL) error ("Creation of Output profile ICC object failed"); /* Read header etc. */ if ((rv = su.out.c->read(su.out.c,su.out.fp,0)) != 0) error ("%d, %s on file '%s'",rv,su.out.c->err,su.out.name); su.out.h = su.out.c->header; /* Check that it is a suitable device output icc */ if (su.out.h->deviceClass != icSigInputClass && su.out.h->deviceClass != icSigDisplayClass && su.out.h->deviceClass != icSigOutputClass && su.out.h->deviceClass != icSigColorSpaceClass) /* For sRGB etc. */ error("Output profile isn't a device profile"); /* Get a conversion object */ if ((su.out.luo = su.out.c->get_luobj(su.out.c, icmBwd, su.out.intent, icSigLabData, icmLuOrdNorm)) == NULL) error ("%d, %s for profile '%s'",su.out.c->errc, su.out.c->err, su.out.name); /* Get details of conversion (Arguments may be NULL if info not needed) */ su.out.luo->spaces(su.out.luo, NULL, NULL, &su.outs, &su.od, &su.out.alg, NULL, NULL, NULL); /* Get native PCS space */ su.out.luo->lutspaces(su.out.luo, NULL, NULL, NULL, NULL, &natpcs); if (natpcs == icSigXYZData) { su.ocombine = 1; /* XYZ is to non-linear to be a benefit */ } /* See discussion in imdi/imdi_gen.c for ideal numbers */ /* Use "high quality" resolution numbers */ switch (su.id) { case 0: error ("Illegal number of input chanels"); case 1: clutres = 256; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -