void AddTag(CIccIO *pIO, CIccProfile *pIcc) { std::string textIn; printf("Enter tag signature to be added [ex- cprt] : "); textIn = GetUserInput(); icTagSignature tagSig = (icTagSignature)icGetSigVal(textIn.c_str()); switch (tagSig) { case icSigProfileDescriptionTag: case icSigCopyrightTag: printf("Enter the text to be saved in the tag : "); textIn = GetUserInput(); if(!AddTextTag(textIn.c_str(), pIcc, tagSig)) printf("Write operation failed.\n"); else printf("Tag added successfully.\n"); break; default: if(!WriteTag(pIcc, tagSig)) printf("Write operation failed.\n"); else printf("Tag added successfully.\n"); } }
void ReadTag(CIccProfile *pIcc) { CIccInfo Fmt; icChar buf[64]; printf("\nProfile Tags\n"); printf( "------------\n"); printf("%25s ID %8s\t%8s\n", "Tag", "Offset", "Size"); printf("%25s ------ %8s\t%8s\n", "----", "------", "----"); TagEntryList::iterator i; for (i=pIcc->m_Tags->begin(); i!=pIcc->m_Tags->end(); i++) { printf("%25s %s %8d\t%8d\n", Fmt.GetTagSigName(i->TagInfo.sig), icGetSig(buf, i->TagInfo.sig, false), i->TagInfo.offset, i->TagInfo.size); } printf("\nNote: The above Offset & Size parameters DO NOT reflect any unsaved changes to profile.\n"); printf("\nEnter the tag ID : "); std::string TagID; TagID = GetUserInput(); if(!ShowTag(pIcc, (icTagSignature)icGetSigVal(TagID.c_str()))) printf("Tag (%s) not found in profile\n", TagID.c_str()); }
void DeleteTag(CIccIO *pIO, CIccProfile *pIcc) { std::string tagtype; printf("Enter tag signature to be deleted [ex- cprt] : "); tagtype = GetUserInput(); if(!pIcc->DeleteTag((icTagSignature)icGetSigVal(tagtype.c_str()))) printf("Delete operation failed.\n"); else printf("Tag deleted successfully.\n"); }
int main(int argc, char* argv[]) { int nArg = 1; if (argc<=1) { print_usage: printf("Usage: iccDumpProfile profile {tagId to dump/\"ALL\")\n"); return -1; } CIccProfile *pIcc; std::string sReport; icValidateStatus nStatus; if (!strncmp(argv[1], "-V", 2) || !strncmp(argv[1], "-v", 2)) { if (argc<=2) goto print_usage; nArg = 2; pIcc = ValidateIccProfile(argv[nArg], sReport, nStatus); } else pIcc = OpenIccProfile(argv[nArg]); if (!pIcc) { printf("Unable to open '%s'\n", argv[nArg]); } else { icHeader *pHdr = &pIcc->m_Header; CIccInfo Fmt; char buf[64]; printf("Profile: '%s'\n", argv[nArg]); if(Fmt.IsProfileIDCalculated(&pHdr->profileID)) printf("Profile ID: %s\n", Fmt.GetProfileID(&pHdr->profileID)); else printf("Profile ID: Profile ID not calculated.\n"); printf("Size: %d(0x%x) bytes\n", pHdr->size, pHdr->size); printf("\nHeader\n"); printf( "------\n"); printf("Attributes: %s\n", Fmt.GetDeviceAttrName(pHdr->attributes)); printf("Cmm: %s\n", Fmt.GetCmmSigName((icCmmSignature)(pHdr->cmmId))); printf("Creation Date: %d/%d/%d %02u:%02u:%02u\n", pHdr->date.month, pHdr->date.day, pHdr->date.year, pHdr->date.hours, pHdr->date.minutes, pHdr->date.seconds); printf("Creator: %s\n", icGetSig(buf, pHdr->creator)); printf("Data Color Space: %s\n", Fmt.GetColorSpaceSigName(pHdr->colorSpace)); printf("Flags %s\n", Fmt.GetProfileFlagsName(pHdr->flags)); printf("PCS Color Space: %s\n", Fmt.GetColorSpaceSigName(pHdr->pcs)); printf("Platform: %s\n", Fmt.GetPlatformSigName(pHdr->platform)); printf("Rendering Intent: %s\n", Fmt.GetRenderingIntentName((icRenderingIntent)(pHdr->renderingIntent))); printf("Type: %s\n", Fmt.GetProfileClassSigName(pHdr->deviceClass)); printf("Version: %s\n", Fmt.GetVersionName(pHdr->version)); printf("Illuminant: X=%.4lf, Y=%.4lf, Z=%.4lf\n", icFtoD(pHdr->illuminant.X), icFtoD(pHdr->illuminant.Y), icFtoD(pHdr->illuminant.Z)); printf("\nProfile Tags\n"); printf( "------------\n"); printf("%25s ID %8s\t%8s\n", "Tag", "Offset", "Size"); printf("%25s ------ %8s\t%8s\n", "----", "------", "----"); int n; TagEntryList::iterator i; for (n=0, i=pIcc->m_Tags->begin(); i!=pIcc->m_Tags->end(); i++, n++) { printf("%25s %s %8d\t%8d\n", Fmt.GetTagSigName(i->TagInfo.sig), icGetSig(buf, i->TagInfo.sig, false), i->TagInfo.offset, i->TagInfo.size); } if (argc>nArg+1) { if (!stricmp(argv[nArg+1], "ALL")) { for (n=0, i=pIcc->m_Tags->begin(); i!=pIcc->m_Tags->end(); i++, n++) { DumpTag(pIcc, i->TagInfo.sig); } } else { DumpTag(pIcc, (icTagSignature)icGetSigVal(argv[nArg+1])); } } } if (nArg>1) { printf("\nValidation Report\n"); printf( "-----------------\n"); switch (nStatus) { case icValidateOK: printf("Profile is valid\n\n"); break; case icValidateWarning: printf("Profile has warning(s)\n\n"); break; case icValidateNonCompliant: printf("Profile violates ICC specification\n\n"); break; case icValidateCriticalError: printf("Profile has Critical Error(s) that violate ICC specificaiton.\n\n"); break; default: printf("Profile has unknown status.\n\n"); break; } fwrite(sReport.c_str(), sReport.length(), 1, stdout); } delete pIcc; return 0; }
int main(int argc, icChar* argv[]) { int minargs = 4; // minimum number of arguments if(argc<minargs) { Usage(); return -1; } int nNumProfiles, temp; temp = argc - minargs; if(temp%2 != 0) { printf("\nMissing arguments!\n"); Usage(); return -1; } nNumProfiles = temp/2; std::ifstream InputData(argv[1]); if(!InputData) { printf("\nFile [%s] cannot be opened.\n", argv[1]); return false; } icChar ColorSig[7], tempBuf[5000]; InputData.getline(tempBuf, sizeof(tempBuf)); int i; for (i = 0; (i<4 || tempBuf[i+1]!='\'') && i < 6; i++) { ColorSig[i] = tempBuf[i+1]; } for (;i<7; i++) ColorSig[i] = '\0'; icColorSpaceSignature SrcspaceSig = (icColorSpaceSignature)icGetSigVal(ColorSig); int nSamples = icGetSpaceSamples(SrcspaceSig); if(SrcspaceSig != icSigNamedData) { if(!nSamples) { printf("Source color space signature not recognized.\n"); return -1; } } InputData.getline(tempBuf, sizeof(tempBuf)); sscanf(tempBuf, "%s", tempBuf); icFloatColorEncoding srcEncoding, destEncoding; srcEncoding = CIccCmm::GetFloatColorEncoding(tempBuf); if(srcEncoding == icEncodeUnknown) { printf("Source color data encoding not recognized.\n"); return false; } destEncoding = (icFloatColorEncoding)atoi(argv[2]); icXformInterp nInterp = (icXformInterp)atoi(argv[3]); int nIntent, nType; CIccNamedColorCmm namedCmm(SrcspaceSig, icSigUnknownData, !IsSpacePCS(SrcspaceSig)); IccProfilePtrList pccList; int nCount; bool bUseMPE; icCmmEnvSigMap sigMap; for(i = 0, nCount=minargs; i<nNumProfiles; i++, nCount+=2) { if (!strnicmp(argv[nCount], "-ENV:", 5)) { //check for -ENV: to allow for Cmm Environment variables to be defined for next transform icSignature sig = icGetSigVal(argv[nCount]+5); icFloatNumber val = (icFloatNumber)atof(argv[nCount+1]); sigMap[sig]=val; } else if (stricmp(argv[nCount], "-PCC")) { //check for -PCC arg to allow for profile connection conditions to be defined bUseMPE = true; nIntent = atoi(argv[nCount+1]); nType = abs(nIntent) / 10; nIntent = nIntent % 10; CIccProfile *pPccProfile = NULL; CIccCreateXformHintManager Hint; switch(nType) { case 1: nType = 0; bUseMPE = false; break; case 4: nType = 0; Hint.AddHint(new CIccApplyBPCHint()); break; } if (i+1<nNumProfiles && !stricmp(argv[nCount+2], "-PCC")) { pPccProfile = OpenIccProfile(argv[nCount+3]); if (!pPccProfile) { printf("Unable to open Profile Connections Conditions from '%s'\n", argv[nCount+3]); return -1; } //Keep track of pPccProfile for until after cmm.Begin is called pccList.push_back(pPccProfile); } if (sigMap.size()>0) { Hint.AddHint(new CIccCmmEnvVarHint(sigMap)); } if (namedCmm.AddXform(argv[nCount], nIntent<0 ? icUnknownIntent : (icRenderingIntent)nIntent, nInterp, pPccProfile, (icXformLutType)nType, bUseMPE, &Hint)) { printf("Invalid Profile: %s\n", argv[nCount]); return -1; } sigMap.clear(); } } icStatusCMM stat; if((stat=namedCmm.Begin())) { printf("Error %d - Unable to begin profile application - Possibly invalid or incompatible profiles\n", stat); return -1; } //Now we can release the pccProfile nodes. IccProfilePtrList::iterator pcc; for (pcc=pccList.begin(); pcc!=pccList.end(); pcc++) { CIccProfile *pPccProfile = *pcc; delete pPccProfile; } pccList.clear(); SrcspaceSig = namedCmm.GetSourceSpace(); int nSrcSamples = icGetSpaceSamples(SrcspaceSig); icColorSpaceSignature DestspaceSig = namedCmm.GetDestSpace(); int nDestSamples = icGetSpaceSamples(DestspaceSig); std::string OutPutData; char SrcNameBuf[256], DestNameBuf[256]; CIccPixelBuf SrcPixel(nSrcSamples+16), DestPixel(nDestSamples+16), Pixel(icIntMax(nSrcSamples, nDestSamples)+16); sprintf(tempBuf,"%s\t; ", icGetColorSig(tempBuf, DestspaceSig, false)); OutPutData += tempBuf; OutPutData += "Data Format\n"; if(DestspaceSig==icSigNamedData) destEncoding = icEncodeValue; sprintf(tempBuf, "%s\t; ", CIccCmm::GetFloatColorEncoding(destEncoding)); OutPutData += tempBuf; OutPutData += "Encoding\n\n"; OutPutData += ";Source Data Format: "; sprintf(tempBuf,"%s\n", icGetColorSig(tempBuf, SrcspaceSig, false)); OutPutData += tempBuf; if(SrcspaceSig==icSigNamedData) srcEncoding = icEncodeValue; OutPutData += ";Source Data Encoding: "; sprintf(tempBuf, "%s\n", CIccCmm::GetFloatColorEncoding(srcEncoding)); OutPutData += tempBuf; OutPutData += ";Source data is after semicolon\n"; OutPutData += "\n;Profiles applied\n"; for(i = 0, nCount=minargs; i<nNumProfiles; i++, nCount+=2) { OutPutData += "; "; if (stricmp(argv[nCount], "-PCC") && strnicmp(argv[nCount], "-ENV:", 5)) { if (i+1<nNumProfiles && !stricmp(argv[nCount+2], "-PCC")) { sprintf(tempBuf, "%s -PCC %s\n", argv[nCount], argv[nCount+3]); OutPutData += tempBuf; nCount += 2; nNumProfiles--; } else { sprintf(tempBuf, "%s\n", argv[nCount]); OutPutData += tempBuf; } } } OutPutData += "\n"; fwrite(OutPutData.c_str(), 1, OutPutData.length(), stdout); while(!InputData.eof()) { if(SrcspaceSig==icSigNamedData) { InputData.getline(tempBuf, sizeof(tempBuf)); if(!ParseName(SrcNameBuf, tempBuf)) continue; icChar *numptr = strstr(tempBuf, "\" }"); if (numptr) numptr+=3; icFloatNumber tint; if (!ParseNextNumber(tint, &numptr)) tint = 1.0; OutPutData.erase(); switch(namedCmm.GetInterface()) { case icApplyNamed2Pixel: { if(namedCmm.Apply(DestPixel, SrcNameBuf, tint)) { printf("Profile application failed.\n"); return -1; } if(CIccCmm::FromInternalEncoding(DestspaceSig, destEncoding, DestPixel, DestPixel, destEncoding!=icEncodeFloat)) { printf("Invalid final data encoding\n"); return -1; } for(i = 0; i<nDestSamples; i++) { sprintf(tempBuf, "%9.4lf ", DestPixel[i]); OutPutData += tempBuf; } OutPutData += "\t; "; break; } case icApplyNamed2Named: { if(namedCmm.Apply(DestNameBuf, SrcNameBuf, tint)) { printf("Profile application failed.\n"); return -1; } sprintf(tempBuf, "{ \"%s\" }\t; ", DestNameBuf); OutPutData += tempBuf; break; } case icApplyPixel2Pixel: case icApplyPixel2Named: default: printf("Incorrect interface.\n"); return -1; } if (tint==1.0) sprintf(tempBuf, "{ \"%s\" }\n", SrcNameBuf); else sprintf(tempBuf, "{ \"%s\" } %.4f\n", SrcNameBuf, tint); OutPutData += tempBuf; } else { InputData.getline(tempBuf, sizeof(tempBuf)); if(!ParseNumbers(Pixel, tempBuf, nSamples)) continue; OutPutData.erase(); if(CIccCmm::ToInternalEncoding(SrcspaceSig, srcEncoding, SrcPixel, Pixel)) { printf("Invalid source data encoding\n"); return -1; } switch(namedCmm.GetInterface()) { case icApplyPixel2Pixel: { if(namedCmm.Apply(DestPixel, SrcPixel)) { printf("Profile application failed.\n"); return -1; } if(CIccCmm::FromInternalEncoding(DestspaceSig, destEncoding, DestPixel, DestPixel)) { printf("Invalid final data encoding\n"); return -1; } for(i = 0; i<nDestSamples; i++) { sprintf(tempBuf, "%9.4lf ", DestPixel[i]); OutPutData += tempBuf; } OutPutData += "\t; "; break; } case icApplyPixel2Named: { if(namedCmm.Apply(DestNameBuf, SrcPixel)) { printf("Profile application failed.\n"); return -1; } sprintf(tempBuf, "{ \"%s\" }\t; ", DestNameBuf); OutPutData += tempBuf; break; } case icApplyNamed2Pixel: case icApplyNamed2Named: default: printf("Incorrect interface.\n"); return -1; } for(i = 0; i<nSamples; i++) { sprintf(tempBuf, "%9.4lf ", Pixel[i]); OutPutData += tempBuf; } OutPutData += "\n"; } fwrite(OutPutData.c_str(), 1, OutPutData.length(), stdout); } return 0; }