diff options
Diffstat (limited to 'namedc/txt2iccnc.c')
-rw-r--r-- | namedc/txt2iccnc.c | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/namedc/txt2iccnc.c b/namedc/txt2iccnc.c new file mode 100644 index 0000000..3ea1bc9 --- /dev/null +++ b/namedc/txt2iccnc.c @@ -0,0 +1,273 @@ + +/* + * Argyll Color Correction System + * x11 style .txt to ICC Named Color converter + * + * Author: Graeme W. Gill + * Date: 24/20/2014 + * + * Copyright 2014 Graeme W. Gill + * All rights reserved. + * + * This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :- + * see the License.txt file for licencing details. + */ + +/* + * TTBD + */ + +#undef DEBUG + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <sys/types.h> +#include <time.h> +#include "copyright.h" +#include "aconfig.h" +#ifndef SALONEINSTLIB +#include "numlib.h" +#include "icc.h" +#else +#include "numsup.h" +#endif +#include "xspect.h" +#include "ui.h" + +void usage(char *diag, ...) { + fprintf(stderr,"x11 .txt to ICC Named Colors\n"); + fprintf(stderr,"Author: Graeme W. Gill\n"); + if (diag != NULL) { + va_list args; + fprintf(stderr," Diagnostic: "); + va_start(args, diag); + vfprintf(stderr, diag, args); + va_end(args); + fprintf(stderr,"\n"); + } + fprintf(stderr,"usage: txt2iccNC [-v level] description infile outfile\n"); + exit(1); +} + +int +main(int argc, char *argv[]) { + int fa,nfa; /* argument we're looking at */ + int verb = 0; + char desc[MAXNAMEL+1]; + char inname[MAXNAMEL+1]; + char outname[MAXNAMEL+1]; + FILE *ifp; +#define BUFSZ 512 + char buf[BUFSZ]; + icmFile *wr_fp; + icc *wr_icco; + int i, rv; + + /* 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(NULL); + + else if (argv[fa][1] == 'v') + verb = 1; + + else + usage("Unknown option '%c'",argv[fa][1]); + } + else + break; + } + + if (fa >= argc || argv[fa][0] == '-') usage("Missing description"); + strncpy(desc,argv[fa++],MAXNAMEL); desc[MAXNAMEL] = '\000'; + + if (fa >= argc || argv[fa][0] == '-') usage("Missing input filename"); + strncpy(inname,argv[fa++],MAXNAMEL); inname[MAXNAMEL] = '\000'; + + if (fa >= argc || argv[fa][0] == '-') usage("Missing output filename"); + strncpy(outname,argv[fa++],MAXNAMEL); outname[MAXNAMEL] = '\000'; + + if ((ifp = fopen(inname,"r"))==NULL) { + error("Read: Can't open file '%s'",inname); + } + + /* Open up the file for writing */ + if ((wr_fp = new_icmFileStd_name(outname,"w")) == NULL) + error ("Write: Can't open file '%s'",outname); + + if ((wr_icco = new_icc()) == NULL) + error ("Write: Creation of ICC object failed"); + + /* Values that must be set before writing */ + wr_icco->header->deviceClass = icSigNamedColorClass; + wr_icco->header->colorSpace = icSigRgbData; + wr_icco->header->pcs = icSigLabData; + wr_icco->header->renderingIntent = icRelativeColorimetric; + + /* Add the description tag */ + { + icmTextDescription *wo; + if ((wo = (icmTextDescription *)wr_icco->add_tag( + wr_icco, icSigProfileDescriptionTag, icSigTextDescriptionType)) == NULL) + error("Failed to add icmTextDescription"); + + wo->size = strlen(desc)+1; /* Allocated and used size of desc, inc null */ + wo->allocate((icmBase *)wo);/* Allocate space */ + strcpy(wo->desc, desc); /* Copy the string in */ + } + + /* Copyright Tag: */ + { + icmText *wo; + char *crt; + + crt = ""; + + if ((wo = (icmText *)wr_icco->add_tag( + wr_icco, icSigCopyrightTag, icSigTextType)) == NULL) + error("add_tag failed: %d, %s",wr_icco->errc,wr_icco->err); + + wo->size = strlen(crt)+1; /* Allocated and used size of text, inc null */ + wo->allocate((icmBase *)wo);/* Allocate space */ + strcpy(wo->data, crt); /* Copy the text in */ + } + + /* White Point Tag: */ + /* Use the orgininal, non PCS adapted white point */ + { + icmXYZArray *wo; + /* Note that tag types icSigXYZType and icSigXYZArrayType are identical */ + if ((wo = (icmXYZArray *)wr_icco->add_tag( + wr_icco, icSigMediaWhitePointTag, icSigXYZArrayType)) == NULL) + error("add_tag failed: %d, %s",wr_icco->errc,wr_icco->err); + + wo->size = 1; + wo->allocate((icmBase *)wo); /* Allocate space */ + wo->data[0] = icmD65; /* sRGB is D65 */ + } + + /* Add a named color tag */ + { + icmNamedColor *wo; + + if ((wo = (icmNamedColor *)wr_icco->add_tag( + wr_icco, icSigNamedColor2Tag, icSigNamedColor2Type)) == NULL) + error("Adding icmNamedColor tag failed"); + + wo->count = 0; + + /* Read lines and count the colors */ + for (;;) { + double rgb[3]; + char s1[BUFSZ]; + char s2[BUFSZ]; + char s3[BUFSZ]; + + if (fgets(buf, BUFSZ, ifp) == NULL) + break; + + if ((rv = sscanf(buf, " %lf %lf %lf %s %s %s\n",&rgb[0], &rgb[1], &rgb[2], s1, s2, s3)) >= 4) { + wo->count++; + } + } + + wo->nDeviceCoords = 3; /* Num of device coordinates */ + strcpy(wo->prefix,""); /* Prefix for each color name, max 32, null terminated */ + strcpy(wo->suffix,""); /* Suffix for each color name, max 32, null terminated */ + + wo->allocate((icmBase *)wo); /* Allocate named color structures */ + + if (verb) + printf("Counted %d colors\n",wo->count); + + /* Read lines and colors */ + rewind(ifp); + for (i = 0; i < wo->count; i++) { + double rgb[3], lab[3]; + char s1[BUFSZ]; + char s2[BUFSZ]; + char s3[BUFSZ]; + unsigned int j; + + if (fgets(buf, BUFSZ, ifp) == NULL) + break; + + if ((rv = sscanf(buf, " %lf %lf %lf %s %s %s\n",&rgb[0], &rgb[1], &rgb[2], s1, s2, s3)) >= 4) { + rgb[0] /= 255.0; + rgb[1] /= 255.0; + rgb[2] /= 255.0; + if (rv >= 5) { + strcat(s1, " "); + strcat(s1, s2); + } + if (rv >= 6) { + strcat(s1, " "); + strcat(s1, s3); + } + /* Convert from sRGB to Bradford adapted D50 */ + icx_sRGB2XYZ(lab, icmD50_ary3, rgb); + icmXYZ2Lab(&icmD50, lab, lab); + + if (verb) + printf("Got %f %f %f '%s'\n",rgb[0], rgb[1], rgb[2], s1); + + strncpy(wo->data[i].root,s1,31); + wo->data[i].root[31] = '\000'; + + for (j = 0; j < wo->nDeviceCoords; j++) + wo->data[i].deviceCoords[j] = rgb[j]; + for (j = 0; j < 3; j++) + wo->data[i].pcsCoords[j] = lab[j]; + } + } + fclose(ifp); + } + + if ((rv = wr_icco->write(wr_icco, wr_fp, 0)) != 0) + error ("Write file: %d, %s",rv,wr_icco->err); + + wr_icco->del(wr_icco); + wr_fp->del(wr_fp); + + return 0; +} + + + + + + + + + + + + + + + + + + + + + + + + |