! : changed
+ : added
+November 29, 2007
+! [GB] Added index.h and index.c in VC6 projects; wrapped index.h in the C++ preprocessor; modified OPJViewer project and some files.
+
November 14, 2007
+ [FOD] Created the file index.c in the codec directory. This file handles the creation of index files,
at encoding and decoding.
\r
CFLAGS = -DUSE_JPWL -DwxUSE_LIBOPENJPEG -DwxUSE_GUI=1 -DOPJ_STATIC -DOPJ_HTMLABOUT $(shell wx-config-2.8 --cxxflags) # -g -p -pg -DUSE_JPWL\r
\r
-OPJV_SRCS = source/imagj2k.cpp source/imagmj2.cpp source/wxj2kparser.cpp source/imagjp2.cpp source/OPJViewer.cpp source/wxjp2parser.cpp\r
+OPJV_SRCS = source/imagj2k.cpp source/imagmj2.cpp source/wxj2kparser.cpp source/imagjp2.cpp source/OPJViewer.cpp source/wxjp2parser.cpp source/OPJViewer.cpp source/OPJThreads.cpp\r
\r
MODULES = $(OPJV_SRCS:.cpp=.o)\r
\r
# PROP Ignore_Export_Lib 0\r
# PROP Target_Dir ""\r
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c\r
-# ADD CPP /nologo /G6 /MD /W3 /GX /O2 /I "d:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "d:\programmi\wxWidgets-2.8.0\include" /I ".." /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "wxUSE_LIBOPENJPEG" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /D "OPJ_HTMLABOUT" /D "OPJ_MANYFORMATS" /D "OPJ_INICONFIG" /FR /FD /c\r
+# ADD CPP /nologo /G6 /MD /W3 /GX /O2 /I "d:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "d:\programmi\wxWidgets-2.8.0\include" /I ".." /I "../libopenjpeg" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "wxUSE_LIBOPENJPEG" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /D "USE_MXF" /D "OPJ_HTMLABOUT" /D "OPJ_MANYFORMATS" /D "OPJ_INICONFIG" /FR /FD /c\r
# ADD BASE RSC /l 0x410 /d "NDEBUG"\r
# ADD RSC /l 0x409 /i "d:\programmi\wxWidgets-2.8.0\include" /d "NDEBUG"\r
BSC32=bscmake.exe\r
# PROP Ignore_Export_Lib 0\r
# PROP Target_Dir ""\r
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c\r
-# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "d:\Programmi\wxWidgets-2.8.0\INCLUDE" /I "d:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "c:\programmi\wxWidgets-2.8.0\include" /I ".." /D "_DEBUG" /D "__WXDEBUG__" /D WXDEBUG=1 /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "wxUSE_LIBOPENJPEG" /D "OPJ_STATIC" /D "USE_JPWL" /D "OPJ_HTMLABOUT" /FR /FD /GZ /c\r
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "c:\Programmi\wxWidgets-2.8.0\INCLUDE" /I "c:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "c:\programmi\wxWidgets-2.8.0\include" /I ".." /D "_DEBUG" /D "__WXDEBUG__" /D WXDEBUG=1 /D "WIN32" /D "_CONSOLE" /D "_MBCS" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "wxUSE_LIBOPENJPEG" /D "OPJ_STATIC" /D "USE_JPWL" /D "OPJ_HTMLABOUT" /FR /FD /GZ /c\r
# ADD BASE RSC /l 0x410 /d "_DEBUG"\r
-# ADD RSC /l 0x410 /i "d:\programmi\wxWidgets-2.8.0\include" /d "_DEBUG"\r
+# ADD RSC /l 0x410 /i "c:\programmi\wxWidgets-2.8.0\include" /d "_DEBUG"\r
BSC32=bscmake.exe\r
# ADD BASE BSC32 /nologo\r
# ADD BSC32 /nologo\r
LINK32=link.exe\r
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\r
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib wxzlibd.lib wxregexd.lib wxpngd.lib wxjpegd.lib wxtiffd.lib wxbase28d.lib wxmsw28d_core.lib wxmsw28d_html.lib wxmsw28d_adv.lib LibOpenJPEG_JPWLd.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcmtd.lib" /pdbtype:sept /libpath:"d:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Debug"\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib wxzlibd.lib wxregexd.lib wxpngd.lib wxjpegd.lib wxtiffd.lib wxbase28d.lib wxmsw28d_core.lib wxmsw28d_html.lib wxmsw28d_adv.lib LibOpenJPEG_JPWLd.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcmtd.lib" /pdbtype:sept /libpath:"c:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Debug"\r
# SUBTRACT LINK32 /pdb:none\r
\r
!ENDIF \r
# End Source File\r
# Begin Source File\r
\r
+SOURCE=.\source\imagmxf.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\codec\index.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\source\OPJAbout.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
SOURCE=.\source\OPJDialogs.cpp\r
# End Source File\r
# Begin Source File\r
\r
+SOURCE=.\source\OPJThreads.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
SOURCE=.\source\OPJViewer.cpp\r
# End Source File\r
# Begin Source File\r
# End Source File\r
# Begin Source File\r
\r
+SOURCE=.\source\imagmxf.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\codec\index.h\r
+# End Source File\r
+# Begin Source File\r
+\r
SOURCE=.\source\OPJViewer.h\r
# End Source File\r
# End Group\r
IMPLEMENT_CLASS(OPJDecoderDialog, wxPropertySheetDialog)\r
\r
BEGIN_EVENT_TABLE(OPJDecoderDialog, wxPropertySheetDialog)\r
-#ifdef USE_JPWL\r
EVT_CHECKBOX(OPJDECO_ENABLEDECO, OPJDecoderDialog::OnEnableDeco)\r
+#ifdef USE_JPWL\r
EVT_CHECKBOX(OPJDECO_ENABLEJPWL, OPJDecoderDialog::OnEnableJPWL)\r
#endif // USE_JPWL\r
END_EVENT_TABLE()\r
\r
#endif // USE_JPWL\r
\r
-bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)\r
-{\r
- /*size_t nFiles = filenames.GetCount();\r
- wxString str;\r
- str.Printf( _T("%d files dropped\n"), (int)nFiles);\r
- for ( size_t n = 0; n < nFiles; n++ ) {\r
- str << filenames[n] << wxT("\n");\r
- }\r
- wxLogMessage(str);*/\r
- m_pOwner->OpenFiles(filenames, filenames);\r
-\r
- return true;\r
-}\r
-\r
-\r
\r
\r
\r
IMPLEMENT_CLASS(OPJEncoderDialog, wxPropertySheetDialog)\r
\r
BEGIN_EVENT_TABLE(OPJEncoderDialog, wxPropertySheetDialog)\r
-#ifdef USE_JPWL\r
- EVT_CHECKBOX(OPJENCO_ENABLEJPWL, OPJEncoderDialog::OnEnableJPWL)\r
EVT_CHECKBOX(OPJENCO_ENABLECOMM, OPJEncoderDialog::OnEnableComm)\r
EVT_CHECKBOX(OPJENCO_ENABLEINDEX, OPJEncoderDialog::OnEnableIdx)\r
+ EVT_CHECKBOX(OPJENCO_ENABLEPOC, OPJEncoderDialog::OnEnablePoc)\r
EVT_RADIOBUTTON(OPJENCO_RATERADIO, OPJEncoderDialog::OnRadioQualityRate)\r
EVT_RADIOBUTTON(OPJENCO_QUALITYRADIO, OPJEncoderDialog::OnRadioQualityRate)\r
+#ifdef USE_JPWL\r
+ EVT_CHECKBOX(OPJENCO_ENABLEJPWL, OPJEncoderDialog::OnEnableJPWL)\r
+ EVT_CHOICE(OPJENCO_HPROT, OPJEncoderDialog::OnHprotSelect)\r
+ EVT_CHOICE(OPJENCO_PPROT, OPJEncoderDialog::OnPprotSelect)\r
+ EVT_CHOICE(OPJENCO_SENSI, OPJEncoderDialog::OnSensiSelect)\r
#endif // USE_JPWL\r
END_EVENT_TABLE()\r
\r
wxPanel* jpwlSettings = CreatePart11SettingsPage(m_settingsNotebook);\r
#endif // USE_JPWL\r
\r
- m_settingsNotebook->AddPage(jpeg2000_1Settings, wxT("JPEG 2000 - 1"), false);\r
- m_settingsNotebook->AddPage(jpeg2000_2Settings, wxT("JPEG 2000 - 2"), false);\r
- m_settingsNotebook->AddPage(mainSettings, wxT("General"), false);\r
#ifdef USE_JPWL\r
m_settingsNotebook->AddPage(jpwlSettings, wxT("JPWL"), false);\r
#endif // USE_JPWL\r
+ m_settingsNotebook->AddPage(jpeg2000_1Settings, wxT("JPEG 2000 - 1"), false);\r
+ m_settingsNotebook->AddPage(jpeg2000_2Settings, wxT("JPEG 2000 - 2"), false);\r
+ m_settingsNotebook->AddPage(mainSettings, wxT("General"), false);\r
\r
LayoutDialog();\r
}\r
wxPanel* OPJEncoderDialog::CreatePart11SettingsPage(wxWindow* parent)\r
{\r
wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+ int specno;\r
\r
// top sizer\r
wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
\r
+ // add JPWL enabling check box\r
+ topSizer->Add(\r
+ m_enablejpwlCheck = new wxCheckBox(panel, OPJENCO_ENABLEJPWL, wxT("Enable JPWL"),\r
+ wxDefaultPosition, wxDefaultSize),\r
+ 0, wxGROW | wxALL | wxALIGN_CENTER, 5);\r
+ m_enablejpwlCheck->SetValue(wxGetApp().m_enablejpwle);\r
+\r
// sub top sizer\r
- wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
+ wxFlexGridSizer *subtopSizer = new wxFlexGridSizer(2, 3, 3);\r
+\r
+ // header settings, column\r
+ wxStaticBox* headerBox = new wxStaticBox(panel, wxID_ANY, wxT("Header protection"));\r
+ wxBoxSizer* headerSizer = new wxStaticBoxSizer(headerBox, wxVERTICAL);\r
+\r
+ // info sizer, row\r
+ wxBoxSizer* info1Sizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+ // add some text\r
+ info1Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+ wxT("Type")),\r
+ 0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ // add some horizontal space\r
+ info1Sizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+ // add some text\r
+ info1Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+ wxT("Tile part")),\r
+ 0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ headerSizer->Add(info1Sizer, 0, wxGROW | wxALL, 0);\r
+\r
+ // specify specs\r
+ wxString hprotvalues[] = {wxT("None"), wxT("Pred."), wxT("CRC16"), wxT("CRC32"),\r
+ wxT("RS37"), wxT("RS38"), wxT("RS40"), wxT("RS43"), wxT("RS45"), wxT("RS48"),\r
+ wxT("RS51"), wxT("RS53"), wxT("RS56"), wxT("RS64"), wxT("RS75"), wxT("RS80"),\r
+ wxT("RS85"), wxT("RS96"), wxT("RS112"), wxT("RS128")};\r
+ for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+\r
+ // tile+hprot sizer, row\r
+ wxBoxSizer* tilehprotSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+ // add the value selection\r
+ tilehprotSizer->Add(\r
+ m_hprotChoice[specno] = new wxChoice(panel, OPJENCO_HPROT,\r
+ wxDefaultPosition, wxSize(60, wxDefaultCoord),\r
+ WXSIZEOF(hprotvalues), hprotvalues),\r
+ 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+ m_hprotChoice[specno]->SetSelection(wxGetApp().m_hprotsel[specno]);\r
+\r
+ // add some horizontal space\r
+ tilehprotSizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+ // add the value control\r
+ tilehprotSizer->Add(\r
+ m_htileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_HTILE,\r
+ wxString::Format(wxT("%d"), wxGetApp().m_htileval[specno]),\r
+ wxDefaultPosition, wxSize(45, wxDefaultCoord),\r
+ wxSP_ARROW_KEYS,\r
+ 0, JPWL_MAXIMUM_TILES - 1, 0),\r
+ 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ headerSizer->Add(tilehprotSizer, 0, wxGROW | wxALL, 0);\r
+ }\r
+\r
+ wxCommandEvent event1;\r
+ OnHprotSelect(event1);\r
+\r
+ subtopSizer->Add(headerSizer, 0, wxGROW | wxALL, 3);\r
+\r
+ // packet settings, column\r
+ wxStaticBox* packetBox = new wxStaticBox(panel, wxID_ANY, wxT("Packet protection"));\r
+ wxBoxSizer* packetSizer = new wxStaticBoxSizer(packetBox, wxVERTICAL);\r
+\r
+ // info sizer, row\r
+ wxBoxSizer* info2Sizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+ // add some text\r
+ info2Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+ wxT("Type")),\r
+ 0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ // add some horizontal space\r
+ info2Sizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+ // add some text\r
+ info2Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+ wxT("Tile part")),\r
+ 0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ // add some horizontal space\r
+ info2Sizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+ // add some text\r
+ info2Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+ wxT("Packet")),\r
+ 0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ packetSizer->Add(info2Sizer, 0, wxGROW | wxALL, 0);\r
+\r
+ // specify specs\r
+ wxString pprotvalues[] = {wxT("None"), wxT("Pred."), wxT("CRC16"), wxT("CRC32"),\r
+ wxT("RS37"), wxT("RS38"), wxT("RS40"), wxT("RS43"), wxT("RS45"), wxT("RS48"),\r
+ wxT("RS51"), wxT("RS53"), wxT("RS56"), wxT("RS64"), wxT("RS75"), wxT("RS80"),\r
+ wxT("RS85"), wxT("RS96"), wxT("RS112"), wxT("RS128")};\r
+ for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+\r
+ // tile+pprot sizer, row\r
+ wxBoxSizer* tilepprotSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+ // add the value selection\r
+ tilepprotSizer->Add(\r
+ m_pprotChoice[specno] = new wxChoice(panel, OPJENCO_PPROT,\r
+ wxDefaultPosition, wxSize(60, wxDefaultCoord),\r
+ WXSIZEOF(pprotvalues), pprotvalues),\r
+ 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+ m_pprotChoice[specno]->SetSelection(wxGetApp().m_pprotsel[specno]);\r
+\r
+ // add some horizontal space\r
+ tilepprotSizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+ // add the value control\r
+ tilepprotSizer->Add(\r
+ m_ptileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_PTILE,\r
+ wxString::Format(wxT("%d"), wxGetApp().m_ptileval[specno]),\r
+ wxDefaultPosition, wxSize(45, wxDefaultCoord),\r
+ wxSP_ARROW_KEYS,\r
+ 0, JPWL_MAXIMUM_TILES - 1, 0),\r
+ 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ // add some horizontal space\r
+ tilepprotSizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+ // add the value control\r
+ tilepprotSizer->Add(\r
+ m_ppackCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_PPACK,\r
+ wxString::Format(wxT("%d"), wxGetApp().m_ppackval[specno]),\r
+ wxDefaultPosition, wxSize(50, wxDefaultCoord),\r
+ wxSP_ARROW_KEYS,\r
+ 0, 2047, 0),\r
+ 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ packetSizer->Add(tilepprotSizer, 0, wxGROW | wxALL, 0);\r
+ }\r
+\r
+ wxCommandEvent event2;\r
+ OnPprotSelect(event2);\r
+\r
+ subtopSizer->Add(packetSizer, 0, wxGROW | wxALL, 3);\r
+\r
+ // sensitivity settings, column\r
+ wxStaticBox* sensiBox = new wxStaticBox(panel, wxID_ANY, wxT("Sensitivity"));\r
+ wxBoxSizer* sensiSizer = new wxStaticBoxSizer(sensiBox, wxVERTICAL);\r
+\r
+ // info sizer, row\r
+ wxBoxSizer* info3Sizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+ // add some text\r
+ info3Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+ wxT("Type")),\r
+ 0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ // add some horizontal space\r
+ info3Sizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+ // add some text\r
+ info3Sizer->Add(new wxStaticText(panel, wxID_ANY,\r
+ wxT("Tile part")),\r
+ 0, wxALL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ sensiSizer->Add(info3Sizer, 0, wxGROW | wxALL, 0);\r
+\r
+ // specify specs\r
+ wxString sensivalues[] = {wxT("None"), wxT("RELATIVE ERROR"), wxT("MSE"),\r
+ wxT("MSE REDUCTION"), wxT("PSNR INCREMENT"), wxT("MAXERR"), wxT("TSE")};\r
+ for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+\r
+ // tile+sensi sizer, row\r
+ wxBoxSizer* tilesensiSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+ // add the value selection\r
+ tilesensiSizer->Add(\r
+ m_sensiChoice[specno] = new wxChoice(panel, OPJENCO_SENSI,\r
+ wxDefaultPosition, wxSize(110, wxDefaultCoord),\r
+ WXSIZEOF(sensivalues), sensivalues),\r
+ 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+ m_sensiChoice[specno]->SetSelection(wxGetApp().m_sensisel[specno]);\r
+\r
+ // add some horizontal space\r
+ tilesensiSizer->Add(3, 3, 1, wxALL, 0);\r
+\r
+ // add the value control\r
+ tilesensiSizer->Add(\r
+ m_stileCtrl[specno] = new wxSpinCtrl(panel, OPJENCO_STILE,\r
+ wxString::Format(wxT("%d"), wxGetApp().m_stileval[specno]),\r
+ wxDefaultPosition, wxSize(45, wxDefaultCoord),\r
+ wxSP_ARROW_KEYS,\r
+ 0, JPWL_MAXIMUM_TILES - 1, 0),\r
+ 0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 1);\r
+\r
+ sensiSizer->Add(tilesensiSizer, 0, wxGROW | wxALL, 0);\r
+ }\r
+\r
+ wxCommandEvent event3;\r
+ OnSensiSelect(event3);\r
+\r
+ subtopSizer->Add(sensiSizer, 0, wxGROW | wxALL, 3);\r
\r
topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
\r
wxString::Format(wxT("%d"), wxGetApp().m_resolutions),\r
wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
wxSP_ARROW_KEYS,\r
- 0, 256, 6),\r
+ 1, 256, 6),\r
0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3);\r
\r
transformSizer->Add(resnumSizer, 0, wxGROW | wxALL, 3);\r
\r
subtopSizer->Add(roiSizer, 0, wxGROW | wxALL, 3);\r
\r
- // Index file settings, column\r
- wxStaticBox* indexBox = new wxStaticBox(panel, wxID_ANY, wxT("Indexing"));\r
- wxBoxSizer* indexSizer = new wxStaticBoxSizer(indexBox, wxVERTICAL);\r
+ // POC settings, column\r
+ wxStaticBox* pocBox = new wxStaticBox(panel, wxID_ANY, wxT("POC"));\r
+ wxBoxSizer* pocSizer = new wxStaticBoxSizer(pocBox, wxVERTICAL);\r
\r
- // indexing check box\r
- indexSizer->Add(\r
- m_enableidxCheck = new wxCheckBox(panel, OPJENCO_ENABLEINDEX, wxT("Enabled"),\r
+ // POC check box\r
+ pocSizer->Add(\r
+ m_enablepocCheck = new wxCheckBox(panel, OPJENCO_ENABLEPOC, wxT("Enabled (tn=rs,cs,le,re,ce,pr)"),\r
wxDefaultPosition, wxDefaultSize),\r
0, wxGROW | wxALL, 3);\r
- m_enableidxCheck->SetValue(wxGetApp().m_enableidx);\r
+ m_enablepocCheck->SetValue(wxGetApp().m_enablepoc);\r
\r
- // index file sizer, row\r
- wxBoxSizer* indexnameSizer = new wxBoxSizer(wxHORIZONTAL);\r
+ // POC sizer, row\r
+ wxBoxSizer* pocspecSizer = new wxBoxSizer(wxHORIZONTAL);\r
\r
// add some text\r
- indexnameSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&File name:")),\r
- 0, wxALL | wxALIGN_CENTER_VERTICAL, 3);\r
+ pocspecSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Changes:")),\r
+ 0, wxALL | wxALIGN_TOP, 3);\r
\r
// add some horizontal space\r
- indexnameSizer->Add(3, 3, 1, wxALL, 0);\r
+ pocspecSizer->Add(3, 3, 1, wxALL, 0);\r
\r
// add the value control\r
- indexnameSizer->Add(\r
- m_indexCtrl = new wxTextCtrl(panel, OPJENCO_INDEXNAME,\r
- wxGetApp().m_index,\r
- wxDefaultPosition, wxSize(120, wxDefaultCoord),\r
- wxTE_LEFT),\r
+ pocspecSizer->Add(\r
+ m_pocCtrl = new wxTextCtrl(panel, OPJENCO_POCSPEC,\r
+ wxGetApp().m_poc,\r
+ wxDefaultPosition, wxSize(140, 60),\r
+ wxTE_LEFT | wxTE_MULTILINE),\r
0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3);\r
- m_indexCtrl->Enable(wxGetApp().m_enableidx);\r
+ m_pocCtrl->Enable(wxGetApp().m_enablepoc);\r
\r
- indexSizer->Add(indexnameSizer, 0, wxGROW | wxALL, 3);\r
-\r
- subtopSizer->Add(indexSizer, 0, wxGROW | wxALL, 3);\r
+ pocSizer->Add(pocspecSizer, 0, wxGROW | wxALL, 3);\r
\r
+ subtopSizer->Add(pocSizer, 0, wxGROW | wxALL, 3);\r
+ \r
// Comment settings, column\r
wxStaticBox* commentBox = new wxStaticBox(panel, wxID_ANY, wxT("Comment"));\r
wxBoxSizer* commentSizer = new wxStaticBoxSizer(commentBox, wxVERTICAL);\r
\r
subtopSizer->Add(commentSizer, 0, wxGROW | wxALL, 3);\r
\r
- // POC settings, column\r
- wxStaticBox* pocBox = new wxStaticBox(panel, wxID_ANY, wxT("POC"));\r
- wxBoxSizer* pocSizer = new wxStaticBoxSizer(pocBox, wxVERTICAL);\r
+ // Index file settings, column\r
+ wxStaticBox* indexBox = new wxStaticBox(panel, wxID_ANY, wxT("Indexing"));\r
+ wxBoxSizer* indexSizer = new wxStaticBoxSizer(indexBox, wxVERTICAL);\r
\r
- // POC check box\r
- pocSizer->Add(\r
- m_enablepocCheck = new wxCheckBox(panel, OPJENCO_ENABLEPOC, wxT("Enabled"),\r
+ // indexing check box\r
+ indexSizer->Add(\r
+ m_enableidxCheck = new wxCheckBox(panel, OPJENCO_ENABLEINDEX, wxT("Enabled"),\r
wxDefaultPosition, wxDefaultSize),\r
0, wxGROW | wxALL, 3);\r
- m_enablepocCheck->SetValue(/*wxGetApp().m_enableidx*/true);\r
+ m_enableidxCheck->SetValue(wxGetApp().m_enableidx);\r
\r
- // POC sizer, row\r
- wxBoxSizer* pocspecSizer = new wxBoxSizer(wxHORIZONTAL);\r
+ // index file sizer, row\r
+ wxBoxSizer* indexnameSizer = new wxBoxSizer(wxHORIZONTAL);\r
\r
// add some text\r
- pocspecSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Changes:")),\r
+ indexnameSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&File name:")),\r
0, wxALL | wxALIGN_CENTER_VERTICAL, 3);\r
\r
// add some horizontal space\r
- pocspecSizer->Add(3, 3, 1, wxALL, 0);\r
+ indexnameSizer->Add(3, 3, 1, wxALL, 0);\r
\r
// add the value control\r
- pocspecSizer->Add(\r
- m_pocCtrl = new wxTextCtrl(panel, OPJENCO_POCSPEC,\r
- /*wxGetApp().m_index*/wxT("RRRR"),\r
+ indexnameSizer->Add(\r
+ m_indexCtrl = new wxTextCtrl(panel, OPJENCO_INDEXNAME,\r
+ wxGetApp().m_index,\r
wxDefaultPosition, wxSize(120, wxDefaultCoord),\r
wxTE_LEFT),\r
0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 3);\r
- m_pocCtrl->Enable(/*wxGetApp().m_enableidx*/true);\r
+ m_indexCtrl->Enable(wxGetApp().m_enableidx);\r
\r
- pocSizer->Add(pocspecSizer, 0, wxGROW | wxALL, 3);\r
+ indexSizer->Add(indexnameSizer, 0, wxGROW | wxALL, 3);\r
\r
- subtopSizer->Add(pocSizer, 0, wxGROW | wxALL, 3);\r
+ subtopSizer->Add(indexSizer, 0, wxGROW | wxALL, 3);\r
\r
topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
\r
\r
}\r
\r
+void OPJEncoderDialog::OnEnablePoc(wxCommandEvent& event)\r
+{\r
+ if (event.IsChecked()) {\r
+ wxLogMessage(wxT("POC enabled"));\r
+ m_pocCtrl->Enable(true);\r
+ } else {\r
+ wxLogMessage(wxT("POC disabled"));\r
+ m_pocCtrl->Enable(false);\r
+ }\r
+\r
+}\r
+\r
void OPJEncoderDialog::OnRadioQualityRate(wxCommandEvent& event)\r
{\r
if (event.GetId() == OPJENCO_QUALITYRADIO) {\r
#ifdef USE_JPWL\r
void OPJEncoderDialog::OnEnableJPWL(wxCommandEvent& event)\r
{\r
- /*if (event.IsChecked()) {\r
+ int specno;\r
+\r
+ if (event.IsChecked()) {\r
wxLogMessage(wxT("JPWL enabled"));\r
- m_expcompsCtrl->Enable(true);\r
- m_maxtilesCtrl->Enable(true);\r
+ for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+ m_hprotChoice[specno]->Enable(true);\r
+ m_htileCtrl[specno]->Enable(true);\r
+ m_pprotChoice[specno]->Enable(true);\r
+ m_ptileCtrl[specno]->Enable(true);\r
+ m_ppackCtrl[specno]->Enable(true);\r
+ m_sensiChoice[specno]->Enable(true);\r
+ m_stileCtrl[specno]->Enable(true);\r
+ }\r
+ OnHprotSelect(event);\r
+ OnPprotSelect(event);\r
+ OnSensiSelect(event);\r
} else {\r
wxLogMessage(wxT("JPWL disabled"));\r
- m_expcompsCtrl->Enable(false);\r
- m_maxtilesCtrl->Enable(false);\r
- }*/\r
+ for (specno = 0; specno < MYJPWL_MAX_NO_TILESPECS; specno++) {\r
+ m_hprotChoice[specno]->Enable(false);\r
+ m_htileCtrl[specno]->Enable(false);\r
+ m_pprotChoice[specno]->Enable(false);\r
+ m_ptileCtrl[specno]->Enable(false);\r
+ m_ppackCtrl[specno]->Enable(false);\r
+ m_sensiChoice[specno]->Enable(false);\r
+ m_stileCtrl[specno]->Enable(false);\r
+ }\r
+ }\r
\r
}\r
+\r
+void OPJEncoderDialog::OnHprotSelect(wxCommandEvent& event)\r
+{\r
+ int specno;\r
+\r
+ // deactivate properly\r
+ for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) {\r
+ if (!m_hprotChoice[specno]->GetSelection()) {\r
+ m_hprotChoice[specno]->Enable(false);\r
+ m_htileCtrl[specno]->Enable(false);\r
+ } else\r
+ break;\r
+ }\r
+ if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) {\r
+ m_hprotChoice[specno + 1]->Enable(true);\r
+ m_htileCtrl[specno + 1]->Enable(true);\r
+ }\r
+\r
+ //wxLogMessage(wxT("hprot changed: %d"), specno);\r
+}\r
+\r
+void OPJEncoderDialog::OnPprotSelect(wxCommandEvent& event)\r
+{\r
+ int specno;\r
+\r
+ // deactivate properly\r
+ for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) {\r
+ if (!m_pprotChoice[specno]->GetSelection()) {\r
+ m_pprotChoice[specno]->Enable(false);\r
+ m_ptileCtrl[specno]->Enable(false);\r
+ m_ppackCtrl[specno]->Enable(false);\r
+ } else\r
+ break;\r
+ }\r
+ if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) {\r
+ m_pprotChoice[specno + 1]->Enable(true);\r
+ m_ptileCtrl[specno + 1]->Enable(true);\r
+ m_ppackCtrl[specno + 1]->Enable(true);\r
+ }\r
+\r
+ //wxLogMessage(wxT("pprot changed: %d"), specno);\r
+}\r
+\r
+void OPJEncoderDialog::OnSensiSelect(wxCommandEvent& event)\r
+{\r
+ int specno;\r
+\r
+ // deactivate properly\r
+ for (specno = MYJPWL_MAX_NO_TILESPECS - 1; specno >= 0; specno--) {\r
+ if (!m_sensiChoice[specno]->GetSelection()) {\r
+ m_sensiChoice[specno]->Enable(false);\r
+ m_stileCtrl[specno]->Enable(false);\r
+ } else\r
+ break;\r
+ }\r
+ if (specno < (MYJPWL_MAX_NO_TILESPECS - 1)) {\r
+ m_sensiChoice[specno + 1]->Enable(true);\r
+ m_stileCtrl[specno + 1]->Enable(true);\r
+ }\r
+\r
+ //wxLogMessage(wxT("sprot changed: %d"), specno);\r
+}\r
+\r
+\r
#endif // USE_JPWL\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2007, Digital Signal Processing Laboratory, Universita'� degli studi di Perugia (UPG), Italy\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+#include "OPJViewer.h"\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Encoding thread class\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+OPJEncoThread::OPJEncoThread(OPJCanvas *canvas)\r
+ : wxThread()\r
+{\r
+ m_count = 0;\r
+ m_canvas = canvas;\r
+}\r
+\r
+void OPJEncoThread::WriteText(const wxString& text)\r
+{\r
+ wxString msg;\r
+\r
+ // before doing any GUI calls we must ensure that this thread is the only\r
+ // one doing it!\r
+\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiEnter();\r
+#endif // __WXGTK__\r
+\r
+ msg << text;\r
+ m_canvas->WriteText(msg);\r
+\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiLeave();\r
+#endif // __WXGTK__\r
+}\r
+\r
+void OPJEncoThread::OnExit()\r
+{\r
+ wxCriticalSectionLocker locker(wxGetApp().m_enco_critsect);\r
+\r
+ wxArrayThread& ethreads = wxGetApp().m_enco_threads;\r
+ ethreads.Remove(this);\r
+\r
+ if (ethreads.IsEmpty() )\r
+ {\r
+ // signal the main thread that there are no more threads left if it is\r
+ // waiting for us\r
+ if (wxGetApp().m_enco_waitingUntilAllDone) {\r
+ wxGetApp().m_enco_waitingUntilAllDone = false;\r
+ wxGetApp().m_enco_semAllDone.Post();\r
+ }\r
+ }\r
+}\r
+\r
+void *OPJEncoThread::Entry()\r
+{\r
+ wxString text;\r
+\r
+ srand(GetId());\r
+ //int m_countnum = rand() % 9;\r
+ //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
+ // GetId(), GetPriority(), m_countnum);\r
+ text.Printf(wxT("Enco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
+ WriteText(text);\r
+\r
+ // set handler properties\r
+ wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
+ j2kkkhandler->m_subsampling = wxGetApp().m_subsampling;\r
+ j2kkkhandler->m_origin = wxGetApp().m_origin;\r
+ j2kkkhandler->m_rates = wxGetApp().m_rates;\r
+ j2kkkhandler->m_quality = wxGetApp().m_quality;\r
+ j2kkkhandler->m_enablequality = wxGetApp().m_enablequality;\r
+ j2kkkhandler->m_multicomp = wxGetApp().m_multicomp;\r
+ j2kkkhandler->m_irreversible = wxGetApp().m_irreversible;\r
+ j2kkkhandler->m_resolutions = wxGetApp().m_resolutions;\r
+ j2kkkhandler->m_progression = wxGetApp().m_progression;\r
+ j2kkkhandler->m_cbsize = wxGetApp().m_cbsize;\r
+ j2kkkhandler->m_prsize = wxGetApp().m_prsize;\r
+ j2kkkhandler->m_tsize = wxGetApp().m_tsize;\r
+ j2kkkhandler->m_torigin = wxGetApp().m_torigin;\r
+ j2kkkhandler->m_enablesop = wxGetApp().m_enablesop;\r
+ j2kkkhandler->m_enableeph = wxGetApp().m_enableeph;\r
+ j2kkkhandler->m_enablebypass = wxGetApp().m_enablebypass;\r
+ j2kkkhandler->m_enablerestart = wxGetApp().m_enablerestart;\r
+ j2kkkhandler->m_enablereset = wxGetApp().m_enablereset;\r
+ j2kkkhandler->m_enablesegmark = wxGetApp().m_enablesegmark;\r
+ j2kkkhandler->m_enableerterm = wxGetApp().m_enableerterm;\r
+ j2kkkhandler->m_enablevsc = wxGetApp().m_enablevsc;\r
+ j2kkkhandler->m_enableidx = wxGetApp().m_enableidx;\r
+ j2kkkhandler->m_index = m_canvas->m_savename.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + wxGetApp().m_index;\r
+ j2kkkhandler->m_enablecomm = wxGetApp().m_enablecomm;\r
+ j2kkkhandler->m_comment = wxGetApp().m_comment;\r
+ j2kkkhandler->m_enablepoc = wxGetApp().m_enablepoc;\r
+ j2kkkhandler->m_poc = wxGetApp().m_poc;\r
+\r
+ // save the file\r
+ if (!m_canvas->m_image100.SaveFile(m_canvas->m_savename.GetFullPath(), (wxBitmapType) wxBITMAP_TYPE_J2K)) {\r
+ WriteText(wxT("Can't save image"));\r
+ return NULL;\r
+ }\r
+\r
+ text.Printf(wxT("Enco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
+ WriteText(text);\r
+ return NULL;\r
+}\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Decoding thread class\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+OPJDecoThread::OPJDecoThread(OPJCanvas *canvas)\r
+ : wxThread()\r
+{\r
+ m_count = 0;\r
+ m_canvas = canvas;\r
+}\r
+\r
+void OPJDecoThread::WriteText(const wxString& text)\r
+{\r
+ wxString msg;\r
+\r
+ // before doing any GUI calls we must ensure that this thread is the only\r
+ // one doing it!\r
+\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiEnter();\r
+#endif // __WXGTK__\r
+\r
+ msg << text;\r
+ m_canvas->WriteText(msg);\r
+\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiLeave();\r
+#endif // __WXGTK__\r
+}\r
+\r
+void OPJDecoThread::OnExit()\r
+{\r
+ wxCriticalSectionLocker locker(wxGetApp().m_deco_critsect);\r
+\r
+ wxArrayThread& dthreads = wxGetApp().m_deco_threads;\r
+ dthreads.Remove(this);\r
+\r
+ if (dthreads.IsEmpty() )\r
+ {\r
+ // signal the main thread that there are no more threads left if it is\r
+ // waiting for us\r
+ if (wxGetApp().m_deco_waitingUntilAllDone) {\r
+ wxGetApp().m_deco_waitingUntilAllDone = false;\r
+ wxGetApp().m_deco_semAllDone.Post();\r
+ }\r
+ }\r
+}\r
+\r
+void *OPJDecoThread::Entry()\r
+{\r
+\r
+ wxString text;\r
+\r
+ srand(GetId());\r
+ //int m_countnum = rand() % 9;\r
+ //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
+ // GetId(), GetPriority(), m_countnum);\r
+ text.Printf(wxT("Deco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
+\r
+ WriteText(text);\r
+\r
+ wxBitmap bitmap(100, 100);\r
+ wxImage image(100, 100, true); //= bitmap.ConvertToImage();\r
+ image.Destroy();\r
+\r
+ WriteText(m_canvas->m_fname.GetFullPath());\r
+\r
+\r
+ // set handler properties\r
+ wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
+ j2kkkhandler->m_reducefactor = wxGetApp().m_reducefactor;\r
+ j2kkkhandler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
+ j2kkkhandler->m_components = wxGetApp().m_components;\r
+#ifdef USE_JPWL\r
+ j2kkkhandler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
+ j2kkkhandler->m_expcomps = wxGetApp().m_expcomps;\r
+ j2kkkhandler->m_maxtiles = wxGetApp().m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
+ wxJP2Handler *jp222handler = (wxJP2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_JP2);\r
+ jp222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
+ jp222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
+ jp222handler->m_components = wxGetApp().m_components;\r
+#ifdef USE_JPWL\r
+ jp222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
+ jp222handler->m_expcomps = wxGetApp().m_expcomps;\r
+ jp222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
+ wxMJ2Handler *mj222handler = (wxMJ2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_MJ2);\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
+ mj222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
+ if (wxGetApp().m_enabledeco) {\r
+\r
+ // load the file\r
+ if (!image.LoadFile(m_canvas->m_fname.GetFullPath(), wxBITMAP_TYPE_ANY, 0)) {\r
+ WriteText(wxT("Can't load image"));\r
+ return NULL;\r
+ }\r
+\r
+ } else {\r
+\r
+ // display a macaron\r
+ if (!image.Create(300, 5, false)) {\r
+ WriteText(wxT("Can't create image"));\r
+ return NULL;\r
+ }\r
+\r
+ }\r
+\r
+ // assign 100% image\r
+ m_canvas->m_image100 = wxBitmap(image);\r
+\r
+ // find a fit-to-width zoom\r
+ int zooml, wzooml, hzooml;\r
+ wxSize clientsize = m_canvas->GetClientSize();\r
+ wzooml = (int) floor(100.0 * (double) clientsize.GetWidth() / (double) (2 * OPJ_CANVAS_BORDER + image.GetWidth()));\r
+ hzooml = (int) floor(100.0 * (double) clientsize.GetHeight() / (double) (2 * OPJ_CANVAS_BORDER + image.GetHeight()));\r
+ zooml = wxMin(100, wxMin(wzooml, hzooml));\r
+\r
+ // fit to width\r
+#ifndef __WXGTK__\r
+ m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe);\r
+#endif // __WXGTK__\r
+\r
+ //m_canvas->m_image = m_canvas->m_image100;\r
+ //m_canvas->Refresh();\r
+ //m_canvas->SetScrollbars(20, 20, (int)(0.5 + (double) image.GetWidth() / 20.0), (int)(0.5 + (double) image.GetHeight() / 20.0));\r
+\r
+ //text.Printf(wxT("Deco thread 0x%lx finished."), GetId());\r
+ text.Printf(wxT("Deco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
+ WriteText(text);\r
+ return NULL;\r
+\r
+}\r
+\r
+/////////////////////////////////////////////////////////////////////\r
+// Parsing thread class\r
+/////////////////////////////////////////////////////////////////////\r
+\r
+OPJParseThread::OPJParseThread(OPJMarkerTree *tree, wxTreeItemId parentid)\r
+ : wxThread()\r
+{\r
+ m_count = 0;\r
+ m_tree = tree;\r
+ m_parentid = parentid;\r
+}\r
+\r
+void OPJParseThread::WriteText(const wxString& text)\r
+{\r
+ wxString msg;\r
+\r
+ // before doing any GUI calls we must ensure that this thread is the only\r
+ // one doing it!\r
+\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiEnter();\r
+#endif // __WXGTK\r
+\r
+ msg << text;\r
+ m_tree->WriteText(msg);\r
+\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiLeave();\r
+#endif // __WXGTK\r
+}\r
+\r
+void OPJParseThread::OnExit()\r
+{\r
+ wxCriticalSectionLocker locker(wxGetApp().m_parse_critsect);\r
+\r
+ wxArrayThread& threads = wxGetApp().m_parse_threads;\r
+ threads.Remove(this);\r
+\r
+ if (threads.IsEmpty()) {\r
+ // signal the main thread that there are no more threads left if it is\r
+ // waiting for us\r
+ if (wxGetApp().m_parse_waitingUntilAllDone) {\r
+ wxGetApp().m_parse_waitingUntilAllDone = false;\r
+ wxGetApp().m_parse_semAllDone.Post();\r
+ }\r
+ }\r
+}\r
+\r
+void *OPJParseThread::Entry()\r
+{\r
+\r
+ printf("Entering\n\n");\r
+\r
+ wxString text;\r
+\r
+ srand(GetId());\r
+ int m_countnum = rand() % 9;\r
+ text.Printf(wxT("Parse thread 0x%lx started (priority = %u, time = %d)."),\r
+ GetId(), GetPriority(), m_countnum);\r
+ WriteText(text);\r
+ LoadFile(m_tree->m_fname);\r
+ text.Printf(wxT("Parse thread 0x%lx finished."), GetId());\r
+ WriteText(text);\r
+\r
+\r
+ //wxLogMessage(wxT("Entering\n")); //test wxLog thread safeness\r
+\r
+ //wxBusyCursor wait;\r
+ //wxBusyInfo wait(wxT("Decoding image ..."));\r
+\r
+\r
+ /*for ( m_count = 0; m_count < m_countnum; m_count++ )\r
+ {\r
+ // check if we were asked to exit\r
+ if ( TestDestroy() )\r
+ break;\r
+\r
+ text.Printf(wxT("[%u] Parse thread 0x%lx here."), m_count, GetId());\r
+ WriteText(text);\r
+\r
+ // wxSleep() can't be called from non-GUI thread!\r
+ wxThread::Sleep(10);\r
+ }*/\r
+\r
+ // wxLogMessage(text); -- test wxLog thread safeness\r
+\r
+ printf("Exiting\n\n");\r
+\r
+ return NULL;\r
+}\r
+\r
+\r
+///////////////////////////////////////////\r
+// Parsing hread and related\r
+///////////////////////////////////////////\r
+\r
+#if USE_GENERIC_TREECTRL\r
+BEGIN_EVENT_TABLE(OPJMarkerTree, wxGenericTreeCtrl)\r
+#else\r
+BEGIN_EVENT_TABLE(OPJMarkerTree, wxTreeCtrl)\r
+#endif\r
+ /*EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginDrag)\r
+ EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginRDrag)\r
+ EVT_TREE_END_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnEndDrag)*/\r
+ /*EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnBeginLabelEdit)\r
+ EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnEndLabelEdit)*/\r
+ /*EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, OPJMarkerTree::OnDeleteItem)*/\r
+#if 0 // there are so many of those that logging them causes flicker\r
+ /*EVT_TREE_GET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnGetInfo)*/\r
+#endif\r
+ /*EVT_TREE_SET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnSetInfo)\r
+ EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanded)*/\r
+ EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanding)\r
+ /*EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsed)\r
+ EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsing)*/\r
+\r
+ EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, OPJMarkerTree::OnSelChanged)\r
+ /*EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, OPJMarkerTree::OnSelChanging)*/\r
+ /*EVT_TREE_KEY_DOWN(TreeTest_Ctrl, OPJMarkerTree::OnTreeKeyDown)*/\r
+ /*EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, OPJMarkerTree::OnItemActivated)*/\r
+\r
+ // so many differents ways to handle right mouse button clicks...\r
+ /*EVT_CONTEXT_MENU(OPJMarkerTree::OnContextMenu)*/\r
+ // EVT_TREE_ITEM_MENU is the preferred event for creating context menus\r
+ // on a tree control, because it includes the point of the click or item,\r
+ // meaning that no additional placement calculations are required.\r
+ EVT_TREE_ITEM_MENU(TreeTest_Ctrl, OPJMarkerTree::OnItemMenu)\r
+ /*EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, OPJMarkerTree::OnItemRClick)*/\r
+\r
+ /*EVT_RIGHT_DOWN(OPJMarkerTree::OnRMouseDown)\r
+ EVT_RIGHT_UP(OPJMarkerTree::OnRMouseUp)\r
+ EVT_RIGHT_DCLICK(OPJMarkerTree::OnRMouseDClick)*/\r
+END_EVENT_TABLE()\r
+\r
+// OPJMarkerTree implementation\r
+#if USE_GENERIC_TREECTRL\r
+IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxGenericTreeCtrl)\r
+#else\r
+IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl)\r
+#endif\r
+\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
+ m_reverseSort = false;\r
+ m_fname = fname;\r
+\r
+ m_peektextCtrl = ((OPJFrame *) (parent->GetParent()->GetParent()))->m_textCtrlbrowse;\r
+ CreateImageList();\r
+\r
+ // Add some items to the tree\r
+ //AddTestItemsToTree(5, 5);\r
+ int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
+ wxTreeItemId rootId = AddRoot(name,\r
+ image, image,\r
+ new OPJMarkerData(name));\r
+\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
+ if (size == -1) {\r
+ SetImageList(NULL);\r
+ return;\r
+ }\r
+ if (size == 0)\r
+ size = m_imageSize;\r
+ else\r
+ m_imageSize = size;\r
+\r
+ // Make an image list containing small icons\r
+ wxImageList *images = new wxImageList(size, size, true);\r
+\r
+ // should correspond to TreeCtrlIcon_xxx enum\r
+ wxBusyCursor wait;\r
+ wxIcon icons[5];\r
+ icons[0] = wxIcon(icon1_xpm);\r
+ icons[1] = wxIcon(icon2_xpm);\r
+ icons[2] = wxIcon(icon3_xpm);\r
+ icons[3] = wxIcon(icon4_xpm);\r
+ icons[4] = wxIcon(icon5_xpm);\r
+\r
+ int sizeOrig = icons[0].GetWidth();\r
+ for (size_t i = 0; i < WXSIZEOF(icons); i++) {\r
+ if (size == sizeOrig) {\r
+ images->Add(icons[i]);\r
+ } else {\r
+ images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
+ }\r
+ }\r
+\r
+ AssignImageList(images);\r
+}\r
+\r
+#if USE_GENERIC_TREECTRL || !defined(__WXMSW__)\r
+void OPJMarkerTree::CreateButtonsImageList(int size)\r
+{\r
+ if ( size == -1 ) {\r
+ SetButtonsImageList(NULL);\r
+ return;\r
+ }\r
+\r
+ // Make an image list containing small icons\r
+ wxImageList *images = new wxImageList(size, size, true);\r
+\r
+ // should correspond to TreeCtrlIcon_xxx enum\r
+ wxBusyCursor wait;\r
+ wxIcon icons[4];\r
+ icons[0] = wxIcon(icon3_xpm); // closed\r
+ icons[1] = wxIcon(icon3_xpm); // closed, selected\r
+ icons[2] = wxIcon(icon5_xpm); // open\r
+ icons[3] = wxIcon(icon5_xpm); // open, selected\r
+\r
+ for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) {\r
+ int sizeOrig = icons[i].GetWidth();\r
+ if ( size == sizeOrig ) {\r
+ images->Add(icons[i]);\r
+ } else {\r
+ images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
+ }\r
+ }\r
+\r
+ AssignButtonsImageList(images);\r
+#else\r
+void OPJMarkerTree::CreateButtonsImageList(int WXUNUSED(size))\r
+{\r
+#endif\r
+}\r
+\r
+void OPJParseThread::LoadFile(wxFileName fname)\r
+{\r
+ wxTreeItemId rootid;\r
+\r
+ // this is the root node\r
+ int image = wxGetApp().ShowImages() ? m_tree->TreeCtrlIcon_Folder : -1;\r
+\r
+ if (this->m_parentid) {\r
+ // leaf of a tree\r
+ rootid = m_parentid;\r
+ m_tree->SetItemText(rootid, wxT("Parsing..."));\r
+\r
+ } else {\r
+\r
+ // delete the existing tree hierarchy\r
+ m_tree->DeleteAllItems();\r
+\r
+ // new tree\r
+ rootid = m_tree->AddRoot(wxT("Parsing..."),\r
+ image,\r
+ image,\r
+ new OPJMarkerData(fname.GetFullPath())\r
+ );\r
+ //m_tree->SetItemFont(rootid, *wxITALIC_FONT);\r
+ m_tree->SetItemBold(rootid);\r
+ }\r
+\r
+ // open the file\r
+ wxFile m_file(fname.GetFullPath().c_str(), wxFile::read);\r
+\r
+ // parsing enabled?\r
+ if (wxGetApp().m_enableparse) {\r
+\r
+ // what is the extension?\r
+ if ((fname.GetExt() == wxT("j2k")) || (fname.GetExt() == wxT("j2c"))) {\r
+\r
+ // parse the file\r
+ ParseJ2KFile(&m_file, 0, m_file.Length(), rootid);\r
+\r
+ } else if ((fname.GetExt() == wxT("jp2")) || (fname.GetExt() == wxT("mj2"))) {\r
+\r
+ // parse the file\r
+ if (this->m_parentid) {\r
+ //WriteText(wxT("Only a subsection of jp2"));\r
+ OPJMarkerData *data = (OPJMarkerData *) m_tree->GetItemData(rootid);\r
+ ParseJ2KFile(&m_file, data->m_start, data->m_length, rootid);\r
+ m_tree->Expand(rootid);\r
+\r
+ } else {\r
+ // as usual\r
+ ParseJP2File(&m_file, 0, m_file.Length(), rootid);\r
+ }\r
+\r
+ } else {\r
+\r
+ // unknown extension\r
+ WriteText(wxT("Unknown file format!"));\r
+\r
+ }\r
+\r
+ }\r
+\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
+/*int OPJMarkerTree::OnCompareItems(const wxTreeItemId& item1,\r
+ const wxTreeItemId& item2)\r
+{\r
+ if ( m_reverseSort )\r
+ {\r
+ // just exchange 1st and 2nd items\r
+ return wxTreeCtrl::OnCompareItems(item2, item1);\r
+ }\r
+ else\r
+ {\r
+ return wxTreeCtrl::OnCompareItems(item1, item2);\r
+ }\r
+}*/\r
+\r
+/*void OPJMarkerTree::AddItemsRecursively(const wxTreeItemId& idParent,\r
+ size_t numChildren,\r
+ size_t depth,\r
+ size_t folder)\r
+{\r
+ if ( depth > 0 )\r
+ {\r
+ bool hasChildren = depth > 1;\r
+\r
+ wxString str;\r
+ for ( size_t n = 0; n < numChildren; n++ )\r
+ {\r
+ // at depth 1 elements won't have any more children\r
+ if ( hasChildren )\r
+ str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1));\r
+ else\r
+ str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1));\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
+ if ( wxGetApp().ShowImages() )\r
+ {\r
+ image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder;\r
+ imageSel = image + 1;\r
+ }\r
+ else\r
+ {\r
+ image = imageSel = -1;\r
+ }\r
+ wxTreeItemId id = AppendItem(idParent, str, image, imageSel,\r
+ new OPJMarkerData(str));\r
+\r
+ // and now we also set the expanded one (only for the folders)\r
+ if ( hasChildren && wxGetApp().ShowImages() )\r
+ {\r
+ SetItemImage(id, TreeCtrlIcon_FolderOpened,\r
+ wxTreeItemIcon_Expanded);\r
+ }\r
+\r
+ // remember the last child for OnEnsureVisible()\r
+ if ( !hasChildren && n == numChildren - 1 )\r
+ {\r
+ m_lastItem = id;\r
+ }\r
+\r
+ AddItemsRecursively(id, numChildren, depth - 1, n + 1);\r
+ }\r
+ }\r
+ //else: done!\r
+}*/\r
+\r
+/*void OPJMarkerTree::AddTestItemsToTree(size_t numChildren,\r
+ size_t depth)\r
+{\r
+ int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
+ wxTreeItemId rootId = AddRoot(wxT("Root"),\r
+ image, image,\r
+ new OPJMarkerData(wxT("Root item")));\r
+ if ( image != -1 )\r
+ {\r
+ SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded);\r
+ }\r
+\r
+ AddItemsRecursively(rootId, numChildren, depth, 0);\r
+\r
+ // set some colours/fonts for testing\r
+ SetItemFont(rootId, *wxITALIC_FONT);\r
+\r
+ wxTreeItemIdValue cookie;\r
+ wxTreeItemId id = GetFirstChild(rootId, cookie);\r
+ SetItemTextColour(id, *wxBLUE);\r
+\r
+ id = GetNextChild(rootId, cookie);\r
+ id = GetNextChild(rootId, cookie);\r
+ SetItemTextColour(id, *wxRED);\r
+ SetItemBackgroundColour(id, *wxLIGHT_GREY);\r
+}*/\r
+\r
+/*void OPJMarkerTree::GetItemsRecursively(const wxTreeItemId& idParent,\r
+ wxTreeItemIdValue cookie)\r
+{\r
+ wxTreeItemId id;\r
+\r
+ if ( !cookie )\r
+ id = GetFirstChild(idParent, cookie);\r
+ else\r
+ id = GetNextChild(idParent, cookie);\r
+\r
+ if ( !id.IsOk() )\r
+ return;\r
+\r
+ wxString text = GetItemText(id);\r
+ wxLogMessage(text);\r
+\r
+ if (ItemHasChildren(id))\r
+ GetItemsRecursively(id);\r
+\r
+ GetItemsRecursively(idParent, cookie);\r
+}*/\r
+\r
+/*void OPJMarkerTree::DoToggleIcon(const wxTreeItemId& item)\r
+{\r
+ int image = (GetItemImage(item) == TreeCtrlIcon_Folder)\r
+ ? TreeCtrlIcon_File\r
+ : TreeCtrlIcon_Folder;\r
+ SetItemImage(item, image, wxTreeItemIcon_Normal);\r
+\r
+ image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected)\r
+ ? TreeCtrlIcon_FileSelected\r
+ : TreeCtrlIcon_FolderSelected;\r
+ SetItemImage(item, image, wxTreeItemIcon_Selected);\r
+}*/\r
+\r
+void OPJMarkerTree::LogEvent(const wxChar *name, const wxTreeEvent& event)\r
+{\r
+ wxTreeItemId item = event.GetItem();\r
+ wxString text;\r
+ if ( item.IsOk() )\r
+ text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
+ else\r
+ text = wxT("invalid item");\r
+ wxLogMessage(wxT("%s(%s)"), name, text.c_str());\r
+}\r
+\r
+OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid, OPJChildFrame *subframe)\r
+{\r
+ OPJParseThread *pthread = new OPJParseThread(this, parentid);\r
+\r
+ if (pthread->Create() != wxTHREAD_NO_ERROR)\r
+ wxLogError(wxT("Can't create parse thread!"));\r
+\r
+ wxCriticalSectionLocker enter(wxGetApp().m_parse_critsect);\r
+ wxGetApp().m_parse_threads.Add(pthread);\r
+\r
+ return pthread;\r
+}\r
+\r
+\r
+/*// avoid repetition\r
+#define TREE_EVENT_HANDLER(name) \\r
+void OPJMarkerTree::name(wxTreeEvent& event) \\r
+{ \\r
+ LogEvent(_T(#name), event); \\r
+ SetLastItem(wxTreeItemId()); \\r
+ event.Skip(); \\r
+}*/\r
+\r
+/*TREE_EVENT_HANDLER(OnBeginRDrag)*/\r
+/*TREE_EVENT_HANDLER(OnDeleteItem)*/\r
+/*TREE_EVENT_HANDLER(OnGetInfo)\r
+TREE_EVENT_HANDLER(OnSetInfo)*/\r
+/*TREE_EVENT_HANDLER(OnItemExpanded)\r
+TREE_EVENT_HANDLER(OnItemExpanding)*/\r
+/*TREE_EVENT_HANDLER(OnItemCollapsed)*/\r
+/*TREE_EVENT_HANDLER(OnSelChanged)\r
+TREE_EVENT_HANDLER(OnSelChanging)*/\r
+\r
+/*#undef TREE_EVENT_HANDLER*/\r
+\r
+void OPJMarkerTree::OnItemExpanding(wxTreeEvent& event)\r
+{\r
+ wxTreeItemId item = event.GetItem();\r
+ OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
+ wxString text;\r
+\r
+ if (item.IsOk())\r
+ text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
+ else\r
+ text = wxT("invalid item");\r
+\r
+ if (wxStrcmp(data->GetDesc1(), wxT("INFO-CSTREAM")))\r
+ return;\r
+\r
+ wxLogMessage(wxT("Expanding... (%s -> %s, %s, %d, %d)"),\r
+ text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
+ data->m_start, data->m_length);\r
+\r
+ // the codestream box is being asked for expansion\r
+ wxTreeItemIdValue cookie;\r
+ if (!GetFirstChild(item, cookie).IsOk()) {\r
+ OPJParseThread *pthread = CreateParseThread(item);\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
+}\r
+\r
+void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)\r
+{\r
+ int bunch_linesize = 16;\r
+ int bunch_numlines = 7;\r
+\r
+ wxTreeItemId item = event.GetItem();\r
+ OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
+ wxString text;\r
+ int l, c, pos = 0, pre_pos;\r
+\r
+ m_peektextCtrl->Clear();\r
+\r
+ /*text << wxString::Format(wxT("Selected... (%s -> %s, %s, %d, %d)"),\r
+ text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
+ data->m_start, data->m_length) << wxT("\n");*/\r
+\r
+ // open the file and browse a little\r
+ wxFile *fp = new wxFile(m_fname.GetFullPath().c_str(), wxFile::read);\r
+\r
+ // go to position claimed\r
+ fp->Seek(data->m_start, wxFromStart);\r
+\r
+ // read a bunch\r
+ int max_read = wxMin(wxFileOffset(bunch_linesize * bunch_numlines), data->m_length - data->m_start + 1);\r
+ if (data->m_desc == wxT("MARK (65380)")) {\r
+ /*wxLogMessage(data->m_desc);*/\r
+ max_read = data->m_length - data->m_start + 1;\r
+ bunch_numlines = (int) ceil((float) max_read / (float) bunch_linesize);\r
+ }\r
+ unsigned char *buffer = new unsigned char[bunch_linesize * bunch_numlines];\r
+ fp->Read(buffer, max_read);\r
+\r
+ // write the file data between start and stop\r
+ pos = 0;\r
+ for (l = 0; l < bunch_numlines; l++) {\r
+\r
+ text << wxString::Format(wxT("%010d:"), data->m_start + pos);\r
+\r
+ pre_pos = pos;\r
+\r
+ // add hex browsing text\r
+ for (c = 0; c < bunch_linesize; c++) {\r
+\r
+ if (!(c % 8))\r
+ text << wxT(" ");\r
+\r
+ if (pos < max_read) {\r
+ text << wxString::Format(wxT("%02X "), buffer[pos]);\r
+ } else\r
+ text << wxT(" ");\r
+ pos++;\r
+ }\r
+\r
+ text << wxT(" ");\r
+\r
+ // add char browsing text\r
+ for (c = 0; c < bunch_linesize; c++) {\r
+\r
+ if (pre_pos < max_read) {\r
+ if ((buffer[pre_pos] == '\n') ||\r
+ (buffer[pre_pos] == '\t') ||\r
+ (buffer[pre_pos] == '\0') ||\r
+ (buffer[pre_pos] == 0x0D) ||\r
+ (buffer[pre_pos] == 0x0B))\r
+ buffer[pre_pos] = ' ';\r
+ text << wxString::FromAscii((char) buffer[pre_pos]) << wxT(".");\r
+ } else\r
+ text << wxT(" ");\r
+ pre_pos++;\r
+ }\r
+\r
+ text << wxT("\n");\r
+\r
+ }\r
+\r
+ // close the file\r
+ fp->Close();\r
+\r
+ m_peektextCtrl->WriteText(text);\r
+\r
+ delete buffer;\r
+}\r
+\r
+/*void LogKeyEvent(const wxChar *name, const wxKeyEvent& event)\r
+{\r
+ wxString key;\r
+ long keycode = event.GetKeyCode();\r
+ {\r
+ switch ( keycode )\r
+ {\r
+ case WXK_BACK: key = wxT("BACK"); break;\r
+ case WXK_TAB: key = wxT("TAB"); break;\r
+ case WXK_RETURN: key = wxT("RETURN"); break;\r
+ case WXK_ESCAPE: key = wxT("ESCAPE"); break;\r
+ case WXK_SPACE: key = wxT("SPACE"); break;\r
+ case WXK_DELETE: key = wxT("DELETE"); break;\r
+ case WXK_START: key = wxT("START"); break;\r
+ case WXK_LBUTTON: key = wxT("LBUTTON"); break;\r
+ case WXK_RBUTTON: key = wxT("RBUTTON"); break;\r
+ case WXK_CANCEL: key = wxT("CANCEL"); break;\r
+ case WXK_MBUTTON: key = wxT("MBUTTON"); break;\r
+ case WXK_CLEAR: key = wxT("CLEAR"); break;\r
+ case WXK_SHIFT: key = wxT("SHIFT"); break;\r
+ case WXK_ALT: key = wxT("ALT"); break;\r
+ case WXK_CONTROL: key = wxT("CONTROL"); break;\r
+ case WXK_MENU: key = wxT("MENU"); break;\r
+ case WXK_PAUSE: key = wxT("PAUSE"); break;\r
+ case WXK_CAPITAL: key = wxT("CAPITAL"); break;\r
+ case WXK_END: key = wxT("END"); break;\r
+ case WXK_HOME: key = wxT("HOME"); break;\r
+ case WXK_LEFT: key = wxT("LEFT"); break;\r
+ case WXK_UP: key = wxT("UP"); break;\r
+ case WXK_RIGHT: key = wxT("RIGHT"); break;\r
+ case WXK_DOWN: key = wxT("DOWN"); break;\r
+ case WXK_SELECT: key = wxT("SELECT"); break;\r
+ case WXK_PRINT: key = wxT("PRINT"); break;\r
+ case WXK_EXECUTE: key = wxT("EXECUTE"); break;\r
+ case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break;\r
+ case WXK_INSERT: key = wxT("INSERT"); break;\r
+ case WXK_HELP: key = wxT("HELP"); break;\r
+ case WXK_NUMPAD0: key = wxT("NUMPAD0"); break;\r
+ case WXK_NUMPAD1: key = wxT("NUMPAD1"); break;\r
+ case WXK_NUMPAD2: key = wxT("NUMPAD2"); break;\r
+ case WXK_NUMPAD3: key = wxT("NUMPAD3"); break;\r
+ case WXK_NUMPAD4: key = wxT("NUMPAD4"); break;\r
+ case WXK_NUMPAD5: key = wxT("NUMPAD5"); break;\r
+ case WXK_NUMPAD6: key = wxT("NUMPAD6"); break;\r
+ case WXK_NUMPAD7: key = wxT("NUMPAD7"); break;\r
+ case WXK_NUMPAD8: key = wxT("NUMPAD8"); break;\r
+ case WXK_NUMPAD9: key = wxT("NUMPAD9"); break;\r
+ case WXK_MULTIPLY: key = wxT("MULTIPLY"); break;\r
+ case WXK_ADD: key = wxT("ADD"); break;\r
+ case WXK_SEPARATOR: key = wxT("SEPARATOR"); break;\r
+ case WXK_SUBTRACT: key = wxT("SUBTRACT"); break;\r
+ case WXK_DECIMAL: key = wxT("DECIMAL"); break;\r
+ case WXK_DIVIDE: key = wxT("DIVIDE"); break;\r
+ case WXK_F1: key = wxT("F1"); break;\r
+ case WXK_F2: key = wxT("F2"); break;\r
+ case WXK_F3: key = wxT("F3"); break;\r
+ case WXK_F4: key = wxT("F4"); break;\r
+ case WXK_F5: key = wxT("F5"); break;\r
+ case WXK_F6: key = wxT("F6"); break;\r
+ case WXK_F7: key = wxT("F7"); break;\r
+ case WXK_F8: key = wxT("F8"); break;\r
+ case WXK_F9: key = wxT("F9"); break;\r
+ case WXK_F10: key = wxT("F10"); break;\r
+ case WXK_F11: key = wxT("F11"); break;\r
+ case WXK_F12: key = wxT("F12"); break;\r
+ case WXK_F13: key = wxT("F13"); break;\r
+ case WXK_F14: key = wxT("F14"); break;\r
+ case WXK_F15: key = wxT("F15"); break;\r
+ case WXK_F16: key = wxT("F16"); break;\r
+ case WXK_F17: key = wxT("F17"); break;\r
+ case WXK_F18: key = wxT("F18"); break;\r
+ case WXK_F19: key = wxT("F19"); break;\r
+ case WXK_F20: key = wxT("F20"); break;\r
+ case WXK_F21: key = wxT("F21"); break;\r
+ case WXK_F22: key = wxT("F22"); break;\r
+ case WXK_F23: key = wxT("F23"); break;\r
+ case WXK_F24: key = wxT("F24"); break;\r
+ case WXK_NUMLOCK: key = wxT("NUMLOCK"); break;\r
+ case WXK_SCROLL: key = wxT("SCROLL"); break;\r
+ case WXK_PAGEUP: key = wxT("PAGEUP"); break;\r
+ case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break;\r
+ case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break;\r
+ case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break;\r
+ case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break;\r
+ case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break;\r
+ case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break;\r
+ case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break;\r
+ case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break;\r
+ case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break;\r
+ case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break;\r
+ case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break;\r
+ case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break;\r
+ case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break;\r
+ case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break;\r
+ case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break;\r
+ case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break;\r
+ case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break;\r
+ case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break;\r
+ case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break;\r
+ case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break;\r
+ case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break;\r
+ case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break;\r
+ case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break;\r
+ case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break;\r
+ case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break;\r
+\r
+ default:\r
+ {\r
+ if ( keycode < 128 && wxIsprint((int)keycode) )\r
+ key.Printf(wxT("'%c'"), (char)keycode);\r
+ else if ( keycode > 0 && keycode < 27 )\r
+ key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);\r
+ else\r
+ key.Printf(wxT("unknown (%ld)"), keycode);\r
+ }\r
+ }\r
+ }\r
+\r
+ wxLogMessage(wxT("%s event: %s (flags = %c%c%c%c)"),\r
+ name,\r
+ key.c_str(),\r
+ event.ControlDown() ? wxT('C') : wxT('-'),\r
+ event.AltDown() ? wxT('A') : wxT('-'),\r
+ event.ShiftDown() ? wxT('S') : wxT('-'),\r
+ event.MetaDown() ? wxT('M') : wxT('-'));\r
+}\r
+\r
+void OPJMarkerTree::OnTreeKeyDown(wxTreeEvent& event)\r
+{\r
+ LogKeyEvent(wxT("Tree key down "), event.GetKeyEvent());\r
+\r
+ event.Skip();\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnBeginDrag(wxTreeEvent& event)\r
+{\r
+ // need to explicitly allow drag\r
+ if ( event.GetItem() != GetRootItem() )\r
+ {\r
+ m_draggedItem = event.GetItem();\r
+\r
+ wxLogMessage(wxT("OnBeginDrag: started dragging %s"),\r
+ GetItemText(m_draggedItem).c_str());\r
+\r
+ event.Allow();\r
+ }\r
+ else\r
+ {\r
+ wxLogMessage(wxT("OnBeginDrag: this item can't be dragged."));\r
+ }\r
+}\r
+\r
+void OPJMarkerTree::OnEndDrag(wxTreeEvent& event)\r
+{\r
+ wxTreeItemId itemSrc = m_draggedItem,\r
+ itemDst = event.GetItem();\r
+ m_draggedItem = (wxTreeItemId)0l;\r
+\r
+ // where to copy the item?\r
+ if ( itemDst.IsOk() && !ItemHasChildren(itemDst) )\r
+ {\r
+ // copy to the parent then\r
+ itemDst = GetItemParent(itemDst);\r
+ }\r
+\r
+ if ( !itemDst.IsOk() )\r
+ {\r
+ wxLogMessage(wxT("OnEndDrag: can't drop here."));\r
+\r
+ return;\r
+ }\r
+\r
+ wxString text = GetItemText(itemSrc);\r
+ wxLogMessage(wxT("OnEndDrag: '%s' copied to '%s'."),\r
+ text.c_str(), GetItemText(itemDst).c_str());\r
+\r
+ // just do append here - we could also insert it just before/after the item\r
+ // on which it was dropped, but this requires slightly more work... we also\r
+ // completely ignore the client data and icon of the old item but could\r
+ // copy them as well.\r
+ //\r
+ // Finally, we only copy one item here but we might copy the entire tree if\r
+ // we were dragging a folder.\r
+ int image = wxGetApp().ShowImages() ? TreeCtrlIcon_File : -1;\r
+ AppendItem(itemDst, text, image);\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnBeginLabelEdit(wxTreeEvent& event)\r
+{\r
+ wxLogMessage(wxT("OnBeginLabelEdit"));\r
+\r
+ // for testing, prevent this item's label editing\r
+ wxTreeItemId itemId = event.GetItem();\r
+ if ( IsTestItem(itemId) )\r
+ {\r
+ wxMessageBox(wxT("You can't edit this item."));\r
+\r
+ event.Veto();\r
+ }\r
+ else if ( itemId == GetRootItem() )\r
+ {\r
+ // test that it is possible to change the text of the item being edited\r
+ SetItemText(itemId, _T("Editing root item"));\r
+ }\r
+}\r
+\r
+void OPJMarkerTree::OnEndLabelEdit(wxTreeEvent& event)\r
+{\r
+ wxLogMessage(wxT("OnEndLabelEdit"));\r
+\r
+ // don't allow anything except letters in the labels\r
+ if ( !event.GetLabel().IsWord() )\r
+ {\r
+ wxMessageBox(wxT("The new label should be a single word."));\r
+\r
+ event.Veto();\r
+ }\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnItemCollapsing(wxTreeEvent& event)\r
+{\r
+ wxLogMessage(wxT("OnItemCollapsing"));\r
+\r
+ // for testing, prevent the user from collapsing the first child folder\r
+ wxTreeItemId itemId = event.GetItem();\r
+ if ( IsTestItem(itemId) )\r
+ {\r
+ wxMessageBox(wxT("You can't collapse this item."));\r
+\r
+ event.Veto();\r
+ }\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnItemActivated(wxTreeEvent& event)\r
+{\r
+ // show some info about this item\r
+ wxTreeItemId itemId = event.GetItem();\r
+ OPJMarkerData *item = (OPJMarkerData *)GetItemData(itemId);\r
+\r
+ if ( item != NULL )\r
+ {\r
+ item->ShowInfo(this);\r
+ }\r
+\r
+ wxLogMessage(wxT("OnItemActivated"));\r
+}*/\r
+\r
+void OPJMarkerTree::OnItemMenu(wxTreeEvent& event)\r
+{\r
+ /*wxTreeItemId itemId = event.GetItem();\r
+ OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
+ : NULL;\r
+\r
+ wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc()\r
+ : _T(""));*/\r
+\r
+ //wxLogMessage(wxT("EEEEEEEEEE"));\r
+\r
+ //event.Skip();\r
+}\r
+\r
+/*void OPJMarkerTree::OnContextMenu(wxContextMenuEvent& event)\r
+{\r
+ wxPoint pt = event.GetPosition();\r
+ wxTreeItemId item;\r
+ wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y);\r
+\r
+ // check if event was generated by keyboard (MSW-specific?)\r
+ if ( pt.x == -1 && pt.y == -1 ) //(this is how MSW indicates it)\r
+ {\r
+ if ( !HasFlag(wxTR_MULTIPLE) )\r
+ item = GetSelection();\r
+\r
+ // attempt to guess where to show the menu\r
+ if ( item.IsOk() )\r
+ {\r
+ // if an item was clicked, show menu to the right of it\r
+ wxRect rect;\r
+ GetBoundingRect(item, rect, true );// only the label\r
+ pt = wxPoint(rect.GetRight(), rect.GetTop());\r
+ }\r
+ else\r
+ {\r
+ pt = wxPoint(0, 0);\r
+ }\r
+ }\r
+ else // event was generated by mouse, use supplied coords\r
+ {\r
+ pt = ScreenToClient(pt);\r
+ item = HitTest(pt);\r
+ }\r
+\r
+ ShowMenu(item, pt);\r
+}*/\r
+\r
+/*void OPJMarkerTree::ShowMenu(wxTreeItemId id, const wxPoint& pt)\r
+{\r
+ wxString title;\r
+ if ( id.IsOk() )\r
+ {\r
+ title << wxT("Menu for ") << GetItemText(id);\r
+ }\r
+ else\r
+ {\r
+ title = wxT("Menu for no particular item");\r
+ }\r
+\r
+#if wxUSE_MENUS\r
+ wxMenu menu(title);\r
+ menu.Append(TreeTest_About, wxT("&About..."));\r
+ menu.AppendSeparator();\r
+ menu.Append(TreeTest_Highlight, wxT("&Highlight item"));\r
+ menu.Append(TreeTest_Dump, wxT("&Dump"));\r
+\r
+ PopupMenu(&menu, pt);\r
+#endif // wxUSE_MENUS\r
+}*/\r
+\r
+/*void OPJMarkerTree::OnItemRClick(wxTreeEvent& event)\r
+{\r
+ wxTreeItemId itemId = event.GetItem();\r
+ OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
+ : NULL;\r
+\r
+ wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc()\r
+ : _T(""));\r
+\r
+ event.Skip();\r
+}*/\r
+\r
+/*\r
+void OPJMarkerTree::OnRMouseDown(wxMouseEvent& event)\r
+{\r
+ wxLogMessage(wxT("Right mouse button down"));\r
+\r
+ event.Skip();\r
+}\r
+\r
+void OPJMarkerTree::OnRMouseUp(wxMouseEvent& event)\r
+{\r
+ wxLogMessage(wxT("Right mouse button up"));\r
+\r
+ event.Skip();\r
+}\r
+\r
+void OPJMarkerTree::OnRMouseDClick(wxMouseEvent& event)\r
+{\r
+ wxTreeItemId id = HitTest(event.GetPosition());\r
+ if ( !id )\r
+ wxLogMessage(wxT("No item under mouse"));\r
+ else\r
+ {\r
+ OPJMarkerData *item = (OPJMarkerData *)GetItemData(id);\r
+ if ( item )\r
+ wxLogMessage(wxT("Item '%s' under mouse"), item->GetDesc());\r
+ }\r
+\r
+ event.Skip();\r
+}\r
+*/\r
+\r
+static inline const wxChar *Bool2String(bool b)\r
+{\r
+ return b ? wxT("") : wxT("not ");\r
+}\r
+\r
+void OPJMarkerData::ShowInfo(wxTreeCtrl *tree)\r
+{\r
+ wxLogMessage(wxT("Item '%s': %sselected, %sexpanded, %sbold,\n")\r
+ wxT("%u children (%u immediately under this item)."),\r
+ m_desc.c_str(),\r
+ Bool2String(tree->IsSelected(GetId())),\r
+ Bool2String(tree->IsExpanded(GetId())),\r
+ Bool2String(tree->IsBold(GetId())),\r
+ unsigned(tree->GetChildrenCount(GetId())),\r
+ unsigned(tree->GetChildrenCount(GetId(), false)));\r
+}\r
+\r
+\r
// Initialise this in OnInit, not statically\r
bool OPJViewerApp::OnInit(void)\r
{\r
+ int n;\r
#if wxUSE_UNICODE\r
\r
wxChar **wxArgv = new wxChar *[argc + 1];\r
\r
- int n;\r
for (n = 0; n < argc; n++ ) {\r
wxMB2WXbuf warg = wxConvertMB2WX((char *) argv[n]);\r
wxArgv[n] = wxStrdup(warg);\r
#if wxUSE_LIBJPEG\r
wxImage::AddHandler( new wxJPEGHandler );\r
#endif\r
+#if USE_MXF\r
+ wxImage::AddHandler( new wxMXFHandler );\r
+#endif // USE_MXF\r
#if wxUSE_LIBOPENJPEG\r
wxImage::AddHandler( new wxJ2KHandler );\r
wxImage::AddHandler( new wxJP2Handler );\r
//load decoding engine parameters\r
OPJconfig = new wxConfig(OPJ_APPLICATION, OPJ_APPLICATION_VENDOR);\r
\r
- OPJconfig->Read(wxT("enabledeco"), &m_enabledeco, (bool) true);\r
- OPJconfig->Read(wxT("enableparse"), &m_enableparse, (bool) true);\r
- OPJconfig->Read(wxT("resizemethod"), &m_resizemethod, (long) 0);\r
- OPJconfig->Read(wxT("xxxreducefactor"), &m_reducefactor, (long) 0);\r
- OPJconfig->Read(wxT("xxxqualitylayers"), &m_qualitylayers, (long) 0);\r
- OPJconfig->Read(wxT("xxxcomponents"), &m_components, (long) 0);\r
- OPJconfig->Read(wxT("xxxframenum"), &m_framenum, (long) 0);\r
+ OPJconfig->Read(wxT("decode/enabledeco"), &m_enabledeco, (bool) true);\r
+ OPJconfig->Read(wxT("decode/enableparse"), &m_enableparse, (bool) true);\r
+ OPJconfig->Read(wxT("decode/resizemethod"), &m_resizemethod, (long) 0);\r
+ OPJconfig->Read(wxT("decode/xxxreducefactor"), &m_reducefactor, (long) 0);\r
+ OPJconfig->Read(wxT("decode/xxxqualitylayers"), &m_qualitylayers, (long) 0);\r
+ OPJconfig->Read(wxT("decode/xxxcomponents"), &m_components, (long) 0);\r
+ OPJconfig->Read(wxT("decode/xxxframenum"), &m_framenum, (long) 0);\r
#ifdef USE_JPWL\r
- OPJconfig->Read(wxT("enablejpwl"), &m_enablejpwl, (bool) true);\r
- OPJconfig->Read(wxT("expcomps"), &m_expcomps, (long) JPWL_EXPECTED_COMPONENTS);\r
- OPJconfig->Read(wxT("maxtiles"), &m_maxtiles, (long) JPWL_MAXIMUM_TILES);\r
+ OPJconfig->Read(wxT("decode/enablejpwl"), &m_enablejpwl, (bool) true);\r
+ OPJconfig->Read(wxT("decode/expcomps"), &m_expcomps, (long) JPWL_EXPECTED_COMPONENTS);\r
+ OPJconfig->Read(wxT("decode/maxtiles"), &m_maxtiles, (long) JPWL_MAXIMUM_TILES);\r
#endif // USE_JPWL\r
\r
OPJconfig->Write(wxT("teststring"), wxT("This is a test value"));\r
OPJconfig->Read(wxT("frameheight"), &m_frameheight, (long) OPJ_FRAME_HEIGHT);\r
\r
// load encoding engine parameters\r
- OPJconfig->Read(wxT("subsampling"), &m_subsampling, (wxString) wxT("1,1"));\r
- OPJconfig->Read(wxT("origin"), &m_origin, (wxString) wxT("0,0"));\r
- OPJconfig->Read(wxT("rates"), &m_rates, (wxString) wxT("20,10,5"));\r
- OPJconfig->Read(wxT("quality"), &m_quality, (wxString) wxT("30,35,40"));\r
- OPJconfig->Read(wxT("enablequality"), &m_enablequality, (bool) false);\r
- OPJconfig->Read(wxT("multicomp"), &m_multicomp, (bool) false); \r
- OPJconfig->Read(wxT("irreversible"), &m_irreversible, (bool) false); \r
- OPJconfig->Read(wxT("resolutions"), &m_resolutions, (int) 6); \r
- OPJconfig->Read(wxT("progression"), &m_progression, (int) 0); \r
- OPJconfig->Read(wxT("cbsize"), &m_cbsize, (wxString) wxT("32,32"));\r
- OPJconfig->Read(wxT("prsize"), &m_prsize, (wxString) wxT("[128,128],[128,128]"));\r
- OPJconfig->Read(wxT("tsize"), &m_tsize, (wxString) wxT(""));\r
- OPJconfig->Read(wxT("torigin"), &m_torigin, (wxString) wxT("0,0"));\r
- OPJconfig->Read(wxT("enablesop"), &m_enablesop, (bool) false); \r
- OPJconfig->Read(wxT("enableeph"), &m_enableeph, (bool) false); \r
- OPJconfig->Read(wxT("enablebypass"), &m_enablebypass, (bool) false); \r
- OPJconfig->Read(wxT("enablereset"), &m_enablereset, (bool) false); \r
- OPJconfig->Read(wxT("enablerestart"), &m_enablerestart, (bool) false); \r
- OPJconfig->Read(wxT("enablevsc"), &m_enablevsc, (bool) false); \r
- OPJconfig->Read(wxT("enableerterm"), &m_enableerterm, (bool) false); \r
- OPJconfig->Read(wxT("enablesegmark"), &m_enablesegmark, (bool) false); \r
- OPJconfig->Read(wxT("enablecomm"), &m_enablecomm, (bool) true); \r
- OPJconfig->Read(wxT("comment"), &m_comment, (wxString) wxT(""));\r
- OPJconfig->Read(wxT("enableidx"), &m_enableidx, (bool) false); \r
- OPJconfig->Read(wxT("index"), &m_index, (wxString) wxT("index.txt"));\r
+ OPJconfig->Read(wxT("encode/subsampling"), &m_subsampling, (wxString) wxT("1,1"));\r
+ OPJconfig->Read(wxT("encode/origin"), &m_origin, (wxString) wxT("0,0"));\r
+ OPJconfig->Read(wxT("encode/rates"), &m_rates, (wxString) wxT("20,10,5"));\r
+ OPJconfig->Read(wxT("encode/quality"), &m_quality, (wxString) wxT("30,35,40"));\r
+ OPJconfig->Read(wxT("encode/enablequality"), &m_enablequality, (bool) false);\r
+ OPJconfig->Read(wxT("encode/multicomp"), &m_multicomp, (bool) false); \r
+ OPJconfig->Read(wxT("encode/irreversible"), &m_irreversible, (bool) false); \r
+ OPJconfig->Read(wxT("encode/resolutions"), &m_resolutions, (int) 6); \r
+ OPJconfig->Read(wxT("encode/progression"), &m_progression, (int) 0); \r
+ OPJconfig->Read(wxT("encode/cbsize"), &m_cbsize, (wxString) wxT("32,32"));\r
+ OPJconfig->Read(wxT("encode/prsize"), &m_prsize, (wxString) wxT("[128,128],[128,128]"));\r
+ OPJconfig->Read(wxT("encode/tsize"), &m_tsize, (wxString) wxT(""));\r
+ OPJconfig->Read(wxT("encode/torigin"), &m_torigin, (wxString) wxT("0,0"));\r
+ OPJconfig->Read(wxT("encode/enablesop"), &m_enablesop, (bool) false); \r
+ OPJconfig->Read(wxT("encode/enableeph"), &m_enableeph, (bool) false); \r
+ OPJconfig->Read(wxT("encode/enablebypass"), &m_enablebypass, (bool) false); \r
+ OPJconfig->Read(wxT("encode/enablereset"), &m_enablereset, (bool) false); \r
+ OPJconfig->Read(wxT("encode/enablerestart"), &m_enablerestart, (bool) false); \r
+ OPJconfig->Read(wxT("encode/enablevsc"), &m_enablevsc, (bool) false); \r
+ OPJconfig->Read(wxT("encode/enableerterm"), &m_enableerterm, (bool) false); \r
+ OPJconfig->Read(wxT("encode/enablesegmark"), &m_enablesegmark, (bool) false); \r
+ OPJconfig->Read(wxT("encode/enablecomm"), &m_enablecomm, (bool) true); \r
+ OPJconfig->Read(wxT("encode/enablepoc"), &m_enablepoc, (bool) false); \r
+ OPJconfig->Read(wxT("encode/comment"), &m_comment, (wxString) wxT(""));\r
+ OPJconfig->Read(wxT("encode/poc"), &m_poc, (wxString) wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL"));\r
+ OPJconfig->Read(wxT("encode/enableidx"), &m_enableidx, (bool) false); \r
+ OPJconfig->Read(wxT("encode/index"), &m_index, (wxString) wxT("index.txt"));\r
+#ifdef USE_JPWL\r
+ OPJconfig->Read(wxT("encode/enablejpwl"), &m_enablejpwle, (bool) true);\r
+ for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {\r
+ OPJconfig->Read(wxT("encode/jpwl/hprotsel") + wxString::Format(wxT("%02d"), n), &m_hprotsel[n], 0);\r
+ OPJconfig->Read(wxT("encode/jpwl/htileval") + wxString::Format(wxT("%02d"), n), &m_htileval[n], 0);\r
+ OPJconfig->Read(wxT("encode/jpwl/pprotsel") + wxString::Format(wxT("%02d"), n), &m_pprotsel[n], 0);\r
+ OPJconfig->Read(wxT("encode/jpwl/ptileval") + wxString::Format(wxT("%02d"), n), &m_ptileval[n], 0);\r
+ OPJconfig->Read(wxT("encode/jpwl/ppackval") + wxString::Format(wxT("%02d"), n), &m_ppackval[n], 0);\r
+ OPJconfig->Read(wxT("encode/jpwl/sensisel") + wxString::Format(wxT("%02d"), n), &m_sensisel[n], 0);\r
+ OPJconfig->Read(wxT("encode/jpwl/stileval") + wxString::Format(wxT("%02d"), n), &m_stileval[n], 0);\r
+ }\r
+#endif // USE_JPWL\r
\r
#else\r
// set decoding engine parameters\r
m_index = wxT("index.txt");\r
m_enablecomm = true;\r
m_comment = wxT("");\r
+ m_enablepoc = false;\r
+ m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL");\r
+#ifdef USE_JPWL\r
+ m_enablejpwle = true;\r
+ for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {\r
+ m_hprotsel[n] = 0;\r
+ m_htileval[n] = 0;\r
+ m_pprotsel[n] = 0;\r
+ m_ptileval[n] = 0;\r
+ m_sensisel[n] = 0;\r
+ m_stileval[n] = 0;\r
+ }\r
+#endif // USE_JPWL\r
\r
#endif // OPJ_INICONFIG\r
\r
\r
int OPJViewerApp::OnExit()\r
{\r
+ int n;\r
+\r
#ifdef OPJ_INICONFIG\r
- OPJconfig->Write(wxT("enabledeco"), m_enabledeco);\r
- OPJconfig->Write(wxT("enableparse"), m_enableparse);\r
- OPJconfig->Write(wxT("resizemethod"), m_resizemethod);\r
- OPJconfig->Write(wxT("reducefactor"), m_reducefactor);\r
- OPJconfig->Write(wxT("qualitylayers"), m_qualitylayers);\r
- OPJconfig->Write(wxT("components"), m_components);\r
- OPJconfig->Write(wxT("framenum"), m_framenum);\r
+ OPJconfig->Write(wxT("decode/enabledeco"), m_enabledeco);\r
+ OPJconfig->Write(wxT("decode/enableparse"), m_enableparse);\r
+ OPJconfig->Write(wxT("decode/resizemethod"), m_resizemethod);\r
+ OPJconfig->Write(wxT("decode/reducefactor"), m_reducefactor);\r
+ OPJconfig->Write(wxT("decode/qualitylayers"), m_qualitylayers);\r
+ OPJconfig->Write(wxT("decode/components"), m_components);\r
+ OPJconfig->Write(wxT("decode/framenum"), m_framenum);\r
#ifdef USE_JPWL\r
- OPJconfig->Write(wxT("enablejpwl"), m_enablejpwl);\r
- OPJconfig->Write(wxT("expcomps"), m_expcomps);\r
- OPJconfig->Write(wxT("maxtiles"), m_maxtiles);\r
+ OPJconfig->Write(wxT("decode/enablejpwl"), m_enablejpwl);\r
+ OPJconfig->Write(wxT("decode/expcomps"), m_expcomps);\r
+ OPJconfig->Write(wxT("decode/maxtiles"), m_maxtiles);\r
#endif // USE_JPWL\r
OPJconfig->Write(wxT("showtoolbar"), m_showtoolbar);\r
OPJconfig->Write(wxT("showbrowser"), m_showbrowser);\r
OPJconfig->Write(wxT("framewidth"), m_framewidth);\r
OPJconfig->Write(wxT("frameheight"), m_frameheight);\r
\r
- OPJconfig->Write(wxT("subsampling"), m_subsampling);\r
- OPJconfig->Write(wxT("origin"), m_origin);\r
- OPJconfig->Write(wxT("rates"), m_rates);\r
- OPJconfig->Write(wxT("quality"), m_quality);\r
- OPJconfig->Write(wxT("enablequality"), m_enablequality);\r
- OPJconfig->Write(wxT("multicomp"), m_multicomp);\r
- OPJconfig->Write(wxT("irreversible"), m_irreversible);\r
- OPJconfig->Write(wxT("resolutions"), m_resolutions);\r
- OPJconfig->Write(wxT("progression"), m_progression);\r
- OPJconfig->Write(wxT("cbsize"), m_cbsize);\r
- OPJconfig->Write(wxT("prsize"), m_prsize);\r
- OPJconfig->Write(wxT("tiles"), m_tsize);\r
- OPJconfig->Write(wxT("torigin"), m_torigin);\r
- OPJconfig->Write(wxT("enablesop"), m_enablesop);\r
- OPJconfig->Write(wxT("enableeph"), m_enableeph);\r
- OPJconfig->Write(wxT("enablebypass"), m_enablebypass);\r
- OPJconfig->Write(wxT("enablereset"), m_enablereset);\r
- OPJconfig->Write(wxT("enablerestart"), m_enablerestart);\r
- OPJconfig->Write(wxT("enablevsc"), m_enablevsc);\r
- OPJconfig->Write(wxT("enableerterm"), m_enableerterm);\r
- OPJconfig->Write(wxT("enablesegmark"), m_enablesegmark);\r
- OPJconfig->Write(wxT("enableidx"), m_enableidx);\r
- OPJconfig->Write(wxT("index"), m_index);\r
- OPJconfig->Write(wxT("enablecomm"), m_enablecomm);\r
- OPJconfig->Write(wxT("comment"), m_comment);\r
+ OPJconfig->Write(wxT("encode/subsampling"), m_subsampling);\r
+ OPJconfig->Write(wxT("encode/origin"), m_origin);\r
+ OPJconfig->Write(wxT("encode/rates"), m_rates);\r
+ OPJconfig->Write(wxT("encode/quality"), m_quality);\r
+ OPJconfig->Write(wxT("encode/enablequality"), m_enablequality);\r
+ OPJconfig->Write(wxT("encode/multicomp"), m_multicomp);\r
+ OPJconfig->Write(wxT("encode/irreversible"), m_irreversible);\r
+ OPJconfig->Write(wxT("encode/resolutions"), m_resolutions);\r
+ OPJconfig->Write(wxT("encode/progression"), m_progression);\r
+ OPJconfig->Write(wxT("encode/cbsize"), m_cbsize);\r
+ OPJconfig->Write(wxT("encode/prsize"), m_prsize);\r
+ OPJconfig->Write(wxT("encode/tiles"), m_tsize);\r
+ OPJconfig->Write(wxT("encode/torigin"), m_torigin);\r
+ OPJconfig->Write(wxT("encode/enablesop"), m_enablesop);\r
+ OPJconfig->Write(wxT("encode/enableeph"), m_enableeph);\r
+ OPJconfig->Write(wxT("encode/enablebypass"), m_enablebypass);\r
+ OPJconfig->Write(wxT("encode/enablereset"), m_enablereset);\r
+ OPJconfig->Write(wxT("encode/enablerestart"), m_enablerestart);\r
+ OPJconfig->Write(wxT("encode/enablevsc"), m_enablevsc);\r
+ OPJconfig->Write(wxT("encode/enableerterm"), m_enableerterm);\r
+ OPJconfig->Write(wxT("encode/enablesegmark"), m_enablesegmark);\r
+ OPJconfig->Write(wxT("encode/enableidx"), m_enableidx);\r
+ OPJconfig->Write(wxT("encode/index"), m_index);\r
+ OPJconfig->Write(wxT("encode/enablecomm"), m_enablecomm);\r
+ OPJconfig->Write(wxT("encode/comment"), m_comment);\r
+ OPJconfig->Write(wxT("encode/enablepoc"), m_enablepoc);\r
+ OPJconfig->Write(wxT("encode/poc"), m_poc);\r
+#ifdef USE_JPWL\r
+ OPJconfig->Write(wxT("encode/enablejpwl"), m_enablejpwle);\r
+ for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {\r
+ OPJconfig->Write(wxT("encode/jpwl/hprotsel") + wxString::Format(wxT("%02d"), n), m_hprotsel[n]);\r
+ OPJconfig->Write(wxT("encode/jpwl/htileval") + wxString::Format(wxT("%02d"), n), m_htileval[n]);\r
+ OPJconfig->Write(wxT("encode/jpwl/pprotsel") + wxString::Format(wxT("%02d"), n), m_pprotsel[n]);\r
+ OPJconfig->Write(wxT("encode/jpwl/ptileval") + wxString::Format(wxT("%02d"), n), m_ptileval[n]);\r
+ OPJconfig->Write(wxT("encode/jpwl/ppackval") + wxString::Format(wxT("%02d"), n), m_ppackval[n]);\r
+ OPJconfig->Write(wxT("encode/jpwl/sensisel") + wxString::Format(wxT("%02d"), n), m_sensisel[n]);\r
+ OPJconfig->Write(wxT("encode/jpwl/stileval") + wxString::Format(wxT("%02d"), n), m_stileval[n]);\r
+ }\r
+#endif // USE_JPWL\r
\r
#endif // OPJ_INICONFIG\r
\r
\r
void OPJFrame::OnSetsEnco(wxCommandEvent& event)\r
{\r
+ int n;\r
+\r
OPJEncoderDialog dialog(this, event.GetId());\r
\r
if (dialog.ShowModal() == wxID_OK) {\r
wxGetApp().m_index = dialog.m_indexCtrl->GetValue();\r
wxGetApp().m_enablecomm = dialog.m_enablecommCheck->GetValue();\r
wxGetApp().m_comment = dialog.m_commentCtrl->GetValue();\r
+ wxGetApp().m_enablepoc = dialog.m_enablepocCheck->GetValue();\r
+ wxGetApp().m_poc = dialog.m_pocCtrl->GetValue();\r
+#ifdef USE_JPWL\r
+ wxGetApp().m_enablejpwle = dialog.m_enablejpwlCheck->GetValue();\r
+ for (n = 0; n < MYJPWL_MAX_NO_TILESPECS; n++) {\r
+ wxGetApp().m_hprotsel[n] = dialog.m_hprotChoice[n]->GetSelection();\r
+ wxGetApp().m_htileval[n] = dialog.m_htileCtrl[n]->GetValue();\r
+ wxGetApp().m_pprotsel[n] = dialog.m_pprotChoice[n]->GetSelection();\r
+ wxGetApp().m_ptileval[n] = dialog.m_ptileCtrl[n]->GetValue();\r
+ wxGetApp().m_ppackval[n] = dialog.m_ppackCtrl[n]->GetValue();\r
+ wxGetApp().m_sensisel[n] = dialog.m_sensiChoice[n]->GetSelection();\r
+ wxGetApp().m_stileval[n] = dialog.m_stileCtrl[n]->GetValue();\r
+ }\r
+#endif // USE_JPWL\r
};\r
}\r
\r
OnReload(e);\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(wxT("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(320, 250), wxHW_SCROLLBAR_NEVER);\r
- html->SetBorders(0);\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
- topsizer->Add(html, 1, wxALL, 10);\r
-\r
- topsizer->Add(new wxStaticLine(&dlg, wxID_ANY), 0, wxEXPAND | wxLEFT | wxRIGHT, 10);\r
-\r
- wxButton *bu1 = new wxButton(&dlg, wxID_OK, wxT("OK"));\r
- bu1->SetDefault();\r
-\r
- topsizer->Add(bu1, 0, wxALL | wxALIGN_RIGHT, 15);\r
-\r
- dlg.SetSizer(topsizer);\r
- topsizer->Fit(&dlg);\r
-\r
- dlg.ShowModal();\r
-\r
-#else\r
-\r
- wxMessageBox(wxString::Format(OPJ_APPLICATION_TITLEBAR\r
- wxT("\n\n")\r
- wxT("Built with %s and OpenJPEG ")\r
- wxT(OPENJPEG_VERSION)\r
- wxT("\non ") wxT(__DATE__) wxT(", ") wxT(__TIME__)\r
- wxT("\nRunning under %s\n\n")\r
- OPJ_APPLICATION_COPYRIGHT,\r
- wxVERSION_STRING,\r
- wxGetOsDescription().c_str()),\r
- wxT("About ") OPJ_APPLICATION_NAME,\r
- wxOK | wxICON_INFORMATION,\r
- this\r
- );\r
-\r
-#endif\r
-\r
-}\r
-\r
void OPJFrame::OnToggleBrowser(wxCommandEvent& WXUNUSED(event))\r
{\r
if (markerTreeWindow->IsShown())\r
#if wxUSE_LIBOPENJPEG\r
wxT("JPEG 2000 files (*.jp2,*.j2k,*.j2c,*.mj2)|*.jp2;*.j2k;*.j2c;*.mj2")\r
#endif\r
+#if USE_MXF\r
+ wxT("|MXF JPEG 2000 video (*.mxf)|*.mxf")\r
+#endif // USE_MXF\r
#if wxUSE_LIBJPEG\r
wxT("|JPEG files (*.jpg)|*.jpg")\r
#endif\r
\r
void OPJFrame::OnMemoryOpen(wxCommandEvent& WXUNUSED(event))\r
{\r
+ // do nothing\r
+ return;\r
+ \r
wxTextEntryDialog dialog(this, wxT("Memory HEX address range: start_address-stop_address"),\r
wxT("Decode a memory buffer"),\r
wxT("0x-0x"),\r
//wxLogMessage(wxT("Lost focus: %d (%x)"), m_winnumber, event.GetWindow());\r
}\r
\r
-#if USE_GENERIC_TREECTRL\r
-BEGIN_EVENT_TABLE(OPJMarkerTree, wxGenericTreeCtrl)\r
-#else\r
-BEGIN_EVENT_TABLE(OPJMarkerTree, wxTreeCtrl)\r
-#endif\r
- /*EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginDrag)\r
- EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, OPJMarkerTree::OnBeginRDrag)\r
- EVT_TREE_END_DRAG(TreeTest_Ctrl, OPJMarkerTree::OnEndDrag)*/\r
- /*EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnBeginLabelEdit)\r
- EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, OPJMarkerTree::OnEndLabelEdit)*/\r
- /*EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, OPJMarkerTree::OnDeleteItem)*/\r
-#if 0 // there are so many of those that logging them causes flicker\r
- /*EVT_TREE_GET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnGetInfo)*/\r
-#endif\r
- /*EVT_TREE_SET_INFO(TreeTest_Ctrl, OPJMarkerTree::OnSetInfo)\r
- EVT_TREE_ITEM_EXPANDED(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanded)*/\r
- EVT_TREE_ITEM_EXPANDING(TreeTest_Ctrl, OPJMarkerTree::OnItemExpanding)\r
- /*EVT_TREE_ITEM_COLLAPSED(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsed)\r
- EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, OPJMarkerTree::OnItemCollapsing)*/\r
-\r
- EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, OPJMarkerTree::OnSelChanged)\r
- /*EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, OPJMarkerTree::OnSelChanging)*/\r
- /*EVT_TREE_KEY_DOWN(TreeTest_Ctrl, OPJMarkerTree::OnTreeKeyDown)*/\r
- /*EVT_TREE_ITEM_ACTIVATED(TreeTest_Ctrl, OPJMarkerTree::OnItemActivated)*/\r
-\r
- // so many differents ways to handle right mouse button clicks...\r
- /*EVT_CONTEXT_MENU(OPJMarkerTree::OnContextMenu)*/\r
- // EVT_TREE_ITEM_MENU is the preferred event for creating context menus\r
- // on a tree control, because it includes the point of the click or item,\r
- // meaning that no additional placement calculations are required.\r
- EVT_TREE_ITEM_MENU(TreeTest_Ctrl, OPJMarkerTree::OnItemMenu)\r
- /*EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, OPJMarkerTree::OnItemRClick)*/\r
-\r
- /*EVT_RIGHT_DOWN(OPJMarkerTree::OnRMouseDown)\r
- EVT_RIGHT_UP(OPJMarkerTree::OnRMouseUp)\r
- EVT_RIGHT_DCLICK(OPJMarkerTree::OnRMouseDClick)*/\r
-END_EVENT_TABLE()\r
-\r
-// OPJMarkerTree implementation\r
-#if USE_GENERIC_TREECTRL\r
-IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxGenericTreeCtrl)\r
-#else\r
-IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl)\r
-#endif\r
-\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
- m_reverseSort = false;\r
- m_fname = fname;\r
-\r
- m_peektextCtrl = ((OPJFrame *) (parent->GetParent()->GetParent()))->m_textCtrlbrowse;\r
- CreateImageList();\r
-\r
- // Add some items to the tree\r
- //AddTestItemsToTree(5, 5);\r
- int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
- wxTreeItemId rootId = AddRoot(name,\r
- image, image,\r
- new OPJMarkerData(name));\r
-\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
- if (size == -1) {\r
- SetImageList(NULL);\r
- return;\r
- }\r
- if (size == 0)\r
- size = m_imageSize;\r
- else\r
- m_imageSize = size;\r
-\r
- // Make an image list containing small icons\r
- wxImageList *images = new wxImageList(size, size, true);\r
-\r
- // should correspond to TreeCtrlIcon_xxx enum\r
- wxBusyCursor wait;\r
- wxIcon icons[5];\r
- icons[0] = wxIcon(icon1_xpm);\r
- icons[1] = wxIcon(icon2_xpm);\r
- icons[2] = wxIcon(icon3_xpm);\r
- icons[3] = wxIcon(icon4_xpm);\r
- icons[4] = wxIcon(icon5_xpm);\r
-\r
- int sizeOrig = icons[0].GetWidth();\r
- for (size_t i = 0; i < WXSIZEOF(icons); i++) {\r
- if (size == sizeOrig) {\r
- images->Add(icons[i]);\r
- } else {\r
- images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
- }\r
- }\r
-\r
- AssignImageList(images);\r
-}\r
-\r
-#if USE_GENERIC_TREECTRL || !defined(__WXMSW__)\r
-void OPJMarkerTree::CreateButtonsImageList(int size)\r
-{\r
- if ( size == -1 ) {\r
- SetButtonsImageList(NULL);\r
- return;\r
- }\r
-\r
- // Make an image list containing small icons\r
- wxImageList *images = new wxImageList(size, size, true);\r
-\r
- // should correspond to TreeCtrlIcon_xxx enum\r
- wxBusyCursor wait;\r
- wxIcon icons[4];\r
- icons[0] = wxIcon(icon3_xpm); // closed\r
- icons[1] = wxIcon(icon3_xpm); // closed, selected\r
- icons[2] = wxIcon(icon5_xpm); // open\r
- icons[3] = wxIcon(icon5_xpm); // open, selected\r
-\r
- for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) {\r
- int sizeOrig = icons[i].GetWidth();\r
- if ( size == sizeOrig ) {\r
- images->Add(icons[i]);\r
- } else {\r
- images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
- }\r
- }\r
-\r
- AssignButtonsImageList(images);\r
-#else\r
-void OPJMarkerTree::CreateButtonsImageList(int WXUNUSED(size))\r
-{\r
-#endif\r
-}\r
-\r
-void OPJParseThread::LoadFile(wxFileName fname)\r
-{\r
- wxTreeItemId rootid;\r
-\r
- // this is the root node\r
- int image = wxGetApp().ShowImages() ? m_tree->TreeCtrlIcon_Folder : -1;\r
-\r
- if (this->m_parentid) {\r
- // leaf of a tree\r
- rootid = m_parentid;\r
- m_tree->SetItemText(rootid, wxT("Parsing..."));\r
-\r
- } else {\r
-\r
- // delete the existing tree hierarchy\r
- m_tree->DeleteAllItems();\r
-\r
- // new tree\r
- rootid = m_tree->AddRoot(wxT("Parsing..."),\r
- image,\r
- image,\r
- new OPJMarkerData(fname.GetFullPath())\r
- );\r
- //m_tree->SetItemFont(rootid, *wxITALIC_FONT);\r
- m_tree->SetItemBold(rootid);\r
- }\r
-\r
- // open the file\r
- wxFile m_file(fname.GetFullPath().c_str(), wxFile::read);\r
-\r
- // parsing enabled?\r
- if (wxGetApp().m_enableparse) {\r
-\r
- // what is the extension?\r
- if ((fname.GetExt() == wxT("j2k")) || (fname.GetExt() == wxT("j2c"))) {\r
-\r
- // parse the file\r
- ParseJ2KFile(&m_file, 0, m_file.Length(), rootid);\r
-\r
- } else if ((fname.GetExt() == wxT("jp2")) || (fname.GetExt() == wxT("mj2"))) {\r
-\r
- // parse the file\r
- if (this->m_parentid) {\r
- //WriteText(wxT("Only a subsection of jp2"));\r
- OPJMarkerData *data = (OPJMarkerData *) m_tree->GetItemData(rootid);\r
- ParseJ2KFile(&m_file, data->m_start, data->m_length, rootid);\r
- m_tree->Expand(rootid);\r
-\r
- } else {\r
- // as usual\r
- ParseJP2File(&m_file, 0, m_file.Length(), rootid);\r
- }\r
-\r
- } else {\r
-\r
- // unknown extension\r
- WriteText(wxT("Unknown file format!"));\r
-\r
- }\r
-\r
- }\r
-\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
-/*int OPJMarkerTree::OnCompareItems(const wxTreeItemId& item1,\r
- const wxTreeItemId& item2)\r
-{\r
- if ( m_reverseSort )\r
- {\r
- // just exchange 1st and 2nd items\r
- return wxTreeCtrl::OnCompareItems(item2, item1);\r
- }\r
- else\r
- {\r
- return wxTreeCtrl::OnCompareItems(item1, item2);\r
- }\r
-}*/\r
-\r
-/*void OPJMarkerTree::AddItemsRecursively(const wxTreeItemId& idParent,\r
- size_t numChildren,\r
- size_t depth,\r
- size_t folder)\r
-{\r
- if ( depth > 0 )\r
- {\r
- bool hasChildren = depth > 1;\r
-\r
- wxString str;\r
- for ( size_t n = 0; n < numChildren; n++ )\r
- {\r
- // at depth 1 elements won't have any more children\r
- if ( hasChildren )\r
- str.Printf(wxT("%s child %u"), wxT("Folder"), unsigned(n + 1));\r
- else\r
- str.Printf(wxT("%s child %u.%u"), wxT("File"), unsigned(folder), unsigned(n + 1));\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
- if ( wxGetApp().ShowImages() )\r
- {\r
- image = depth == 1 ? TreeCtrlIcon_File : TreeCtrlIcon_Folder;\r
- imageSel = image + 1;\r
- }\r
- else\r
- {\r
- image = imageSel = -1;\r
- }\r
- wxTreeItemId id = AppendItem(idParent, str, image, imageSel,\r
- new OPJMarkerData(str));\r
-\r
- // and now we also set the expanded one (only for the folders)\r
- if ( hasChildren && wxGetApp().ShowImages() )\r
- {\r
- SetItemImage(id, TreeCtrlIcon_FolderOpened,\r
- wxTreeItemIcon_Expanded);\r
- }\r
-\r
- // remember the last child for OnEnsureVisible()\r
- if ( !hasChildren && n == numChildren - 1 )\r
- {\r
- m_lastItem = id;\r
- }\r
-\r
- AddItemsRecursively(id, numChildren, depth - 1, n + 1);\r
- }\r
- }\r
- //else: done!\r
-}*/\r
-\r
-/*void OPJMarkerTree::AddTestItemsToTree(size_t numChildren,\r
- size_t depth)\r
-{\r
- int image = wxGetApp().ShowImages() ? OPJMarkerTree::TreeCtrlIcon_Folder : -1;\r
- wxTreeItemId rootId = AddRoot(wxT("Root"),\r
- image, image,\r
- new OPJMarkerData(wxT("Root item")));\r
- if ( image != -1 )\r
- {\r
- SetItemImage(rootId, TreeCtrlIcon_FolderOpened, wxTreeItemIcon_Expanded);\r
- }\r
-\r
- AddItemsRecursively(rootId, numChildren, depth, 0);\r
-\r
- // set some colours/fonts for testing\r
- SetItemFont(rootId, *wxITALIC_FONT);\r
-\r
- wxTreeItemIdValue cookie;\r
- wxTreeItemId id = GetFirstChild(rootId, cookie);\r
- SetItemTextColour(id, *wxBLUE);\r
-\r
- id = GetNextChild(rootId, cookie);\r
- id = GetNextChild(rootId, cookie);\r
- SetItemTextColour(id, *wxRED);\r
- SetItemBackgroundColour(id, *wxLIGHT_GREY);\r
-}*/\r
-\r
-/*void OPJMarkerTree::GetItemsRecursively(const wxTreeItemId& idParent,\r
- wxTreeItemIdValue cookie)\r
-{\r
- wxTreeItemId id;\r
-\r
- if ( !cookie )\r
- id = GetFirstChild(idParent, cookie);\r
- else\r
- id = GetNextChild(idParent, cookie);\r
-\r
- if ( !id.IsOk() )\r
- return;\r
-\r
- wxString text = GetItemText(id);\r
- wxLogMessage(text);\r
-\r
- if (ItemHasChildren(id))\r
- GetItemsRecursively(id);\r
-\r
- GetItemsRecursively(idParent, cookie);\r
-}*/\r
-\r
-/*void OPJMarkerTree::DoToggleIcon(const wxTreeItemId& item)\r
-{\r
- int image = (GetItemImage(item) == TreeCtrlIcon_Folder)\r
- ? TreeCtrlIcon_File\r
- : TreeCtrlIcon_Folder;\r
- SetItemImage(item, image, wxTreeItemIcon_Normal);\r
-\r
- image = (GetItemImage(item) == TreeCtrlIcon_FolderSelected)\r
- ? TreeCtrlIcon_FileSelected\r
- : TreeCtrlIcon_FolderSelected;\r
- SetItemImage(item, image, wxTreeItemIcon_Selected);\r
-}*/\r
-\r
-void OPJMarkerTree::LogEvent(const wxChar *name, const wxTreeEvent& event)\r
-{\r
- wxTreeItemId item = event.GetItem();\r
- wxString text;\r
- if ( item.IsOk() )\r
- text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
- else\r
- text = wxT("invalid item");\r
- wxLogMessage(wxT("%s(%s)"), name, text.c_str());\r
-}\r
-\r
-OPJParseThread *OPJMarkerTree::CreateParseThread(wxTreeItemId parentid, OPJChildFrame *subframe)\r
-{\r
- OPJParseThread *pthread = new OPJParseThread(this, parentid);\r
-\r
- if (pthread->Create() != wxTHREAD_NO_ERROR)\r
- wxLogError(wxT("Can't create parse thread!"));\r
-\r
- wxCriticalSectionLocker enter(wxGetApp().m_parse_critsect);\r
- wxGetApp().m_parse_threads.Add(pthread);\r
-\r
- return pthread;\r
-}\r
-\r
-\r
-/*// avoid repetition\r
-#define TREE_EVENT_HANDLER(name) \\r
-void OPJMarkerTree::name(wxTreeEvent& event) \\r
-{ \\r
- LogEvent(_T(#name), event); \\r
- SetLastItem(wxTreeItemId()); \\r
- event.Skip(); \\r
-}*/\r
-\r
-/*TREE_EVENT_HANDLER(OnBeginRDrag)*/\r
-/*TREE_EVENT_HANDLER(OnDeleteItem)*/\r
-/*TREE_EVENT_HANDLER(OnGetInfo)\r
-TREE_EVENT_HANDLER(OnSetInfo)*/\r
-/*TREE_EVENT_HANDLER(OnItemExpanded)\r
-TREE_EVENT_HANDLER(OnItemExpanding)*/\r
-/*TREE_EVENT_HANDLER(OnItemCollapsed)*/\r
-/*TREE_EVENT_HANDLER(OnSelChanged)\r
-TREE_EVENT_HANDLER(OnSelChanging)*/\r
-\r
-/*#undef TREE_EVENT_HANDLER*/\r
-\r
-void OPJMarkerTree::OnItemExpanding(wxTreeEvent& event)\r
-{\r
- wxTreeItemId item = event.GetItem();\r
- OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
- wxString text;\r
-\r
- if (item.IsOk())\r
- text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
- else\r
- text = wxT("invalid item");\r
-\r
- if (wxStrcmp(data->GetDesc1(), wxT("INFO-CSTREAM")))\r
- return;\r
-\r
- wxLogMessage(wxT("Expanding... (%s -> %s, %s, %d, %d)"),\r
- text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
- data->m_start, data->m_length);\r
-\r
- // the codestream box is being asked for expansion\r
- wxTreeItemIdValue cookie;\r
- if (!GetFirstChild(item, cookie).IsOk()) {\r
- OPJParseThread *pthread = CreateParseThread(item);\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
-}\r
-\r
-void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)\r
-{\r
- int bunch_linesize = 16;\r
- int bunch_numlines = 7;\r
-\r
- wxTreeItemId item = event.GetItem();\r
- OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
- wxString text;\r
- int l, c, pos = 0, pre_pos;\r
-\r
- m_peektextCtrl->Clear();\r
-\r
- /*text << wxString::Format(wxT("Selected... (%s -> %s, %s, %d, %d)"),\r
- text.c_str(), data->GetDesc1(), data->GetDesc2(),\r
- data->m_start, data->m_length) << wxT("\n");*/\r
-\r
- // open the file and browse a little\r
- wxFile *fp = new wxFile(m_fname.GetFullPath().c_str(), wxFile::read);\r
-\r
- // go to position claimed\r
- fp->Seek(data->m_start, wxFromStart);\r
-\r
- // read a bunch\r
- int max_read = wxMin(wxFileOffset(bunch_linesize * bunch_numlines), data->m_length - data->m_start + 1);\r
- if (data->m_desc == wxT("MARK (65380)")) {\r
- /*wxLogMessage(data->m_desc);*/\r
- max_read = data->m_length - data->m_start + 1;\r
- bunch_numlines = (int) ceil((float) max_read / (float) bunch_linesize);\r
- }\r
- unsigned char *buffer = new unsigned char[bunch_linesize * bunch_numlines];\r
- fp->Read(buffer, max_read);\r
-\r
- // write the file data between start and stop\r
- pos = 0;\r
- for (l = 0; l < bunch_numlines; l++) {\r
-\r
- text << wxString::Format(wxT("%010d:"), data->m_start + pos);\r
-\r
- pre_pos = pos;\r
-\r
- // add hex browsing text\r
- for (c = 0; c < bunch_linesize; c++) {\r
-\r
- if (!(c % 8))\r
- text << wxT(" ");\r
-\r
- if (pos < max_read) {\r
- text << wxString::Format(wxT("%02X "), buffer[pos]);\r
- } else\r
- text << wxT(" ");\r
- pos++;\r
- }\r
-\r
- text << wxT(" ");\r
-\r
- // add char browsing text\r
- for (c = 0; c < bunch_linesize; c++) {\r
-\r
- if (pre_pos < max_read) {\r
- if ((buffer[pre_pos] == '\n') ||\r
- (buffer[pre_pos] == '\t') ||\r
- (buffer[pre_pos] == '\0') ||\r
- (buffer[pre_pos] == 0x0D) ||\r
- (buffer[pre_pos] == 0x0B))\r
- buffer[pre_pos] = ' ';\r
- text << wxString::FromAscii((char) buffer[pre_pos]) << wxT(".");\r
- } else\r
- text << wxT(" ");\r
- pre_pos++;\r
- }\r
-\r
- text << wxT("\n");\r
-\r
- }\r
-\r
- // close the file\r
- fp->Close();\r
-\r
- m_peektextCtrl->WriteText(text);\r
-\r
- delete buffer;\r
-}\r
-\r
-/*void LogKeyEvent(const wxChar *name, const wxKeyEvent& event)\r
-{\r
- wxString key;\r
- long keycode = event.GetKeyCode();\r
- {\r
- switch ( keycode )\r
- {\r
- case WXK_BACK: key = wxT("BACK"); break;\r
- case WXK_TAB: key = wxT("TAB"); break;\r
- case WXK_RETURN: key = wxT("RETURN"); break;\r
- case WXK_ESCAPE: key = wxT("ESCAPE"); break;\r
- case WXK_SPACE: key = wxT("SPACE"); break;\r
- case WXK_DELETE: key = wxT("DELETE"); break;\r
- case WXK_START: key = wxT("START"); break;\r
- case WXK_LBUTTON: key = wxT("LBUTTON"); break;\r
- case WXK_RBUTTON: key = wxT("RBUTTON"); break;\r
- case WXK_CANCEL: key = wxT("CANCEL"); break;\r
- case WXK_MBUTTON: key = wxT("MBUTTON"); break;\r
- case WXK_CLEAR: key = wxT("CLEAR"); break;\r
- case WXK_SHIFT: key = wxT("SHIFT"); break;\r
- case WXK_ALT: key = wxT("ALT"); break;\r
- case WXK_CONTROL: key = wxT("CONTROL"); break;\r
- case WXK_MENU: key = wxT("MENU"); break;\r
- case WXK_PAUSE: key = wxT("PAUSE"); break;\r
- case WXK_CAPITAL: key = wxT("CAPITAL"); break;\r
- case WXK_END: key = wxT("END"); break;\r
- case WXK_HOME: key = wxT("HOME"); break;\r
- case WXK_LEFT: key = wxT("LEFT"); break;\r
- case WXK_UP: key = wxT("UP"); break;\r
- case WXK_RIGHT: key = wxT("RIGHT"); break;\r
- case WXK_DOWN: key = wxT("DOWN"); break;\r
- case WXK_SELECT: key = wxT("SELECT"); break;\r
- case WXK_PRINT: key = wxT("PRINT"); break;\r
- case WXK_EXECUTE: key = wxT("EXECUTE"); break;\r
- case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break;\r
- case WXK_INSERT: key = wxT("INSERT"); break;\r
- case WXK_HELP: key = wxT("HELP"); break;\r
- case WXK_NUMPAD0: key = wxT("NUMPAD0"); break;\r
- case WXK_NUMPAD1: key = wxT("NUMPAD1"); break;\r
- case WXK_NUMPAD2: key = wxT("NUMPAD2"); break;\r
- case WXK_NUMPAD3: key = wxT("NUMPAD3"); break;\r
- case WXK_NUMPAD4: key = wxT("NUMPAD4"); break;\r
- case WXK_NUMPAD5: key = wxT("NUMPAD5"); break;\r
- case WXK_NUMPAD6: key = wxT("NUMPAD6"); break;\r
- case WXK_NUMPAD7: key = wxT("NUMPAD7"); break;\r
- case WXK_NUMPAD8: key = wxT("NUMPAD8"); break;\r
- case WXK_NUMPAD9: key = wxT("NUMPAD9"); break;\r
- case WXK_MULTIPLY: key = wxT("MULTIPLY"); break;\r
- case WXK_ADD: key = wxT("ADD"); break;\r
- case WXK_SEPARATOR: key = wxT("SEPARATOR"); break;\r
- case WXK_SUBTRACT: key = wxT("SUBTRACT"); break;\r
- case WXK_DECIMAL: key = wxT("DECIMAL"); break;\r
- case WXK_DIVIDE: key = wxT("DIVIDE"); break;\r
- case WXK_F1: key = wxT("F1"); break;\r
- case WXK_F2: key = wxT("F2"); break;\r
- case WXK_F3: key = wxT("F3"); break;\r
- case WXK_F4: key = wxT("F4"); break;\r
- case WXK_F5: key = wxT("F5"); break;\r
- case WXK_F6: key = wxT("F6"); break;\r
- case WXK_F7: key = wxT("F7"); break;\r
- case WXK_F8: key = wxT("F8"); break;\r
- case WXK_F9: key = wxT("F9"); break;\r
- case WXK_F10: key = wxT("F10"); break;\r
- case WXK_F11: key = wxT("F11"); break;\r
- case WXK_F12: key = wxT("F12"); break;\r
- case WXK_F13: key = wxT("F13"); break;\r
- case WXK_F14: key = wxT("F14"); break;\r
- case WXK_F15: key = wxT("F15"); break;\r
- case WXK_F16: key = wxT("F16"); break;\r
- case WXK_F17: key = wxT("F17"); break;\r
- case WXK_F18: key = wxT("F18"); break;\r
- case WXK_F19: key = wxT("F19"); break;\r
- case WXK_F20: key = wxT("F20"); break;\r
- case WXK_F21: key = wxT("F21"); break;\r
- case WXK_F22: key = wxT("F22"); break;\r
- case WXK_F23: key = wxT("F23"); break;\r
- case WXK_F24: key = wxT("F24"); break;\r
- case WXK_NUMLOCK: key = wxT("NUMLOCK"); break;\r
- case WXK_SCROLL: key = wxT("SCROLL"); break;\r
- case WXK_PAGEUP: key = wxT("PAGEUP"); break;\r
- case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break;\r
- case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break;\r
- case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break;\r
- case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break;\r
- case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break;\r
- case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break;\r
- case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break;\r
- case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break;\r
- case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break;\r
- case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break;\r
- case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break;\r
- case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break;\r
- case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break;\r
- case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break;\r
- case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break;\r
- case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break;\r
- case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break;\r
- case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break;\r
- case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break;\r
- case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break;\r
- case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break;\r
- case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break;\r
- case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break;\r
- case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break;\r
- case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break;\r
-\r
- default:\r
- {\r
- if ( keycode < 128 && wxIsprint((int)keycode) )\r
- key.Printf(wxT("'%c'"), (char)keycode);\r
- else if ( keycode > 0 && keycode < 27 )\r
- key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);\r
- else\r
- key.Printf(wxT("unknown (%ld)"), keycode);\r
- }\r
- }\r
- }\r
-\r
- wxLogMessage(wxT("%s event: %s (flags = %c%c%c%c)"),\r
- name,\r
- key.c_str(),\r
- event.ControlDown() ? wxT('C') : wxT('-'),\r
- event.AltDown() ? wxT('A') : wxT('-'),\r
- event.ShiftDown() ? wxT('S') : wxT('-'),\r
- event.MetaDown() ? wxT('M') : wxT('-'));\r
-}\r
-\r
-void OPJMarkerTree::OnTreeKeyDown(wxTreeEvent& event)\r
-{\r
- LogKeyEvent(wxT("Tree key down "), event.GetKeyEvent());\r
-\r
- event.Skip();\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnBeginDrag(wxTreeEvent& event)\r
-{\r
- // need to explicitly allow drag\r
- if ( event.GetItem() != GetRootItem() )\r
- {\r
- m_draggedItem = event.GetItem();\r
-\r
- wxLogMessage(wxT("OnBeginDrag: started dragging %s"),\r
- GetItemText(m_draggedItem).c_str());\r
-\r
- event.Allow();\r
- }\r
- else\r
- {\r
- wxLogMessage(wxT("OnBeginDrag: this item can't be dragged."));\r
- }\r
-}\r
-\r
-void OPJMarkerTree::OnEndDrag(wxTreeEvent& event)\r
-{\r
- wxTreeItemId itemSrc = m_draggedItem,\r
- itemDst = event.GetItem();\r
- m_draggedItem = (wxTreeItemId)0l;\r
-\r
- // where to copy the item?\r
- if ( itemDst.IsOk() && !ItemHasChildren(itemDst) )\r
- {\r
- // copy to the parent then\r
- itemDst = GetItemParent(itemDst);\r
- }\r
-\r
- if ( !itemDst.IsOk() )\r
- {\r
- wxLogMessage(wxT("OnEndDrag: can't drop here."));\r
-\r
- return;\r
- }\r
-\r
- wxString text = GetItemText(itemSrc);\r
- wxLogMessage(wxT("OnEndDrag: '%s' copied to '%s'."),\r
- text.c_str(), GetItemText(itemDst).c_str());\r
-\r
- // just do append here - we could also insert it just before/after the item\r
- // on which it was dropped, but this requires slightly more work... we also\r
- // completely ignore the client data and icon of the old item but could\r
- // copy them as well.\r
- //\r
- // Finally, we only copy one item here but we might copy the entire tree if\r
- // we were dragging a folder.\r
- int image = wxGetApp().ShowImages() ? TreeCtrlIcon_File : -1;\r
- AppendItem(itemDst, text, image);\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnBeginLabelEdit(wxTreeEvent& event)\r
-{\r
- wxLogMessage(wxT("OnBeginLabelEdit"));\r
-\r
- // for testing, prevent this item's label editing\r
- wxTreeItemId itemId = event.GetItem();\r
- if ( IsTestItem(itemId) )\r
- {\r
- wxMessageBox(wxT("You can't edit this item."));\r
-\r
- event.Veto();\r
- }\r
- else if ( itemId == GetRootItem() )\r
- {\r
- // test that it is possible to change the text of the item being edited\r
- SetItemText(itemId, _T("Editing root item"));\r
- }\r
-}\r
-\r
-void OPJMarkerTree::OnEndLabelEdit(wxTreeEvent& event)\r
-{\r
- wxLogMessage(wxT("OnEndLabelEdit"));\r
-\r
- // don't allow anything except letters in the labels\r
- if ( !event.GetLabel().IsWord() )\r
- {\r
- wxMessageBox(wxT("The new label should be a single word."));\r
-\r
- event.Veto();\r
- }\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnItemCollapsing(wxTreeEvent& event)\r
-{\r
- wxLogMessage(wxT("OnItemCollapsing"));\r
-\r
- // for testing, prevent the user from collapsing the first child folder\r
- wxTreeItemId itemId = event.GetItem();\r
- if ( IsTestItem(itemId) )\r
- {\r
- wxMessageBox(wxT("You can't collapse this item."));\r
-\r
- event.Veto();\r
- }\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnItemActivated(wxTreeEvent& event)\r
-{\r
- // show some info about this item\r
- wxTreeItemId itemId = event.GetItem();\r
- OPJMarkerData *item = (OPJMarkerData *)GetItemData(itemId);\r
-\r
- if ( item != NULL )\r
- {\r
- item->ShowInfo(this);\r
- }\r
-\r
- wxLogMessage(wxT("OnItemActivated"));\r
-}*/\r
-\r
-void OPJMarkerTree::OnItemMenu(wxTreeEvent& event)\r
-{\r
- /*wxTreeItemId itemId = event.GetItem();\r
- OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
- : NULL;\r
-\r
- wxLogMessage(wxT("OnItemMenu for item \"%s\""), item ? item->GetDesc()\r
- : _T(""));*/\r
-\r
- //wxLogMessage(wxT("EEEEEEEEEE"));\r
-\r
- //event.Skip();\r
-}\r
-\r
-/*void OPJMarkerTree::OnContextMenu(wxContextMenuEvent& event)\r
-{\r
- wxPoint pt = event.GetPosition();\r
- wxTreeItemId item;\r
- wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y);\r
-\r
- // check if event was generated by keyboard (MSW-specific?)\r
- if ( pt.x == -1 && pt.y == -1 ) //(this is how MSW indicates it)\r
- {\r
- if ( !HasFlag(wxTR_MULTIPLE) )\r
- item = GetSelection();\r
-\r
- // attempt to guess where to show the menu\r
- if ( item.IsOk() )\r
- {\r
- // if an item was clicked, show menu to the right of it\r
- wxRect rect;\r
- GetBoundingRect(item, rect, true );// only the label\r
- pt = wxPoint(rect.GetRight(), rect.GetTop());\r
- }\r
- else\r
- {\r
- pt = wxPoint(0, 0);\r
- }\r
- }\r
- else // event was generated by mouse, use supplied coords\r
- {\r
- pt = ScreenToClient(pt);\r
- item = HitTest(pt);\r
- }\r
-\r
- ShowMenu(item, pt);\r
-}*/\r
-\r
-/*void OPJMarkerTree::ShowMenu(wxTreeItemId id, const wxPoint& pt)\r
-{\r
- wxString title;\r
- if ( id.IsOk() )\r
- {\r
- title << wxT("Menu for ") << GetItemText(id);\r
- }\r
- else\r
- {\r
- title = wxT("Menu for no particular item");\r
- }\r
-\r
-#if wxUSE_MENUS\r
- wxMenu menu(title);\r
- menu.Append(TreeTest_About, wxT("&About..."));\r
- menu.AppendSeparator();\r
- menu.Append(TreeTest_Highlight, wxT("&Highlight item"));\r
- menu.Append(TreeTest_Dump, wxT("&Dump"));\r
-\r
- PopupMenu(&menu, pt);\r
-#endif // wxUSE_MENUS\r
-}*/\r
-\r
-/*void OPJMarkerTree::OnItemRClick(wxTreeEvent& event)\r
-{\r
- wxTreeItemId itemId = event.GetItem();\r
- OPJMarkerData *item = itemId.IsOk() ? (OPJMarkerData *)GetItemData(itemId)\r
- : NULL;\r
-\r
- wxLogMessage(wxT("Item \"%s\" right clicked"), item ? item->GetDesc()\r
- : _T(""));\r
-\r
- event.Skip();\r
-}*/\r
-\r
-/*\r
-void OPJMarkerTree::OnRMouseDown(wxMouseEvent& event)\r
-{\r
- wxLogMessage(wxT("Right mouse button down"));\r
-\r
- event.Skip();\r
-}\r
-\r
-void OPJMarkerTree::OnRMouseUp(wxMouseEvent& event)\r
-{\r
- wxLogMessage(wxT("Right mouse button up"));\r
-\r
- event.Skip();\r
-}\r
-\r
-void OPJMarkerTree::OnRMouseDClick(wxMouseEvent& event)\r
-{\r
- wxTreeItemId id = HitTest(event.GetPosition());\r
- if ( !id )\r
- wxLogMessage(wxT("No item under mouse"));\r
- else\r
- {\r
- OPJMarkerData *item = (OPJMarkerData *)GetItemData(id);\r
- if ( item )\r
- wxLogMessage(wxT("Item '%s' under mouse"), item->GetDesc());\r
- }\r
-\r
- event.Skip();\r
-}\r
-*/\r
-\r
-static inline const wxChar *Bool2String(bool b)\r
-{\r
- return b ? wxT("") : wxT("not ");\r
-}\r
-\r
-void OPJMarkerData::ShowInfo(wxTreeCtrl *tree)\r
-{\r
- wxLogMessage(wxT("Item '%s': %sselected, %sexpanded, %sbold,\n")\r
- wxT("%u children (%u immediately under this item)."),\r
- m_desc.c_str(),\r
- Bool2String(tree->IsSelected(GetId())),\r
- Bool2String(tree->IsExpanded(GetId())),\r
- Bool2String(tree->IsBold(GetId())),\r
- unsigned(tree->GetChildrenCount(GetId())),\r
- unsigned(tree->GetChildrenCount(GetId(), false)));\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Encoding thread class\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-OPJEncoThread::OPJEncoThread(OPJCanvas *canvas)\r
- : wxThread()\r
-{\r
- m_count = 0;\r
- m_canvas = canvas;\r
-}\r
-\r
-void OPJEncoThread::WriteText(const wxString& text)\r
-{\r
- wxString msg;\r
-\r
- // before doing any GUI calls we must ensure that this thread is the only\r
- // one doing it!\r
-\r
-#ifndef __WXGTK__ \r
- wxMutexGuiEnter();\r
-#endif // __WXGTK__\r
-\r
- msg << text;\r
- m_canvas->WriteText(msg);\r
-\r
-#ifndef __WXGTK__ \r
- wxMutexGuiLeave();\r
-#endif // __WXGTK__\r
-}\r
-\r
-void OPJEncoThread::OnExit()\r
-{\r
- wxCriticalSectionLocker locker(wxGetApp().m_enco_critsect);\r
-\r
- wxArrayThread& ethreads = wxGetApp().m_enco_threads;\r
- ethreads.Remove(this);\r
-\r
- if (ethreads.IsEmpty() )\r
- {\r
- // signal the main thread that there are no more threads left if it is\r
- // waiting for us\r
- if (wxGetApp().m_enco_waitingUntilAllDone) {\r
- wxGetApp().m_enco_waitingUntilAllDone = false;\r
- wxGetApp().m_enco_semAllDone.Post();\r
- }\r
- }\r
-}\r
-\r
-void *OPJEncoThread::Entry()\r
-{\r
- wxString text;\r
-\r
- srand(GetId());\r
- //int m_countnum = rand() % 9;\r
- //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
- // GetId(), GetPriority(), m_countnum);\r
- text.Printf(wxT("Enco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
- WriteText(text);\r
-\r
- // set handler properties\r
- wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
- j2kkkhandler->m_subsampling = wxGetApp().m_subsampling;\r
- j2kkkhandler->m_origin = wxGetApp().m_origin;\r
- j2kkkhandler->m_rates = wxGetApp().m_rates;\r
- j2kkkhandler->m_quality = wxGetApp().m_quality;\r
- j2kkkhandler->m_enablequality = wxGetApp().m_enablequality;\r
- j2kkkhandler->m_multicomp = wxGetApp().m_multicomp;\r
- j2kkkhandler->m_irreversible = wxGetApp().m_irreversible;\r
- j2kkkhandler->m_resolutions = wxGetApp().m_resolutions;\r
- j2kkkhandler->m_progression = wxGetApp().m_progression;\r
- j2kkkhandler->m_cbsize = wxGetApp().m_cbsize;\r
- j2kkkhandler->m_prsize = wxGetApp().m_prsize;\r
- j2kkkhandler->m_tsize = wxGetApp().m_tsize;\r
- j2kkkhandler->m_torigin = wxGetApp().m_torigin;\r
- j2kkkhandler->m_enablesop = wxGetApp().m_enablesop;\r
- j2kkkhandler->m_enableeph = wxGetApp().m_enableeph;\r
- j2kkkhandler->m_enablebypass = wxGetApp().m_enablebypass;\r
- j2kkkhandler->m_enablerestart = wxGetApp().m_enablerestart;\r
- j2kkkhandler->m_enablereset = wxGetApp().m_enablereset;\r
- j2kkkhandler->m_enablesegmark = wxGetApp().m_enablesegmark;\r
- j2kkkhandler->m_enableerterm = wxGetApp().m_enableerterm;\r
- j2kkkhandler->m_enablevsc = wxGetApp().m_enablevsc;\r
- j2kkkhandler->m_enableidx = wxGetApp().m_enableidx;\r
- j2kkkhandler->m_index = m_canvas->m_savename.GetPath(wxPATH_GET_VOLUME | wxPATH_GET_SEPARATOR) + wxGetApp().m_index;\r
- j2kkkhandler->m_enablecomm = wxGetApp().m_enablecomm;\r
- j2kkkhandler->m_comment = wxGetApp().m_comment;\r
-\r
- // save the file\r
- if (!m_canvas->m_image100.SaveFile(m_canvas->m_savename.GetFullPath(), (wxBitmapType) wxBITMAP_TYPE_J2K)) {\r
- WriteText(wxT("Can't save image"));\r
- return NULL;\r
- }\r
-\r
- text.Printf(wxT("Enco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
- WriteText(text);\r
- return NULL;\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Decoding thread class\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-OPJDecoThread::OPJDecoThread(OPJCanvas *canvas)\r
- : wxThread()\r
-{\r
- m_count = 0;\r
- m_canvas = canvas;\r
-}\r
-\r
-void OPJDecoThread::WriteText(const wxString& text)\r
-{\r
- wxString msg;\r
-\r
- // before doing any GUI calls we must ensure that this thread is the only\r
- // one doing it!\r
-\r
-#ifndef __WXGTK__ \r
- wxMutexGuiEnter();\r
-#endif // __WXGTK__\r
-\r
- msg << text;\r
- m_canvas->WriteText(msg);\r
-\r
-#ifndef __WXGTK__ \r
- wxMutexGuiLeave();\r
-#endif // __WXGTK__\r
-}\r
-\r
-void OPJDecoThread::OnExit()\r
-{\r
- wxCriticalSectionLocker locker(wxGetApp().m_deco_critsect);\r
-\r
- wxArrayThread& dthreads = wxGetApp().m_deco_threads;\r
- dthreads.Remove(this);\r
-\r
- if (dthreads.IsEmpty() )\r
- {\r
- // signal the main thread that there are no more threads left if it is\r
- // waiting for us\r
- if (wxGetApp().m_deco_waitingUntilAllDone) {\r
- wxGetApp().m_deco_waitingUntilAllDone = false;\r
- wxGetApp().m_deco_semAllDone.Post();\r
- }\r
- }\r
-}\r
-\r
-void *OPJDecoThread::Entry()\r
-{\r
-\r
- wxString text;\r
-\r
- srand(GetId());\r
- //int m_countnum = rand() % 9;\r
- //text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
- // GetId(), GetPriority(), m_countnum);\r
- text.Printf(wxT("Deco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
-\r
- WriteText(text);\r
-\r
- wxBitmap bitmap(100, 100);\r
- wxImage image(100, 100, true); //= bitmap.ConvertToImage();\r
- image.Destroy();\r
-\r
- WriteText(m_canvas->m_fname.GetFullPath());\r
-\r
-\r
- // set handler properties\r
- wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
- j2kkkhandler->m_reducefactor = wxGetApp().m_reducefactor;\r
- j2kkkhandler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
- j2kkkhandler->m_components = wxGetApp().m_components;\r
-#ifdef USE_JPWL\r
- j2kkkhandler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
- j2kkkhandler->m_expcomps = wxGetApp().m_expcomps;\r
- j2kkkhandler->m_maxtiles = wxGetApp().m_maxtiles;\r
-#endif // USE_JPWL\r
-\r
- wxJP2Handler *jp222handler = (wxJP2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_JP2);\r
- jp222handler->m_reducefactor = wxGetApp().m_reducefactor;\r
- jp222handler->m_qualitylayers = wxGetApp().m_qualitylayers;\r
- jp222handler->m_components = wxGetApp().m_components;\r
-#ifdef USE_JPWL\r
- jp222handler->m_enablejpwl = wxGetApp().m_enablejpwl;\r
- jp222handler->m_expcomps = wxGetApp().m_expcomps;\r
- jp222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
-#endif // USE_JPWL\r
-\r
- wxMJ2Handler *mj222handler = (wxMJ2Handler *) wxImage::FindHandler( wxBITMAP_TYPE_MJ2);\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
- mj222handler->m_maxtiles = wxGetApp().m_maxtiles;\r
-#endif // USE_JPWL\r
-\r
- if (wxGetApp().m_enabledeco) {\r
-\r
- // load the file\r
- if (!image.LoadFile(m_canvas->m_fname.GetFullPath(), wxBITMAP_TYPE_ANY, 0)) {\r
- WriteText(wxT("Can't load image"));\r
- return NULL;\r
- }\r
\r
- } else {\r
-\r
- // display a macaron\r
- if (!image.Create(300, 5, false)) {\r
- WriteText(wxT("Can't create image"));\r
- return NULL;\r
- }\r
-\r
- }\r
-\r
- // assign 100% image\r
- m_canvas->m_image100 = wxBitmap(image);\r
-\r
- // find a fit-to-width zoom\r
- int zooml, wzooml, hzooml;\r
- wxSize clientsize = m_canvas->GetClientSize();\r
- wzooml = (int) floor(100.0 * (double) clientsize.GetWidth() / (double) (2 * OPJ_CANVAS_BORDER + image.GetWidth()));\r
- hzooml = (int) floor(100.0 * (double) clientsize.GetHeight() / (double) (2 * OPJ_CANVAS_BORDER + image.GetHeight()));\r
- zooml = wxMin(100, wxMin(wzooml, hzooml));\r
-\r
- // fit to width\r
-#ifndef __WXGTK__\r
- m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe);\r
-#endif // __WXGTK__\r
-\r
- //m_canvas->m_image = m_canvas->m_image100;\r
- //m_canvas->Refresh();\r
- //m_canvas->SetScrollbars(20, 20, (int)(0.5 + (double) image.GetWidth() / 20.0), (int)(0.5 + (double) image.GetHeight() / 20.0));\r
+////////////////////////////////\r
+// drag and drop \r
+////////////////////////////////\r
\r
- //text.Printf(wxT("Deco thread 0x%lx finished."), GetId());\r
- text.Printf(wxT("Deco thread %d finished"), m_canvas->m_childframe->m_winnumber);\r
- WriteText(text);\r
- return NULL;\r
-\r
-}\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-// Parsing thread class\r
-/////////////////////////////////////////////////////////////////////\r
-\r
-OPJParseThread::OPJParseThread(OPJMarkerTree *tree, wxTreeItemId parentid)\r
- : wxThread()\r
-{\r
- m_count = 0;\r
- m_tree = tree;\r
- m_parentid = parentid;\r
-}\r
-\r
-void OPJParseThread::WriteText(const wxString& text)\r
+bool OPJDnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)\r
{\r
- wxString msg;\r
-\r
- // before doing any GUI calls we must ensure that this thread is the only\r
- // one doing it!\r
-\r
-#ifndef __WXGTK__ \r
- wxMutexGuiEnter();\r
-#endif // __WXGTK\r
-\r
- msg << text;\r
- m_tree->WriteText(msg);\r
-\r
-#ifndef __WXGTK__ \r
- wxMutexGuiLeave();\r
-#endif // __WXGTK\r
-}\r
-\r
-void OPJParseThread::OnExit()\r
-{\r
- wxCriticalSectionLocker locker(wxGetApp().m_parse_critsect);\r
-\r
- wxArrayThread& threads = wxGetApp().m_parse_threads;\r
- threads.Remove(this);\r
-\r
- if (threads.IsEmpty()) {\r
- // signal the main thread that there are no more threads left if it is\r
- // waiting for us\r
- if (wxGetApp().m_parse_waitingUntilAllDone) {\r
- wxGetApp().m_parse_waitingUntilAllDone = false;\r
- wxGetApp().m_parse_semAllDone.Post();\r
- }\r
+ /*size_t nFiles = filenames.GetCount();\r
+ wxString str;\r
+ str.Printf( _T("%d files dropped\n"), (int)nFiles);\r
+ for ( size_t n = 0; n < nFiles; n++ ) {\r
+ str << filenames[n] << wxT("\n");\r
}\r
-}\r
-\r
-void *OPJParseThread::Entry()\r
-{\r
-\r
- printf("Entering\n\n");\r
-\r
- wxString text;\r
-\r
- srand(GetId());\r
- int m_countnum = rand() % 9;\r
- text.Printf(wxT("Parse thread 0x%lx started (priority = %u, time = %d)."),\r
- GetId(), GetPriority(), m_countnum);\r
- WriteText(text);\r
- LoadFile(m_tree->m_fname);\r
- text.Printf(wxT("Parse thread 0x%lx finished."), GetId());\r
- WriteText(text);\r
-\r
-\r
- //wxLogMessage(wxT("Entering\n")); //test wxLog thread safeness\r
-\r
- //wxBusyCursor wait;\r
- //wxBusyInfo wait(wxT("Decoding image ..."));\r
-\r
+ wxLogMessage(str);*/\r
+ m_pOwner->OpenFiles(filenames, filenames);\r
\r
- /*for ( m_count = 0; m_count < m_countnum; m_count++ )\r
- {\r
- // check if we were asked to exit\r
- if ( TestDestroy() )\r
- break;\r
-\r
- text.Printf(wxT("[%u] Parse thread 0x%lx here."), m_count, GetId());\r
- WriteText(text);\r
-\r
- // wxSleep() can't be called from non-GUI thread!\r
- wxThread::Sleep(10);\r
- }*/\r
-\r
- // wxLogMessage(text); -- test wxLog thread safeness\r
-\r
- printf("Exiting\n\n");\r
-\r
- return NULL;\r
+ return true;\r
}\r
\r
-\r
-\r
-\r
-\r
-\r
-\r
#include "imagj2k.h"\r
#include "imagjp2.h"\r
#include "imagmj2.h"\r
+#ifdef USE_MXF\r
+#include "imagmxf.h"\r
+#endif // USE_MXF\r
\r
#ifdef __WXMSW__\r
typedef unsigned __int64 int8byte;\r
#define OPJ_CANVAS_BORDER 10\r
#define OPJ_CANVAS_COLOUR *wxWHITE\r
\r
+\r
+\r
+#ifdef USE_JPWL\r
+\r
+//#define MYJPWL_MAX_NO_TILESPECS JPWL_MAX_NO_TILESPECS\r
+#define MYJPWL_MAX_NO_TILESPECS 4\r
+\r
+#endif // USE_JPWL\r
+\r
+\r
class OPJDecoThread;\r
class OPJEncoThread;\r
class OPJParseThread;\r
bool m_enabledeco, m_enableparse;\r
int m_reducefactor, m_qualitylayers, m_components, m_framenum;\r
#ifdef USE_JPWL\r
- bool m_enablejpwl;\r
+ bool m_enablejpwl, m_enablejpwle;\r
int m_expcomps, m_maxtiles;\r
int m_framewidth, m_frameheight;\r
#endif // USE_JPWL\r
\r
// encoding engine parameters\r
wxString m_subsampling, m_origin, m_rates, m_comment, m_index, m_quality;\r
- wxString m_cbsize, m_prsize, m_tsize, m_torigin;\r
+ wxString m_cbsize, m_prsize, m_tsize, m_torigin, m_poc;\r
bool m_enablecomm, m_enableidx, m_multicomp, m_irreversible, m_enablesop, m_enableeph;\r
bool m_enablebypass, m_enablereset, m_enablerestart, m_enablevsc, m_enableerterm;\r
- bool m_enablesegmark;\r
+ bool m_enablesegmark, m_enablepoc;\r
bool m_enablequality;\r
int m_resolutions, m_progression;\r
+#ifdef USE_JPWL\r
+ int m_hprotsel[MYJPWL_MAX_NO_TILESPECS], m_pprotsel[MYJPWL_MAX_NO_TILESPECS];\r
+ int m_htileval[MYJPWL_MAX_NO_TILESPECS], m_ptileval[MYJPWL_MAX_NO_TILESPECS],\r
+ m_ppackval[MYJPWL_MAX_NO_TILESPECS];\r
+ int m_sensisel[MYJPWL_MAX_NO_TILESPECS], m_stileval[MYJPWL_MAX_NO_TILESPECS];\r
+#endif // USE_JPWL\r
\r
// some layout settings\r
bool m_showtoolbar, m_showbrowser, m_showpeeker;\r
wxPanel* CreatePart1_1SettingsPage(wxWindow* parent);\r
wxPanel* CreatePart1_2SettingsPage(wxWindow* parent);\r
/* wxPanel* CreatePart3SettingsPage(wxWindow* parent);*/\r
-#ifdef USE_JPWL\r
- void OnEnableJPWL(wxCommandEvent& event);\r
void OnEnableComm(wxCommandEvent& event);\r
void OnEnableIdx(wxCommandEvent& event);\r
+ void OnEnablePoc(wxCommandEvent& event);\r
void OnRadioQualityRate(wxCommandEvent& event);\r
+#ifdef USE_JPWL\r
+ void OnEnableJPWL(wxCommandEvent& event);\r
wxPanel* CreatePart11SettingsPage(wxWindow* parent);\r
/*wxCheckBox *m_enablejpwlCheck;*/\r
+ wxChoice *m_hprotChoice[MYJPWL_MAX_NO_TILESPECS];\r
+ wxSpinCtrl *m_htileCtrl[MYJPWL_MAX_NO_TILESPECS];\r
+ wxChoice *m_pprotChoice[MYJPWL_MAX_NO_TILESPECS];\r
+ wxSpinCtrl *m_ptileCtrl[MYJPWL_MAX_NO_TILESPECS];\r
+ wxSpinCtrl *m_ppackCtrl[MYJPWL_MAX_NO_TILESPECS];\r
+ wxChoice *m_sensiChoice[MYJPWL_MAX_NO_TILESPECS];\r
+ wxSpinCtrl *m_stileCtrl[MYJPWL_MAX_NO_TILESPECS];\r
+ void OnHprotSelect(wxCommandEvent& event);\r
+ void OnPprotSelect(wxCommandEvent& event);\r
+ void OnSensiSelect(wxCommandEvent& event);\r
#endif // USE_JPWL\r
\r
wxTextCtrl *m_subsamplingCtrl, *m_originCtrl, *m_rateCtrl, *m_commentCtrl;\r
wxCheckBox *m_enablecommCheck, *m_enableidxCheck, *m_mctCheck, *m_irrevCheck;\r
wxCheckBox *m_sopCheck, *m_ephCheck, *m_enablebypassCheck, *m_enableresetCheck,\r
*m_enablerestartCheck, *m_enablevscCheck, *m_enableertermCheck, *m_enablesegmarkCheck;\r
- wxCheckBox *m_enablepocCheck;\r
+ wxCheckBox *m_enablepocCheck, *m_enablejpwlCheck;\r
wxSpinCtrl *m_resolutionsCtrl;\r
\r
protected:\r
OPJENCO_INDEXNAME,\r
OPJENCO_POCSPEC,\r
OPJENCO_ENABLECOMM,\r
- OPJENCO_COMMENTTEXT\r
+ OPJENCO_COMMENTTEXT,\r
+ OPJENCO_HPROT,\r
+ OPJENCO_HTILE,\r
+ OPJENCO_PPROT,\r
+ OPJENCO_PTILE,\r
+ OPJENCO_PPACK,\r
+ OPJENCO_SENSI,\r
+ OPJENCO_STILE\r
};\r
\r
DECLARE_EVENT_TABLE()\r
-wxT("292") \r
+wxT("404") \r
\r
/* Write the index to disk */\r
if (*indexfilename) {\r
- bSuccess = write_index_file(&cstr_info, indexfilename);\r
- if (!bSuccess) {\r
+ if (write_index_file(&cstr_info, indexfilename)) {\r
wxLogError(wxT("Failed to output index file"));\r
}\r
}\r
return hdr[0] == 0xFF && hdr[1] == 0x4F;\r
}\r
\r
-// write the index file\r
-bool wxJ2KHandler::write_index_file(opj_codestream_info_t *cstr_info, char *index) {\r
- int tileno, compno, layno, resno, precno, pack_nb, x, y;\r
- FILE *stream = NULL;\r
- double total_disto = 0;\r
- int tilepartno;\r
-\r
-#ifdef USE_JPWL\r
- if (!strcmp(index, JPWL_PRIVATEINDEX_NAME))\r
- return true;\r
-#endif // USE_JPWL\r
-\r
- if (!cstr_info) \r
- return 1;\r
-\r
- stream = fopen(index, "w");\r
- if (!stream) {\r
- fprintf(stderr, "failed to open index file [%s] for writing\n", index);\r
- return false;\r
- }\r
- \r
- fprintf(stream, "%d %d\n", cstr_info->image_w, cstr_info->image_h);\r
- fprintf(stream, "%d\n", cstr_info->prog);\r
- fprintf(stream, "%d %d\n", cstr_info->tile_x, cstr_info->tile_y);\r
- fprintf(stream, "%d %d\n", cstr_info->tw, cstr_info->th);\r
- fprintf(stream, "%d\n", cstr_info->numcomps);\r
- fprintf(stream, "%d\n", cstr_info->numlayers);\r
- fprintf(stream, "%d\n", cstr_info->numdecompos);\r
-\r
- for (resno = cstr_info->numdecompos[0]; resno >= 0; resno--) {\r
- fprintf(stream, "[%d,%d] ", \r
- (1 << cstr_info->tile[0].pdx[resno]), (1 << cstr_info->tile[0].pdx[resno])); /* based on tile 0 and component 0 */\r
- }\r
-\r
- fprintf(stream, "\n");\r
- fprintf(stream, "%d\n", cstr_info->main_head_start);\r
- fprintf(stream, "%d\n", cstr_info->main_head_end);\r
- fprintf(stream, "%d\n", cstr_info->codestream_size);\r
- \r
- fprintf(stream, "\nINFO ON TILES\n");\r
- fprintf(stream, "tileno start_pos end_hd end_tile nbparts disto nbpix disto/nbpix\n");\r
- for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {\r
- fprintf(stream, "%4d %9d %9d %9d %9d %9e %9d %9e\n",\r
- cstr_info->tile[tileno].tileno,\r
- cstr_info->tile[tileno].start_pos,\r
- cstr_info->tile[tileno].end_header,\r
- cstr_info->tile[tileno].end_pos,\r
- cstr_info->tile[tileno].num_tps,\r
- cstr_info->tile[tileno].distotile, cstr_info->tile[tileno].numpix,\r
- cstr_info->tile[tileno].distotile / cstr_info->tile[tileno].numpix);\r
- }\r
- \r
- for (tileno = 0; tileno < cstr_info->tw * cstr_info->th; tileno++) {\r
- int start_pos, end_ph_pos, end_pos;\r
- double disto = 0;\r
- int max_numdecompos = 0;\r
- pack_nb = 0;\r
-\r
- for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
- if (max_numdecompos < cstr_info->numdecompos[compno])\r
- max_numdecompos = cstr_info->numdecompos[compno];\r
- } \r
-\r
- fprintf(stream, "\nTILE %d DETAILS\n", tileno); \r
- fprintf(stream, "part_nb tileno start_pack num_packs start_pos end_tph_pos end_pos\n");\r
- for (tilepartno = 0; tilepartno < cstr_info->tile[tileno].num_tps; tilepartno++)\r
- fprintf(stream, "%4d %9d %9d %9d %9d %11d %9d\n",\r
- tilepartno, tileno,\r
- cstr_info->tile[tileno].tp[tilepartno].tp_start_pack,\r
- cstr_info->tile[tileno].tp[tilepartno].tp_numpacks,\r
- cstr_info->tile[tileno].tp[tilepartno].tp_start_pos,\r
- cstr_info->tile[tileno].tp[tilepartno].tp_end_header,\r
- cstr_info->tile[tileno].tp[tilepartno].tp_end_pos\r
- );\r
- if (cstr_info->prog == LRCP) { /* LRCP */\r
- fprintf(stream, "LRCP\npack_nb tileno layno resno compno precno start_pos end_ph_pos end_pos disto\n");\r
-\r
- for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
- for (resno = 0; resno < max_numdecompos + 1; resno++) {\r
- for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
- int prec_max;\r
- if (resno > cstr_info->numdecompos[compno])\r
- break;\r
- prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
- for (precno = 0; precno < prec_max; precno++) {\r
- start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
- end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
- end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
- disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
- fprintf(stream, "%4d %6d %7d %5d %6d %6d %6d %6d %7d %8e\n",\r
- pack_nb, tileno, layno, resno, compno, precno, start_pos, end_ph_pos, end_pos, disto);\r
- total_disto += disto;\r
- pack_nb++;\r
- }\r
- }\r
- }\r
- }\r
- } /* LRCP */\r
- else if (cstr_info->prog == RLCP) { /* RLCP */\r
-\r
- fprintf(stream, "RLCP\npack_nb tileno resno layno compno precno start_pos end_ph_pos end_pos disto\n");\r
-\r
- for (resno = 0; resno < max_numdecompos + 1; resno++) {\r
- for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
- for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
- int prec_max; \r
- if (resno > cstr_info->numdecompos[compno])\r
- break;\r
- prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
- for (precno = 0; precno < prec_max; precno++) {\r
- start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
- end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
- end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
- disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
- fprintf(stream, "%4d %6d %5d %7d %6d %6d %9d %9d %7d %8e\n",\r
- pack_nb, tileno, resno, layno, compno, precno, start_pos, end_ph_pos, end_pos, disto);\r
- total_disto += disto;\r
- pack_nb++;\r
- }\r
- }\r
- }\r
- }\r
- } /* RLCP */\r
- else if (cstr_info->prog == RPCL) { /* RPCL */\r
-\r
- fprintf(stream, "RPCL\npack_nb tileno resno precno compno layno start_pos end_ph_pos end_pos disto\n"); \r
-\r
- for (resno = 0; resno < max_numdecompos + 1; resno++) {\r
- /* I suppose components have same XRsiz, YRsiz */\r
- int x0 = cstr_info->tile_Ox + tileno - (int)floor((float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;\r
- int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;\r
- int x1 = x0 + cstr_info->tile_x;\r
- int y1 = y0 + cstr_info->tile_y;\r
- for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
- int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
- if (resno > cstr_info->numdecompos[compno])\r
- break;\r
- for (precno = 0; precno < prec_max; precno++) {\r
- int pcnx = cstr_info->tile[tileno].pw[resno];\r
- int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );\r
- int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );\r
- int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;\r
- int precno_y = (int) floor( (float)precno/(float)pcnx );\r
- for(y = y0; y < y1; y++) { \r
- if (precno_y*pcy == y ) {\r
- for (x = x0; x < x1; x++) { \r
- if (precno_x*pcx == x ) {\r
- for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
- start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
- end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
- end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
- disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
- fprintf(stream, "%4d %6d %5d %6d %6d %7d %9d %9d %7d %8e\n",\r
- pack_nb, tileno, resno, precno, compno, layno, start_pos, end_ph_pos, end_pos, disto); \r
- total_disto += disto;\r
- pack_nb++; \r
- }\r
- }\r
- }/* x = x0..x1 */\r
- } \r
- } /* y = y0..y1 */\r
- } /* precno */\r
- } /* compno */\r
- } /* resno */\r
- } /* RPCL */\r
- else if (cstr_info->prog == PCRL) { /* PCRL */\r
- /* I suppose components have same XRsiz, YRsiz */\r
- int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;\r
- int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;\r
- int x1 = x0 + cstr_info->tile_x;\r
- int y1 = y0 + cstr_info->tile_y;\r
-\r
- fprintf(stream, "PCRL\npack_nb tileno precno compno resno layno start_pos end_ph_pos end_pos disto\n"); \r
-\r
- for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
- for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {\r
- int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
- for (precno = 0; precno < prec_max; precno++) {\r
- int pcnx = cstr_info->tile[tileno].pw[resno];\r
- int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );\r
- int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );\r
- int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;\r
- int precno_y = (int) floor( (float)precno/(float)pcnx );\r
- for(y = y0; y < y1; y++) { \r
- if (precno_y*pcy == y ) {\r
- for (x = x0; x < x1; x++) { \r
- if (precno_x*pcx == x ) {\r
- for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
- start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
- end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
- end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
- disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
- fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d %8e\n",\r
- pack_nb, tileno, precno, compno, resno, layno, start_pos, end_ph_pos, end_pos, disto); \r
- total_disto += disto;\r
- pack_nb++; \r
- }\r
- }\r
- }/* x = x0..x1 */\r
- } \r
- } /* y = y0..y1 */\r
- } /* precno */\r
- } /* resno */\r
- } /* compno */\r
- } /* PCRL */\r
- else { /* CPRL */\r
-\r
- fprintf(stream, "CPRL\npack_nb tileno compno precno resno layno start_pos end_ph_pos end_pos disto\n"); \r
-\r
- for (compno = 0; compno < cstr_info->numcomps; compno++) {\r
- /* I suppose components have same XRsiz, YRsiz */\r
- int x0 = cstr_info->tile_Ox + tileno - (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tw * cstr_info->tile_x;\r
- int y0 = cstr_info->tile_Ox + (int)floor( (float)tileno/(float)cstr_info->tw ) * cstr_info->tile_y;\r
- int x1 = x0 + cstr_info->tile_x;\r
- int y1 = y0 + cstr_info->tile_y;\r
- \r
- for (resno = 0; resno < cstr_info->numdecompos[compno] + 1; resno++) {\r
- int prec_max = cstr_info->tile[tileno].pw[resno] * cstr_info->tile[tileno].ph[resno];\r
- for (precno = 0; precno < prec_max; precno++) {\r
- int pcnx = cstr_info->tile[tileno].pw[resno];\r
- int pcx = (int) pow( 2, cstr_info->tile[tileno].pdx[resno] + cstr_info->numdecompos[compno] - resno );\r
- int pcy = (int) pow( 2, cstr_info->tile[tileno].pdy[resno] + cstr_info->numdecompos[compno] - resno );\r
- int precno_x = precno - (int) floor( (float)precno/(float)pcnx ) * pcnx;\r
- int precno_y = (int) floor( (float)precno/(float)pcnx );\r
- for(y = y0; y < y1; y++) {\r
- if (precno_y*pcy == y ) {\r
- for (x = x0; x < x1; x++) {\r
- if (precno_x*pcx == x ) {\r
- for (layno = 0; layno < cstr_info->numlayers; layno++) {\r
- start_pos = cstr_info->tile[tileno].packet[pack_nb].start_pos;\r
- end_ph_pos = cstr_info->tile[tileno].packet[pack_nb].end_ph_pos;\r
- end_pos = cstr_info->tile[tileno].packet[pack_nb].end_pos;\r
- disto = cstr_info->tile[tileno].packet[pack_nb].disto;\r
- fprintf(stream, "%4d %6d %6d %6d %5d %7d %9d %9d %7d %8e\n",\r
- pack_nb, tileno, compno, precno, resno, layno, start_pos, end_ph_pos, end_pos, disto); \r
- total_disto += disto;\r
- pack_nb++; \r
- }\r
- }\r
- }/* x = x0..x1 */\r
- }\r
- } /* y = y0..y1 */\r
- } /* precno */\r
- } /* resno */\r
- } /* compno */\r
- } /* CPRL */ \r
- } /* tileno */\r
- \r
- fprintf(stream, "%8e\n", cstr_info->D_max); /* SE max */\r
- fprintf(stream, "%.8e\n", total_disto); /* SE totale */\r
- fprintf(stream, "\nMARKER LIST\n");\r
- fprintf(stream, "%d\n", cstr_info->marknum);\r
- fprintf(stream, "type\tstart_pos length\n");\r
- for (x = 0; x < cstr_info->marknum; x++)\r
- fprintf(stream, "%X\t%9d %9d\n", cstr_info->marker[x].type, cstr_info->marker[x].pos, cstr_info->marker[x].len);\r
- fclose(stream);\r
-\r
- fprintf(stderr,"Generated index file %s\n", index);\r
-\r
- return true;\r
-}\r
-\r
#endif // wxUSE_STREAMS\r
\r
#endif // wxUSE_LIBOPENJPEG\r
\r
#include "wx/image.h"\r
#include "libopenjpeg/openjpeg.h"\r
+#include "codec/index.h"\r
\r
#define wxBITMAP_TYPE_J2K 47\r
\r
m_indexfname*/\r
m_enableidx = false;\r
m_index = wxT("index.txt");\r
+ m_enablepoc = false;\r
+ m_poc = wxT("T1=0,0,1,5,3,CPRL/T1=5,0,1,6,3,CPRL");\r
m_enablecomm = true;\r
\r
#if defined __WXMSW__\r
wxString m_index;\r
bool m_enablecomm;\r
wxString m_comment;\r
-\r
- bool write_index_file(opj_codestream_info_t *cstr_info, char *index);\r
+ bool m_enablepoc;\r
+ wxString m_poc;\r
\r
#if wxUSE_STREAMS\r
virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 );\r
#endif\r
\r
private:\r
+ OPJ_PROG_ORDER give_progression(char progression[4]);\r
DECLARE_DYNAMIC_CLASS(wxJ2KHandler)\r
};\r
\r
--- /dev/null
+/*\r
+ * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� degli studi di Perugia (UPG), Italy\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Name: imagmxf.cpp\r
+// Purpose: wxImage MXF (Material eXchange Format) JPEG 2000 file format handler\r
+// Author: Giuseppe Baruffa - based on imagjpeg.cpp, Vaclav Slavik\r
+// RCS-ID: $Id: imagmxf.cpp,v 0.00 2007/11/19 17:00:00 MW Exp $\r
+// Copyright: (c) Giuseppe Baruffa\r
+// Licence: wxWindows licence\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifdef USE_MXF\r
+\r
+// For compilers that support precompilation, includes "wx.h".\r
+#include "wx/wxprec.h"\r
+\r
+#ifdef __BORLANDC__\r
+ #pragma hdrstop\r
+#endif\r
+\r
+#if wxUSE_IMAGE && wxUSE_LIBOPENJPEG\r
+\r
+#include "imagmxf.h"\r
+\r
+#ifndef WX_PRECOMP\r
+ #include "wx/log.h"\r
+ #include "wx/app.h"\r
+ #include "wx/intl.h"\r
+ #include "wx/bitmap.h"\r
+ #include "wx/module.h"\r
+#endif\r
+\r
+\r
+#include "libopenjpeg/openjpeg.h"\r
+\r
+\r
+#include "wx/filefn.h"\r
+#include "wx/wfstream.h"\r
+\r
+// ----------------------------------------------------------------------------\r
+// types\r
+// ----------------------------------------------------------------------------\r
+\r
+\r
+//-----------------------------------------------------------------------------\r
+// wxMXFHandler\r
+//-----------------------------------------------------------------------------\r
+\r
+IMPLEMENT_DYNAMIC_CLASS(wxMXFHandler,wxImageHandler)\r
+\r
+#if wxUSE_STREAMS\r
+\r
+//------------- JPEG 2000 Data Source Manager\r
+\r
+#define J2K_CFMT 0\r
+#define JP2_CFMT 1\r
+#define JPT_CFMT 2\r
+#define MJ2_CFMT 3\r
+#define PXM_DFMT 0\r
+#define PGX_DFMT 1\r
+#define BMP_DFMT 2\r
+#define YUV_DFMT 3\r
+\r
+#define MAX_MESSAGE_LEN 200\r
+\r
+/* sample error callback expecting a FILE* client object */\r
+void mxf_error_callback(const char *msg, void *client_data) {\r
+ int message_len = strlen(msg) - 1;\r
+ if (msg[message_len] != '\n')\r
+ message_len = MAX_MESSAGE_LEN;\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiEnter();\r
+#endif /* __WXGTK__ */\r
+ wxLogMessage(wxT("[ERROR] %.*s"), message_len, msg);\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiLeave();\r
+#endif /* __WXGTK__ */\r
+}\r
+\r
+/* sample warning callback expecting a FILE* client object */\r
+void mxf_warning_callback(const char *msg, void *client_data) {\r
+ int message_len = strlen(msg) - 1;\r
+ if (msg[message_len] != '\n')\r
+ message_len = MAX_MESSAGE_LEN;\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiEnter();\r
+#endif /* __WXGTK__ */\r
+ wxLogMessage(wxT("[WARNING] %.*s"), message_len, msg);\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiLeave();\r
+#endif /* __WXGTK__ */\r
+}\r
+\r
+/* sample debug callback expecting no client object */\r
+void mxf_info_callback(const char *msg, void *client_data) {\r
+ int message_len = strlen(msg) - 1;\r
+ if (msg[message_len] != '\n')\r
+ message_len = MAX_MESSAGE_LEN;\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiEnter();\r
+#endif /* __WXGTK__ */\r
+ wxLogMessage(wxT("[INFO] %.*s"), message_len, msg);\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiLeave();\r
+#endif /* __WXGTK__ */\r
+}\r
+\r
+\r
+/////////////////////////////////////////////////\r
+/////////////////////////////////////////////////\r
+\r
+// load the mxf file format\r
+bool wxMXFHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose, int index)\r
+{\r
+ opj_dparameters_t parameters; /* decompression parameters */\r
+ opj_event_mgr_t event_mgr; /* event manager */\r
+ opj_image_t *opjimage = NULL;\r
+ unsigned char *src = NULL;\r
+ unsigned char *ptr;\r
+ int file_length, j2k_point, j2k_len;\r
+ opj_codestream_info_t cstr_info; /* Codestream information structure */\r
+\r
+ // destroy the image\r
+ image->Destroy();\r
+\r
+ /* handle to a decompressor */\r
+ opj_dinfo_t* dinfo = NULL; \r
+ opj_cio_t *cio = NULL;\r
+\r
+ /* configure the event callbacks (not required) */\r
+ memset(&event_mgr, 0, sizeof(opj_event_mgr_t));\r
+ event_mgr.error_handler = mxf_error_callback;\r
+ event_mgr.warning_handler = mxf_warning_callback;\r
+ event_mgr.info_handler = mxf_info_callback;\r
+\r
+ /* set decoding parameters to default values */\r
+ opj_set_default_decoder_parameters(¶meters);\r
+\r
+ /* prepare parameters */\r
+ strncpy(parameters.infile, "", sizeof(parameters.infile)-1);\r
+ strncpy(parameters.outfile, "", sizeof(parameters.outfile)-1);\r
+ parameters.decod_format = J2K_CFMT;\r
+ parameters.cod_format = BMP_DFMT;\r
+ if (m_reducefactor)\r
+ parameters.cp_reduce = m_reducefactor;\r
+ if (m_qualitylayers)\r
+ parameters.cp_layer = m_qualitylayers;\r
+ /*if (n_components)\r
+ parameters. = n_components;*/\r
+\r
+ /* JPWL only */\r
+#ifdef USE_JPWL\r
+ parameters.jpwl_exp_comps = m_expcomps;\r
+ parameters.jpwl_max_tiles = m_maxtiles;\r
+ parameters.jpwl_correct = m_enablejpwl;\r
+#endif /* USE_JPWL */\r
+\r
+ /* get a decoder handle */\r
+ dinfo = opj_create_decompress(CODEC_J2K);\r
+\r
+ /* find length of the stream */\r
+ stream.SeekI(0, wxFromEnd);\r
+ file_length = (int) stream.TellI();\r
+\r
+ /* search for the m_framenum codestream position and length */\r
+ //jp2c_point = searchjp2c(stream, file_length, m_framenum);\r
+ //jp2c_len = searchjp2c(stream, file_length, m_framenum);\r
+ j2k_point = 0;\r
+ j2k_len = 10;\r
+\r
+ // malloc memory source\r
+ src = (unsigned char *) malloc(j2k_len);\r
+\r
+ // copy the jp2c\r
+ stream.SeekI(j2k_point, wxFromStart);\r
+ stream.Read(src, j2k_len);\r
+\r
+ /* catch events using our callbacks and give a local context */\r
+ opj_set_event_mgr((opj_common_ptr)dinfo, &event_mgr, stderr);\r
+\r
+ /* setup the decoder decoding parameters using user parameters */\r
+ opj_setup_decoder(dinfo, ¶meters);\r
+\r
+ /* open a byte stream */\r
+ cio = opj_cio_open((opj_common_ptr)dinfo, src, j2k_len);\r
+\r
+ /* decode the stream and fill the image structure */\r
+ opjimage = opj_decode_with_info(dinfo, cio, &cstr_info);\r
+ if (!opjimage) {\r
+ wxMutexGuiEnter();\r
+ wxLogError(wxT("MXF: failed to decode image!"));\r
+ wxMutexGuiLeave();\r
+ opj_destroy_decompress(dinfo);\r
+ opj_cio_close(cio);\r
+ free(src);\r
+ return false;\r
+ }\r
+\r
+ /* close the byte stream */\r
+ opj_cio_close(cio);\r
+\r
+ /* common rendering method */\r
+#include "imagjpeg2000.cpp"\r
+\r
+ wxMutexGuiEnter();\r
+ wxLogMessage(wxT("MXF: image loaded."));\r
+ wxMutexGuiLeave();\r
+\r
+ /* close openjpeg structs */\r
+ opj_destroy_decompress(dinfo);\r
+ opj_image_destroy(opjimage);\r
+ free(src);\r
+\r
+ if (!image->Ok())\r
+ return false;\r
+ else\r
+ return true;\r
+\r
+}\r
+\r
+// save the mxf file format\r
+bool wxMXFHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose )\r
+{\r
+ wxLogError(wxT("MXF: Couldn't save movie -> not implemented."));\r
+ return false;\r
+}\r
+\r
+#ifdef __VISUALC__\r
+ #pragma warning(default:4611)\r
+#endif /* VC++ */\r
+\r
+// recognize the MXF JPEG 2000 starting box\r
+bool wxMXFHandler::DoCanRead( wxInputStream& stream )\r
+{\r
+ unsigned char hdr[4];\r
+\r
+ if ( !stream.Read(hdr, WXSIZEOF(hdr)) )\r
+ return false;\r
+\r
+ return (hdr[0] == 0x06 &&\r
+ hdr[1] == 0x0E &&\r
+ hdr[2] == 0x2B &&\r
+ hdr[3] == 0x34);\r
+}\r
+\r
+#endif // wxUSE_STREAMS\r
+\r
+#endif // wxUSE_LIBOPENJPEG\r
+\r
+#endif // USE_MXF\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2007, Digital Signal Processing Laboratory, Universit� degli studi di Perugia (UPG), Italy\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ * notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ * notice, this list of conditions and the following disclaimer in the\r
+ * documentation and/or other materials provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'\r
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ */\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Name: imagmxf.h\r
+// Purpose: wxImage MXF (Material eXchange Format) JPEG 2000 file format handler\r
+// Author: G. Baruffa - based on imagjpeg.h, Vaclav Slavik\r
+// RCS-ID: $Id: imagmj2.h,v 0.0 2007/11/19 17:00:00 VZ Exp $\r
+// Copyright: (c) Giuseppe Baruffa\r
+// Licence: wxWindows licence\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef _WX_IMAGMXF_H_\r
+#define _WX_IMAGMXF_H_\r
+\r
+#ifdef USE_MXF\r
+\r
+#include "wx/defs.h"\r
+\r
+//-----------------------------------------------------------------------------\r
+// wxMXFHandler\r
+//-----------------------------------------------------------------------------\r
+\r
+#if wxUSE_LIBOPENJPEG\r
+\r
+#include "wx/image.h"\r
+#include "libopenjpeg/openjpeg.h"\r
+\r
+#define wxBITMAP_TYPE_MXF 50\r
+\r
+class WXDLLEXPORT wxMXFHandler: public wxImageHandler\r
+{\r
+public:\r
+ inline wxMXFHandler()\r
+ {\r
+ m_name = wxT("MXF JPEG 2000 file format");\r
+ m_extension = wxT("mxf");\r
+ m_type = wxBITMAP_TYPE_MXF;\r
+ m_mime = wxT("image/mxf");\r
+\r
+ m_reducefactor = 0;\r
+ m_qualitylayers = 0;\r
+ m_components = 0;\r
+#ifdef USE_JPWL\r
+ m_enablejpwl = true;\r
+ m_expcomps = JPWL_EXPECTED_COMPONENTS;\r
+ m_maxtiles = JPWL_MAXIMUM_TILES;\r
+#endif // USE_JPWL\r
+ }\r
+\r
+ // decoding engine parameters\r
+ int m_reducefactor, m_qualitylayers, m_components, m_framenum;\r
+#ifdef USE_JPWL\r
+ bool m_enablejpwl;\r
+ int m_expcomps, m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
+#if wxUSE_STREAMS\r
+ virtual bool LoadFile( wxImage *image, wxInputStream& stream, bool verbose=true, int index=-1 );\r
+ virtual bool SaveFile( wxImage *image, wxOutputStream& stream, bool verbose=true );\r
+protected:\r
+ virtual bool DoCanRead( wxInputStream& stream );\r
+#endif\r
+\r
+private:\r
+ DECLARE_DYNAMIC_CLASS(wxMXFHandler)\r
+};\r
+\r
+#endif // wxUSE_LIBOPENJPEG\r
+\r
+#endif // USE_MXF\r
+\r
+#endif // _WX_IMAGMXF_H_\r
+\r
\r
SOURCE=.\image_to_j2k.c\r
# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\index.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\index.h\r
+# End Source File\r
# End Target\r
# End Project\r
\r
#include <stdio.h>\r
#include <math.h>\r
+#include <string.h>\r
#include "openjpeg.h"\r
#include "index.h"\r
\r
#ifndef __J2K_INDEX_H\r
#define __J2K_INDEX_H\r
\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
/**\r
Write a structured index to a file\r
@param cstr_info Codestream information \r
*/\r
int write_index_file(opj_codestream_info_t *cstr_info, char *index);\r
\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
#endif /* __J2K_INDEX_H */\r
\r
# End Source File\r
# Begin Source File\r
\r
+SOURCE=.\index.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\index.h\r
+# End Source File\r
+# Begin Source File\r
+\r
SOURCE=.\j2k_to_image.c\r
# End Source File\r
# End Target\r
\r
SOURCE=..\codec\image_to_j2k.c\r
# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\codec\index.c\r
+# End Source File\r
# End Group\r
# Begin Group "Header Files"\r
\r
# End Source File\r
# Begin Source File\r
\r
+SOURCE=..\codec\index.h\r
+# End Source File\r
+# Begin Source File\r
+\r
SOURCE=..\libopenjpeg\openjpeg.h\r
# End Source File\r
# End Group\r
# End Source File\r
# Begin Source File\r
\r
+SOURCE=..\codec\index.c\r
+# End Source File\r
+# Begin Source File\r
+\r
SOURCE=..\codec\j2k_to_image.c\r
# End Source File\r
# End Group\r
# End Source File\r
# Begin Source File\r
\r
+SOURCE=..\codec\index.h\r
+# End Source File\r
+# Begin Source File\r
+\r
SOURCE=.\jpwl.h\r
# End Source File\r
# Begin Source File\r
# PROP Intermediate_Dir "Release"\r
# PROP Target_Dir ""\r
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
-# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /YX /FD /c\r
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "../libopenjpeg" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /YX /FD /c\r
# ADD BASE RSC /l 0x80c /d "NDEBUG"\r
# ADD RSC /l 0x80c /d "NDEBUG"\r
BSC32=bscmake.exe\r
# PROP Intermediate_Dir "Debug"\r
# PROP Target_Dir ""\r
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
-# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /YX /FD /GZ /c\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../libopenjpeg" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "OPJ_STATIC" /D "USE_JPWL" /D "USE_JPSEC" /YX /FD /GZ /c\r
# ADD BASE RSC /l 0x80c /d "_DEBUG"\r
# ADD RSC /l 0x80c /d "_DEBUG"\r
BSC32=bscmake.exe\r
\r
bool jpwl_check_tile(opj_j2k_t *j2k, opj_tcd_t *tcd, int tileno) {\r
\r
+#ifdef oerhgierhgvhreit4u\r
/*\r
we navigate through the tile and find possible invalid parameters:\r
this saves a lot of crashes!!!!!\r
}\r
}\r
\r
+#endif\r
+\r
return true;\r
}\r
\r
j2k->state = J2K_STATE_MHSOC;
/* cycle all over the markers */
- while ((unsigned int) cio_tell(cio) < cio->length) {
+ while (cio_tell(cio) < cio->length) {
/* read the marker */
mark_pos = cio_tell(cio);