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