wxImage::AddHandler( new wxJP2Handler );\r
wxImage::AddHandler( new wxMJ2Handler );\r
#endif\r
- // we use a PNG image in our HTML page\r
- wxImage::AddHandler(new wxPNGHandler);\r
+ // we use a XPM image in our HTML page\r
+ wxImage::AddHandler(new wxXPMHandler);\r
+\r
+ // memory file system\r
+ wxFileSystem::AddHandler(new wxMemoryFSHandler);\r
\r
// set decoding engine parameters\r
+ m_resizemethod = 0;\r
m_reducefactor = 0;\r
m_qualitylayers = 0;\r
m_components = 0;\r
+ m_framenum = 0;\r
#ifdef USE_JPWL\r
m_enablejpwl = true;\r
m_expcomps = JPWL_EXPECTED_COMPONENTS;\r
if (!(m_filelist.IsEmpty())) {\r
//wxLogMessage(wxT("Habemus files!!!"));\r
wxArrayString paths, filenames;\r
- for (int f = 0; f < wxGetApp().m_filelist.GetCount(); f++) {\r
+ for (unsigned int f = 0; f < wxGetApp().m_filelist.GetCount(); f++) {\r
paths.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullPath());\r
filenames.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullName());\r
}\r
EVT_MENU(OPJFRAME_FILECLOSE, OPJFrame::OnClose)\r
EVT_MENU(OPJFRAME_VIEWZOOM, OPJFrame::OnZoom)\r
EVT_MENU(OPJFRAME_VIEWFIT, OPJFrame::OnFit)\r
- EVT_MENU(OPJFRAME_FILETOGGLE, OPJFrame::OnToggleWindow)\r
+ EVT_MENU(OPJFRAME_VIEWRELOAD, OPJFrame::OnReload)\r
+ EVT_MENU(OPJFRAME_FILETOGGLEB, OPJFrame::OnToggleBrowser)\r
+ EVT_MENU(OPJFRAME_FILETOGGLEP, OPJFrame::OnTogglePeeker)\r
EVT_MENU(OPJFRAME_SETSDECO, OPJFrame::OnSetsDeco)\r
EVT_SASH_DRAGGED_RANGE(OPJFRAME_BROWSEWIN, OPJFRAME_LOGWIN, OPJFrame::OnSashDrag)\r
EVT_NOTEBOOK_PAGE_CHANGED(LEFT_NOTEBOOK_ID, OPJFrame::OnNotebook)\r
file_menu->Append(OPJFRAME_FILEOPEN, wxT("&Open\tCtrl+O"));\r
file_menu->SetHelpString(OPJFRAME_FILEOPEN, wxT("Open one or more files"));\r
\r
- file_menu->Append(OPJFRAME_FILETOGGLE, wxT("&Toggle browser\tCtrl+T"));\r
- file_menu->SetHelpString(OPJFRAME_FILETOGGLE, wxT("Toggle the left browsing pane"));\r
+ file_menu->Append(OPJFRAME_FILETOGGLEB, wxT("Toggle &browser\tCtrl+B"));\r
+ file_menu->SetHelpString(OPJFRAME_FILETOGGLEB, wxT("Toggle the left browsing pane"));\r
+\r
+ file_menu->Append(OPJFRAME_FILETOGGLEP, wxT("Toggle &peeker\tCtrl+P"));\r
+ file_menu->SetHelpString(OPJFRAME_FILETOGGLEP, wxT("Toggle the bottom peeking pane"));\r
\r
file_menu->Append(OPJFRAME_FILECLOSE, wxT("&Close\tCtrl+C"));\r
file_menu->SetHelpString(OPJFRAME_FILECLOSE, wxT("Close current image"));\r
view_menu->Append(OPJFRAME_VIEWFIT, wxT("Zoom to &fit\tCtrl+F"));\r
view_menu->SetHelpString(OPJFRAME_VIEWFIT, wxT("Fit the image in canvas"));\r
\r
+ view_menu->Append(OPJFRAME_VIEWRELOAD, wxT("&Reload image\tCtrl+R"));\r
+ view_menu->SetHelpString(OPJFRAME_VIEWRELOAD, wxT("Reload the current image"));\r
+\r
// settings menu and its items\r
wxMenu *sets_menu = new wxMenu;\r
\r
if (dialog.ShowModal() == wxID_OK) {\r
\r
// load settings\r
+ wxGetApp().m_resizemethod = dialog.m_resizeBox->GetSelection();\r
wxGetApp().m_reducefactor = dialog.m_reduceCtrl->GetValue();\r
wxGetApp().m_qualitylayers = dialog.m_layerCtrl->GetValue();\r
wxGetApp().m_components = dialog.m_numcompsCtrl->GetValue();\r
+ wxGetApp().m_framenum = dialog.m_framenumCtrl->GetValue();\r
#ifdef USE_JPWL\r
wxGetApp().m_enablejpwl = dialog.m_enablejpwlCheck->GetValue();\r
wxGetApp().m_expcomps = dialog.m_expcompsCtrl->GetValue();\r
if (zooml != 100)\r
new_image.Rescale((int) ((double) zooml * (double) new_image.GetWidth() / 100.0),\r
(int) ((double) zooml * (double) new_image.GetHeight() / 100.0),\r
- wxIMAGE_QUALITY_NORMAL);\r
+ wxGetApp().m_resizemethod ? wxIMAGE_QUALITY_HIGH : wxIMAGE_QUALITY_NORMAL);\r
currframe->m_canvas->m_image = wxBitmap(new_image);\r
currframe->m_canvas->SetScrollbars(20,\r
20,\r
}\r
\r
\r
+void OPJFrame::OnReload(wxCommandEvent& event)\r
+{\r
+ OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();\r
+\r
+ OPJDecoThread *dthread = currframe->m_canvas->CreateDecoThread();\r
+\r
+ if (dthread->Run() != wxTHREAD_NO_ERROR)\r
+ wxLogMessage(wxT("Can't start deco thread!"));\r
+ else\r
+ wxLogMessage(wxT("New deco thread started."));\r
+\r
+ currframe->m_canvas->Refresh();\r
+\r
+ // update zoom\r
+ //currframe->m_canvas->m_zooml = zooml;\r
+}\r
+\r
+\r
// about window for the frame\r
void OPJFrame::OnAbout(wxCommandEvent& WXUNUSED(event))\r
{\r
#ifdef OPJ_HTMLABOUT\r
+#include "about_htm.h"\r
+#include "opj_logo.xpm"\r
\r
wxBoxSizer *topsizer;\r
wxHtmlWindow *html;\r
wxDialog dlg(this, wxID_ANY, wxString(_("About")));\r
\r
+ wxMemoryFSHandler::AddFile("opj_logo.xpm", wxBitmap(opj_logo), wxBITMAP_TYPE_XPM);\r
+\r
topsizer = new wxBoxSizer(wxVERTICAL);\r
\r
- html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition, wxSize(350, 250), wxHW_SCROLLBAR_NEVER);\r
+ html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition, wxSize(320, 250), wxHW_SCROLLBAR_NEVER);\r
html->SetBorders(0);\r
- html->LoadPage(wxT("about/about.htm"));\r
+ //html->LoadPage(wxT("about/about.htm"));\r
//html->SetPage("<html><body>Hello, world!</body></html>");\r
+ html->SetPage(htmlaboutpage);\r
html->SetSize(html->GetInternalRepresentation()->GetWidth(),\r
html->GetInternalRepresentation()->GetHeight());\r
\r
\r
}\r
\r
-void OPJFrame::OnToggleWindow(wxCommandEvent& WXUNUSED(event))\r
+void OPJFrame::OnToggleBrowser(wxCommandEvent& WXUNUSED(event))\r
{\r
if (markerTreeWindow->IsShown())\r
markerTreeWindow->Show(false);\r
layout.LayoutMDIFrame(this);\r
}\r
\r
+void OPJFrame::OnTogglePeeker(wxCommandEvent& WXUNUSED(event))\r
+{\r
+ if (loggingWindow->IsShown())\r
+ loggingWindow->Show(false);\r
+ else\r
+ loggingWindow->Show(true);\r
+\r
+ wxLayoutAlgorithm layout;\r
+ layout.LayoutMDIFrame(this);\r
+}\r
+\r
void OPJFrame::OnSashDrag(wxSashEvent& event)\r
{\r
if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)\r
m_childhash[winNumber] = subframe;\r
\r
// create own marker tree\r
- m_treehash[winNumber] = new OPJMarkerTree(m_bookCtrl, paths[n], wxT("Parsing..."), TreeTest_Ctrl,\r
+ m_treehash[winNumber] = new OPJMarkerTree(m_bookCtrl, subframe, paths[n], wxT("Parsing..."), TreeTest_Ctrl,\r
wxDefaultPosition, wxDefaultSize,\r
wxTR_DEFAULT_STYLE | wxSUNKEN_BORDER\r
);\r
\r
m_bookCtrl->AddPage(m_treehash[winNumber], wxString::Format(wxT("%u"), winNumber), false);\r
\r
- for (int p = 0; p < m_bookCtrl->GetPageCount(); p++) {\r
+ for (unsigned int p = 0; p < m_bookCtrl->GetPageCount(); p++) {\r
if (m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), winNumber)) {\r
m_bookCtrl->ChangeSelection(p);\r
break;\r
return dthread;\r
}\r
\r
+#define activeoverlay 0\r
// Define the repainting behaviour\r
void OPJCanvas::OnDraw(wxDC& dc)\r
{\r
if (m_image.Ok()) {\r
dc.DrawBitmap(m_image, OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER);\r
+\r
+ if (activeoverlay) {\r
+ dc.SetPen(*wxRED_PEN);\r
+ dc.SetBrush(*wxTRANSPARENT_BRUSH);\r
+ //int tw, th;\r
+ dc.DrawRectangle(OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER,\r
+ (unsigned long int) (0.5 + (double) m_zooml * (double) m_childframe->m_twidth / 100.0),\r
+ (unsigned long int) (0.5 + (double) m_zooml * (double) m_childframe->m_theight / 100.0));\r
+ }\r
+\r
} else {\r
dc.SetFont(*wxSWISS_FONT);\r
dc.SetPen(*wxBLACK_PEN);\r
const long style):\r
wxMDIChildFrame(parent, wxID_ANY, title, pos, size, style)\r
{\r
- m_frame = (OPJFrame *) parent;\r
- m_canvas = NULL;\r
- //my_children.Append(this);\r
- m_fname = fname;\r
- m_winnumber = winnumber;\r
+ m_frame = (OPJFrame *) parent;\r
+ m_canvas = NULL;\r
+ //my_children.Append(this);\r
+ m_fname = fname;\r
+ m_winnumber = winnumber;\r
SetTitle(wxString::Format(_T("%d: "), m_winnumber) + m_fname.GetFullName());\r
\r
-\r
// Give it an icon (this is ignored in MDI mode: uses resources)\r
#ifdef __WXMSW__\r
- SetIcon(wxIcon(wxT("OPJChild16")));\r
+ SetIcon(wxIcon(wxT("OPJChild16")));\r
#endif\r
\r
- // Give it a status line\r
- /*CreateStatusBar();*/\r
+ // Give it a status line\r
+ /*CreateStatusBar();*/\r
\r
- int width, height;\r
- GetClientSize(&width, &height);\r
+ int width, height;\r
+ GetClientSize(&width, &height);\r
\r
- OPJCanvas *canvas = new OPJCanvas(fname, this, wxPoint(0, 0), wxSize(width, height));\r
- canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));\r
- m_canvas = canvas;\r
+ OPJCanvas *canvas = new OPJCanvas(fname, this, wxPoint(0, 0), wxSize(width, height));\r
+ canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));\r
+ m_canvas = canvas;\r
\r
- // Give it scrollbars\r
- canvas->SetScrollbars(20, 20, 5, 5);\r
+ // Give it scrollbars\r
+ canvas->SetScrollbars(20, 20, 5, 5);\r
\r
- Show(true);\r
- Maximize(true);\r
+ Show(true);\r
+ Maximize(true);\r
\r
/*wxLogError(wxString::Format(wxT("Created tree %d (0x%x)"), m_winnumber, m_frame->m_treehash[m_winnumber]));*/\r
\r
\r
void OPJChildFrame::OnClose(wxCloseEvent& event)\r
{\r
- for (int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {\r
-\r
+ for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {\r
if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {\r
m_frame->m_bookCtrl->DeletePage(p);\r
break;\r
}\r
-\r
}\r
Destroy();\r
\r
wxLogMessage(wxT("Closed: %d"), m_winnumber);\r
-\r
}\r
\r
void OPJChildFrame::OnActivate(wxActivateEvent& event)\r
if (!m_frame->m_bookCtrl)\r
return;\r
\r
- for (int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {\r
+ for (unsigned int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {\r
\r
if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {\r
m_frame->m_bookCtrl->ChangeSelection(p);\r
IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl)\r
#endif\r
\r
-OPJMarkerTree::OPJMarkerTree(wxWindow *parent, wxFileName fname, wxString name, const wxWindowID id,\r
+OPJMarkerTree::OPJMarkerTree(wxWindow *parent, OPJChildFrame *subframe, wxFileName fname, wxString name, const wxWindowID id,\r
const wxPoint& pos, const wxSize& size, long style)\r
: wxTreeCtrl(parent, id, pos, size, style)\r
{\r
image, image,\r
new OPJMarkerData(name));\r
\r
- OPJParseThread *pthread = CreateParseThread();\r
+ OPJParseThread *pthread = CreateParseThread(0x00, subframe);\r
if (pthread->Run() != wxTHREAD_NO_ERROR)\r
wxLogMessage(wxT("Can't start parse thread!"));\r
else\r
wxLogMessage(wxT("New parse thread started."));\r
+\r
+ m_childframe = subframe;\r
}\r
\r
void OPJMarkerTree::CreateImageList(int size)\r
\r
}\r
\r
- // close the file\r
- m_file.Close();\r
-\r
// this is the root node\r
if (this->m_parentid)\r
m_tree->SetItemText(rootid, wxT("Codestream"));\r
else\r
+ //m_tree->SetItemText(rootid, wxString::Format(wxT("%s (%d B)"), fname.GetFullName(), m_file.Length()));\r
m_tree->SetItemText(rootid, fname.GetFullName());\r
\r
+ // close the file\r
+ m_file.Close();\r
+\r
WriteText(wxT("Parsing finished!"));\r
}\r
\r
wxLogMessage(wxT("%s(%s)"), name, text.c_str());\r
}\r
\r
-OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid)\r
+OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid, OPJChildFrame *subframe)\r
{\r
OPJParseThread *pthread = new OPJParseThread(this, parentid);\r
\r
mj222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
mj222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
mj222handler->m_components = wxGetApp().m_components;\r
+ mj222handler->m_framenum = wxGetApp().m_framenum;\r
#ifdef USE_JPWL\r
mj222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
mj222handler->m_expcomps = wxGetApp().m_expcomps;\r
\r
OPJDecoderDialog::OPJDecoderDialog(wxWindow* win, int dialogType)\r
{\r
- SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);\r
-\r
- int tabImage1 = -1;\r
- int tabImage2 = -1;\r
-\r
- int resizeBorder = wxRESIZE_BORDER;\r
+ SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);\r
\r
- m_imageList = NULL;\r
+ Create(win, wxID_ANY, wxT("Decoder settings"),\r
+ wxDefaultPosition, wxDefaultSize,\r
+ wxDEFAULT_DIALOG_STYLE| (int) wxPlatform::IfNot(wxOS_WINDOWS_CE, wxRESIZE_BORDER)\r
+ );\r
\r
- Create(win, wxID_ANY, wxT("Decoder settings"), wxDefaultPosition, wxDefaultSize,\r
- wxDEFAULT_DIALOG_STYLE| (int) wxPlatform::IfNot(wxOS_WINDOWS_CE, resizeBorder)\r
- );\r
+ CreateButtons(wxOK | wxCANCEL | (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP));\r
\r
- CreateButtons(wxOK | wxCANCEL | (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP));\r
+ wxBookCtrlBase* notebook = GetBookCtrl();\r
\r
- wxBookCtrlBase* notebook = GetBookCtrl();\r
- notebook->SetImageList(m_imageList);\r
-\r
- wxPanel* mainSettings = CreateMainSettingsPage(notebook);\r
+ wxPanel* mainSettings = CreateMainSettingsPage(notebook);\r
+ wxPanel* jpeg2000Settings = CreatePart1SettingsPage(notebook);\r
+ wxPanel* mjpeg2000Settings = CreatePart3SettingsPage(notebook);\r
#ifdef USE_JPWL\r
- wxPanel* jpwlSettings = CreateJPWLSettingsPage(notebook);\r
+ wxPanel* jpwlSettings = CreatePart11SettingsPage(notebook);\r
#endif // USE_JPWL\r
\r
- notebook->AddPage(mainSettings, wxT("Main"), false);\r
+ notebook->AddPage(mainSettings, wxT("Display"), false);\r
+ notebook->AddPage(jpeg2000Settings, wxT("JPEG 2000"), false);\r
+ notebook->AddPage(mjpeg2000Settings, wxT("MJPEG 2000"), false);\r
#ifdef USE_JPWL\r
- notebook->AddPage(jpwlSettings, wxT("JPWL"), false);\r
+ notebook->AddPage(jpwlSettings, wxT("JPWL"), false);\r
#endif // USE_JPWL\r
\r
- LayoutDialog();\r
+ LayoutDialog();\r
}\r
\r
OPJDecoderDialog::~OPJDecoderDialog()\r
{\r
- delete m_imageList;\r
}\r
\r
/*wxPanel* OPJDecoderDialog::CreateGeneralSettingsPage(wxWindow* parent)\r
}*/\r
\r
wxPanel* OPJDecoderDialog::CreateMainSettingsPage(wxWindow* parent)\r
+{\r
+ wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+\r
+ // top sizer\r
+ wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+ // sub top sizer\r
+ wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+ // resize settings, column\r
+ wxString choices[] = {wxT("Low quality"), wxT("High quality")};\r
+ m_resizeBox = new wxRadioBox(panel, OPJDECO_RESMETHOD,\r
+ wxT("Resize method"),\r
+ wxDefaultPosition, wxDefaultSize,\r
+ WXSIZEOF(choices),\r
+ choices,\r
+ 1,\r
+ wxRA_SPECIFY_ROWS);\r
+ m_resizeBox->SetSelection(wxGetApp().m_resizemethod);\r
+\r
+ subtopSizer->Add(m_resizeBox, 0, wxGROW | wxALL, 5);\r
+\r
+ topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
+\r
+ // assign top and fit it\r
+ panel->SetSizer(topSizer);\r
+ topSizer->Fit(panel);\r
+\r
+ return panel;\r
+}\r
+\r
+wxPanel* OPJDecoderDialog::CreatePart3SettingsPage(wxWindow* parent)\r
+{\r
+ wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+\r
+ // top sizer\r
+ wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+ // add some space\r
+ //topSizer->AddSpacer(5);\r
+\r
+ // sub top sizer\r
+ wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+ // frame settings, column\r
+ wxStaticBox* frameBox = new wxStaticBox(panel, wxID_ANY, wxT("Frame"));\r
+ wxBoxSizer* frameSizer = new wxStaticBoxSizer(frameBox, wxVERTICAL);\r
+\r
+ // selected frame number, row\r
+ wxBoxSizer* framenumSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+ // add some text\r
+ framenumSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Displayed frame:")),\r
+ 0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+ // add some horizontal space\r
+ framenumSizer->Add(5, 5, 1, wxALL, 0);\r
+\r
+ // add the value control\r
+ framenumSizer->Add(\r
+ m_framenumCtrl = new wxSpinCtrl(panel, OPJDECO_FRAMENUM,\r
+ wxString::Format(wxT("%d"), wxGetApp().m_framenum),\r
+ wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
+ wxSP_ARROW_KEYS,\r
+ 1, 100000, wxGetApp().m_framenum),\r
+ 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+ frameSizer->Add(framenumSizer, 0, wxGROW | wxALL, 5);\r
+\r
+ subtopSizer->Add(frameSizer, 0, wxGROW | wxALL, 5);\r
+\r
+ topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
+\r
+ // assign top and fit it\r
+ panel->SetSizer(topSizer);\r
+ topSizer->Fit(panel);\r
+\r
+ return panel;\r
+}\r
+\r
+wxPanel* OPJDecoderDialog::CreatePart1SettingsPage(wxWindow* parent)\r
{\r
wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
\r
wxSP_ARROW_KEYS,\r
0, 100000, wxGetApp().m_components),\r
0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
+ m_numcompsCtrl->Enable(false);\r
\r
compoSizer->Add(numcompsSizer, 0, wxGROW | wxALL, 5);\r
\r
}\r
\r
#ifdef USE_JPWL\r
-wxPanel* OPJDecoderDialog::CreateJPWLSettingsPage(wxWindow* parent)\r
+wxPanel* OPJDecoderDialog::CreatePart11SettingsPage(wxWindow* parent)\r
{\r
wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
\r
\r
}\r
\r
+#endif // USE_JPWL\r
+\r
bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)\r
{\r
/*size_t nFiles = filenames.GetCount();\r
return true;\r
}\r
\r
-#endif // USE_JPWL\r
-\r
--- /dev/null
+/* XPM */
+static char *opj_logo[] = {
+/* columns rows colors chars-per-pixel */
+"90 61 218 2",
+" c #BE3D12",
+". c #BF461D",
+"X c #AD5435",
+"o c #B64925",
+"O c #B54E2B",
+"+ c #BC4620",
+"@ c #BB4B25",
+"# c #BC4E29",
+"$ c #B5502F",
+"% c #BD512C",
+"& c #B45334",
+"* c #B35638",
+"= c #B45B3D",
+"- c #BB5533",
+"; c #BE5937",
+": c #BC5C3D",
+"> c #9C766A",
+", c #AD5D42",
+"< c #B55F41",
+"1 c #BA5E40",
+"2 c #A7634D",
+"3 c #A76C57",
+"4 c #AA6750",
+"5 c #AC6B56",
+"6 c #AA6E5A",
+"7 c #A4705E",
+"8 c #B46045",
+"9 c #B1644B",
+"0 c #BD6244",
+"q c #B96448",
+"w c #BC694D",
+"e c #B36B53",
+"r c #B26E58",
+"t c #BB6C52",
+"y c #B2725D",
+"u c #BD7056",
+"i c #BB745C",
+"p c #A67566",
+"a c #A57B6D",
+"s c #AE7562",
+"d c #AB7867",
+"f c #AA7C6C",
+"g c #A07E73",
+"h c #AA7F71",
+"j c #B37661",
+"k c #B47863",
+"l c #B27D6B",
+"z c #BB7863",
+"x c #BA7E69",
+"c c #C73605",
+"v c #C63A0B",
+"b c #CB3300",
+"n c #CA3807",
+"m c #C93A0A",
+"M c #C43E11",
+"N c #C93E10",
+"B c #C44115",
+"V c #C3441A",
+"C c #C4481E",
+"Z c #CA4113",
+"A c #C94519",
+"S c #CB481C",
+"D c #C24A23",
+"F c #C24F28",
+"G c #CD4D23",
+"H c #C4522D",
+"J c #CB532B",
+"K c #C25632",
+"L c #C35936",
+"P c #C25C3B",
+"I c #C85630",
+"U c #CB5933",
+"Y c #CB5E3A",
+"T c #D05026",
+"R c #CC613D",
+"E c #C26343",
+"W c #C46748",
+"Q c #C1694C",
+"! c #CD6744",
+"~ c #CA6C4D",
+"^ c #C37155",
+"/ c #C4755B",
+"( c #CB7356",
+") c #C8765B",
+"_ c #D06D4C",
+"` c #D07253",
+"' c #D47B5E",
+"] c #C37B63",
+"[ c #C27E68",
+"{ c #C97F68",
+"} c #A68175",
+"| c #A48479",
+" . c #AD8172",
+".. c #AD8578",
+"X. c #AB897D",
+"o. c #B1806F",
+"O. c #BA816F",
+"+. c #B38373",
+"@. c #B58778",
+"#. c #B3897B",
+"$. c #BA8472",
+"%. c #BB8C7C",
+"&. c #C2816B",
+"*. c #CD846C",
+"=. c #C38470",
+"-. c #C38976",
+";. c #C38D7B",
+":. c #CC8973",
+">. c #CF8F7A",
+",. c #CB907D",
+"<. c #D1937F",
+"1. c #948E8C",
+"2. c #9D8C86",
+"3. c #9D8F89",
+"4. c #96908E",
+"5. c #9C918D",
+"6. c #949392",
+"7. c #9B9492",
+"8. c #9D9997",
+"9. c #9D9C9C",
+"0. c #A38B83",
+"q. c #AA8D83",
+"w. c #A4918B",
+"e. c #AC9087",
+"r. c #AB938C",
+"t. c #A49590",
+"y. c #A29996",
+"u. c #A19D9C",
+"i. c #AA9790",
+"p. c #AC9994",
+"a. c #AC9E99",
+"s. c #B18D81",
+"d. c #B59084",
+"f. c #B49389",
+"g. c #BA9184",
+"h. c #B89589",
+"j. c #BA988D",
+"k. c #B29B93",
+"l. c #BC9C92",
+"z. c #ACA19D",
+"x. c #B1A19D",
+"c. c #BCA39B",
+"v. c #A3A3A3",
+"b. c #ABA5A3",
+"n. c #AEA9A7",
+"m. c #ABABAA",
+"M. c #B3A5A1",
+"N. c #B3A9A6",
+"B. c #B3ADAA",
+"V. c #B9A6A0",
+"C. c #B9AAA5",
+"Z. c #BAADA9",
+"A. c #B4B0AF",
+"S. c #BAB0AD",
+"D. c #B4B3B3",
+"F. c #BAB5B3",
+"G. c #BDB8B6",
+"H. c #BBBBBB",
+"J. c #C39384",
+"K. c #C0978A",
+"L. c #C2998B",
+"P. c #CA9483",
+"I. c #CD9A8A",
+"U. c #C19D92",
+"Y. c #D69B89",
+"T. c #DB9680",
+"R. c #C2A095",
+"E. c #C4A69C",
+"W. c #CCA193",
+"Q. c #C8A599",
+"!. c #CBA99D",
+"~. c #C6AEA6",
+"^. c #CCACA2",
+"/. c #CBB2AB",
+"(. c #C3B8B5",
+"). c #C2BDBC",
+"_. c #C9B9B3",
+"`. c #D3ADA0",
+"'. c #D3B4A9",
+"]. c #DCB2A4",
+"[. c #DEB6A8",
+"{. c #D1BFB9",
+"}. c #D9BEB5",
+"|. c #C5C0BE",
+" X c #CDC0BC",
+".X c #D2C1BB",
+"XX c #DDC3BB",
+"oX c #E0C5BC",
+"OX c #E0C8BF",
+"+X c #C2C2C2",
+"@X c #CBC4C2",
+"#X c #CDC8C6",
+"$X c #CCCBCB",
+"%X c #D2C6C2",
+"&X c #D1CECD",
+"*X c #DDC8C1",
+"=X c #DECFCA",
+"-X c #D9D1CE",
+";X c #D3D3D3",
+":X c #D9D5D4",
+">X c #DED9D7",
+",X c #DBDBDB",
+"<X c #E1CAC3",
+"1X c #E2CFC8",
+"2X c #E1D3CE",
+"3X c #E2D5D0",
+"4X c #E5D8D3",
+"5X c #E4DDDB",
+"6X c #E8DBD6",
+"7X c #EADEDA",
+"8X c #E6E0DE",
+"9X c #EBE0DC",
+"0X c #E4E4E4",
+"qX c #E8E2E0",
+"wX c #EBEBEB",
+"eX c #F0EAE8",
+"rX c #F3F3F3",
+"tX c #FEFEFE",
+/* pixels */
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXrXrXtXrXrXrXrXrXrXrXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXrXtXrXrXrXwXwXrXwXrXrXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXrXrXrXwXwX0X0XqX0X0X0X0XwXwXwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXrXtXrXwXwX2X[.[.].].].].].1XwXrXwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXrXrXrXwX0X0XL.J b b b b b b b J '.0X0XwXwXrXrXrXrXrXrXrXrXrXrXtXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXrXrXwX0XXXt m b m B V N b b v >.;X0XwXwXwXwXrXwXwXrXrXrXrXtXrXtXrXrXrXwXrXrXrXrXrXrXrXrXrXrXrXwXrXrXwXrXrXrXtXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXrXrXrX0X,X'.S b b P l.z.M.k.w n b b g.;X,X,X,X0X0X0X0X0XwXwXwXwXwXwXwXwXwX0X0X0XwX0X0XwXwXwXwX0X0X0X0X0X0XwXwXwXwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXrXrXrXwX0X:XT.m b A ] G.D.D.m.$.m b b $.$X&X.X}.XX>XOX}.oXXX<X0X0XwXwXwX0X2XXXoXXXoXOX5X0XwX0X1XoXXX5X*X}.}.oX<XqXrXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXrXrXwX0X,XL.b b D M.H.D.D.D.D.m.L b b W H.Z.# b Y / m b b b Z P.:X:X:X$X:.Z b b b b n :.;X;X;XR b A &.Z b b b b *.wXwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXrXwX0X:X$.b b E B.H.H.D.D.D.D.P b b E H.V.. b U L v v n b b ( #X;X$X~.Y b m N m b b ! {.&X#XI b C R v v n b b ! 0XwXrXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXrXwX0X:X!.A b Z F.H.H.H.H.H.D.m.L b b e b.+.b b V k i.r.t n b b s.H.x v b L q.b.p.D b b t F.$.n b M l a.M.y b b A :X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXrXwX0X:XL.m b D H.).H.+XH.H.H.D.H b b 6 v.j b b - a.A.m.@.m b b h D.< b b w z.b.b.P b b q B.z b b @ B.D.m...v b G :X,XwXwXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXwX0X,X&X/ b b , D.H.+X+X+X+XH.f.B b b 5.8.M b M w.v.v.v.r.D b b h l v b b M V v b b q u.X b n @.v.m.v.j b b Q &X,X0XwXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXwX0X,X$X^ b b , H.H.+X+XH.H.H.s.N b n 7.7.v b B 8.v.v.v.w.M b b g r b b b n n n b b b b e y.O b n X.m.v.n.e b b u &X,X0XrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXrX0X,X$X/ b b + F.H.H.H.+XH.d.b b M | 8.> c b @ 9.v.9.u., b b - 3.& b b 7 1.1.4.4.4.6.7.9.w.m b + t.v.m.p.D b b K.;X,X0XwXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXwX0X,X$X-.b b b i D.H.G.H.J.N b b = 9.9.5 c b B 7.9.v.y.b b m f 4.O b b 3 6.6.6.g 9 4 h u.h b b - b.m.m.s.b b N ~.;X,X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXwX0X,X;XE.G b b I z ] ] ] W n b H l 9.8.9 b b m e 6 r e b b # 0.y.< b b O 6 p 6 < # ; q.v.t b b 0 n.A.A.+.b b H _.;X,XwXwXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXwXwX,X;X#Xf.b b b b b b b b b - a.v.v.w.@ b b v b b b b b @ b.m.v.w.M b b b b b b v ..m.n.A b n g.H.H.H.4 b b [ &X,X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXwXwX0X:X$XZ.Q H v n b m B H E x n.m.m.q.B b v < . v N + E z m.m.m.b.e - M m v M - t k.D.m.; # - V.H.+XH.s # # K.:X,X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXrXwXwX,X,X$X+XG.Z.Z.B.C.S.F.H.H.H.D.D.j b b q v.b.a.n.B.H.H.+X+X+XH.H.D.Z.C.Z.Z.F.H.H.+X+XH.).H.$X&X&X;X$X#X#X:X,X0XwXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXrXrXwX0X,X;X#X+X+X+XH.H.+X+X+XH.H.H.D.e b n i n.m.D.H.H.+X#X$X$X+X+X+X+XH.H.H.H.+X+X+X$X&X&X&X$X;X;X;X:X;X:X,X,X0XwXwXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXrXrXwXwX,X,X;X;X$X$X$X;X;X&X;X$X#X+XF b v s.H.H.+X$X&X;X;X,X,X,X;X:X;X;X;X;X;X;X:X,X,X,X0X,X0X,X0X0X0X0X0X0X0XwXwXrXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXrXtXrXwXwX0X,X:X;X;X;X;X;X:X;X;X;X$X+XC b B k.+X+X$X$X;X,X,X0X0X0X0X0X;X,X,X,X,X,X,X,X,X0X0X0X0X0X0XwX0X0X0XwXwXrXrXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXrXrXrXrXwXwXwX0X0X0X0X0X0X0X,X,X:X^.^.!.$X$X;X,X,X0XwXwXwXwXwXwXwXwX0X0X0X0XwXwXwXwXwXwXrXrXwXrXrXrXrXrXrXrXrXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXrXrXrXrXwXwXwXwX0XwXwXwX0X0X,X:X;X$X&X&X;X,X,X0XwXwXwXrXrXrXrXrXwXwXwXwXwXwXwXrXrXrXwXrXrXrXrXrXrXrXrXrXrXtXrXtXtXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXrXrXrXrXrXrXrXrXrXwXwXwXwX0X,X0X0X0XwXwXrXrXrXrXrXrXrXrXrXrXrXrXrXrXwXrXrXrXrXrXtXrXrXrXtXrXrXrXrXrXrXrXrXrXtXtXtXrXrXtXtXtXtXrXrXtXrXrXtXrXtXrXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXrXtXtXrXtXrXrXrXrXrXrXwXwXwX0XwX0XwXwXwXrXrXrXtXtXrXrXrXrXrXrXrXrXwXrXwXrXwXwXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXtXtXrXrXrXrXrXrXrXrXrXrXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXwXrXrXrXrXrXrXtXrXtXrXrXrXrXrXwXwXwXwXwX0X0XwX0XwXwXwXwXwXwXwXrXwXwXwX0X0X0X0XwX0XwXwXrXrXrXwXrXwXwXwX0XwX0XwXwXwXrXrXrXrXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrXrXrXrXrXtXtXrXrXtXrXrXeX7X7X9XwXwXwX5X3X3X3X2X2X2X5X0XwXwXwXwXwX8X3X3X2X2X2X2X2X3X6X6X7XwXwXwXwXwXwX7X1XXXOXOX1X8XwXwXrXrXrXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXtXtXrXrXrXwXT.T T :.,X,X-X` G G G G G G U _ J.-X,X,X,X[ G G G G G G G G G G _ >XwX0X,X&XI.R N b b b m ! `.5XwXrXrXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXtXtXrXtXrXrXrXwX0X' b b ] >X,X%XJ b b b b b b b b Q {.:X;X:Xq b b b b b b b b b b Y >X0X,X-X'.^ n b b b b b m *.1XwXwXrXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrX0X0X%XL b b L.@X+X-.b b M L L L D b b b M V.+X(.N b b D H H H H H U U W.;X&X^.H b b n W -.-.W n b b J &XwXrXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXwXwX0X XF b b U.+X+X[ b b D z z j P v b b N U.H.S.m b m E Q t ^ ) / ) ) /.$X$X;.m b n A %.H.H.J.N b b N .XwXwXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXwXwX,X:X!.m b L N.D.m.* b b y v.v.v.v.p.n b M f.m.w b b D u.v.m.m.D.G.H.H.+X).g.b b B j.F.D.D.D.D.l.; F I /.0XwXrXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXwX,X:XU.n b E B.A.n.$ b b s v.9.v.v.r.n n M r.b.1 b b D u.v.m.m.D.D.H.H.).H.k b b # M.G.D.D.D.D.Z.t w u _.0XwXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXwXwX,X;X$XJ b m h b.v.i.m b M a 5.5.2.p M b c < 8.2.+ b b M o o o o # % j G.H.g.m b A M.D.D.D.B.M.M.M.M.Z.(.:X0XwXrXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrXrXwX,X,X&X(.n b M 0.v.v.s b b b b b n b b c b M u.v.g M b b b b b b b b b i G.D.0 b b 8 D.D.H.G.P n b b n b U :X,XwXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrXwX0X,X;X$XV.n b M w.v.9.< b b b b b b b b c H r 9.v.a n b * < < w w Q Q g.D.B.: b b r D.D.D.m.C b b b b b ) ;X0XwXrXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrX6XP.=.K.;X#X+Xx n b D v.u.7.. b b M D . D & 2 q.b.b.v.v.< b b X 6.9.9.b.m.D.D.D.D.n.# b b f D.D.D.b.= 1 * N b n !.;X,XwXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXrXrXwX<X~ P x $X+XH.z b b - v.v.3.M b b < r r r k 0.a.m.m.m.v.# b b , 6.9.v.m.D.D.D.H.D.z.O b b s D.D.D.N.f l 9 v b M ~.;X,XwXrXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXrXwX0XY.n b e H.H.V.F b b p b.v.h v b v v.m.A.D.H.+X+X+XH.D.p.b b m p 9.v.m.D.D.H.H.H.D.N.- b b - m.A.D.A.m.a.B b b - (.:X0XwXrXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXwXwX0XY.n b ; Z.C.$.A b v 0.m.m.l n b M m.D.D.H.+X#X+X+XH.H.r.b b m < d l l l $.;.J.V.H.B.w b b C @.s.a.k.#.j n b b : ).:X,XwXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXwXwX0X'.N b b A B n b n z m.D.B.0 b b 9 H.H.+X$X;X:X;X$X$X+Xl b b b b b b b b b b b s.H.H.B.H b b b n Z Z b b V n b ] $X:X0XwXrXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXwX0X,X.XR b b b b b A P d.D.D.C.H b b j H.$X$X;X:X,X,X;X;X+X/ b b b b b b b b b b b a.H.H.D.u G b b b b b B H : v m ;.$X,XwXwXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXwXwX,X:X Xg.j 5 y s.C.H.H.+X+X|.E.Q.Q. X;X;X,X0XwXwX0X0X,X;X/.U.j.h.g.f.h.j.U.U.U.!.$X$X+X+XH.Z.g.y 4 6 l x.D.A.l.~.#X,X0XwXrXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXwX0X:X$XG.k.e.f.B.H.H.+X$X$X$X#X$X$X;X;X,X0XwXwXwXwX0X0X;X$X+XH.D.D.D.F.H.+X+X#X&X$X;X$X$X+X+XA.r.X.e.a.H.H.H.+X+X;X,X0XwXrXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXwX,X,X$X&X$X$X$X$X;X;X,X,X,X,X,X,X0XwXwXwXrXtXrXrXwXwX0X,X;X$X$X+X$X$X$X;X;X:X,X,X,X,X,X;X$X&X#X#X$X$X$X$X$X;X,X,X0XwXrXrXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXwXwX0X,X:X;X;X$X;X;X:X,X,X0X0X,X0X0X0XwXwXwXrXrXtXrXrXwXwX0X;X;X$X&X$X$X&X:X,X,X,X,X0X,X,X:X;X;X$X$X$X$X$X;X:X,X,X0XwXwXrXrXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXrXwXwXwX0X0X0X0X0X0XwXwXwXwXwXwXwXwXrXwXrXtXtXrXtXtXrXrXrXwX0X0X0X0X,X,X0X0X0X0XwXwXwXwXwXwX0X0X0X,X,X,X,X0X0XwXwXwXrXtXrXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrXwXwX0X0X0X0X0XwXwXwXrXwXrXrXrXrXrXtXrXtXtXtXtXrXrXrXwXwXwX0X0X0X0X0X0X0XwXwXwXwXwXwXwXwXwX0X0X0X0XwXwXwXwXwXrXrXrXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXrXrXrXrXrXrXrXrXrXrXtXtXrXtXtXrXtXtXtXtXtXtXtXrXtXrXtXrXrXrXrXwXwXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXwXrXrXrXrXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXtXrXrXrXrXrXrXtXtXrXtXrXtXrXrXtXtXtXtXtXtXtXtXtXtXtXrXrXrXrXrXrXrXrXrXrXrXtXtXrXtXrXrXtXrXrXrXrXrXrXrXrXtXrXrXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX",
+"tXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtX"
+};
\r
\r
/* Markers values */\r
+#define J2KMARK_NUM 24\r
enum {\r
SOC_VAL = 0xFF4F,\r
SOT_VAL = 0xFF90,\r
PPT_VAL = 0xFF61,\r
SOP_VAL = 0xFF91,\r
EPH_VAL = 0xFF92,\r
- CME_VAL = 0xFF64,\r
-#ifndef USEOLDJPWL \r
- EPB_VAL = 0xFF66,\r
+ COM_VAL = 0xFF64\r
+#ifdef USE_JPWL\r
+ , EPB_VAL = 0xFF66,\r
ESD_VAL = 0xFF67,\r
EPC_VAL = 0xFF68,\r
RED_VAL = 0xFF69\r
-#else\r
- EPB_VAL = 0xFF96,\r
+ /*, EPB_VAL = 0xFF96,\r
ESD_VAL = 0xFF98,\r
EPC_VAL = 0xFF97,\r
- RED_VAL = 0xFF99\r
-#endif\r
+ RED_VAL = 0xFF99*/\r
+#endif // USE_JPWL\r
+#ifdef USE_JPSEC\r
+ , SEC_VAL = 0xFF65\r
+#endif // USE_JPSEC\r
};\r
\r
// All the markers in one vector\r
COD_VAL, COC_VAL, RGN_VAL, QCD_VAL, QCC_VAL, POD_VAL,\r
TLM_VAL, PLM_VAL, PLT_VAL, PPM_VAL, PPT_VAL,\r
SOP_VAL, EPH_VAL,\r
- CME_VAL,\r
- EPB_VAL, ESD_VAL, EPC_VAL, RED_VAL\r
+ COM_VAL\r
+#ifdef USE_JPWL\r
+ , EPB_VAL, ESD_VAL, EPC_VAL, RED_VAL\r
+#endif // USE_JPWL\r
+#ifdef USE_JPSEC\r
+ , SEC_VAL\r
+#endif // USE_JPSEC\r
};\r
\r
// Marker names\r
"COD", "COC", "RGN", "QCD", "QCC", "POD",\r
"TLM", "PLM", "PLT", "PPM", "PPT",\r
"SOP", "EPH",\r
- "CME",\r
- "EPB", "ESD", "EPC", "RED"\r
+ "COM"\r
+#ifdef USE_JPWL\r
+ , "EPB", "ESD", "EPC", "RED"\r
+#endif // USE_JPWL\r
+#ifdef USE_JPSEC\r
+ , "SEC"\r
+#endif // USE_JPSEC\r
};\r
\r
// Marker descriptions\r
"Tile-part lengths, main header", "Packet length, main header", "Packets length, tile-part header",\r
"Packed packet headers, main header", "Packed packet headers, tile-part header",\r
"Start of packet", "End of packet header",\r
- "Comment and extension",\r
- "Error Protection Block", "Error Sensitivity Descriptor", "Error Protection Capability",\r
+ "Comment and extension"\r
+#ifdef USE_JPWL\r
+ , "Error Protection Block", "Error Sensitivity Descriptor", "Error Protection Capability",\r
"Residual Errors Descriptor"\r
+#endif // USE_JPWL\r
+#ifdef USE_JPSEC\r
+ , "Main security marker"\r
+#endif // USE_JPSEC\r
};\r
\r
void OPJParseThread::ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOffset length, wxTreeItemId parentid)\r
{\r
+ unsigned short int csiz = 0;\r
+\r
// check if the file is opened\r
if (m_file->IsOpened())\r
WriteText(wxT("File OK"));\r
// position at the beginning\r
m_file->Seek(offset, wxFromStart);\r
\r
- //WriteText(wxString::Format(wxT("from to %d"), length));\r
-\r
// navigate the file\r
- int m, inside_sod = 0, nmarks = 0, maxmarks = 10000, done = 0;\r
+ int m, inside_sod = 0, inside_sop = 0;\r
+ int nmarks = 0, maxmarks = 10000;\r
unsigned char onebyte[1];\r
- unsigned char twobytes[2];\r
+ unsigned char twobytes[2], firstbyte, secondbyte;\r
unsigned char fourbytes[4];\r
unsigned short int currmark;\r
unsigned short int currlen;\r
int lastPsot = 0, lastsotpos = 0;\r
\r
WriteText(wxT("Start search..."));\r
- while ((offset < length) && (!m_file->Eof())) {\r
\r
- done = 0;\r
+// advancing macro\r
+#define OPJ_ADVANCE(A) {offset += A; if (offset < length) m_file->Seek(offset, wxFromStart); else return;}\r
\r
- // read da marka\r
- if (m_file->Read(twobytes, 2) != 2)\r
+ // begin search\r
+ while ((offset < length) && (!m_file->Eof())) {\r
+\r
+ // read one byte\r
+ if (m_file->Read(&firstbyte, 1) != 1)\r
break;\r
- currmark = (((unsigned short int) twobytes[0]) << 8) + (unsigned short int) twobytes[1];\r
\r
- // Markers cycle\r
- for (m = 0; m < 23; m++) {\r
+ // look for 0xFF\r
+ if (firstbyte == 0xFF) {\r
\r
- // check the marker\r
- if (currmark == marker_val[m]) {\r
+ // it is a possible marker\r
+ if (m_file->Read(&secondbyte, 1) != 1)\r
+ break;\r
+ else\r
+ currmark = (((unsigned short int) firstbyte) << 8) + (unsigned short int) secondbyte;\r
\r
- if (currmark == SOD_VAL) {\r
+ } else {\r
\r
- // we enter SOD\r
- currlen = 0;\r
- inside_sod = 1;\r
+ // nope, advance by one and search again\r
+ OPJ_ADVANCE(1);\r
+ continue;\r
+ }\r
+ \r
+ // search the marker\r
+ for (m = 0; m < J2KMARK_NUM; m++) {\r
+ if (currmark == marker_val[m])\r
+ break;\r
+ }\r
\r
- } else if ((currmark == SOC_VAL) || (currmark == EOC_VAL) || (currmark == EPH_VAL))\r
- \r
- currlen = 0;\r
+ // marker not found\r
+ if (m == J2KMARK_NUM) {\r
+ // nope, advance by one and search again\r
+ OPJ_ADVANCE(1);\r
+ continue;\r
+ }\r
\r
- else {\r
+ // if we are inside SOD, only some markers are allowed\r
+ if (inside_sod) {\r
\r
- // read length\r
- if (m_file->Read(twobytes, 2) != 2)\r
- break;\r
- currlen = (((unsigned short int) twobytes[0]) << 8) + (unsigned short int) twobytes[1];\r
+ // we are inside SOP\r
+ if (inside_sop) {\r
+\r
+ }\r
\r
+ // randomly marker coincident data\r
+ if ((currmark != SOT_VAL) &&\r
+ (currmark != EOC_VAL) /*&&\r
+ (currmark != SOP_VAL) &&\r
+ (currmark != EPH_VAL)*/) {\r
+ OPJ_ADVANCE(1);\r
+ continue;\r
+ }\r
+\r
+ // possible SOT?\r
+ if ((currmark == SOT_VAL)) {\r
+ // too early SOT\r
+ if (offset < (lastsotpos + lastPsot)) {\r
+ OPJ_ADVANCE(1);\r
+ continue;\r
}\r
+ // we were not in the last tile\r
+ /*if (lastPsot != 0) {\r
+ OPJ_ADVANCE(1);\r
+ break;\r
+ }*/\r
+ }\r
+ }\r
\r
- // inside SOD, only some markers are allowed\r
- if (inside_sod && (currmark != SOD_VAL) && (currmark != SOT_VAL)\r
- && (currmark != EOC_VAL) && (currmark != SOP_VAL) && (currmark != EPH_VAL))\r
- break; /*randomly marker coincident data */\r
+ // beyond this point, the marker MUST BE real\r
\r
- if (inside_sod && (currmark == SOT_VAL) && (lastPsot == 0))\r
- inside_sod = 0; /* random data coincident with SOT, but last SOT was the last one */\r
+ // length of current marker segment\r
+ if ((currmark == SOD_VAL) ||\r
+ (currmark == SOC_VAL) ||\r
+ (currmark == EOC_VAL) ||\r
+ (currmark == EPH_VAL))\r
\r
- if (inside_sod && (currmark == SOT_VAL))\r
- inside_sod = 0; /* new tile part */\r
+ // zero length markers\r
+ currlen = 0;\r
\r
- // here we pass to AppendItem() normal and selected item images (we\r
- // suppose that selected image follows the normal one in the enum)\r
- int image, imageSel;\r
- image = m_tree->TreeCtrlIcon_Folder;\r
- imageSel = image + 1;\r
+ else {\r
+\r
+ // read length field\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+\r
+ currlen = (((unsigned short int) twobytes[0]) << 8) + (unsigned short int) twobytes[1];\r
+ }\r
+\r
+ // here we pass to AppendItem() normal and selected item images (we\r
+ // suppose that selected image follows the normal one in the enum)\r
+ int image, imageSel;\r
+ image = m_tree->TreeCtrlIcon_Folder;\r
+ imageSel = image + 1;\r
+\r
+ // append the marker\r
+ wxTreeItemId currid = m_tree->AppendItem(parentid,\r
+ wxString::Format(wxT("%03d: %s (0x%04X)"), nmarks, marker_name[m], marker_val[m]),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("MARK"), m_tree->m_fname.GetFullPath(), offset, offset + currlen + 1)\r
+ );\r
+\r
+ // append some info\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ // marker name\r
+ wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,\r
+ wxT("*** ") + wxString::Format(wxT("%s"), marker_descr[m]) + wxT(" ***"),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+ m_tree->SetItemFont(subcurrid1, *wxITALIC_FONT);\r
+\r
+ // position and length\r
+ wxTreeItemId subcurrid2 = m_tree->AppendItem(currid,\r
+ wxLongLong(offset).ToString() + wxT(" > ") + wxLongLong(offset + currlen + 1).ToString() + \r
+ wxT(", ") + wxString::Format(wxT("%d + 2 (%d)"), currlen, currlen + 2),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ // give additional info on markers\r
+ switch (currmark) {\r
+\r
+ /////////\r
+ // SOP //\r
+ /////////\r
+ case SOP_VAL:\r
+ {\r
+ // read packet number\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ int packnum = STREAM_TO_UINT16(twobytes, 0);\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("Pack. no. %d"), packnum),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+ inside_sop = 1;\r
+ };\r
+ break;\r
+\r
+ /////////\r
+ // RED //\r
+ /////////\r
+ case RED_VAL:\r
+ {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char pred = onebyte[0];\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ wxString address[] = {\r
+ wxT("Packet addressing"),\r
+ wxT("Byte-range addressing"),\r
+ wxT("Packet-range addressing"),\r
+ wxT("Reserved")\r
+ };\r
+\r
+ wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
+ address[(pred & 0xC0) >> 6],\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("%d bytes range"), (((pred & 0x02) >> 1) + 1) * 2),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ pred & 0x01 ? wxT("Errors/erasures in codestream") : wxT("Error free codestream"),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("Residual corruption level: %d"), (pred & 0x38) >> 3),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ }\r
+ break;\r
+\r
+ /////////\r
+ // ESD //\r
+ /////////\r
+ case ESD_VAL:\r
+ {\r
+ unsigned short int cesd;\r
+ if (csiz < 257) {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ cesd = onebyte[0];\r
+ } else {\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ cesd = STREAM_TO_UINT16(twobytes, 0);\r
+ }\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char pesd = onebyte[0];\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
+ pesd & 0x01 ? wxT("Comp. average") : wxString::Format(wxT("Comp. no. %d"), cesd),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ wxString meth[] = {\r
+ wxT("Relative error sensitivity"),\r
+ wxT("MSE"),\r
+ wxT("MSE reduction"),\r
+ wxT("PSNR"),\r
+ wxT("PSNR increase"),\r
+ wxT("MAXERR (absolute peak error)"),\r
+ wxT("TSE (total squared error)"),\r
+ wxT("Reserved")\r
+ };\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ meth[(pesd & 0x38) >> 3],\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ wxString address[] = {\r
+ wxT("Packet addressing"),\r
+ wxT("Byte-range addressing"),\r
+ wxT("Packet-range addressing"),\r
+ wxT("Reserved")\r
+ };\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ address[(pesd & 0xC0) >> 6],\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("%d bytes/value, %d bytes range"), ((pesd & 0x04) >> 2) + 1, (((pesd & 0x02) >> 1) + 1) * 2),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ }\r
+ break;\r
+\r
+ /////////\r
+ // EPC //\r
+ /////////\r
+ case EPC_VAL:\r
+ {\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ unsigned short int pcrc = STREAM_TO_UINT16(twobytes, 0);\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int dl = STREAM_TO_UINT32(fourbytes, 0);\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char pepc = onebyte[0];\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("CRC-16 = 0x%x"), pcrc),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
\r
- // append the marker\r
- wxTreeItemId currid = m_tree->AppendItem(parentid,\r
- wxString::Format(wxT("%03d: %s (0x%04X)"), nmarks, marker_name[m], marker_val[m]),\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("Tot. length = %d"), dl),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("%s%s%s%s"),\r
+ pepc & 0x10 ? wxT("ESD, ") : wxT(""),\r
+ pepc & 0x20 ? wxT("RED, ") : wxT(""),\r
+ pepc & 0x40 ? wxT("EPB, ") : wxT(""),\r
+ pepc & 0x80 ? wxT("Info") : wxT("")\r
+ ),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ }\r
+ break;\r
+\r
+ /////////\r
+ // EPB //\r
+ /////////\r
+ case EPB_VAL:\r
+ {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char depb = onebyte[0];\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int ldpepb = STREAM_TO_UINT32(fourbytes, 0);\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int pepb = STREAM_TO_UINT32(fourbytes, 0);\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("No. %d, %slatest, %spacked"),\r
+ depb & 0x3F,\r
+ depb & 0x40 ? wxT("") : wxT("not "),\r
+ depb & 0x80 ? wxT("") : wxT("un")),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("%d bytes protected"), ldpepb),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (pepb == 0x00000000)\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxT("Predefined codes"),\r
image, imageSel,\r
- new OPJMarkerData(wxT("MARK"), m_tree->m_fname.GetFullPath(), offset, offset + currlen + 1)\r
+ new OPJMarkerData(wxT("INFO"))\r
);\r
\r
- // append some info\r
- image = m_tree->TreeCtrlIcon_File;\r
- imageSel = image + 1;\r
+ else if ((pepb >= 0x10000000) && (pepb <= 0x1FFFFFFF)) {\r
\r
- // marker name\r
- wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,\r
- wxT("*** ") + wxString::Format(wxT("%s"), marker_descr[m]) + wxT(" ***"),\r
+ wxString text = wxT("CRC code");\r
+ if (pepb == 0x10000000)\r
+ text << wxT(", CCITT (X25) 16 bits");\r
+ else if (pepb == 0x10000001)\r
+ text << wxT(", Ethernet 32 bits");\r
+ else\r
+ text << wxT(", JPWL RA");\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ text,\r
image, imageSel,\r
new OPJMarkerData(wxT("INFO"))\r
);\r
- m_tree->SetItemFont(subcurrid1, *wxITALIC_FONT);\r
\r
- // position and length\r
- wxTreeItemId subcurrid2 = m_tree->AppendItem(currid,\r
- wxLongLong(offset).ToString() + wxT(" > ") + wxLongLong(offset + currlen + 1).ToString() + \r
- wxT(", ") + wxString::Format(wxT("%d + 2 (%d)"), currlen, currlen + 2),\r
+ } else if ((pepb >= 0x20000000) && (pepb <= 0x2FFFFFFF)) {\r
+\r
+ wxString text;\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("RS code, RS(%d, %d)"),\r
+ (pepb & 0x0000FF00) >> 8,\r
+ (pepb & 0x000000FF)),\r
image, imageSel,\r
new OPJMarkerData(wxT("INFO"))\r
);\r
\r
- // give additional info on markers\r
- switch (currmark) {\r
- \r
- case SOP_VAL:\r
- {\r
- // read packet number\r
- if (m_file->Read(twobytes, 2) != 2)\r
- break;\r
- int packnum = STREAM_TO_UINT16(twobytes, 0);;\r
- wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
- wxString::Format(wxT("Pack. no. %d"), packnum),\r
- image, imageSel,\r
- new OPJMarkerData(wxT("INFO"))\r
- );\r
- }\r
+ } else if ((pepb >= 0x30000000) && (pepb <= 0x3FFFFFFE))\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxT("JPWL RA"),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ else if (pepb == 0xFFFFFFFF)\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxT("No method"),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ }\r
+ break;\r
+\r
+ /////////\r
+ // SIZ //\r
+ /////////\r
+ case SIZ_VAL:\r
+ {\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ unsigned short int rsiz = STREAM_TO_UINT16(twobytes, 0);\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int xsiz = STREAM_TO_UINT32(fourbytes, 0);\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int ysiz = STREAM_TO_UINT32(fourbytes, 0);\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int xosiz = STREAM_TO_UINT32(fourbytes, 0);\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int yosiz = STREAM_TO_UINT32(fourbytes, 0);\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int xtsiz = STREAM_TO_UINT32(fourbytes, 0);\r
+ this->m_tree->m_childframe->m_twidth = xtsiz;\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int ytsiz = STREAM_TO_UINT32(fourbytes, 0);\r
+ this->m_tree->m_childframe->m_theight = ytsiz;\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int xtosiz = STREAM_TO_UINT32(fourbytes, 0);\r
+ this->m_tree->m_childframe->m_tx = xtosiz;\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int ytosiz = STREAM_TO_UINT32(fourbytes, 0);\r
+ this->m_tree->m_childframe->m_ty = ytosiz;\r
+\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ csiz = STREAM_TO_UINT16(twobytes, 0);\r
+\r
+ bool equaldepth = true, equalsize = true;\r
+ unsigned char *ssiz = new unsigned char(csiz);\r
+ unsigned char *xrsiz = new unsigned char(csiz);\r
+ unsigned char *yrsiz = new unsigned char(csiz);\r
+\r
+ for (int c = 0; c < csiz; c++) {\r
+\r
+ if (m_file->Read(&ssiz[c], 1) != 1)\r
break;\r
\r
- case SIZ_VAL:\r
- {\r
- m_file->Seek(2, wxFromCurrent);\r
- if (m_file->Read(fourbytes, 4) != 4)\r
- break;\r
- unsigned long int xsiz = STREAM_TO_UINT32(fourbytes, 0);\r
+ if (c > 0)\r
+ equaldepth = equaldepth && (ssiz[c] == ssiz[c - 1]);\r
\r
- if (m_file->Read(fourbytes, 4) != 4)\r
- break;\r
- unsigned long int ysiz = STREAM_TO_UINT32(fourbytes, 0);\r
+ if (m_file->Read(&xrsiz[c], 1) != 1)\r
+ break;\r
\r
- m_file->Seek(24, wxFromCurrent);\r
- if (m_file->Read(twobytes, 2) != 2)\r
- break;\r
- unsigned short int csiz = STREAM_TO_UINT16(twobytes, 0);\r
+ if (m_file->Read(&yrsiz[c], 1) != 1)\r
+ break;\r
+\r
+ if (c > 0)\r
+ equalsize = equalsize && (xrsiz[c] == xrsiz[c - 1]) && (yrsiz[c] == yrsiz[c - 1]) ;\r
+\r
+ }\r
+\r
+ if (equaldepth && equalsize)\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("I: %dx%d (%d, %d), %d c., %d%s bpp"),\r
+ xsiz, ysiz,\r
+ xosiz, yosiz,\r
+ csiz, ((ssiz[0] & 0x7F) + 1),\r
+ (ssiz[0] & 0x80) ? wxT("s") : wxT("u")),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+ else\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("I: %dx%d (%d, %d), %d c."),\r
+ xsiz, ysiz,\r
+ xosiz, yosiz,\r
+ csiz),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("T: %dx%d (%d, %d)"),\r
+ xtsiz, ytsiz,\r
+ xtosiz, ytosiz),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ image = m_tree->TreeCtrlIcon_Folder;\r
+ imageSel = image + 1;\r
+\r
+ wxTreeItemId subcurrid4 = m_tree->AppendItem(currid,\r
+ wxT("Components"),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ for (c = 0; c < csiz; c++) {\r
+\r
+ wxTreeItemId subcurrid5 = m_tree->AppendItem(subcurrid4,\r
+ wxString::Format(wxT("#%d: %dx%d, %d%s bpp"),\r
+ c,\r
+ xsiz/xrsiz[c], ysiz/yrsiz[c],\r
+ ((ssiz[c] & 0x7F) + 1),\r
+ (ssiz[c] & 0x80) ? wxT("s") : wxT("u")),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ }\r
+\r
+ };\r
+ break;\r
+\r
+ /////////\r
+ // SOT //\r
+ /////////\r
+ case SOT_VAL:\r
+ {\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ unsigned short int isot = STREAM_TO_UINT16(twobytes, 0);\r
+\r
+ if (m_file->Read(fourbytes, 4) != 4)\r
+ break;\r
+ unsigned long int psot = STREAM_TO_UINT32(fourbytes, 0);\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char tpsot = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char tnsot = onebyte[0];\r
+\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("tile %d, psot = %d, part %d of %d"), isot, psot, tpsot, tnsot),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ lastPsot = psot;\r
+ lastsotpos = offset;\r
+ inside_sod = 0;\r
+ };\r
+ break;\r
+\r
+ /////////\r
+ // COC //\r
+ /////////\r
+ case COC_VAL:\r
+ {\r
+ unsigned short int ccoc;\r
+ if (csiz < 257) {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ ccoc = onebyte[0];\r
+ } else {\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ ccoc = STREAM_TO_UINT16(twobytes, 0);\r
+ }\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char scoc = onebyte[0];\r
+\r
+ wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("Comp. no. %d"), ccoc),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+ \r
+ wxString text;\r
+ if (scoc & 0x01)\r
+ text << wxT("Partitioned entropy coder");\r
+ else\r
+ text << wxT("Unpartitioned entropy coder");\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char decomplevs = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char cbswidth = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char cbsheight = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char cbstyle = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char transform = onebyte[0];\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (transform & 0x01)\r
+ text = wxT("5-3 reversible wavelet");\r
+ else\r
+ text = wxT("9-7 irreversible wavelet");\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ image = m_tree->TreeCtrlIcon_Folder;\r
+ imageSel = image + 1;\r
\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ wxT("Coding styles"),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ if (cbstyle & 0x01)\r
+ text = wxT("Selective arithmetic coding bypass");\r
+ else\r
+ text = wxT("No selective arithmetic coding bypass");\r
+ wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x02)\r
+ text = wxT("Reset context probabilities on coding pass boundaries");\r
+ else\r
+ text = wxT("No reset of context probabilities on coding pass boundaries");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x04)\r
+ text = wxT("Termination on each coding passs");\r
+ else\r
+ text = wxT("No termination on each coding pass");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x08)\r
+ text = wxT("Vertically stripe causal context");\r
+ else\r
+ text = wxT("No vertically stripe causal context");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x10)\r
+ text = wxT("Predictable termination");\r
+ else\r
+ text = wxT("No predictable termination");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x20)\r
+ text = wxT("Segmentation symbols are used");\r
+ else\r
+ text = wxT("No segmentation symbols are used");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ }\r
+ break;\r
+\r
+ /////////\r
+ // COD //\r
+ /////////\r
+ case COD_VAL:\r
+ {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char scod = onebyte[0];\r
+\r
+ wxString text;\r
+\r
+ if (scod & 0x01)\r
+ text << wxT("Partitioned entropy coder");\r
+ else\r
+ text << wxT("Unpartitioned entropy coder");\r
+\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ text = wxT("");\r
+ if (scod & 0x02)\r
+ text << wxT("Possible SOPs");\r
+ else\r
+ text << wxT("No SOPs");\r
+\r
+ if (scod & 0x04)\r
+ text << wxT(", possible EPHs");\r
+ else\r
+ text << wxT(", no EPHs");\r
+\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char progord = onebyte[0];\r
+\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ unsigned short int numlayers = STREAM_TO_UINT16(twobytes, 0);\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char mctransform = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char decomplevs = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char cbswidth = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char cbsheight = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char cbstyle = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char transform = onebyte[0];\r
+\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("%d levels (%d resolutions)"), decomplevs, decomplevs + 1),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ text = wxT("");\r
+ switch (progord) {\r
+ case (0):\r
+ text << wxT("LRCP");\r
+ break;\r
+ case (1):\r
+ text << wxT("RLCP");\r
+ break;\r
+ case (2):\r
+ text << wxT("LRCP");\r
+ break;\r
+ case (3):\r
+ text << wxT("RPCL");\r
+ break;\r
+ case (4):\r
+ text << wxT("CPRL");\r
+ break;\r
+ default:\r
+ text << wxT("unknown progression");\r
+ break;\r
+ }\r
+ text << wxString::Format(wxT(", %d layers"), numlayers);\r
+ if (transform & 0x01)\r
+ text << wxT(", 5-3 rev.");\r
+ else\r
+ text << wxT(", 9-7 irr.");\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("Code-blocks: %dx%d"), 1 << ((cbswidth & 0x0F) + 2), 1 << ((cbsheight & 0x0F) + 2)),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ switch (mctransform) {\r
+ case (0):\r
+ {\r
+ text = wxT("No MCT");\r
+ }\r
+ break;\r
+ case (1):\r
+ {\r
+ text = wxT("Reversible MCT on 0, 1, 2");\r
+ }\r
+ break;\r
+ case (2):\r
+ {\r
+ text = wxT("Irreversible MCT on 0, 1, 2");\r
+ }\r
+ break;\r
+ default:\r
+ {\r
+ text = wxT("Unknown");\r
+ }\r
+ break;\r
+ };\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+\r
+ image = m_tree->TreeCtrlIcon_Folder;\r
+ imageSel = image + 1;\r
+\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ wxT("Coding styles"),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ if (cbstyle & 0x01)\r
+ text = wxT("Selective arithmetic coding bypass");\r
+ else\r
+ text = wxT("No selective arithmetic coding bypass");\r
+ wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x02)\r
+ text = wxT("Reset context probabilities on coding pass boundaries");\r
+ else\r
+ text = wxT("No reset of context probabilities on coding pass boundaries");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x04)\r
+ text = wxT("Termination on each coding passs");\r
+ else\r
+ text = wxT("No termination on each coding pass");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x08)\r
+ text = wxT("Vertically stripe causal context");\r
+ else\r
+ text = wxT("No vertically stripe causal context");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x10)\r
+ text = wxT("Predictable termination");\r
+ else\r
+ text = wxT("No predictable termination");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (cbstyle & 0x20)\r
+ text = wxT("Segmentation symbols are used");\r
+ else\r
+ text = wxT("No segmentation symbols are used");\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ };\r
+ break;\r
+\r
+ /////////\r
+ // QCC //\r
+ /////////\r
+ case QCC_VAL:\r
+ {\r
+ unsigned short int cqcc;\r
+ if (csiz < 257) {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ cqcc = onebyte[0];\r
+ } else {\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ cqcc = STREAM_TO_UINT16(twobytes, 0);\r
+ }\r
+\r
+ wxTreeItemId subcurrid = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("Comp. no. %d"), cqcc),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+ \r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char sqcc = onebyte[0];\r
+\r
+ wxString text;\r
+ switch (sqcc & 0x1F) {\r
+ case (0):\r
+ text = wxT("No quantization");\r
+ break;\r
+ case (1):\r
+ text = wxT("Scalar implicit");\r
+ break;\r
+ case (2):\r
+ text = wxT("Scalar explicit");\r
+ break;\r
+ default:\r
+ text = wxT("Unknown");\r
+ break;\r
+ }\r
+ text << wxString::Format(wxT(", %d guard bits"), (sqcc & 0xE0) >> 5);\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ }\r
+ break;\r
+\r
+ /////////\r
+ // QCD //\r
+ /////////\r
+ case QCD_VAL:\r
+ {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char sqcd = onebyte[0];\r
+\r
+ wxString text;\r
+ switch (sqcd & 0x1F) {\r
+ case (0):\r
+ text = wxT("No quantization");\r
+ break;\r
+ case (1):\r
+ text = wxT("Scalar implicit");\r
+ break;\r
+ case (2):\r
+ text = wxT("Scalar explicit");\r
+ break;\r
+ default:\r
+ text = wxT("Unknown");\r
+ break;\r
+ }\r
+ text << wxString::Format(wxT(", %d guard bits"), (sqcd & 0xE0) >> 5);\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ };\r
+ break;\r
+\r
+ /////////\r
+ // COM //\r
+ /////////\r
+ case COM_VAL:\r
+ {\r
+ #define showlen 25\r
+ unsigned char comment[showlen];\r
+\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ unsigned short int rcom = STREAM_TO_UINT16(twobytes, 0);\r
+\r
+ wxString text;\r
+ if (rcom == 0)\r
+ text = wxT("Binary values");\r
+ else if (rcom == 1)\r
+ text = wxT("ISO 8859-1 (latin-1) values");\r
+ else if (rcom < 65535)\r
+ text = wxT("Reserved for registration");\r
+ else\r
+ text = wxT("Reserved for extension");\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ if (m_file->Read(comment, showlen) != showlen)\r
+ break;\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("%.*s%s"), wxMin(showlen, currlen - 4), comment,\r
+ (((currlen - 4) > showlen) ? "..." : "")),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+ };\r
+ break;\r
+\r
+ /////////\r
+ // TLM //\r
+ /////////\r
+ case TLM_VAL:\r
+ {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char ztlm = onebyte[0];\r
+\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char stlm = onebyte[0];\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("TLM #%d"), ztlm),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("%d bits/index, %d bits/length"),\r
+ 8 * ((stlm & 0x30) >> 4), 16 + 16 * ((stlm & 0x40) >> 6)),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ int n, numparts;\r
+\r
+ numparts = (currlen - 2) / ( ((stlm & 0x30) >> 4) + 2 + 2 * ((stlm & 0x40) >> 6));\r
+\r
+ image = m_tree->TreeCtrlIcon_Folder;\r
+ imageSel = image + 1;\r
+\r
+ subcurrid3 = m_tree->AppendItem(currid,\r
+ wxT("Tile parts"),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ for (n = 0; n < numparts; n++) {\r
+\r
+ unsigned short int ttlm;\r
+ unsigned long int ptlm;\r
+\r
+ switch (((stlm & 0x30) >> 4)) {\r
+\r
+ case 0:\r
+ ttlm = 0;\r
+ break;\r
+\r
+ case 1:\r
if (m_file->Read(onebyte, 1) != 1)\r
break;\r
- unsigned char ssiz = onebyte[0];\r
-\r
- wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
- wxString::Format(wxT("%d x %d, %d comps. @ %d bpp"), xsiz, ysiz, csiz, (ssiz + 1) & 0xEF),\r
- image, imageSel,\r
- new OPJMarkerData(wxT("INFO"))\r
- );\r
+ ttlm = onebyte[0];\r
+ break;\r
\r
- }\r
+ case 2:\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ ttlm = STREAM_TO_UINT16(twobytes, 0);\r
break;\r
\r
- case SOT_VAL:\r
- {\r
+ }\r
+\r
+ switch (((stlm & 0x40) >> 6)) {\r
+\r
+ case 0:\r
if (m_file->Read(twobytes, 2) != 2)\r
break;\r
- unsigned short int isot = STREAM_TO_UINT16(twobytes, 0);\r
+ ptlm = STREAM_TO_UINT16(twobytes, 0);\r
+ break;\r
\r
+ case 1:\r
if (m_file->Read(fourbytes, 4) != 4)\r
break;\r
- unsigned long int psot = STREAM_TO_UINT32(fourbytes, 0);\r
+ ptlm = STREAM_TO_UINT32(fourbytes, 0);\r
+ break;\r
\r
- if (m_file->Read(onebyte, 1) != 1)\r
- break;\r
- unsigned char tpsot = onebyte[0];\r
+ }\r
+\r
+ wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ wxString::Format(wxT("Tile %d: %d bytes"), ttlm, ptlm),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ }\r
+\r
+ }\r
+ break;\r
+\r
+ /////////\r
+ // POD //\r
+ /////////\r
+ case POD_VAL:\r
+ {\r
+ int n, numchanges;\r
+\r
+ if (csiz < 257)\r
+ numchanges = (currlen - 2) / 7;\r
+ else\r
+ numchanges = (currlen - 2) / 9;\r
+\r
+ for (n = 0; n < numchanges; n++) {\r
+\r
+ image = m_tree->TreeCtrlIcon_Folder;\r
+ imageSel = image + 1;\r
+\r
+ wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
+ wxString::Format(wxT("Change #%d"), n),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char rspod = onebyte[0];\r
+\r
+ unsigned short int cspod;\r
+ if (csiz < 257) {\r
if (m_file->Read(onebyte, 1) != 1)\r
break;\r
- unsigned char tnsot = onebyte[0];\r
-\r
- wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
- wxString::Format(wxT("tile %d, psot = %d, part %d of %d"), isot, psot, tpsot, tnsot),\r
- image, imageSel,\r
- new OPJMarkerData(wxT("INFO"))\r
- );\r
+ cspod = onebyte[0];\r
+ } else {\r
+ if (m_file->Read(twobytes, 2) != 2)\r
+ break;\r
+ cspod = STREAM_TO_UINT16(twobytes, 0);\r
+ }\r
\r
- lastPsot = psot;\r
- lastsotpos = offset;\r
- };\r
+ if (m_file->Read(twobytes, 2) != 2)\r
break;\r
+ unsigned short int lyepod = STREAM_TO_UINT16(twobytes, 0);\r
\r
- case CME_VAL:\r
- {\r
- #define showlen 25\r
- unsigned char comment[showlen];\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ unsigned char repod = onebyte[0];\r
\r
- m_file->Seek(2, wxFromCurrent);\r
- if (m_file->Read(comment, showlen) != showlen)\r
+ unsigned short int cepod;\r
+ if (csiz < 257) {\r
+ if (m_file->Read(onebyte, 1) != 1)\r
+ break;\r
+ cepod = onebyte[0];\r
+ } else {\r
+ if (m_file->Read(twobytes, 2) != 2)\r
break;\r
+ cepod = STREAM_TO_UINT16(twobytes, 0);\r
+ }\r
\r
- wxTreeItemId subcurrid3 = m_tree->AppendItem(currid,\r
- wxString::Format(wxT("%.*s%s"), wxMin(showlen, currlen - 4), comment,\r
- (((currlen - 4) > showlen) ? "..." : "")),\r
- image, imageSel,\r
- new OPJMarkerData(wxT("INFO"))\r
- );\r
- }\r
+ if (m_file->Read(onebyte, 1) != 1)\r
break;\r
+ unsigned char ppod = onebyte[0];\r
+\r
+ image = m_tree->TreeCtrlIcon_File;\r
+ imageSel = image + 1;\r
+\r
+ wxTreeItemId subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ wxString::Format(wxT("%d <= Resolution < %d"), rspod, repod),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ wxString::Format(wxT("%d <= Component < %d"), cspod, cepod),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ wxString::Format(wxT("0 <= Layer < %d"), lyepod),\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
\r
+ wxString text = wxT("");\r
+ switch (ppod) {\r
+ case (0):\r
+ text << wxT("LRCP");\r
+ break;\r
+ case (1):\r
+ text << wxT("RLCP");\r
+ break;\r
+ case (2):\r
+ text << wxT("LRCP");\r
+ break;\r
+ case (3):\r
+ text << wxT("RPCL");\r
+ break;\r
+ case (4):\r
+ text << wxT("CPRL");\r
+ break;\r
default:\r
+ text << wxT("unknown progression");\r
break;\r
}\r
- \r
- \r
- // increment number of markers\r
- nmarks++;\r
- if (nmarks >= maxmarks)\r
- break;\r
+ subcurrid4 = m_tree->AppendItem(subcurrid3,\r
+ text,\r
+ image, imageSel,\r
+ new OPJMarkerData(wxT("INFO"))\r
+ );\r
+ }\r
\r
- // increment offset\r
- if (currmark == SOD_VAL)\r
- offset += lastPsot - (offset - lastsotpos);\r
- else\r
- offset += (2 + currlen);\r
+ }\r
+ break;\r
\r
- m_file->Seek(offset, wxFromStart);\r
- done = 1;\r
+ /////////\r
+ // SOD //\r
+ /////////\r
+ case SOD_VAL:\r
+ {\r
+ inside_sod = 1;\r
+ };\r
+ break;\r
\r
- break;\r
- }\r
+ default:\r
+ break;\r
+ \r
}\r
-\r
- if (done)\r
- continue;\r
- else {\r
- offset++;\r
- m_file->Seek(offset, wxFromStart);\r
+ \r
+ // increment number of markers\r
+ if (nmarks++ >= maxmarks) {\r
+ WriteText(wxT("Maximum amount of markers exceeded"));\r
+ break;\r
}\r
- }\r
- \r
+\r
+ // advance position\r
+ OPJ_ADVANCE(currlen + 2);\r
+ } \r
+\r
+ WriteText(wxT("Search finished"));\r
}\r