1 #include <stdio.h>
2 #include <iostream>
3 
4 #include "IccProfile.h"
5 #include "IccTag.h"
6 #include "IccUtil.h"
7 #include "IccDefs.h"
8 #include "WriteFunctions.h"
9 
10 //----------------------------------------------------
11 // Function Declarations
12 //----------------------------------------------------
13 
14 void ShowMenu();
15 std::string GetUserInput();
16 bool ConfirmExit();
17 void ShowHeader(CIccProfile *pIcc);
18 void ReadTag(CIccProfile *pIcc);
19 bool ShowTag(CIccProfile *pIcc, icTagSignature sig);
20 void SaveProfile(CIccProfile *pIcc);
21 void IsValidProfile(CIccIO *pIO, CIccProfile *pIcc);
22 void AddTag(CIccIO *pIO, CIccProfile *pIcc);
23 void DeleteTag(CIccIO *pIO, CIccProfile *pIcc);
24 void SaveProfCopy(CIccProfile *pIcc);
25 
26 
27 //----------------------------------------------------
28 // Function Definitions
29 //----------------------------------------------------
30 
31 
32 //===================================================
33 
ShowMenu()34 void ShowMenu()
35 {
36   printf("\n=======================================\n");
37   printf("0. Show Menu\n");
38   printf("1. Show Profile Header and Tag Table\n");
39   printf("2. Show tag contents\n");
40   printf("3. Add Tag\n");
41   printf("4. Save Profile and Exit\n");
42   printf("5. Validate Profile\n");
43   printf("6. Delete Tag\n");
44   printf("7. Save a copy of the profile.\n");
45   printf("9. Exit\n");
46   printf("=======================================\n");
47   printf("\nMenu Option [0-9]: ");
48 }
49 
50 //===================================================
51 
GetUserInput()52 std::string GetUserInput()
53 {
54   std::string Option;
55 	char str[256];
56 	std::cin.getline(str, 255);
57 	Option = str;
58   return Option;
59 }
60 
61 //===================================================
62 
ConfirmExit()63 bool ConfirmExit()
64 {
65   std::string Exit;
66   printf("\nExit? (y/n): ");
67   Exit = GetUserInput();
68 
69   return (("Y" == Exit) || ("y" == Exit));
70 }
71 
72 //===================================================
73 
ShowHeader(CIccProfile * pIcc)74 void ShowHeader(CIccProfile *pIcc)
75 {
76   icHeader *pHdr = &pIcc->m_Header;
77   CIccInfo Fmt;
78   icChar buf[64];
79 
80   printf("\nHeader\n");
81   printf(  "------\n");
82   printf("Profile Size:     %d(0x%x) bytes\n", pHdr->size, pHdr->size);
83 
84   if(Fmt.IsProfileIDCalculated(&pHdr->profileID))
85     printf("Profile ID:        %s\n", Fmt.GetProfileID(&pHdr->profileID));
86   else
87     printf("Profile ID:       Profile ID not calculated.\n");
88   printf("Attributes:       %s\n", Fmt.GetDeviceAttrName(pHdr->attributes));
89   printf("Cmm:              %s\n", Fmt.GetCmmSigName((icCmmSignature)(pHdr->cmmId)));
90   printf("Creation Date:    %d/%d/%d  %02u:%02u:%02u\n",
91                             pHdr->date.month, pHdr->date.day, pHdr->date.year,
92                             pHdr->date.hours, pHdr->date.minutes, pHdr->date.seconds);
93   printf("Creator:          %s\n", icGetSig(buf, pHdr->creator));
94   printf("Data Color Space: %s\n", Fmt.GetColorSpaceSigName(pHdr->colorSpace));
95   printf("Flags             %s\n", Fmt.GetProfileFlagsName(pHdr->flags));
96   printf("PCS Color Space:  %s\n", Fmt.GetColorSpaceSigName(pHdr->pcs));
97   printf("Platform:         %s\n", Fmt.GetPlatformSigName(pHdr->platform));
98   printf("Rendering Intent: %s\n", Fmt.GetRenderingIntentName((icRenderingIntent)(pHdr->renderingIntent)));
99   printf("Type:             %s\n", Fmt.GetProfileClassSigName(pHdr->deviceClass));
100   printf("Version:          %s\n", Fmt.GetVersionName(pHdr->version));
101   printf("Illuminant:       X=%.4lf, Y=%.4lf, Z=%.4lf\n",
102                           icFtoD(pHdr->illuminant.X),
103                           icFtoD(pHdr->illuminant.Y),
104                           icFtoD(pHdr->illuminant.Z));
105 
106   printf("\nProfile Tags\n");
107   printf(  "------------\n");
108 
109   printf("%25s    ID    %8s\t%8s\n", "Tag", "Offset", "Size");
110   printf("%25s  ------  %8s\t%8s\n", "----", "------", "----");
111 
112   TagEntryList::iterator i;
113 
114   for (i=pIcc->m_Tags->begin(); i!=pIcc->m_Tags->end(); i++) {
115     printf("%25s  %s  %8d\t%8d\n", Fmt.GetTagSigName(i->TagInfo.sig),
116                                      icGetSig(buf, i->TagInfo.sig, false),
117                                      i->TagInfo.offset, i->TagInfo.size);
118   }
119 
120 }
121 
122 //===================================================
123 
ReadTag(CIccProfile * pIcc)124 void ReadTag(CIccProfile *pIcc)
125 {
126   CIccInfo Fmt;
127   icChar buf[64];
128 
129   printf("\nProfile Tags\n");
130   printf(  "------------\n");
131 
132   printf("%25s    ID    %8s\t%8s\n", "Tag", "Offset", "Size");
133   printf("%25s  ------  %8s\t%8s\n", "----", "------", "----");
134 
135   TagEntryList::iterator i;
136 
137   for (i=pIcc->m_Tags->begin(); i!=pIcc->m_Tags->end(); i++) {
138     printf("%25s  %s  %8d\t%8d\n", Fmt.GetTagSigName(i->TagInfo.sig),
139                                      icGetSig(buf, i->TagInfo.sig, false),
140                                      i->TagInfo.offset, i->TagInfo.size);
141   }
142 
143   printf("\nNote: The above Offset & Size parameters DO NOT reflect any unsaved changes to profile.\n");
144 
145   printf("\nEnter the tag ID : ");
146   std::string TagID;
147   TagID = GetUserInput();
148 
149   if(!ShowTag(pIcc, (icTagSignature)icGetSigVal(TagID.c_str())))
150     printf("Tag (%s) not found in profile\n", TagID.c_str());
151 
152 }
153 
154 //===================================================
155 
ShowTag(CIccProfile * pIcc,icTagSignature sig)156 bool ShowTag(CIccProfile *pIcc, icTagSignature sig)
157 {
158   CIccTag *pTag = pIcc->FindTag(sig);
159   icChar buf[64];
160   CIccInfo Fmt;
161 
162   std::string contents;
163 
164   if (!pTag)
165     return false;
166 
167   printf("\n************ Tag Contents **************\n");
168 
169   printf("\nContents of %s tag (%s)\n", Fmt.GetTagSigName(sig), icGetSig(buf, sig));
170   printf("Type:   ");
171   if (pTag->IsArrayType()) {
172     printf("Array of ");
173   }
174   printf("%s\n", Fmt.GetTagTypeSigName(pTag->GetType()));
175   pTag->Describe(contents);
176   fwrite(contents.c_str(), contents.length(), 1, stdout);
177 
178   printf("\n****************************************\n");
179 
180   return true;
181 }
182 
183 
184 //===================================================
185 
SaveProfile(CIccProfile * pIcc)186 void SaveProfile(CIccProfile *pIcc)
187 {
188   printf("\nSave Profile as [Ex- Filename.icc]: ");
189 
190   std::string szFilename;
191   szFilename = GetUserInput();
192 
193   if(SaveIccProfile(szFilename.c_str(),pIcc))
194     printf("\nProfile successfully saved.\n");
195   else
196     printf("\nError saving Profile.\n");
197 
198 }
199 
200 //===================================================
201 
SaveProfCopy(CIccProfile * pIcc)202 void SaveProfCopy(CIccProfile *pIcc)
203 {
204   CIccProfile* pCopy = pIcc;
205   SaveProfile(pCopy);
206 }
207 
208 //===================================================
209 
IsValidProfile(CIccIO * pIO,CIccProfile * pIcc)210 void IsValidProfile(CIccIO *pIO, CIccProfile *pIcc)
211 {
212   std::string str;
213   icValidateStatus stat = pIcc->ReadValidate(pIO, str);
214   stat = icMaxStatus(stat, pIcc->Validate(str));
215 
216   switch(stat) {
217     case icValidateOK:
218     default:
219       printf("\nVALID PROFILE! See below for details:\n");
220       break;
221     case icValidateWarning:
222       printf("\nVALID PROFILE with warning(s)! See below for details:\n");
223       break;
224     case icValidateNonCompliant:
225       printf("\nNON-COMPLIANT PROFILE! See below for details:\n");
226       break;
227     case icValidateCriticalError:
228       printf("\nERROR - INVALID PROFILE! See below for details:\n");
229       break;
230   }
231 
232   printf("\n%s\n", str.c_str());
233 
234 }
235 
236 //===================================================
237 
AddTag(CIccIO * pIO,CIccProfile * pIcc)238 void AddTag(CIccIO *pIO, CIccProfile *pIcc)
239 {
240   std::string textIn;
241 
242   printf("Enter tag signature to be added [ex- cprt] : ");
243   textIn = GetUserInput();
244 
245 	icTagSignature tagSig = (icTagSignature)icGetSigVal(textIn.c_str());
246 
247 	switch (tagSig) {
248 		case icSigProfileDescriptionTag:
249 		case icSigCopyrightTag:
250 			printf("Enter the text to be saved in the tag : ");
251 			textIn = GetUserInput();
252 			if(!AddTextTag(textIn.c_str(), pIcc, tagSig))
253 				printf("Write operation failed.\n");
254 			else
255 				printf("Tag added successfully.\n");
256 			break;
257 		default:
258 			if(!WriteTag(pIcc, tagSig))
259 				printf("Write operation failed.\n");
260 			else
261 				printf("Tag added successfully.\n");
262 	}
263 
264 }
265 
266 //===================================================
267 
DeleteTag(CIccIO * pIO,CIccProfile * pIcc)268 void DeleteTag(CIccIO *pIO, CIccProfile *pIcc)
269 {
270   std::string tagtype;
271 
272   printf("Enter tag signature to be deleted [ex- cprt] : ");
273   tagtype = GetUserInput();
274 
275   if(!pIcc->DeleteTag((icTagSignature)icGetSigVal(tagtype.c_str())))
276     printf("Delete operation failed.\n");
277   else
278     printf("Tag deleted successfully.\n");
279 }
280 
281 //===================================================
282 
main(int argc,icChar * argv[])283 int main(int argc, icChar* argv[])
284 {
285   if (argc<=1) {
286     printf("Usage: CmdIccProfLibTest profile\n");
287     return -1;
288   }
289 
290 
291   CIccFileIO FileIO;
292   if (!FileIO.Open(argv[1], "rb")) {
293     printf("Unable to open '%s'\n", argv[1]);
294     return -1;
295   }
296 
297   CIccProfile *pIcc = new CIccProfile;
298 
299   if(!pIcc->Read(&FileIO)) {
300     printf("Unable to read '%s'\n", argv[1]);
301     delete pIcc;
302     return -1;
303   }
304 
305   bool Exit = false;
306   std::string Option;
307 
308   ShowMenu();
309 
310   while(!Exit) {
311     Option = GetUserInput();
312     if(Option.size() >=2) {
313       printf("\nInvalid Option\n");
314       return -1;
315     }
316 
317     icChar temp = Option[0];
318 
319     switch(temp) {
320     case '0':
321       ShowMenu();
322       break;
323     case '1':
324       ShowHeader(pIcc);
325       ShowMenu();
326       break;
327     case '2':
328       ReadTag(pIcc);
329       ShowMenu();
330       break;
331     case '3':
332       AddTag(&FileIO,pIcc);
333       ShowMenu();
334       break;
335     case '4':
336       SaveProfile(pIcc);
337       return 0;
338     case '5':
339       IsValidProfile(&FileIO, pIcc);
340       ShowMenu();
341       break;
342     case '6':
343       DeleteTag(&FileIO, pIcc);
344       ShowMenu();
345       break;
346     case '7':
347       SaveProfCopy(pIcc);
348       ShowMenu();
349       break;
350     case '9':
351       Exit = ConfirmExit();
352       if(!Exit) ShowMenu();
353       break;
354     default:
355       printf("\nInvalid Option\n");
356       ShowMenu();
357     }
358   }
359 
360 
361   delete pIcc;
362 
363   return 0;
364 }
365