89#include "wx/toolbar.h"
91#include "wx/filename.h"
92#include "wx/filedlg.h"
94#if !defined(__WXMSW__)
98#include "bitmaps/new.xpm"
99#include "bitmaps/open.xpm"
100#include "bitmaps/save.xpm"
101#include "bitmaps/copy.xpm"
102#include "bitmaps/cut.xpm"
103#include "bitmaps/paste.xpm"
104#include "bitmaps/print.xpm"
105#include "bitmaps/help.xpm"
110#if wxMAJOR_VERSION > 2
111#define wxOPEN wxFD_OPEN
112#define wxFILE_MUST_EXIST wxFD_FILE_MUST_EXIST
137#define ID_VALIDATE_PROFILE 1000
138#define ID_TAG_LIST 1001
139#define ID_ROUND_TRIP 1002
141BEGIN_EVENT_TABLE(
MyFrame, wxMDIParentFrame)
148 EVT_SIZE(MyFrame::OnSize)
154BEGIN_EVENT_TABLE(
MyChild, wxMDIChildFrame)
176 wxDefaultPosition, wxSize(1024, 768),
177 wxDEFAULT_FRAME_STYLE | wxHSCROLL | wxVSCROLL);
181 wxConfig config(
wxT(
"wxProfileDump"));
183 m_history.Load(config);
188 wxMenu* windowMenu =
new wxMenu;
189 windowMenu->Append(5000, _T(
"My menu item!"));
190 my_frame->SetWindowMenu(windowMenu);
196 my_frame->SetIcon(wxIcon(_T(
"wxProfileDump_icn")));
202 wxMenu *file_menu =
new wxMenu;
204 file_menu->Append(
MDI_OPEN_PROFILE, _T(
"&Open Profile\tCtrl-O"), _T(
"Open an ICC profile"));
205 file_menu->Append(
MDI_QUIT, _T(
"&Exit\tAlt-X"), _T(
"Quit the program"));
207 m_history.UseMenu(file_menu);
208 m_history.AddFilesToMenu(file_menu);
210 wxMenu *help_menu =
new wxMenu;
211 help_menu->Append(
MDI_ABOUT, _T(
"&About\tF1"));
213 wxMenuBar *menu_bar =
new wxMenuBar;
215 menu_bar->Append(file_menu, _T(
"&File"));
216 menu_bar->Append(help_menu, _T(
"&Help"));
253 const wxString& title,
257 : wxMDIParentFrame(parent, id, title, pos, size,
258 style | wxNO_FULL_REPAINT_ON_RESIZE)
261 CreateToolBar(wxNO_BORDER | wxTB_FLAT | wxTB_HORIZONTAL);
266 wxAcceleratorEntry entries[3];
268 entries[1].Set(wxACCEL_CTRL, (
int)
'X',
MDI_QUIT);
269 entries[2].Set(wxACCEL_CTRL, (
int)
'A',
MDI_ABOUT);
270 wxAcceleratorTable accel(3, entries);
271 SetAcceleratorTable(accel);
279 msg.Printf(_T(
"%d windows still open, close anyhow?"),
gs_nFrames);
280 if ( wxMessageBox(msg, _T(
"Please confirm"),
281 wxICON_QUESTION | wxYES_NO) != wxYES )
299 (void)wxMessageBox(_T(
"wxProfileDump\n")
300 _T(
"Copyright (C) 2005-2023\n\n")
302 _T(
"About wxProfileDump"));
307 wxFileName filepath(profilePath);
308 wxString profileTitle = filepath.GetName();
310 char * pPath = strdup( profilePath.mb_str() );
314 (void)wxMessageBox(wxString(_T(
"Unable to open profile '")) + profilePath + _T(
"'"),
319 wxGetApp().m_history.AddFileToHistory(profilePath);
324 subframe->SetTitle(profileTitle);
328 subframe->SetIcon(wxIcon(_T(
"ProfileDumpDoc_icn")));
334 wxMenu *file_menu =
new wxMenu;
338 file_menu->Append(
MDI_CHILD_QUIT, _T(
"&Close"), _T(
"Close this window"));
339 file_menu->Append(
MDI_QUIT, _T(
"&Exit"));
341 wxGetApp().m_history.UseMenu(file_menu);
342 wxGetApp().m_history.AddFilesToMenu(file_menu);
344 wxMenu *help_menu =
new wxMenu;
345 help_menu->Append(
MDI_ABOUT, _T(
"&About"));
347 wxMenuBar *menu_bar =
new wxMenuBar;
349 menu_bar->Append(file_menu, _T(
"&File"));
350 menu_bar->Append(help_menu, _T(
"&Help"));
353 subframe->SetMenuBar(menu_bar);
354 subframe->Show(
true);
359 wxString profilePath;
362 wxFileDialog dialog(
this, _T(
"Open Profile"), wxEmptyString, wxEmptyString, _T(
"ICC files (*.icc)|*.icc|ICM files (*.icm)|*.icm|All files|*.*"), wxOPEN |wxFILE_MUST_EXIST);
364 if (dialog.ShowModal()!=wxID_OK)
367 profilePath = dialog.GetPath();
370 profilePath = wxGetApp().m_history.GetHistoryFile(event.GetId() - wxID_FILE1);
380 wxBitmap* bitmaps[6];
383 bitmaps[index++] =
new wxBitmap( open_xpm );
388 bitmaps[index++] =
new wxBitmap( help_xpm );
394 toolBar->AddTool(
MDI_OPEN_PROFILE, _T(
"Open"), *(bitmaps[index]), _T(
"Open Profile"));
395 currentX += width + 5;
415 toolBar->AddSeparator();
418 toolBar->AddTool(
MDI_ABOUT, _T(
"Help"), *bitmaps[index], _T(
"Help"));
423 for (i = 0; i <= index; i++)
453MyChild::MyChild(wxMDIParentFrame *parent,
const wxString& title, CIccProfile *pIcc,
const wxString &profilePath)
454 : wxMDIChildFrame(parent, wxID_ANY, title, wxDefaultPosition, wxSize(750,900),
455 wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE)
463 SetSizeHints(750, 900);
466 m_panel =
new wxPanel(
this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxCLIP_CHILDREN);
468 wxSizer *sizerTop =
new wxBoxSizer(wxVERTICAL);
469 wxSizer *sizerBox =
new wxStaticBoxSizer(
new wxStaticBox(
m_panel, wxID_ANY, _T(
"&Profile Header")), wxVERTICAL);
496 sizerTop->Add(sizerBox, wxSizerFlags().Expand().Border(wxALL, 5));
498 wxSizer *sizerBtn =
new wxBoxSizer(wxHORIZONTAL);
500 sizerBtn->Add(
new wxButton(
m_panel,
ID_ROUND_TRIP, _(
"&Round Trip Report")), wxSizerFlags().Border(wxRIGHT, 5));
504 sizerTop->Add(sizerBtn, wxSizerFlags().Right());
506 wxSizer *sizerLabel =
new wxBoxSizer(wxHORIZONTAL);
507 sizerLabel->Add(
new wxStaticText(
m_panel, wxID_ANY, _(
"Profile Tags")), wxSizerFlags().Border(wxLEFT, 5));
509 sizerTop->Add(sizerLabel, wxSizerFlags().Left());
512 wxSizer *sizerTags =
new wxBoxSizer(wxVERTICAL);
513 sizerTags->Add(
m_tagsCtrl, wxSizerFlags(1).Expand().Border(wxALL, 0));
514 sizerTags->SetItemMinSize((
size_t)0, 455, 175);
515 sizerTop->Add(sizerTags, wxSizerFlags(1).Expand().Border(wxALL, 5));
517 m_tagsCtrl->InsertColumn(0, _(
"#"), wxLIST_FORMAT_RIGHT, 30);
518 m_tagsCtrl->InsertColumn(1, _(
"Tag ID"), wxLIST_FORMAT_LEFT, 210);
519 m_tagsCtrl->InsertColumn(2, _(
"Tag Type"), wxLIST_FORMAT_LEFT, 210);
520 m_tagsCtrl->InsertColumn(3, _(
"Offset"), wxLIST_FORMAT_RIGHT, 100);
521 m_tagsCtrl->InsertColumn(4, _(
"Size"), wxLIST_FORMAT_RIGHT, 100);
522 m_tagsCtrl->InsertColumn(5, _(
"Padding"), wxLIST_FORMAT_RIGHT, 100);
526 sizerTop->SetSizeHints(
this );
538 for (n = 0; n < 16; n++) {
545 m_textSize->SetLabel(wxString::Format(_T(
"%d (0x%x) bytes"), pHdr->
size, pHdr->
size));
569 m_textIlluminant->SetLabel(wxString::Format(_T(
"X=%.4lf, Y=%.4lf, Z=%.4lf"),
601 int item, closest, pad;
602 TagEntryList::iterator i, j;
604 for (n = 0, i = pIcc->m_Tags->begin(); i != pIcc->m_Tags->end(); i++, n++) {
605 item =
m_tagsCtrl->InsertItem(n, wxString::Format(
"%d", n));
608 closest = pHdr->
size;
609 for (j = pIcc->m_Tags->begin(); j != pIcc->m_Tags->end(); j++) {
610 if ((i != j) && (j->TagInfo.offset >= i->TagInfo.offset + i->TagInfo.size) && ((
int)j->TagInfo.offset <= closest)) {
611 closest = j->TagInfo.offset;
616 pad = closest - i->TagInfo.offset - i->TagInfo.size;
619 CIccTag* pTag = pIcc->FindTag(i->TagInfo.sig);
621 m_tagsCtrl->SetItem(item, 2, _T(
"***Invalid Tag!***"));
625 m_tagsCtrl->SetItem(item, 3, wxString::Format(
"%d", i->TagInfo.offset));
626 m_tagsCtrl->SetItem(item, 4, wxString::Format(
"%d", i->TagInfo.size));
627 m_tagsCtrl->SetItem(item, 5, wxString::Format(
"%d", pad));
629 m_tagsCtrl->SetItemData(item, (
long)i->TagInfo.sig);
644 wxSizer *sizerRow =
new wxBoxSizer(wxHORIZONTAL);
646 wxSize winSize = wxDefaultSize;
648 winSize.SetWidth(210);
649 wxStaticText *label =
new wxStaticText(
m_panel, wxID_ANY, labelText, wxDefaultPosition, winSize, wxALIGN_RIGHT);
651 winSize.SetWidth(250);
652 wxStaticText *text =
new wxStaticText(
m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, winSize, wxSTATIC_BORDER|wxTE_RIGHT);
654 sizerRow->Add(label, 0, wxRIGHT | wxALIGN_CENTRE_VERTICAL, 5);
655 sizerRow->Add(text, 1, wxLEFT | wxALIGN_CENTRE_VERTICAL, 5);
706 wxDialog(pParent, wxID_ANY, title,wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
708 wxSizer *sizer =
new wxBoxSizer(wxVERTICAL);
709 wxSizer *sizerRow =
new wxBoxSizer(wxHORIZONTAL);
711 wxSize winSize = wxDefaultSize;
713 winSize.SetWidth(100);
714 wxStaticText *labelSttus =
new wxStaticText(
this, wxID_ANY, _T(
"Validation Status:"), wxDefaultPosition, winSize, wxALIGN_RIGHT);
716 winSize.SetWidth(500);
717 wxStaticText *textStatus =
new wxStaticText(
this, wxID_ANY, wxEmptyString, wxDefaultPosition, winSize,
718 wxSTATIC_BORDER | wxTE_LEFT | wxST_ELLIPSIZE_END);
720 sizerRow->Add(labelSttus, 0, wxALL | wxALIGN_CENTRE_VERTICAL, 5);
721 sizerRow->Add(textStatus, 1, wxALL | wxALIGN_CENTRE_VERTICAL, 5);
723 sizer->Add(sizerRow, wxSizerFlags().Expand());
725 winSize = wxSize(500, 400);
726 wxTextCtrl *textReport =
new wxTextCtrl(
this, wxID_ANY, wxEmptyString, wxDefaultPosition, winSize,
727 wxTE_MULTILINE | wxTE_READONLY | wxTE_RICH | wxTE_BESTWRAP);
729 sizer->Add(textReport, wxSizerFlags(1).Expand());
732 wxString theReport, theValidateStatus;
736 if (profilePath.IsEmpty()) {
737 theReport =
"Invalid Profile Path!\n";
743 char * pPath = strdup( profilePath.mb_str() );
747 TagEntryList::iterator i, j;
752 ver_str =
" for version ";
757 for (n = 0, i = pIcc->m_Tags->begin(); i != pIcc->m_Tags->end(); i++, n++)
758 for (m = 0, j = pIcc->m_Tags->begin(); j != pIcc->m_Tags->end(); j++, m++)
759 if ((i != j) && (i->TagInfo.sig == j->TagInfo.sig)) {
760 sprintf(str,
"%28s is duplicated at positions %d and %d!\n", Fmt.
GetTagSigName(i->TagInfo.sig), n, m);
777 int closest, pad, rndup, smallest_offset = pHdr->
size;
784 sReport +=
"File size is not a multiple of 4 bytes (last tag needs padding?).\n";
788 for (i = pIcc->m_Tags->begin(); i != pIcc->m_Tags->end(); i++) {
789 rndup = 4 * ((i->TagInfo.size + 3) / 4);
790 pad = rndup - i->TagInfo.size;
793 if (i->TagInfo.offset + i->TagInfo.size > pHdr->
size) {
795 sprintf(str,
"Tag %s (offset %d, size %d) ends beyond EOF.\n",
796 Fmt.
GetTagSigName(i->TagInfo.sig), i->TagInfo.offset, i->TagInfo.size);
802 if ((
int)i->TagInfo.offset < smallest_offset) {
803 smallest_offset = (int)i->TagInfo.offset;
807 closest = pHdr->
size;
808 for (j = pIcc->m_Tags->begin(); j != pIcc->m_Tags->end(); j++) {
809 if ((i != j) && (j->TagInfo.offset > i->TagInfo.offset) && ((
int)j->TagInfo.offset <= closest)) {
810 closest = j->TagInfo.offset;
815 if ((closest < (
int)i->TagInfo.offset + (int)i->TagInfo.size) && (closest < (int)pHdr->
size)) {
817 sprintf(str,
"Tag %s (offset %d, size %d) overlaps with following tag data starting at offset %d.\n",
818 Fmt.
GetTagSigName(i->TagInfo.sig), i->TagInfo.offset, i->TagInfo.size, closest);
824 if (closest > (
int)i->TagInfo.offset + rndup) {
826 sprintf(str,
"Tag %s (size %d) is followed by %d unnecessary additional bytes (from offset %d).\n",
827 Fmt.
GetTagSigName(i->TagInfo.sig), i->TagInfo.size, closest - (i->TagInfo.offset + rndup), (i->TagInfo.offset + rndup));
835 if ((n > 0) && (smallest_offset > 128 + 4 + (n * 12))) {
837 sprintf(str,
"First tag data is at offset %d rather than immediately after tag table (offset %d).\n",
838 smallest_offset, 128 + 4 + (n * 12));
847 sReport =
"There is nothing to report.\n";
849 theReport = sReport.c_str();
852 wxColour status_color = *wxBLACK;
855 status_color = wxColour(
"DARK GREEN");
856 ver_str =
"Valid Profile" + ver_str;
860 status_color = wxColour(
"ORANGE RED");
861 ver_str =
"Validation Warning(s)" + ver_str;
865 status_color = *wxRED;
866 ver_str =
"Profile violates ICC Specification" + ver_str;
870 status_color = *wxRED;
871 ver_str =
"Critical Error - Profile Violates ICC Specification" + ver_str;
875 status_color = *wxRED;
876 ver_str =
"Unknown Validation Status";
879 theValidateStatus = ver_str.c_str();
881 textStatus->SetForegroundColour(status_color);
882 textStatus->SetLabel(theValidateStatus);
883 *textReport << theReport;
968 char * pPath = strdup( profilePath.mb_str() );
969 clock_t start = clock();
973 report += wxString::Format(
" Unable to perform round trip on '%s'\n", profilePath.c_str());
975 report +=
"CMM Status: ";
976 report += CIccCmm::GetStatusText(stat);
985 clock_t elapsed = clock() - start;
988 report += wxString::Format(
" Unable to perform PRMG analysis on '%s'\n", profilePath.c_str());
995 report += wxString::Format(
"Specified Rendering Intent Gamut: %s\n", prmg.
m_bPrmgImplied ?
"Perceptual Reference Medium Gamut" :
"Not Specified");
997 report += wxString::Format(
"\n Round Trip 1\n");
998 report += wxString::Format(
" ------------\n");
999 report += wxString::Format(
" Min DeltaE: %8.2" ICFLOATSFX "\n", eval.
minDE1);
1001 report += wxString::Format(
" Max DeltaE: %8.2" ICFLOATSFX "\n\n", eval.
maxDE1);
1005 report += wxString::Format(
"\n Round Trip 2\n");
1006 report += wxString::Format(
" ------------\n");
1007 report += wxString::Format(
" Min DeltaE: %8.2" ICFLOATSFX "\n", eval.
minDE2);
1009 report += wxString::Format(
" Max DeltaE: %8.2" ICFLOATSFX "\n", eval.
maxDE2);
1010 report += wxString::Format(
" DE <= 1.0 (%8u): %5.1f%%\n\n", eval.
num3, (
float)eval.
num3 / (
float)eval.
m_nTotal*100.0);
1015 report += wxString::Format(
"\n PRMG Interoperability - Round Trip Results\n");
1016 report += wxString::Format(
" ------------------------------------------------------\n");
1018 report += wxString::Format(
" DE <= 1.0 (%8u): %5.1f%%\n", prmg.
m_nDE1, (
float)prmg.
m_nDE1/(
float)prmg.
m_nTotal*100.0);
1019 report += wxString::Format(
" DE <= 2.0 (%8u): %5.1f%%\n", prmg.
m_nDE2, (
float)prmg.
m_nDE2/(
float)prmg.
m_nTotal*100.0);
1020 report += wxString::Format(
" DE <= 3.0 (%8u): %5.1f%%\n", prmg.
m_nDE3, (
float)prmg.
m_nDE3/(
float)prmg.
m_nTotal*100.0);
1021 report += wxString::Format(
" DE <= 5.0 (%8u): %5.1f%%\n", prmg.
m_nDE5, (
float)prmg.
m_nDE5/(
float)prmg.
m_nTotal*100.0);
1022 report += wxString::Format(
" DE <=10.0 (%8u): %5.1f%%\n", prmg.
m_nDE10, (
float)prmg.
m_nDE10/(
float)prmg.
m_nTotal*100.0);
1023 report += wxString::Format(
" Total (%8u)\n", prmg.
m_nTotal);
1028 report += wxString::Format(
"Evaluation took %f seconds\n\n", (
double)elapsed / (
double)CLOCKS_PER_SEC);
1034 wxDialog(pParent, wxID_ANY, title,wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
1036 wxSizer *sizer =
new wxBoxSizer(wxVERTICAL);
1037 wxSize winSize = winSize = wxSize(500, 400);
1038 wxTextCtrl *textReport =
new wxTextCtrl(
this, wxID_ANY, wxEmptyString, wxDefaultPosition, winSize,
1039 wxTE_MULTILINE |wxTE_READONLY | wxTE_RICH);
1041 sizer->Add(textReport, wxSizerFlags(1).Expand());
1045 if (profilePath.IsEmpty()) {
1046 theReport =
"Invalid Profile Path\n";
1049 bool bRelative =
false;
1051 wxBeginBusyCursor();
1097 if (theReport.IsEmpty())
1098 theReport =
"There is nothing to report\n";
1101 textReport->SetLabel(theReport);
1108wxDialog(pParent, wxID_ANY, _T(
"View Tag"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
1122 sTagType = _T(
"Array of ");
1129 wxBeginBusyCursor();
1135 sTagType =
"***Invalid Tag!***";
1141 desc =
"Data contents of tag:\n\n";
1145 desc =
"Invalid Tag Directory Entry!\n";
1149 desc =
"Invalid Tag Entry!\n";
1150 sTagType =
"***Invalid Tag***";
1153 wxSizer *sizer =
new wxBoxSizer(wxVERTICAL);
1155 wxSizer *sizerRow1 =
new wxBoxSizer(wxHORIZONTAL);
1156 wxSize winSize = wxDefaultSize;
1158 winSize.SetWidth(100);
1159 wxStaticText *labelSig =
new wxStaticText(
this, wxID_ANY, _T(
"Tag Signature:"), wxDefaultPosition, winSize, wxALIGN_RIGHT);
1161 winSize.SetWidth(400);
1162 wxStaticText *textSig =
new wxStaticText(
this, wxID_ANY, sTagSignature, wxDefaultPosition, winSize, wxSTATIC_BORDER|wxTE_RIGHT);
1164 sizerRow1->Add(labelSig, 0, wxALL | wxALIGN_CENTRE_VERTICAL, 5);
1165 sizerRow1->Add(textSig, 1, wxALL | wxALIGN_CENTRE_VERTICAL, 5);
1167 sizer->Add(sizerRow1, wxSizerFlags().Expand());
1169 wxSizer *sizerRow2 =
new wxBoxSizer(wxHORIZONTAL);
1170 winSize = wxDefaultSize;
1172 winSize.SetWidth(100);
1173 wxStaticText *labelType =
new wxStaticText(
this, wxID_ANY, _T(
"Tag Type:"), wxDefaultPosition, winSize, wxALIGN_RIGHT);
1175 winSize.SetWidth(400);
1176 wxStaticText *textType =
new wxStaticText(
this, wxID_ANY, sTagType, wxDefaultPosition, winSize, wxSTATIC_BORDER|wxTE_RIGHT);
1178 sizerRow2->Add(labelType, 0, wxALL | wxALIGN_CENTRE_VERTICAL, 5);
1179 sizerRow2->Add(textType, 1, wxALL | wxALIGN_CENTRE_VERTICAL, 5);
1181 sizer->Add(sizerRow2, wxSizerFlags().Expand());
1183 winSize = wxSize(500, 400);
1184 wxTextCtrl *textReport =
new wxTextCtrl(
this, wxID_ANY, wxString(desc.c_str()), wxDefaultPosition, winSize,
1185 wxTE_MULTILINE |wxTE_READONLY | wxTE_RICH| wxTE_DONTWRAP);
1187 sizer->Add(textReport, wxSizerFlags(1).Expand());
icStatusCMM
CMM return status values.
float icFloatNumber
All floating point operations/variables in IccProfLib use the icFloatNumber data type.
#define ICFLOATSFX
String formating macros need to match precision of icFloatNumber If precision is double change the "f...
@ icValidateCriticalError
CIccProfile * ValidateIccProfile(CIccIO *pIO, std::string &sReport, icValidateStatus &nStatus)
Name: ValidateIccProfile.
CIccProfile * OpenIccProfile(const icChar *szFilename, bool bUseSubProfile)
Name: OpenIccProfile.
icValidateStatus icMaxStatus(icValidateStatus s1, icValidateStatus s2)
Name: icMaxStatus.
const char * icMsgValidateWarning
icFloatNumber icFtoD(icS15Fixed16Number num)
void icMemDump(std::string &sDump, void *pBuf, icUInt32Number nNum)
icFloatNumber icDeltaE(const icFloatNumber *lab1, const icFloatNumber *lab2)
const char * icMsgValidateNonCompliant
icFloatNumber icF16toF(icFloat16Number num)
const icChar * icGetSig(icChar *pBuf, icUInt32Number nSig, bool bGetHexVal)
unsigned int icUInt32Number
icStatusCMM EvaluateProfile(CIccProfile *pProfile, icUInt8Number nGran=0, icRenderingIntent nIntent=((icRenderingIntent) 0x3f3f3f3f), icXformInterp nInterp=icInterpLinear, bool buseMpeTags=true)
const icChar * GetVersionName(icUInt32Number val)
const icChar * GetSpectralColorSigName(icSpectralColorSignature sig)
const icChar * GetCmmSigName(icCmmSignature sig)
const icChar * GetProfileClassSigName(icProfileClassSignature sig)
const icChar * GetTagSigName(icTagSignature sig)
const icChar * GetProfileFlagsName(icUInt32Number val, bool bCheckMCS=false)
const icChar * GetPlatformSigName(icPlatformSignature sig)
const icChar * GetColorSpaceSigName(icColorSpaceSignature sig)
const icChar * GetTagTypeSigName(icTagTypeSignature sig)
const icChar * GetDeviceAttrName(icUInt64Number val)
const icChar * GetSubClassVersionName(icUInt32Number val)
const icChar * GetRenderingIntentName(icRenderingIntent val, bool bIsV5=false)
icUInt8Number * GetData()
virtual icInt32Number GetLength()
void Compare(icFloatNumber *pixel, icFloatNumber *deviceLab, icFloatNumber *lab1, icFloatNumber *lab2)
icStatusCMM EvaluateProfile(CIccProfile *pProfile, icRenderingIntent nIntent=((icRenderingIntent) 0x3f3f3f3f), icXformInterp nInterp=icInterpLinear, bool buseMpeTags=true)
virtual icTagTypeSignature GetType() const
Function: GetType()
virtual void Describe(std::string &sDescription, int nVerboseness=0)
Function: Describe(sDescription) Each derived tag will implement it's own Describe() function.
virtual bool IsArrayType()
wxStaticText * m_textIlluminant
wxStaticText * m_textAttribute
wxStaticText * m_textDeviceManufacturer
wxStaticText * m_textSubClass
wxStaticText * m_textFlags
wxSizer * CreateSizerWithText(const wxString &labelText, wxStaticText **ppText)
wxStaticText * m_textPlatform
wxStaticText * m_textRenderingIntent
wxStaticText * m_textSpectralWavelengths
void OnQuit(wxCommandEvent &event)
void OnValidate(wxCommandEvent &event)
void SetFileMenu(wxMenu *menu)
wxStaticText * m_textCreator
wxStaticText * m_textSize
void OnClose(wxCloseEvent &event)
wxStaticText * m_textBiSpectralWavelengths
wxStaticText * m_textClass
wxStaticText * m_textColorSpace
wxStaticText * m_textSpectralPCS
wxStaticText * m_textProfileID
void OnTagClicked(wxListEvent &event)
void OnRoundTrip(wxCommandEvent &event)
MyChild(wxMDIParentFrame *parent, const wxString &title, CIccProfile *pIcc, const wxString &profilePath)
wxStaticText * m_textSubClassVersion
wxStaticText * m_textVersion
wxStaticText * m_textCreationDate
wxStaticText * m_textMaterialColorSpace
MyDialog(wxWindow *pParent, const wxString &title, wxString &profilePath)
void OpenFile(wxString path)
void OnOpenProfile(wxCommandEvent &event)
void OnQuit(wxCommandEvent &event)
void InitToolBar(wxToolBar *toolBar)
void OnAbout(wxCommandEvent &event)
void OnClose(wxCloseEvent &event)
MyFrame(wxWindow *parent, const wxWindowID id, const wxString &title, const wxPoint &pos, const wxSize &size, const long style)
MyRoundTripDialog(wxWindow *pParent, const wxString &title, wxString &profilePath, CIccProfile *pIcc)
MyTagDialog(wxWindow *pParent, CIccProfile *pIcc, icTagSignature sig, CIccTag *pTag)
wxString AnalyzeRoundTrip(wxString &profilePath, icRenderingIntent nIntent, bool bUseMPE)
#define ID_VALIDATE_PROFILE
static bool IsRoundTripable(CIccProfile *pIcc)