]> granicus.if.org Git - openjpeg/commitdiff
Zoom capability and decoder settings dialog in OPJViewer
authorGiuseppe Baruffa <gbaruffa@users.noreply.github.com>
Thu, 1 Mar 2007 00:01:37 +0000 (00:01 +0000)
committerGiuseppe Baruffa <gbaruffa@users.noreply.github.com>
Thu, 1 Mar 2007 00:01:37 +0000 (00:01 +0000)
22 files changed:
ChangeLog
OPJViewer/OPJViewer.dsp
OPJViewer/OPJViewer.iss
OPJViewer/Readme.txt
OPJViewer/about/about.htm [new file with mode: 0644]
OPJViewer/about/opj_logo.png [new file with mode: 0644]
OPJViewer/source/OPJChild.ico [new file with mode: 0644]
OPJViewer/source/OPJChild16.xpm [new file with mode: 0644]
OPJViewer/source/OPJViewer.cpp
OPJViewer/source/OPJViewer.h
OPJViewer/source/OPJViewer.rc
OPJViewer/source/imagj2k.cpp
OPJViewer/source/imagj2k.h
OPJViewer/source/imagjp2.cpp
OPJViewer/source/imagjp2.h
OPJViewer/source/imagmj2.cpp
OPJViewer/source/imagmj2.h
OPJViewer/source/license.txt [new file with mode: 0644]
OPJViewer/source/readmeafter.txt [new file with mode: 0644]
OPJViewer/source/readmebefore.txt [new file with mode: 0644]
OPJViewer/source/wxj2kparser.cpp
OPJViewer/source/wxjp2parser.cpp

index 10bf62e0bdb3e8592c4c1cdf7f1481e08daf49eb..218055d9cb1743b8851242542800655e0d592c5c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,9 @@ What's New for OpenJPEG
 ! : changed
 + : added
 
+March 1, 2007
++ [GB] Zoom capability and decoder settings dialog in OPJViewer; modified JPWL library .dsp project in order to create a library with embedded JPWL functions
+
 February 28, 2007
 + [Parvatha] Enabled compression of TIF image format to j2k by tifftoimage() and decompression of codestream to TIF image format using imagetotif(). Modifications in image_to_j2k.c, j2k_to_image.c, convert.c, convert.h
 * [antonin] fixed a bug in context numerotation that prevented the RESET switch to work correctly : mqc_reset_enc in mqc.c
index a388b32b971f8825482ff63afcc8b7b20e4c6f8a..2188d5dd5ae6e6b5fc4823f30403ae3f6ef0b5e6 100644 (file)
@@ -37,20 +37,20 @@ RSC=rc.exe
 # PROP BASE Target_Dir ""\r
 # PROP Use_MFC 0\r
 # PROP Use_Debug_Libraries 0\r
-# PROP Output_Dir "W32Release"\r
-# PROP Intermediate_Dir "W32Release"\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\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 /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" /FR /FD /c\r
+# ADD CPP /nologo /G6 /MD /GX /O2 /I "c:\programmi\wxWidgets-2.8.0\lib\vc_lib\msw" /I "c:\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 "OPJ_HTMLABOUT" /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
+# ADD RSC /l 0x409 /i "c:\programmi\wxWidgets-2.8.0\include" /d "NDEBUG"\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 /machine:I386\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 wxzlib.lib wxregex.lib wxpng.lib wxjpeg.lib wxbase28.lib wxmsw28_core.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib LibOpenJPEG_JPWL.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcmt.lib" /libpath:"d:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Release" /IGNORE:4089\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 wxzlib.lib wxregex.lib wxpng.lib wxjpeg.lib wxbase28.lib wxmsw28_core.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib LibOpenJPEG_JPWL.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcmt.lib" /libpath:"c:\programmi\wxWidgets-2.8.0\lib\vc_lib" /libpath:"..\jpwl\Release" /IGNORE:4089\r
 # SUBTRACT LINK32 /pdb:none\r
 \r
 !ELSEIF  "$(CFG)" == "OPJViewer - Win32 Debug"\r
@@ -62,12 +62,12 @@ LINK32=link.exe
 # PROP BASE Target_Dir ""\r
 # PROP Use_MFC 0\r
 # PROP Use_Debug_Libraries 1\r
-# PROP Output_Dir "W32Debug"\r
-# PROP Intermediate_Dir "W32Debug"\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\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 /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" /FR /FD /GZ /c\r
+# ADD CPP /nologo /MDd /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
 # SUBTRACT CPP /YX\r
 # ADD BASE RSC /l 0x410 /d "_DEBUG"\r
 # ADD RSC /l 0x410 /i "c:\programmi\wxWidgets-2.8.0\include" /d "_DEBUG"\r
@@ -76,7 +76,7 @@ BSC32=bscmake.exe
 # 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_JPWL.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
+# 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
@@ -158,47 +158,23 @@ SOURCE=.\source\icon5.xpm
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\source\OPJViewer.ico\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\source\OPJViewer.rc\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\source\OPJViewer16.xpm\r
+SOURCE=.\source\OPJChild.ico\r
 # End Source File\r
-# End Group\r
-# Begin Group "JPWL"\r
-\r
-# PROP Default_Filter ""\r
 # Begin Source File\r
 \r
-SOURCE=..\jpwl\crc.c\r
+SOURCE=.\source\OPJChild16.xpm\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\jpwl\crc.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=..\jpwl\jpwl.c\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=..\jpwl\jpwl.h\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=..\jpwl\jpwl_lib.c\r
+SOURCE=.\source\OPJViewer.ico\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\jpwl\rs.c\r
+SOURCE=.\source\OPJViewer.rc\r
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=..\jpwl\rs.h\r
+SOURCE=.\source\OPJViewer16.xpm\r
 # End Source File\r
 # End Group\r
 # End Target\r
index 6b324c7a6c92683ad147b37f3b026fcafd978e87..00f121c9b740bac6ce61c33585fb8eb60db11ec8 100644 (file)
@@ -3,7 +3,7 @@
 \r
 [Setup]\r
 AppName=OPJViewer\r
-AppVerName=OPJViewer 0.1 alpha\r
+AppVerName=OPJViewer 0.2 alpha\r
 AppPublisher=OpenJPEG\r
 AppPublisherURL=http://www.openjpeg.org\r
 AppSupportURL=http://www.openjpeg.org\r
@@ -11,9 +11,17 @@ AppUpdatesURL=http://www.openjpeg.org
 DefaultDirName={pf}\OPJViewer\r
 DefaultGroupName=OPJViewer\r
 OutputDir=setup\r
-OutputBaseFilename=OPJViewer01alpha_setup\r
+OutputBaseFilename=OPJViewer02alpha_setup\r
 Compression=lzma\r
-SolidCompression=yes\r
+SolidCompression=true\r
+InfoBeforeFile=source\readmebefore.txt\r
+InfoAfterFile=source\readmeafter.txt\r
+LicenseFile=source\license.txt\r
+VersionInfoVersion=0.2.0.0\r
+VersionInfoCompany=OpenJPEG\r
+VersionInfoDescription=JPEG 2000 viewer\r
+ShowLanguageDialog=yes\r
+SetupIconFile=source\OPJViewer.ico\r
 \r
 [Languages]\r
 Name: english; MessagesFile: compiler:Default.isl\r
@@ -22,13 +30,15 @@ Name: english; MessagesFile: compiler:Default.isl
 Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked\r
 \r
 [Files]\r
-Source: W32Release\OPJViewer.exe; DestDir: {app}; Flags: ignoreversion\r
+Source: Release\OPJViewer.exe; DestDir: {app}; Flags: ignoreversion\r
+Source: about\about.htm; DestDir: {app}/about; Flags: ignoreversion\r
+Source: about\opj_logo.png; DestDir: {app}/about; Flags: ignoreversion\r
 ; NOTE: Don't use "Flags: ignoreversion" on any shared system files\r
 \r
 [Icons]\r
-Name: {group}\OPJViewer; Filename: {app}\OPJViewer.exe\r
+Name: {group}\OPJViewer; Filename: {app}\OPJViewer.exe; WorkingDir: {app}; IconIndex: 0\r
 Name: {group}\{cm:UninstallProgram,OPJViewer}; Filename: {uninstallexe}\r
-Name: {userdesktop}\OPJViewer; Filename: {app}\OPJViewer.exe; Tasks: desktopicon\r
+Name: {userdesktop}\OPJViewer; Filename: {app}\OPJViewer.exe; Tasks: desktopicon; WorkingDir: {app}; IconIndex: 0\r
 \r
 [Run]\r
-Filename: {app}\OPJViewer.exe; Description: {cm:LaunchProgram,OPJViewer}; Flags: nowait postinstall skipifsilent\r
+Filename: {app}\OPJViewer.exe; Description: {cm:LaunchProgram,OPJViewer}; Flags: nowait postinstall skipifsilent; WorkingDir: {app}\r
index 58232d82163f661d7035dd79f73c79feb71fbd9e..053bf81ab0579fc222387026ba9691d6fedbef5c 100644 (file)
@@ -1,8 +1,6 @@
 ===============================================================================
 \r
-       JPEG2000 Visualization Software
-
- - OPJViewer\r
+       JPEG2000 Visualization Software - OPJViewer\r
 \r
                Version 0.1 alpha\r
 
diff --git a/OPJViewer/about/about.htm b/OPJViewer/about/about.htm
new file mode 100644 (file)
index 0000000..88da55b
--- /dev/null
@@ -0,0 +1,36 @@
+<html>\r
+<body bgcolor="#FFFFFF">\r
+<table cellspacing=7 cellpadding=1 border=0 width="100%">\r
+<tr>\r
+<td rowspan=3 valign=top align=center width=70>\r
+<img src="opj_logo.png"><br><br>\r
+</td>\r
+<td align=center>\r
+<font size=+2 color="#000000"><b>OPJViewer v0.2 alpha</b></font><br>\r
+<font size=+0 color="#000000"><b>A JPEG 2000 image viewer</b></font>\r
+</td>\r
+</tr>\r
+<tr height=3 valign=center>\r
+<td valign=center  bgcolor=#cc3300></td>\r
+</tr>\r
+<tr>\r
+<td align=justify>\r
+<center><font size=+0 color="#000000"><a href="http://www.openjpeg.org/">OpenJPEG</a></font></center>\r
+<font size=-1 color="#000000">The OpenJPEG library is an open-source JPEG 2000 codec written in C language.\r
+In addition to the basic codec, various other features are under development,\r
+among them the JP2 and MJ2 (Motion JPEG 2000) file formats, an indexing tool\r
+useful for the JPIP protocol, JPWL-tools for error-resilience, ...</font>\r
+</td>\r
+</tr>\r
+<tr>\r
+<td colspan=2 bgcolor="#CC3300" height=3 valign=center></td>\r
+</tr>\r
+<tr>\r
+<td colspan=2>\r
+<font size=-2 color="#444">OpenJPEG is &copy; 2002-2007 <a href="http://www.tele.ucl.ac.be/">TELE</a> - <a href="http://www.uclouvain.be/">Université Catholique de Louvain</a></font><br>\r
+<font size=-2 color="#444">OPJViewer is also &copy; 2005-2007 <a href="http://dsplab.diei.unipg.it/">DSPLab</a> - <a href="http://www.unipg.it/">Università degli studi di Perugia</a></font>\r
+</td>\r
+</tr>\r
+</table>\r
+</body>\r
+</html>\r
diff --git a/OPJViewer/about/opj_logo.png b/OPJViewer/about/opj_logo.png
new file mode 100644 (file)
index 0000000..0f43840
Binary files /dev/null and b/OPJViewer/about/opj_logo.png differ
diff --git a/OPJViewer/source/OPJChild.ico b/OPJViewer/source/OPJChild.ico
new file mode 100644 (file)
index 0000000..7a12718
Binary files /dev/null and b/OPJViewer/source/OPJChild.ico differ
diff --git a/OPJViewer/source/OPJChild16.xpm b/OPJViewer/source/OPJChild16.xpm
new file mode 100644 (file)
index 0000000..48e8796
--- /dev/null
@@ -0,0 +1,28 @@
+/* XPM */\r
+static char *OPJChild16[] = {\r
+/* columns rows colors chars-per-pixel */\r
+"16 16 6 1",\r
+"  c black",\r
+". c #008000",\r
+"X c red",\r
+"o c #800080",\r
+"O c gray100",\r
+"+ c None",\r
+/* pixels */\r
+"++++++++++++++++",\r
+"+OOOOOOOOOOOOOO+",\r
+"+OooooooooooooO+",\r
+"+OooooooooooooO+",\r
+"+OooOOOOOOOOOoO+",\r
+"+OooO.......OoO+",\r
+"+OooO.......OoO+",\r
+"+OooO..OOO..OoO+",\r
+"+OooO..OXO..OoO+",\r
+"+OooO..OOO..OoO+",\r
+"+OooO.......OoO+",\r
+"+OooO.......OoO+",\r
+"+OooOOOOOOOOOoO+",\r
+"+OooooooooooooO+",\r
+"+OOOOOOOOOOOOOO+",\r
+"++++++++++++++++"\r
+};\r
index 3bbf47973fc326a31959999c946876bd5117310a..b06ba2d9b8423aded5afa6e358e9b576f352c98a 100644 (file)
 // Copyright:   (c) 1998-2002 wxWidgets team\r
 // License:     wxWindows license\r
 /////////////////////////////////////////////////////////////////////////////\r
-#include "OPJViewer.h"\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Name:        dialogs.cpp\r
+// Purpose:     Common dialogs demo\r
+// Author:      Julian Smart\r
+// Modified by: ABX (2004) - adjustements for conditional building + new menu\r
+// Created:     04/01/98\r
+// RCS-ID:      $Id: dialogs.cpp,v 1.163 2006/11/04 10:57:24 VZ Exp $\r
+// Copyright:   (c) Julian Smart\r
+// Licence:     wxWindows license\r
+/////////////////////////////////////////////////////////////////////////////\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Name:        dnd.cpp\r
+// Purpose:     Drag and drop sample\r
+// Author:      Vadim Zeitlin\r
+// Modified by:\r
+// Created:     04/01/98\r
+// RCS-ID:      $Id: dnd.cpp,v 1.107 2006/10/30 20:23:41 VZ Exp $\r
+// Copyright:\r
+// Licence:     wxWindows licence\r
+/////////////////////////////////////////////////////////////////////////////\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Name:        test.cpp\r
+// Purpose:     wxHtml testing example\r
+/////////////////////////////////////////////////////////////////////////////\r
 \r
-OPJFrame *frame = NULL;\r
-wxList my_children;\r
+\r
+#include "OPJViewer.h"\r
 \r
 IMPLEMENT_APP(OPJViewerApp)\r
 \r
@@ -110,37 +133,28 @@ int winNumber = 1;
 bool OPJViewerApp::OnInit(void)\r
 {\r
 #if wxUSE_UNICODE\r
+\r
     wxChar **wxArgv = new wxChar *[argc + 1];\r
 \r
-    {\r
-        int n;\r
+    for (int n = 0; n < argc; n++ ) {\r
+        wxMB2WXbuf warg = wxConvertMB2WX(argv[n]);\r
+        wxArgv[n] = wxStrdup(warg);\r
+    }\r
 \r
-        for (n = 0; n < argc; n++ )\r
-        {\r
-            wxMB2WXbuf warg = wxConvertMB2WX(argv[n]);\r
-            wxArgv[n] = wxStrdup(warg);\r
-        }\r
+    wxArgv[n] = NULL;\r
 \r
-        wxArgv[n] = NULL;\r
-    }\r
 #else // !wxUSE_UNICODE\r
+\r
     #define wxArgv argv\r
+\r
 #endif // wxUSE_UNICODE/!wxUSE_UNICODE\r
 \r
 #if wxUSE_CMDLINE_PARSER\r
+\r
     static const wxCmdLineEntryDesc cmdLineDesc[] =\r
     {\r
         { wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("show this help message"),\r
             wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },\r
-        /*{ wxCMD_LINE_SWITCH, _T("v"), _T("verbose"), _T("be verbose") },\r
-        { wxCMD_LINE_SWITCH, _T("q"), _T("quiet"),   _T("be quiet") },\r
-\r
-        { wxCMD_LINE_OPTION, _T("o"), _T("output"),  _T("output file") },\r
-        { wxCMD_LINE_OPTION, _T("i"), _T("input"),   _T("input dir") },\r
-        { wxCMD_LINE_OPTION, _T("s"), _T("size"),    _T("output block size"),\r
-            wxCMD_LINE_VAL_NUMBER },\r
-        { wxCMD_LINE_OPTION, _T("d"), _T("date"),    _T("output file date"),\r
-            wxCMD_LINE_VAL_DATE },*/\r
 \r
         { wxCMD_LINE_PARAM,  NULL, NULL, _T("input file"),\r
             wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE },\r
@@ -154,20 +168,20 @@ bool OPJViewerApp::OnInit(void)
                      wxCMD_LINE_VAL_STRING,\r
                      wxCMD_LINE_OPTION_MANDATORY | wxCMD_LINE_NEEDS_SEPARATOR);*/\r
 \r
-    switch ( parser.Parse() )\r
-    {\r
-        case -1:\r
-            wxLogMessage(_T("Help was given, terminating."));\r
-            break;\r
+    switch (parser.Parse()) {\r
+    case -1:\r
+        wxLogMessage(wxT("Help was given, terminating."));\r
+        break;\r
 \r
-        case 0:\r
-            ShowCmdLine(parser);\r
-            break;\r
+    case 0:\r
+        ShowCmdLine(parser);\r
+        break;\r
 \r
-        default:\r
-            wxLogMessage(_T("Syntax error detected."));\r
-            break;\r
+    default:\r
+        wxLogMessage(wxT("Syntax error detected."));\r
+        break;\r
     }\r
+\r
 #endif // wxUSE_CMDLINE_PARSER\r
 \r
     //wxInitAllImageHandlers();\r
@@ -179,68 +193,74 @@ bool OPJViewerApp::OnInit(void)
   wxImage::AddHandler( new wxJP2Handler );\r
   wxImage::AddHandler( new wxMJ2Handler );\r
 #endif\r
-\r
+    // we use a PNG image in our HTML page\r
+    wxImage::AddHandler(new wxPNGHandler);\r
+\r
+       // set decoding engine parameters\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
        // Create the main frame window\r
-\r
-  frame = new OPJFrame(NULL, wxID_ANY, OPJ_APPLICATION_TITLEBAR, wxDefaultPosition, wxSize(800, 600),\r
-                      wxDEFAULT_FRAME_STYLE |\r
-                      wxNO_FULL_REPAINT_ON_RESIZE |\r
+  OPJFrame *frame = new OPJFrame(NULL, wxID_ANY, OPJ_APPLICATION_TITLEBAR,\r
+                                         wxDefaultPosition, wxSize(800, 600),\r
+                      wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE |\r
                       wxHSCROLL | wxVSCROLL);\r
 \r
   // Give it an icon (this is ignored in MDI mode: uses resources)\r
 #ifdef __WXMSW__\r
-  frame->SetIcon(wxIcon(_T("OPJViewer16")));\r
+  frame->SetIcon(wxIcon(wxT("OPJViewer16")));\r
 #endif\r
 \r
   frame->Show(true);\r
 \r
   SetTopWindow(frame);\r
 \r
+       // if there are files on the command line, open them\r
+       if (!(m_filelist.IsEmpty())) {\r
+               //wxLogMessage(wxT("Habemus files!!!"));\r
+               wxArrayString paths, filenames;\r
+               for (int f = 0; f < wxGetApp().m_filelist.GetCount(); f++) {\r
+                       paths.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullPath());\r
+                       filenames.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullName());\r
+               }\r
+               //wxLogMessage(paths[0]);\r
+               frame->OpenFiles(paths, filenames);\r
+       }\r
+\r
   return true;\r
 }\r
 \r
 void OPJViewerApp::ShowCmdLine(const wxCmdLineParser& parser)\r
 {\r
-    wxString s = _T("Command line parsed successfully:\nInput files: ");\r
+    wxString s = wxT("Command line parsed successfully:\nInput files: ");\r
 \r
     size_t count = parser.GetParamCount();\r
-    for ( size_t param = 0; param < count; param++ )\r
-    {\r
+    for (size_t param = 0; param < count; param++) {\r
         s << parser.GetParam(param) << ';';\r
-\r
                m_filelist.Add(parser.GetParam(param));\r
     }\r
 \r
-    /*s << '\n'\r
-      << _T("Verbose:\t") << (parser.Found(_T("v")) ? _T("yes") : _T("no")) << '\n'\r
-      << _T("Quiet:\t") << (parser.Found(_T("q")) ? _T("yes") : _T("no")) << '\n';\r
-\r
-    wxString strVal;\r
-    long lVal;\r
-    wxDateTime dt;\r
-    if ( parser.Found(_T("o"), &strVal) )\r
-        s << _T("Output file:\t") << strVal << '\n';\r
-    if ( parser.Found(_T("i"), &strVal) )\r
-        s << _T("Input dir:\t") << strVal << '\n';\r
-    if ( parser.Found(_T("s"), &lVal) )\r
-        s << _T("Size:\t") << lVal << '\n';\r
-    if ( parser.Found(_T("d"), &dt) )\r
-        s << _T("Date:\t") << dt.FormatISODate() << '\n';\r
-    if ( parser.Found(_T("project_name"), &strVal) )\r
-        s << _T("Project:\t") << strVal << '\n';*/\r
-\r
     //wxLogMessage(s);\r
 }\r
 \r
 // OPJFrame events\r
 BEGIN_EVENT_TABLE(OPJFrame, wxMDIParentFrame)\r
-    EVT_MENU(SASHTEST_ABOUT, OPJFrame::OnAbout)\r
-    EVT_MENU(SASHTEST_NEW_WINDOW, OPJFrame::OnFileOpen)\r
+    EVT_MENU(OPJFRAME_HELPABOUT, OPJFrame::OnAbout)\r
+    EVT_MENU(OPJFRAME_FILEOPEN, OPJFrame::OnFileOpen)\r
     EVT_SIZE(OPJFrame::OnSize)\r
-    EVT_MENU(SASHTEST_QUIT, OPJFrame::OnQuit)\r
-    EVT_MENU(SASHTEST_TOGGLE_WINDOW, OPJFrame::OnToggleWindow)\r
-    EVT_SASH_DRAGGED_RANGE(ID_WINDOW_TOP, ID_WINDOW_BOTTOM, OPJFrame::OnSashDrag)\r
+    EVT_MENU(OPJFRAME_FILEEXIT, OPJFrame::OnQuit)\r
+    EVT_MENU(OPJFRAME_FILECLOSE, OPJFrame::OnClose)\r
+    EVT_MENU(OPJFRAME_VIEWZOOM, OPJFrame::OnZoom)\r
+    EVT_MENU(OPJFRAME_VIEWFIT, OPJFrame::OnFit)\r
+    EVT_MENU(OPJFRAME_FILETOGGLE, OPJFrame::OnToggleWindow)\r
+    EVT_MENU(OPJFRAME_SETSDECO, OPJFrame::OnSetsDeco)\r
+    EVT_SASH_DRAGGED_RANGE(OPJFRAME_BROWSEWIN, OPJFRAME_LOGWIN, OPJFrame::OnSashDrag)\r
     EVT_NOTEBOOK_PAGE_CHANGED(LEFT_NOTEBOOK_ID, OPJFrame::OnNotebook)\r
 END_EVENT_TABLE()\r
 \r
@@ -252,24 +272,44 @@ OPJFrame::OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
        // file menu and its items\r
        wxMenu *file_menu = new wxMenu;\r
 \r
-       file_menu->Append(SASHTEST_NEW_WINDOW, wxT("&Open\tCtrl+O"));\r
-       file_menu->SetHelpString(SASHTEST_NEW_WINDOW, wxT("Open one or more files"));\r
+       file_menu->Append(OPJFRAME_FILEOPEN, wxT("&Open\tCtrl+O"));\r
+       file_menu->SetHelpString(OPJFRAME_FILEOPEN, wxT("Open one or more files"));\r
+\r
+       file_menu->Append(OPJFRAME_FILETOGGLE, wxT("&Toggle browser\tCtrl+T"));\r
+       file_menu->SetHelpString(OPJFRAME_FILETOGGLE, wxT("Toggle the left browsing pane"));\r
+\r
+       file_menu->Append(OPJFRAME_FILECLOSE, wxT("&Close\tCtrl+C"));\r
+       file_menu->SetHelpString(OPJFRAME_FILECLOSE, wxT("Close current image"));\r
+\r
+       file_menu->Append(OPJFRAME_FILEEXIT, wxT("&Exit\tCtrl+Q"));\r
+       file_menu->SetHelpString(OPJFRAME_FILEEXIT, wxT("Quit this program"));\r
 \r
-       file_menu->Append(SASHTEST_TOGGLE_WINDOW, wxT("&Toggle browser\tCtrl+T"));\r
-       file_menu->SetHelpString(SASHTEST_TOGGLE_WINDOW, wxT("Toggle the left browsing pane"));\r
+       // view menu and its items\r
+       wxMenu *view_menu = new wxMenu;\r
 \r
-       file_menu->Append(SASHTEST_QUIT, wxT("&Exit\tCtrl+Q"));\r
-       file_menu->SetHelpString(SASHTEST_QUIT, wxT("Quit this program"));\r
+       view_menu->Append(OPJFRAME_VIEWZOOM, wxT("&Zoom\tCtrl+Z"));\r
+       view_menu->SetHelpString(OPJFRAME_VIEWZOOM, wxT("Rescale the image"));\r
+\r
+       view_menu->Append(OPJFRAME_VIEWFIT, wxT("Zoom to &fit\tCtrl+F"));\r
+       view_menu->SetHelpString(OPJFRAME_VIEWFIT, wxT("Fit the image in canvas"));\r
+\r
+       // settings menu and its items\r
+       wxMenu *sets_menu = new wxMenu;\r
+\r
+       sets_menu->Append(OPJFRAME_SETSDECO, wxT("&Decoder\tCtrl+D"));\r
+       sets_menu->SetHelpString(OPJFRAME_SETSDECO, wxT("Decoder settings"));\r
 \r
        // help menu and its items\r
        wxMenu *help_menu = new wxMenu;\r
 \r
-       help_menu->Append(SASHTEST_ABOUT, wxT("&About\tF1"));\r
-       help_menu->SetHelpString(SASHTEST_ABOUT, wxT("Basic info on the program"));\r
+       help_menu->Append(OPJFRAME_HELPABOUT, wxT("&About\tF1"));\r
+       help_menu->SetHelpString(OPJFRAME_HELPABOUT, wxT("Basic info on the program"));\r
 \r
        // the whole menubar\r
        wxMenuBar *menu_bar = new wxMenuBar;\r
        menu_bar->Append(file_menu, wxT("&File"));\r
+       menu_bar->Append(view_menu, wxT("&View"));\r
+       menu_bar->Append(sets_menu, wxT("&Settings"));\r
        menu_bar->Append(help_menu, wxT("&Help"));\r
 \r
        // Associate the menu bar with the frame\r
@@ -279,7 +319,7 @@ OPJFrame::OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
        CreateStatusBar();\r
 \r
        // the logging window\r
-       loggingWindow = new wxSashLayoutWindow(this, ID_WINDOW_BOTTOM,\r
+       loggingWindow = new wxSashLayoutWindow(this, OPJFRAME_LOGWIN,\r
                                                                                        wxDefaultPosition, wxSize(400, 130),\r
                                                                                        wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN\r
                                                                                        );\r
@@ -307,15 +347,18 @@ OPJFrame::OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
        // create the text control of the browser\r
        m_textCtrlbrowse = new wxTextCtrl(m_bookCtrlbottom, wxID_ANY, wxT(""),\r
                                                                wxDefaultPosition, wxDefaultSize,\r
-                                                               wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY \r
+                                                               wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY | wxTE_RICH \r
                                                                );\r
-       m_textCtrlbrowse->SetValue(_T("Browsing window\n"));\r
+       wxFont *browsefont = new wxFont(wxNORMAL_FONT->GetPointSize(),\r
+               wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);\r
+    m_textCtrlbrowse->SetDefaultStyle(wxTextAttr(wxNullColour, wxNullColour, *browsefont));\r
+       m_textCtrlbrowse->AppendText(wxT("Browsing window\n"));\r
 \r
        // add it the notebook\r
-       m_bookCtrlbottom->AddPage(m_textCtrlbrowse, wxT("Peek"));\r
+       m_bookCtrlbottom->AddPage(m_textCtrlbrowse, wxT("Peek"), false);\r
 \r
        // the browser window\r
-       markerTreeWindow = new wxSashLayoutWindow(this, ID_WINDOW_LEFT1,\r
+       markerTreeWindow = new wxSashLayoutWindow(this, OPJFRAME_BROWSEWIN,\r
                                                                                          wxDefaultPosition, wxSize(300, 30),\r
                                                                                          wxNO_BORDER | wxSW_3D | wxCLIP_CHILDREN\r
                                                                                          );\r
@@ -331,8 +374,6 @@ OPJFrame::OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
                                                                wxDefaultPosition, wxDefaultSize,\r
                                                                wxBK_TOP);\r
 \r
-\r
-#if wxUSE_LOG\r
 #ifdef __WXMOTIF__\r
        // For some reason, we get a memcpy crash in wxLogStream::DoLogStream\r
        // on gcc/wxMotif, if we use wxLogTextCtl. Maybe it's just gcc?\r
@@ -342,18 +383,10 @@ OPJFrame::OPJFrame(wxWindow *parent, const wxWindowID id, const wxString& title,
        wxLogTextCtrl *logWindow = new wxLogTextCtrl(m_textCtrl);\r
        delete wxLog::SetActiveTarget(logWindow);\r
 #endif\r
-#endif // wxUSE_LOG\r
 \r
-       // if there are files on the command line, open them\r
-       /*if (!wxGetApp().m_filelist.IsEmpty()) {\r
-       wxLogMessage(wxT("Habemus files!!!"));\r
-       wxArrayString paths, filenames;\r
-       for (int f = 0; f < wxGetApp().m_filelist.GetCount(); f++) {\r
-       paths.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullPath());\r
-       filenames.Add(wxFileName(wxGetApp().m_filelist[f]).GetFullName());\r
-       }\r
-       OpenFiles(paths, filenames);\r
-       }*/\r
+       // associate drop targets with the controls\r
+       SetDropTarget(new OPJDnDFile(this));\r
+\r
 }\r
 \r
 // this is the frame destructor\r
@@ -385,7 +418,7 @@ void OPJFrame::OnNotebook(wxNotebookEvent& event)
 \r
        m_childhash[childnum]->Activate();\r
 \r
-       wxLogMessage(wxString::Format(wxT("Selection changed (now %d --> %d)"), childnum, m_childhash[childnum]->m_winnumber));\r
+       //wxLogMessage(wxT("Selection changed (now %d --> %d)"), childnum, m_childhash[childnum]->m_winnumber);\r
 \r
 }\r
 \r
@@ -395,14 +428,138 @@ void OPJFrame::Resize(int number)
        wxSize size = GetClientSize();\r
 }\r
 \r
+void OPJFrame::OnSetsDeco(wxCommandEvent& event)\r
+{\r
+    OPJDecoderDialog dialog(this, event.GetId());\r
+\r
+    if (dialog.ShowModal() == wxID_OK) {\r
+\r
+               // load settings\r
+               wxGetApp().m_reducefactor = dialog.m_reduceCtrl->GetValue();\r
+               wxGetApp().m_qualitylayers = dialog.m_layerCtrl->GetValue();\r
+               wxGetApp().m_components = dialog.m_numcompsCtrl->GetValue();\r
+#ifdef USE_JPWL\r
+               wxGetApp().m_enablejpwl = dialog.m_enablejpwlCheck->GetValue();\r
+               wxGetApp().m_expcomps = dialog.m_expcompsCtrl->GetValue();\r
+               wxGetApp().m_maxtiles = dialog.m_maxtilesCtrl->GetValue();\r
+#endif // USE_JPWL     \r
+               \r
+       };      \r
+}\r
+\r
 void OPJFrame::OnQuit(wxCommandEvent& WXUNUSED(event))\r
 {\r
        Close(true);\r
 }\r
 \r
+void OPJFrame::OnClose(wxCommandEvent& WXUNUSED(event))\r
+{\r
+       // current frame\r
+       OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();\r
+\r
+       if (!currframe)\r
+               return;\r
+\r
+       wxCloseEvent e;\r
+       currframe->OnClose(e);\r
+}\r
+\r
+void OPJFrame::OnFit(wxCommandEvent& WXUNUSED(event))\r
+{\r
+       // current child\r
+       OPJChildFrame *currchild = (OPJChildFrame *) GetActiveChild();\r
+       if (!currchild)\r
+               return;\r
+\r
+       // current canvas\r
+       OPJCanvas *currcanvas = currchild->m_canvas;\r
+\r
+       // find a fit-to-width zoom\r
+       int zooml, wzooml, hzooml;\r
+       wxSize clientsize = currcanvas->GetClientSize();\r
+       wzooml = (int) ceil(100.0 * (double) (clientsize.GetWidth() - 2 * OPJ_CANVAS_BORDER) / (double) (currcanvas->m_image100.GetWidth()));\r
+       hzooml = (int) ceil(100.0 * (double) (clientsize.GetHeight() - 2 * OPJ_CANVAS_BORDER) / (double) (currcanvas->m_image100.GetHeight()));\r
+       zooml = wxMin(100, wxMin(wzooml, hzooml));\r
+\r
+       // fit to width\r
+       Rescale(zooml, currchild);\r
+}\r
+\r
+void OPJFrame::OnZoom(wxCommandEvent& WXUNUSED(event))\r
+{\r
+       // current frame\r
+       OPJChildFrame *currframe = (OPJChildFrame *) GetActiveChild();\r
+\r
+       if (!currframe)\r
+               return;\r
+\r
+       // get the preferred zoom\r
+       long zooml = wxGetNumberFromUser(wxT("Choose a scale between 5% and 300%"),\r
+               wxT("Zoom (%)"),\r
+               wxT("Image scale"),\r
+               currframe->m_canvas->m_zooml, 5, 300, NULL, wxDefaultPosition);\r
+\r
+       // rescale current frame image if necessary\r
+       if (zooml >= 5) {\r
+               Rescale(zooml, currframe);\r
+               wxLogMessage(wxT("zoom to %d%%"), zooml);\r
+       }\r
+}\r
+\r
+void OPJFrame::Rescale(int zooml, OPJChildFrame *currframe)\r
+{\r
+       wxImage new_image = currframe->m_canvas->m_image100.ConvertToImage();\r
+       if (zooml != 100)\r
+               new_image.Rescale((int) ((double) zooml * (double) new_image.GetWidth() / 100.0),\r
+                       (int) ((double) zooml * (double) new_image.GetHeight() / 100.0),\r
+                       wxIMAGE_QUALITY_NORMAL);\r
+    currframe->m_canvas->m_image = wxBitmap(new_image);\r
+       currframe->m_canvas->SetScrollbars(20,\r
+                                                                               20,\r
+                                                                               (int)(0.5 + (double) new_image.GetWidth() / 20.0),\r
+                                                                               (int)(0.5 + (double) new_image.GetHeight() / 20.0)\r
+                                                                               );\r
+       currframe->m_canvas->Refresh();\r
+\r
+       // update zoom\r
+       currframe->m_canvas->m_zooml = zooml;\r
+}\r
+\r
+\r
 // about window for the frame\r
 void OPJFrame::OnAbout(wxCommandEvent& WXUNUSED(event))\r
 {\r
+#ifdef OPJ_HTMLABOUT\r
+\r
+    wxBoxSizer *topsizer;\r
+    wxHtmlWindow *html;\r
+    wxDialog dlg(this, wxID_ANY, wxString(_("About")));\r
+\r
+    topsizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+    html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition, wxSize(350, 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->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
@@ -411,28 +568,25 @@ void OPJFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
                                                                  wxT("\nRunning under %s\n\n")\r
                                                                  OPJ_APPLICATION_COPYRIGHT,\r
                                                                  wxVERSION_STRING,\r
-                                                                 wxGetOsDescription().c_str()\r
-                                                                 ),\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::OnToggleWindow(wxCommandEvent& WXUNUSED(event))\r
 {\r
     if (markerTreeWindow->IsShown())\r
-    {\r
         markerTreeWindow->Show(false);\r
-    }\r
     else\r
-    {\r
         markerTreeWindow->Show(true);\r
-    }\r
-#if wxUSE_MDI_ARCHITECTURE\r
+\r
     wxLayoutAlgorithm layout;\r
     layout.LayoutMDIFrame(this);\r
-#endif // wxUSE_MDI_ARCHITECTURE\r
 }\r
 \r
 void OPJFrame::OnSashDrag(wxSashEvent& event)\r
@@ -440,24 +594,21 @@ void OPJFrame::OnSashDrag(wxSashEvent& event)
     if (event.GetDragStatus() == wxSASH_STATUS_OUT_OF_RANGE)\r
         return;\r
 \r
-    switch (event.GetId())\r
-    {\r
-        case ID_WINDOW_LEFT1:\r
-        {\r
-            markerTreeWindow->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));\r
-            break;\r
-        }\r
-        case ID_WINDOW_BOTTOM:\r
-        {\r
-            loggingWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));\r
-            break;\r
-        }\r
+    switch (event.GetId()) {\r
+               case OPJFRAME_BROWSEWIN:\r
+               {\r
+                       markerTreeWindow->SetDefaultSize(wxSize(event.GetDragRect().width, 1000));\r
+                       break;\r
+               }\r
+               case OPJFRAME_LOGWIN:\r
+               {\r
+                       loggingWindow->SetDefaultSize(wxSize(1000, event.GetDragRect().height));\r
+                       break;\r
+               }\r
     }\r
 \r
-#if wxUSE_MDI_ARCHITECTURE\r
     wxLayoutAlgorithm layout;\r
     layout.LayoutMDIFrame(this);\r
-#endif // wxUSE_MDI_ARCHITECTURE\r
 \r
     // Leaves bits of itself behind sometimes\r
     GetClientWindow()->Refresh();\r
@@ -467,58 +618,44 @@ void OPJFrame::OnSashDrag(wxSashEvent& event)
 void OPJFrame::OpenFiles(wxArrayString paths, wxArrayString filenames)\r
 {\r
 \r
-        size_t count = paths.GetCount();\r
-        for ( size_t n = 0; n < count; n++ )\r
-        {\r
-                       wxString msg, s;\r
-            s.Printf(_T("File %d: %s (%s)\n"),\r
-                     (int)n, paths[n].c_str(), filenames[n].c_str());\r
-\r
-            msg += s;\r
-                       //s.Printf(_T("Filter index: %d"), dialog.GetFilterIndex());\r
-                       msg += s;\r
-\r
-                       /*wxMessageDialog dialog2(this, msg, _T("Selected files"));\r
-                       dialog2.ShowModal();*/\r
-\r
-                       // Make another frame, containing a canvas\r
-                         OPJChildFrame *subframe = new OPJChildFrame(frame,\r
-                                                                                         paths[n],\r
-                                                                                         winNumber,\r
-                                                                                         _T("Canvas Frame"),\r
-                                                                                         wxDefaultPosition, wxSize(300, 300),\r
-                                                                                         wxDEFAULT_FRAME_STYLE |\r
-                                                                                         wxNO_FULL_REPAINT_ON_RESIZE);\r
-                         m_childhash[winNumber] = subframe;\r
-\r
-                                 // create own marker tree\r
-                               long tstyle = wxTR_DEFAULT_STYLE | wxSUNKEN_BORDER | \r
-                       #ifndef NO_VARIABLE_HEIGHT\r
-                                                        wxTR_HAS_VARIABLE_ROW_HEIGHT /*|*/\r
-                       #endif\r
-                                                        /*wxTR_EDIT_LABELS*/;\r
-\r
-                               m_treehash[winNumber] = new OPJMarkerTree(m_bookCtrl, paths[n], wxT("Parsing..."), TreeTest_Ctrl,\r
-                                                                                       wxDefaultPosition, wxDefaultSize,\r
-                                                                                       tstyle);\r
-\r
-                               m_bookCtrl->AddPage(m_treehash[winNumber],\r
-                                                                               wxString::Format(wxT("%u"), winNumber), false);\r
-\r
-                               for (int p = 0; p < m_bookCtrl->GetPageCount(); p++) {\r
-\r
-                                       if (m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), winNumber)) {\r
-                                               m_bookCtrl->ChangeSelection(p);\r
-                                               break;\r
-                                       }\r
-\r
-                               }\r
-\r
-                         winNumber++;\r
-               \r
-               }\r
+       size_t count = paths.GetCount();\r
+       for (size_t n = 0; n < count; n++) {\r
+\r
+               wxString msg, s;\r
+               s.Printf(_T("File %d: %s (%s)\n"), (int)n, paths[n].c_str(), filenames[n].c_str());\r
+\r
+               msg += s;\r
+\r
+               /*wxMessageDialog dialog2(this, msg, _T("Selected files"));\r
+               dialog2.ShowModal();*/\r
+\r
+               // Make another frame, containing a canvas\r
+               OPJChildFrame *subframe = new OPJChildFrame(this,\r
+                                                                                                       paths[n],\r
+                                                                                                       winNumber,\r
+                                                                                                       wxT("Canvas Frame"),\r
+                                                                                                       wxDefaultPosition, wxSize(300, 300),\r
+                                                                                                       wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE\r
+                                                                                                       );\r
+               m_childhash[winNumber] = subframe;\r
+\r
+               // create own marker tree\r
+               m_treehash[winNumber] = new OPJMarkerTree(m_bookCtrl, paths[n], wxT("Parsing..."), TreeTest_Ctrl,\r
+                                                                                                 wxDefaultPosition, wxDefaultSize,\r
+                                                                                                 wxTR_DEFAULT_STYLE | wxSUNKEN_BORDER\r
+                                                                                                 );\r
 \r
+               m_bookCtrl->AddPage(m_treehash[winNumber], wxString::Format(wxT("%u"), winNumber), false);\r
 \r
+               for (int p = 0; p < m_bookCtrl->GetPageCount(); p++) {\r
+                       if (m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), winNumber)) {\r
+                               m_bookCtrl->ChangeSelection(p);\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               winNumber++;\r
+       }\r
 }\r
 \r
 void OPJFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event))\r
@@ -533,15 +670,13 @@ void OPJFrame::OnFileOpen(wxCommandEvent& WXUNUSED(event))
                         wxEmptyString, wxEmptyString, wildcards,\r
                         wxFD_OPEN|wxFD_MULTIPLE);\r
 \r
-    if (dialog.ShowModal() == wxID_OK)\r
-    {\r
+    if (dialog.ShowModal() == wxID_OK) {\r
         wxArrayString paths, filenames;\r
 \r
         dialog.GetPaths(paths);\r
         dialog.GetFilenames(filenames);\r
 \r
                OpenFiles(paths, filenames);\r
-\r
     }\r
 \r
 }\r
@@ -558,14 +693,17 @@ OPJCanvas::OPJCanvas(wxFileName fname, wxWindow *parent, const wxPoint& pos, con
     SetBackgroundColour(OPJ_CANVAS_COLOUR);\r
 \r
        m_fname = fname;\r
+       m_childframe = (OPJChildFrame *) parent;\r
 \r
     OPJDecoThread *dthread = CreateDecoThread();\r
 \r
     if (dthread->Run() != wxTHREAD_NO_ERROR)\r
         wxLogMessage(wxT("Can't start deco thread!"));\r
     else\r
-               wxLogMessage(_T("New deco thread started."));\r
+               wxLogMessage(wxT("New deco thread started."));\r
 \r
+       // 100% zoom\r
+       m_zooml = 100;\r
 }\r
 \r
 OPJDecoThread *OPJCanvas::CreateDecoThread(void)\r
@@ -584,10 +722,6 @@ OPJDecoThread *OPJCanvas::CreateDecoThread(void)
 // Define the repainting behaviour\r
 void OPJCanvas::OnDraw(wxDC& dc)\r
 {\r
-    /*dc.SetFont(*wxSWISS_FONT);\r
-    dc.SetPen(*wxBLACK_PEN);\r
-    dc.DrawText(_T("Image drawing canvas"), 10, 10);\r
-    dc.DrawLine(8, 22, 300, 22);*/\r
        if (m_image.Ok()) {\r
                dc.DrawBitmap(m_image, OPJ_CANVAS_BORDER, OPJ_CANVAS_BORDER);\r
        } else {\r
@@ -595,30 +729,6 @@ void OPJCanvas::OnDraw(wxDC& dc)
                dc.SetPen(*wxBLACK_PEN);\r
                dc.DrawText(_T("Decoding image, please wait..."), 40, 50);\r
        }\r
-\r
-    /*dc.SetFont(*wxSWISS_FONT);\r
-    dc.SetPen(*wxGREEN_PEN);\r
-    dc.DrawLine(0, 0, 200, 200);\r
-    dc.DrawLine(200, 0, 0, 200);\r
-\r
-    dc.SetBrush(*wxCYAN_BRUSH);\r
-    dc.SetPen(*wxRED_PEN);\r
-    dc.DrawRectangle(100, 100, 100, 50);\r
-    dc.DrawRoundedRectangle(150, 150, 100, 50, 20);\r
-\r
-    dc.DrawEllipse(250, 250, 100, 50);\r
-#if wxUSE_SPLINES\r
-    dc.DrawSpline(50, 200, 50, 100, 200, 10);\r
-#endif // wxUSE_SPLINES\r
-    dc.DrawLine(50, 230, 200, 230);\r
-    dc.DrawText(_T("This is a test string"), 50, 230);\r
-\r
-    wxPoint points[3];\r
-    points[0].x = 200; points[0].y = 300;\r
-    points[1].x = 100; points[1].y = 400;\r
-    points[2].x = 300; points[2].y = 400;\r
-\r
-    dc.DrawPolygon(3, points);*/\r
 }\r
 \r
 // This implements a tiny doodling program! Drag the mouse using\r
@@ -630,9 +740,8 @@ void OPJCanvas::OnEvent(wxMouseEvent& event)
 \r
   wxPoint pt(event.GetLogicalPosition(dc));\r
 \r
-  if (xpos > -1 && ypos > -1 && event.Dragging())\r
-  {\r
-    dc.SetPen(*wxBLACK_PEN);\r
+  if ((xpos > -1) && (ypos > -1) && event.Dragging()) {\r
+    dc.SetPen(*wxRED_PEN);\r
     dc.DrawLine(xpos, ypos, pt.x, pt.y);\r
   }\r
   xpos = pt.x;\r
@@ -641,13 +750,11 @@ void OPJCanvas::OnEvent(wxMouseEvent& event)
 \r
 void OPJFrame::OnSize(wxSizeEvent& WXUNUSED(event))\r
 {\r
-#if wxUSE_MDI_ARCHITECTURE\r
     wxLayoutAlgorithm layout;\r
     layout.LayoutMDIFrame(this);\r
-#endif // wxUSE_MDI_ARCHITECTURE\r
 }\r
 \r
-// Note that SASHTEST_NEW_WINDOW and SASHTEST_ABOUT commands get passed\r
+// Note that OPJFRAME_FILEOPEN and OPJFRAME_HELPABOUT commands get passed\r
 // to the parent window for processing, so no need to\r
 // duplicate event handlers here.\r
 \r
@@ -655,7 +762,7 @@ BEGIN_EVENT_TABLE(OPJChildFrame, wxMDIChildFrame)
   /*EVT_MENU(SASHTEST_CHILD_QUIT, OPJChildFrame::OnQuit)*/\r
   EVT_CLOSE(OPJChildFrame::OnClose)\r
   EVT_SET_FOCUS(OPJChildFrame::OnGotFocus)\r
-  /*EVT_KILL_FOCUS(OPJChildFrame::OnLostFocus)*/\r
+  EVT_KILL_FOCUS(OPJChildFrame::OnLostFocus)\r
 END_EVENT_TABLE()\r
 \r
 OPJChildFrame::OPJChildFrame(OPJFrame *parent, wxFileName fname, int winnumber, const wxString& title, const wxPoint& pos, const wxSize& size,\r
@@ -664,7 +771,7 @@ const long style):
 {\r
   m_frame = (OPJFrame  *) parent;\r
   m_canvas = NULL;\r
-  my_children.Append(this);\r
+  //my_children.Append(this);\r
   m_fname = fname;\r
   m_winnumber = winnumber;\r
        SetTitle(wxString::Format(_T("%d: "), m_winnumber) + m_fname.GetFullName());\r
@@ -672,38 +779,11 @@ const long style):
 \r
          // Give it an icon (this is ignored in MDI mode: uses resources)\r
 #ifdef __WXMSW__\r
-         SetIcon(wxIcon(_T("sashtest_icn")));\r
+         SetIcon(wxIcon(wxT("OPJChild16")));\r
 #endif\r
 \r
-#if wxUSE_STATUSBAR\r
          // Give it a status line\r
-         //CreateStatusBar();\r
-#endif // wxUSE_STATUSBAR\r
-\r
-         // Make a menubar\r
-         /*wxMenu *file_menu = new wxMenu;\r
-\r
-         file_menu->Append(SASHTEST_NEW_WINDOW, _T("&Open\tCtrl+O"));\r
-         file_menu->Append(SASHTEST_CHILD_QUIT, _T("&Close\tCtrl+C"));\r
-         file_menu->Append(SASHTEST_QUIT, _T("&Exit\tCtrl+Q"));\r
-\r
-         wxMenu *option_menu = new wxMenu;\r
-\r
-         // Dummy option\r
-         option_menu->Append(SASHTEST_REFRESH, _T("&Refresh picture"));\r
-\r
-         wxMenu *help_menu = new wxMenu;\r
-         help_menu->Append(SASHTEST_ABOUT, _T("&About\tF1"));\r
-\r
-         wxMenuBar *menu_bar = new wxMenuBar;\r
-\r
-         menu_bar->Append(file_menu, _T("&File"));\r
-         menu_bar->Append(option_menu, _T("&Options"));\r
-         menu_bar->Append(help_menu, _T("&Help"));\r
-\r
-         // Associate the menu bar with the frame\r
-         SetMenuBar(menu_bar);*/\r
-\r
+         /*CreateStatusBar();*/\r
 \r
          int width, height;\r
          GetClientSize(&width, &height);\r
@@ -712,43 +792,21 @@ const long style):
          canvas->SetCursor(wxCursor(wxCURSOR_PENCIL));\r
          m_canvas = canvas;\r
 \r
-         // Give it scrollbars\r
+               // Give it scrollbars\r
          canvas->SetScrollbars(20, 20, 5, 5);\r
 \r
          Show(true);\r
          Maximize(true);\r
 \r
-\r
-    /*wxSize gsize = m_frame->m_bookCtrl->GetClientSize();\r
-    m_frame->m_treehash[m_winnumber]->SetSize(0, 0, gsize.x, gsize.y);*/\r
-\r
-    /*m_frame->Resize(m_winnumber);*/\r
-       /*m_frame->m_treehash[0]->Show(false);\r
-       m_frame->m_treehash[m_winnumber]->Show(true);*/\r
-    /*m_frame->Resize(m_winnumber);*/\r
-\r
        /*wxLogError(wxString::Format(wxT("Created tree %d (0x%x)"), m_winnumber, m_frame->m_treehash[m_winnumber]));*/\r
 \r
 }\r
 \r
 OPJChildFrame::~OPJChildFrame(void)\r
 {\r
-  my_children.DeleteObject(this);\r
+  //my_children.DeleteObject(this);\r
 }\r
 \r
-/*void OPJChildFrame::OnQuit(wxCommandEvent& WXUNUSED(event))\r
-{\r
-       for (int p = 0; p < m_frame->m_bookCtrl->GetPageCount(); p++) {\r
-\r
-               if (m_frame->m_bookCtrl->GetPageText(p) == wxString::Format(wxT("%u"), m_winnumber)) {\r
-                       m_frame->m_bookCtrl->DeletePage(p);;\r
-                       break;\r
-               }\r
-\r
-       }\r
-\r
-       Close(true);\r
-}*/\r
 \r
 void OPJChildFrame::OnClose(wxCloseEvent& event)\r
 {\r
@@ -762,7 +820,7 @@ void OPJChildFrame::OnClose(wxCloseEvent& event)
        }\r
        Destroy();\r
 \r
-       wxLogMessage(wxString::Format(wxT("Closed: %d"), m_winnumber));\r
+       wxLogMessage(wxT("Closed: %d"), m_winnumber);\r
 \r
 }\r
 \r
@@ -787,14 +845,13 @@ void OPJChildFrame::OnGotFocus(wxFocusEvent& event)
 \r
        }\r
 \r
-       wxLogMessage(wxString::Format(wxT("Got focus: %d (%x)"), m_winnumber, event.GetWindow()));\r
+       //wxLogMessage(wxT("Got focus: %d (%x)"), m_winnumber, event.GetWindow());\r
 }\r
 \r
-/*void OPJChildFrame::OnLostFocus(wxFocusEvent& event)\r
+void OPJChildFrame::OnLostFocus(wxFocusEvent& event)\r
 {\r
-       wxLogMessage(wxString::Format(wxT("Lost focus: %d (%x)"), m_winnumber, event.GetWindow()));\r
-\r
-}*/\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
@@ -826,7 +883,7 @@ BEGIN_EVENT_TABLE(OPJMarkerTree, wxTreeCtrl)
     // 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_MENU(TreeTest_Ctrl, OPJMarkerTree::OnItemMenu)\r
     /*EVT_TREE_ITEM_RIGHT_CLICK(TreeTest_Ctrl, OPJMarkerTree::OnItemRClick)*/\r
 \r
     /*EVT_RIGHT_DOWN(OPJMarkerTree::OnRMouseDown)\r
@@ -842,8 +899,7 @@ IMPLEMENT_DYNAMIC_CLASS(OPJMarkerTree, wxTreeCtrl)
 #endif\r
 \r
 OPJMarkerTree::OPJMarkerTree(wxWindow *parent, wxFileName fname, wxString name, const wxWindowID id,\r
-                       const wxPoint& pos, const wxSize& size,\r
-                       long style)\r
+           const wxPoint& pos, const wxSize& size, long style)\r
           : wxTreeCtrl(parent, id, pos, size, style)\r
 {\r
     m_reverseSort = false;\r
@@ -863,17 +919,16 @@ OPJMarkerTree::OPJMarkerTree(wxWindow *parent, wxFileName fname, wxString name,
     if (pthread->Run() != wxTHREAD_NO_ERROR)\r
         wxLogMessage(wxT("Can't start parse thread!"));\r
     else\r
-               wxLogMessage(_T("New parse thread started."));\r
+               wxLogMessage(wxT("New parse thread started."));\r
 }\r
 \r
 void OPJMarkerTree::CreateImageList(int size)\r
 {\r
-    if ( size == -1 )\r
-    {\r
+    if (size == -1) {\r
         SetImageList(NULL);\r
         return;\r
     }\r
-    if ( size == 0 )\r
+    if (size == 0)\r
         size = m_imageSize;\r
     else\r
         m_imageSize = size;\r
@@ -891,14 +946,10 @@ void OPJMarkerTree::CreateImageList(int size)
     icons[4] = wxIcon(icon5_xpm);\r
 \r
     int sizeOrig = icons[0].GetWidth();\r
-    for ( size_t i = 0; i < WXSIZEOF(icons); i++ )\r
-    {\r
-        if ( size == sizeOrig )\r
-        {\r
+    for (size_t i = 0; i < WXSIZEOF(icons); i++) {\r
+        if (size == sizeOrig) {\r
             images->Add(icons[i]);\r
-        }\r
-        else\r
-        {\r
+        } else {\r
             images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
         }\r
     }\r
@@ -909,8 +960,7 @@ void OPJMarkerTree::CreateImageList(int size)
 #if USE_GENERIC_TREECTRL || !defined(__WXMSW__)\r
 void OPJMarkerTree::CreateButtonsImageList(int size)\r
 {\r
-    if ( size == -1 )\r
-    {\r
+    if ( size == -1 ) {\r
         SetButtonsImageList(NULL);\r
         return;\r
     }\r
@@ -926,15 +976,11 @@ void OPJMarkerTree::CreateButtonsImageList(int size)
     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
-    {\r
+    for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) {\r
         int sizeOrig = icons[i].GetWidth();\r
-        if ( size == sizeOrig )\r
-        {\r
+        if ( size == sizeOrig ) {\r
             images->Add(icons[i]);\r
-        }\r
-        else\r
-        {\r
+        } else {\r
             images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));\r
         }\r
     }\r
@@ -1147,9 +1193,9 @@ void OPJMarkerTree::LogEvent(const wxChar *name, const wxTreeEvent& event)
     wxTreeItemId item = event.GetItem();\r
     wxString text;\r
     if ( item.IsOk() )\r
-        text << _T('"') << GetItemText(item).c_str() << _T('"');\r
+        text << wxT('"') << GetItemText(item).c_str() << wxT('"');\r
     else\r
-        text = _T("invalid item");\r
+        text = wxT("invalid item");\r
     wxLogMessage(wxT("%s(%s)"), name, text.c_str());\r
 }\r
 \r
@@ -1219,8 +1265,8 @@ void OPJMarkerTree::OnItemExpanding(wxTreeEvent& event)
 \r
 void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)\r
 {\r
-#define BUNCH_LINESIZE 24\r
-#define BUNCH_NUMLINES 6\r
+#define BUNCH_LINESIZE 16\r
+#define BUNCH_NUMLINES 7\r
 \r
        wxTreeItemId item = event.GetItem();\r
        OPJMarkerData* data = (OPJMarkerData *) GetItemData(item);\r
@@ -1230,13 +1276,9 @@ void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)
 \r
        m_peektextCtrl->Clear();\r
 \r
-       /*wxTextAttr myattr = m_peektextCtrl->GetDefaultStyle();\r
-       myattr.SetFont(wxFont(10, wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL));\r
-       m_peektextCtrl->SetDefaultStyle(myattr);*/\r
-\r
-       text << wxString::Format(wxT("Selected... (%s -> %s, %s, %d, %d)"),\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
+               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
@@ -1248,10 +1290,11 @@ void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)
        int max_read = wxMin(WXSIZEOF(buffer), data->m_length - data->m_start + 1);\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("%08d:"), data->m_start + pos);\r
+               text << wxString::Format(wxT("%010d:"), data->m_start + pos);\r
 \r
                pre_pos = pos;\r
 \r
@@ -1274,7 +1317,11 @@ void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)
                for (c = 0; c < BUNCH_LINESIZE; c++) {\r
 \r
                        if (pre_pos < max_read) {\r
-                               if ((buffer[pre_pos] == '\n') || (buffer[pre_pos] == '\t'))\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::Format(wxT("%c."), wxChar(buffer[pre_pos]));\r
                        } else\r
@@ -1410,7 +1457,7 @@ void OPJMarkerTree::OnSelChanged(wxTreeEvent& event)
         }\r
     }\r
 \r
-    wxLogMessage( wxT("%s event: %s (flags = %c%c%c%c)"),\r
+    wxLogMessage(wxT("%s event: %s (flags = %c%c%c%c)"),\r
                   name,\r
                   key.c_str(),\r
                   event.ControlDown() ? wxT('C') : wxT('-'),\r
@@ -1539,17 +1586,19 @@ void OPJMarkerTree::OnEndLabelEdit(wxTreeEvent& event)
     wxLogMessage(wxT("OnItemActivated"));\r
 }*/\r
 \r
-/*void OPJMarkerTree::OnItemMenu(wxTreeEvent& event)\r
+void OPJMarkerTree::OnItemMenu(wxTreeEvent& event)\r
 {\r
-    wxTreeItemId itemId = event.GetItem();\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
+                                                         : _T(""));*/\r
 \r
-    event.Skip();\r
-}*/\r
+       //wxLogMessage(wxT("EEEEEEEEEE"));\r
+\r
+    //event.Skip();\r
+}\r
 \r
 /*void OPJMarkerTree::OnContextMenu(wxContextMenuEvent& event)\r
 {\r
@@ -1719,45 +1768,74 @@ void *OPJDecoThread::Entry()
 \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 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
     WriteText(text);\r
-    // wxLogMessage(text); -- 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
-        // check if we were asked to exit\r
-        if ( TestDestroy() )\r
-            break;\r
 \r
-        text.Printf(wxT("[%u] Deco 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
-    wxBitmap bitmap( 100, 100 );\r
+    wxBitmap bitmap(100, 100);\r
     wxImage image = bitmap.ConvertToImage();\r
     image.Destroy();\r
 \r
        WriteText(m_canvas->m_fname.GetFullPath());\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
+#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
+       // load the file\r
     if (!image.LoadFile(m_canvas->m_fname.GetFullPath(), wxBITMAP_TYPE_ANY), 0) {\r
-        wxLogError(wxT("Can't load image"));\r
+        WriteText(wxT("Can't load image"));\r
                return NULL;\r
        }\r
 \r
-    m_canvas->m_image = wxBitmap(image);\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
+       // 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
+       m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe);\r
 \r
-    text.Printf(wxT("Deco thread 0x%lx finished."), GetId());\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
-    // wxLogMessage(text); -- test wxLog thread safeness\r
 \r
     return NULL;\r
 }\r
@@ -1796,14 +1874,11 @@ void OPJParseThread::OnExit()
     wxArrayThread& threads = wxGetApp().m_parse_threads;\r
     threads.Remove(this);\r
 \r
-    if ( threads.IsEmpty() )\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
-        {\r
+        if (wxGetApp().m_parse_waitingUntilAllDone) {\r
             wxGetApp().m_parse_waitingUntilAllDone = false;\r
-\r
             wxGetApp().m_parse_semAllDone.Post();\r
         }\r
     }\r
@@ -1814,10 +1889,10 @@ void *OPJParseThread::Entry()
 \r
     wxString text;\r
 \r
-       srand( GetId() );\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
+            GetId(), GetPriority(), m_countnum);\r
     WriteText(text);\r
     // wxLogMessage(text); -- test wxLog thread safeness\r
 \r
@@ -1847,3 +1922,382 @@ void *OPJParseThread::Entry()
 \r
     return NULL;\r
 }\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+// ----------------------------------------------------------------------------\r
+// OPJDecoderDialog\r
+// ----------------------------------------------------------------------------\r
+\r
+IMPLEMENT_CLASS(OPJDecoderDialog, wxPropertySheetDialog)\r
+\r
+BEGIN_EVENT_TABLE(OPJDecoderDialog, wxPropertySheetDialog)\r
+#ifdef USE_JPWL\r
+       EVT_CHECKBOX(OPJDECO_ENABLEJPWL, OPJDecoderDialog::OnEnableJPWL)\r
+#endif // USE_JPWL\r
+END_EVENT_TABLE()\r
+\r
+OPJDecoderDialog::OPJDecoderDialog(wxWindow* win, int dialogType)\r
+{\r
+    SetExtraStyle(wxDIALOG_EX_CONTEXTHELP|wxWS_EX_VALIDATE_RECURSIVELY);\r
+\r
+    int tabImage1 = -1;\r
+    int tabImage2 = -1;\r
+\r
+    int resizeBorder = wxRESIZE_BORDER;\r
+\r
+        m_imageList = NULL;\r
+\r
+    Create(win, wxID_ANY, wxT("Decoder settings"), wxDefaultPosition, wxDefaultSize,\r
+        wxDEFAULT_DIALOG_STYLE| (int) wxPlatform::IfNot(wxOS_WINDOWS_CE, resizeBorder)\r
+    );\r
+\r
+        CreateButtons(wxOK | wxCANCEL | (int)wxPlatform::IfNot(wxOS_WINDOWS_CE, wxHELP));\r
+\r
+    wxBookCtrlBase* notebook = GetBookCtrl();\r
+    notebook->SetImageList(m_imageList);\r
+\r
+    wxPanel* mainSettings = CreateMainSettingsPage(notebook);\r
+#ifdef USE_JPWL\r
+    wxPanel* jpwlSettings = CreateJPWLSettingsPage(notebook);\r
+#endif // USE_JPWL\r
+\r
+    notebook->AddPage(mainSettings, wxT("Main"), false);\r
+#ifdef USE_JPWL\r
+    notebook->AddPage(jpwlSettings, wxT("JPWL"), false);\r
+#endif // USE_JPWL\r
+\r
+    LayoutDialog();\r
+}\r
+\r
+OPJDecoderDialog::~OPJDecoderDialog()\r
+{\r
+    delete m_imageList;\r
+}\r
+\r
+/*wxPanel* OPJDecoderDialog::CreateGeneralSettingsPage(wxWindow* parent)\r
+{\r
+    wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+\r
+    wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );\r
+    wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );\r
+\r
+    //// LOAD LAST FILE\r
+\r
+    wxBoxSizer* itemSizer3 = new wxBoxSizer( wxHORIZONTAL );\r
+    wxCheckBox* checkBox3 = new wxCheckBox(panel, ID_LOAD_LAST_PROJECT, _("&Load last project on startup"), wxDefaultPosition, wxDefaultSize);\r
+    itemSizer3->Add(checkBox3, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
+    item0->Add(itemSizer3, 0, wxGROW|wxALL, 0);\r
+\r
+    //// AUTOSAVE\r
+\r
+    wxString autoSaveLabel = _("&Auto-save every");\r
+    wxString minsLabel = _("mins");\r
+\r
+    wxBoxSizer* itemSizer12 = new wxBoxSizer( wxHORIZONTAL );\r
+    wxCheckBox* checkBox12 = new wxCheckBox(panel, ID_AUTO_SAVE, autoSaveLabel, wxDefaultPosition, wxDefaultSize);\r
+\r
+    wxSpinCtrl* spinCtrl12 = new wxSpinCtrl(panel, ID_AUTO_SAVE_MINS, wxEmptyString,\r
+        wxDefaultPosition, wxSize(40, wxDefaultCoord), wxSP_ARROW_KEYS, 1, 60, 1);\r
+\r
+    itemSizer12->Add(checkBox12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
+    itemSizer12->Add(spinCtrl12, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
+    itemSizer12->Add(new wxStaticText(panel, wxID_STATIC, minsLabel), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
+    item0->Add(itemSizer12, 0, wxGROW|wxALL, 0);\r
+\r
+    //// TOOLTIPS\r
+\r
+    wxBoxSizer* itemSizer8 = new wxBoxSizer( wxHORIZONTAL );\r
+    wxCheckBox* checkBox6 = new wxCheckBox(panel, ID_SHOW_TOOLTIPS, _("Show &tooltips"), wxDefaultPosition, wxDefaultSize);\r
+    itemSizer8->Add(checkBox6, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
+    item0->Add(itemSizer8, 0, wxGROW|wxALL, 0);\r
+\r
+    topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );\r
+\r
+    panel->SetSizer(topSizer);\r
+    topSizer->Fit(panel);\r
+\r
+    return panel;\r
+}*/\r
+\r
+/*wxPanel* OPJDecoderDialog::CreateAestheticSettingsPage(wxWindow* parent)\r
+{\r
+    wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+\r
+    wxBoxSizer *topSizer = new wxBoxSizer( wxVERTICAL );\r
+    wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );\r
+\r
+    //// PROJECT OR GLOBAL\r
+    wxString globalOrProjectChoices[2];\r
+    globalOrProjectChoices[0] = _("&New projects");\r
+    globalOrProjectChoices[1] = _("&This project");\r
+\r
+    wxRadioBox* projectOrGlobal = new wxRadioBox(panel, ID_APPLY_SETTINGS_TO, _("&Apply settings to:"),\r
+        wxDefaultPosition, wxDefaultSize, 2, globalOrProjectChoices);\r
+    item0->Add(projectOrGlobal, 0, wxGROW|wxALL, 5);\r
+\r
+    projectOrGlobal->SetSelection(0);\r
+\r
+    //// BACKGROUND STYLE\r
+    wxArrayString backgroundStyleChoices;\r
+    backgroundStyleChoices.Add(wxT("Colour"));\r
+    backgroundStyleChoices.Add(wxT("Image"));\r
+    wxStaticBox* staticBox3 = new wxStaticBox(panel, wxID_ANY, _("Background style:"));\r
+\r
+    wxBoxSizer* styleSizer = new wxStaticBoxSizer( staticBox3, wxVERTICAL );\r
+    item0->Add(styleSizer, 0, wxGROW|wxALL, 5);\r
+\r
+    wxBoxSizer* itemSizer2 = new wxBoxSizer( wxHORIZONTAL );\r
+\r
+    wxChoice* choice2 = new wxChoice(panel, ID_BACKGROUND_STYLE, wxDefaultPosition, wxDefaultSize, backgroundStyleChoices);\r
+\r
+    itemSizer2->Add(new wxStaticText(panel, wxID_ANY, _("&Window:")), 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
+    itemSizer2->Add(5, 5, 1, wxALL, 0);\r
+    itemSizer2->Add(choice2, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+    styleSizer->Add(itemSizer2, 0, wxGROW|wxALL, 5);\r
+\r
+#if wxUSE_SPINCTRL\r
+    //// FONT SIZE SELECTION\r
+\r
+    wxStaticBox* staticBox1 = new wxStaticBox(panel, wxID_ANY, _("Tile font size:"));\r
+    wxBoxSizer* itemSizer5 = new wxStaticBoxSizer( staticBox1, wxHORIZONTAL );\r
+\r
+    wxSpinCtrl* spinCtrl = new wxSpinCtrl(panel, ID_FONT_SIZE, wxEmptyString, wxDefaultPosition,\r
+        wxSize(80, wxDefaultCoord));\r
+    itemSizer5->Add(spinCtrl, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+    item0->Add(itemSizer5, 0, wxGROW|wxLEFT|wxRIGHT, 5);\r
+#endif\r
+\r
+    topSizer->Add( item0, 1, wxGROW|wxALIGN_CENTRE|wxALL, 5 );\r
+    topSizer->AddSpacer(5);\r
+\r
+    panel->SetSizer(topSizer);\r
+    topSizer->Fit(panel);\r
+\r
+    return panel;\r
+}*/\r
+\r
+wxPanel* OPJDecoderDialog::CreateMainSettingsPage(wxWindow* parent)\r
+{\r
+    wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+\r
+       // top sizer\r
+    wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+       // add some space\r
+       //topSizer->AddSpacer(5);\r
+\r
+               // sub top sizer\r
+               wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+                       // resolutions settings, column\r
+                       wxStaticBox* resolutionBox = new wxStaticBox(panel, wxID_ANY, wxT("Resolutions"));\r
+                       wxBoxSizer* resolutionSizer = new wxStaticBoxSizer(resolutionBox, wxVERTICAL);\r
+\r
+                               // reduce factor sizer, row\r
+                               wxBoxSizer* reduceSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               reduceSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Reduce factor:")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+                               // add some horizontal space\r
+                               reduceSizer->Add(5, 5, 1, wxALL, 0);\r
+\r
+                               // add the value control\r
+                               reduceSizer->Add(\r
+                                       m_reduceCtrl = new wxSpinCtrl(panel, OPJDECO_REDUCEFACTOR,\r
+                                       wxString::Format(wxT("%d"), wxGetApp().m_reducefactor),\r
+                                                               wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
+                                                               wxSP_ARROW_KEYS,\r
+                                                               0, 10000, wxGetApp().m_reducefactor),\r
+                                       0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+                       resolutionSizer->Add(reduceSizer, 0, wxGROW | wxALL, 5);\r
+\r
+               subtopSizer->Add(resolutionSizer, 0, wxGROW | wxALL, 5);\r
+\r
+                       // quality layer settings, column\r
+                       wxStaticBox* layerBox = new wxStaticBox(panel, wxID_ANY, wxT("Layers"));\r
+                       wxBoxSizer* layerSizer = new wxStaticBoxSizer(layerBox, wxVERTICAL);\r
+\r
+                               // quality layers sizer, row\r
+                               wxBoxSizer* qualitySizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               qualitySizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Quality layers:")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+                               // add some horizontal space\r
+                               qualitySizer->Add(5, 5, 1, wxALL, 0);\r
+\r
+                               // add the value control\r
+                               qualitySizer->Add(\r
+                                       m_layerCtrl = new wxSpinCtrl(panel, OPJDECO_QUALITYLAYERS,\r
+                                                               wxString::Format(wxT("%d"), wxGetApp().m_qualitylayers),\r
+                                                               wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
+                                                               wxSP_ARROW_KEYS,\r
+                                                               0, 100000, wxGetApp().m_qualitylayers),\r
+                                       0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+                       layerSizer->Add(qualitySizer, 0, wxGROW | wxALL, 5);\r
+\r
+               subtopSizer->Add(layerSizer, 0, wxGROW | wxALL, 5);\r
+\r
+                       // component settings, column\r
+                       wxStaticBox* compoBox = new wxStaticBox(panel, wxID_ANY, wxT("Components"));\r
+                       wxBoxSizer* compoSizer = new wxStaticBoxSizer(compoBox, wxVERTICAL);\r
+\r
+                               // quality layers sizer, row\r
+                               wxBoxSizer* numcompsSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               numcompsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&No. of components:")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+                               // add some horizontal space\r
+                               numcompsSizer->Add(5, 5, 1, wxALL, 0);\r
+\r
+                               // add the value control\r
+                               numcompsSizer->Add(\r
+                                       m_numcompsCtrl = new wxSpinCtrl(panel, OPJDECO_NUMCOMPS,\r
+                                                               wxString::Format(wxT("%d"), wxGetApp().m_components),\r
+                                                               wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
+                                                               wxSP_ARROW_KEYS,\r
+                                                               0, 100000, wxGetApp().m_components),\r
+                                       0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+                       compoSizer->Add(numcompsSizer, 0, wxGROW | wxALL, 5);\r
+\r
+               subtopSizer->Add(compoSizer, 0, wxGROW | wxALL, 5);\r
+\r
+       topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
+\r
+       // assign top and fit it\r
+    panel->SetSizer(topSizer);\r
+    topSizer->Fit(panel);\r
+\r
+    return panel;\r
+}\r
+\r
+#ifdef USE_JPWL\r
+wxPanel* OPJDecoderDialog::CreateJPWLSettingsPage(wxWindow* parent)\r
+{\r
+    wxPanel* panel = new wxPanel(parent, wxID_ANY);\r
+\r
+       // top sizer\r
+    wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+       // add some space\r
+       //topSizer->AddSpacer(5);\r
+\r
+               // sub top sizer\r
+               wxBoxSizer *subtopSizer = new wxBoxSizer(wxVERTICAL);\r
+\r
+               // add JPWL enabling check box\r
+               subtopSizer->Add(\r
+                       m_enablejpwlCheck = new wxCheckBox(panel, OPJDECO_ENABLEJPWL, wxT("Enable JPWL"), wxDefaultPosition, wxDefaultSize),\r
+                       0, wxGROW | wxALL, 5);\r
+               m_enablejpwlCheck->SetValue(wxGetApp().m_enablejpwl);\r
+\r
+                       // component settings, column\r
+                       wxStaticBox* compoBox = new wxStaticBox(panel, wxID_ANY, wxT("Components"));\r
+                       wxBoxSizer* compoSizer = new wxStaticBoxSizer(compoBox, wxVERTICAL);\r
+\r
+                               // expected components sizer, row\r
+                               wxBoxSizer* expcompsSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               expcompsSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Expected comps.:")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+                               // add some horizontal space\r
+                               expcompsSizer->Add(5, 5, 1, wxALL, 0);\r
+\r
+                               // add the value control\r
+                               expcompsSizer->Add(\r
+                                       m_expcompsCtrl = new wxSpinCtrl(panel, OPJDECO_EXPCOMPS,\r
+                                                               wxString::Format(wxT("%d"), wxGetApp().m_expcomps),\r
+                                                               wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
+                                                               wxSP_ARROW_KEYS,\r
+                                                               1, 100000, wxGetApp().m_expcomps),\r
+                                       0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
+                               m_expcompsCtrl->Enable(wxGetApp().m_enablejpwl);\r
+\r
+                       compoSizer->Add(expcompsSizer, 0, wxGROW | wxALL, 5);\r
+\r
+               subtopSizer->Add(compoSizer, 0, wxGROW | wxALL, 5);\r
+\r
+                       // tiles settings, column\r
+                       wxStaticBox* tileBox = new wxStaticBox(panel, wxID_ANY, wxT("Tiles"));\r
+                       wxBoxSizer* tileSizer = new wxStaticBoxSizer(tileBox, wxVERTICAL);\r
+\r
+                               // maximum tiles sizer, row\r
+                               wxBoxSizer* maxtileSizer = new wxBoxSizer(wxHORIZONTAL);\r
+\r
+                               // add some text\r
+                               maxtileSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("&Max. no. of tiles:")),\r
+                                                               0, wxALL | wxALIGN_CENTER_VERTICAL, 5);\r
+\r
+                               // add some horizontal space\r
+                               maxtileSizer->Add(5, 5, 1, wxALL, 0);\r
+\r
+                               // add the value control\r
+                               maxtileSizer->Add(\r
+                                       m_maxtilesCtrl = new wxSpinCtrl(panel, OPJDECO_MAXTILES,\r
+                                                               wxString::Format(wxT("%d"), wxGetApp().m_maxtiles),\r
+                                                               wxDefaultPosition, wxSize(80, wxDefaultCoord),\r
+                                                               wxSP_ARROW_KEYS,\r
+                                                               1, 100000, wxGetApp().m_maxtiles),\r
+                                       0, wxALL | wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 5);\r
+                               m_maxtilesCtrl->Enable(wxGetApp().m_enablejpwl);\r
+\r
+                       tileSizer->Add(maxtileSizer, 0, wxGROW | wxALL, 5);\r
+\r
+               subtopSizer->Add(tileSizer, 0, wxGROW | wxALL, 5);\r
+\r
+       topSizer->Add(subtopSizer, 1, wxGROW | wxALIGN_CENTRE | wxALL, 5);\r
+\r
+       // assign top and fit it\r
+    panel->SetSizer(topSizer);\r
+    topSizer->Fit(panel);\r
+\r
+    return panel;\r
+}\r
+\r
+void OPJDecoderDialog::OnEnableJPWL(wxCommandEvent& event)\r
+{\r
+       if (event.IsChecked()) {\r
+               wxLogMessage(wxT("JPWL enabled"));\r
+               m_expcompsCtrl->Enable(true);\r
+               m_maxtilesCtrl->Enable(true);\r
+       } else {\r
+               wxLogMessage(wxT("JPWL disabled"));\r
+               m_expcompsCtrl->Enable(false);\r
+               m_maxtilesCtrl->Enable(false);\r
+       }\r
+\r
+}\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
+#endif // USE_JPWL\r
+\r
index f386ea8cc86bd01d58655483cf3672a439c263ce..7a7ea3288aead4706fc83481b9138a516e6a075e 100644 (file)
 // Copyright:   (c) Julian Smart\r
 // Licence:     wxWindows license\r
 /////////////////////////////////////////////////////////////////////////////\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Name:        dialogs.h\r
+// Purpose:     Common dialogs demo\r
+// Author:      Julian Smart\r
+// Modified by: ABX (2004) - adjustementd for conditional building\r
+// Created:     04/01/98\r
+// RCS-ID:      $Id: dialogs.h,v 1.50 2006/10/08 14:12:59 VZ Exp $\r
+// Copyright:   (c) Julian Smart\r
+// Licence:     wxWindows license\r
+/////////////////////////////////////////////////////////////////////////////\r
 \r
 #ifndef __OPJ_VIEWER_H__\r
 #define __OPJ_VIEWER_H__\r
 #include <wx/cmdline.h>\r
 #include <wx/file.h>\r
 #include "wx/notebook.h"\r
+#include <wx/numdlg.h>\r
+\r
+#include "wx/propdlg.h"\r
+#include "wx/spinctrl.h"\r
+\r
+#include <wx/dnd.h>\r
+#include "wx/wxhtml.h"\r
+#include "wx/statline.h"\r
 \r
 #include "libopenjpeg\openjpeg.h"\r
 \r
 #include "imagjp2.h"\r
 #include "imagmj2.h"\r
 \r
+#ifdef __WXMSW__\r
+typedef unsigned __int64 int8byte;\r
+#endif // __WXMSW__\r
+\r
+#ifdef __WXGTK__\r
+typedef unsigned long long int8byte;\r
+#endif // __WXGTK__\r
+\r
 #define USE_GENERIC_TREECTRL 0\r
 \r
 #if USE_GENERIC_TREECTRL\r
 #endif\r
 \r
 #define OPJ_APPLICATION_NAME           wxT("OpenJPEG Viewer")\r
-#define OPJ_APPLICATION_VERSION                wxT("0.1 alpha")\r
+#define OPJ_APPLICATION_VERSION                wxT("0.2 alpha")\r
 #define OPJ_APPLICATION_TITLEBAR       OPJ_APPLICATION_NAME wxT(" ") OPJ_APPLICATION_VERSION\r
 #define OPJ_APPLICATION_COPYRIGHT      wxT("(C) 2007, Giuseppe Baruffa")\r
 \r
@@ -140,6 +166,13 @@ class OPJViewerApp: public wxApp
                // the list of all filenames written in the command line\r
                wxArrayString m_filelist;\r
 \r
+               // decoding engine parameters\r
+               int m_reducefactor, m_qualitylayers, m_components;\r
+#ifdef USE_JPWL\r
+               bool m_enablejpwl;\r
+               int m_expcomps, m_maxtiles;\r
+#endif // USE_JPWL\r
+\r
        // private methods and variables\r
        private:\r
                bool m_showImages, m_showButtons;\r
@@ -163,9 +196,11 @@ class OPJCanvas: public wxScrolledWindow
                void OnEvent(wxMouseEvent& event);\r
                void WriteText(const wxString& text) { wxMutexGuiEnter(); wxLogMessage(text); wxMutexGuiLeave();}\r
                OPJDecoThread *CreateDecoThread(void);\r
+               OPJChildFrame *m_childframe;\r
 \r
-               wxBitmap  m_image;\r
+               wxBitmap  m_image, m_image100;\r
                wxFileName m_fname;\r
+               long m_zooml;\r
 \r
        DECLARE_EVENT_TABLE()\r
 };\r
@@ -223,7 +258,7 @@ public:
     void OnEndLabelEdit(wxTreeEvent& event);*/\r
     /*void OnDeleteItem(wxTreeEvent& event);*/\r
     /*void OnContextMenu(wxContextMenuEvent& event);*/\r
-    /*void OnItemMenu(wxTreeEvent& event);*/\r
+    void OnItemMenu(wxTreeEvent& event);\r
     /*void OnGetInfo(wxTreeEvent& event);\r
     void OnSetInfo(wxTreeEvent& event);*/\r
     /*void OnItemExpanded(wxTreeEvent& event);*/\r
@@ -304,10 +339,15 @@ class OPJFrame: public wxMDIParentFrame
     void OnAbout(wxCommandEvent& WXUNUSED(event));\r
     void OnFileOpen(wxCommandEvent& WXUNUSED(event));\r
     void OnQuit(wxCommandEvent& WXUNUSED(event));\r
+    void OnClose(wxCommandEvent& WXUNUSED(event));\r
+    void OnZoom(wxCommandEvent& WXUNUSED(event));\r
+       void OnFit(wxCommandEvent& WXUNUSED(event));\r
        void OnToggleWindow(wxCommandEvent& WXUNUSED(event));\r
+       void OnSetsDeco(wxCommandEvent& event);\r
        void OnSashDrag(wxSashEvent& event);\r
        void OpenFiles(wxArrayString paths, wxArrayString filenames);\r
        void OnNotebook(wxNotebookEvent& event);\r
+       void Rescale(int scale, OPJChildFrame *child);\r
 \r
        OPJMarkerTreeHash m_treehash;\r
        OPJChildFrameHash m_childhash;\r
@@ -345,25 +385,29 @@ class OPJChildFrame: public wxMDIChildFrame
        /*void OnQuit(wxCommandEvent& WXUNUSED(event));*/\r
        void OnClose(wxCloseEvent& event);\r
        void OnGotFocus(wxFocusEvent& event);\r
-       /*void OnLostFocus(wxFocusEvent& event);*/\r
+       void OnLostFocus(wxFocusEvent& event);\r
     OPJFrame *m_frame;\r
        wxFileName m_fname;\r
        int m_winnumber;\r
 \r
-DECLARE_EVENT_TABLE()\r
+       DECLARE_EVENT_TABLE()\r
 };\r
 \r
-#define SASHTEST_QUIT        wxID_EXIT\r
-#define SASHTEST_NEW_WINDOW  2\r
-#define SASHTEST_REFRESH     3\r
-#define SASHTEST_CHILD_QUIT  4\r
-#define SASHTEST_ABOUT       wxID_ABOUT\r
-#define SASHTEST_TOGGLE_WINDOW 6\r
+// frame and main menu ids\r
+enum {\r
+       OPJFRAME_FILEEXIT = wxID_EXIT,\r
+       OPJFRAME_HELPABOUT = wxID_ABOUT,\r
+       OPJFRAME_FILEOPEN,\r
+       OPJFRAME_FILETOGGLE,\r
+       OPJFRAME_VIEWZOOM,\r
+       OPJFRAME_VIEWFIT,\r
+       OPJFRAME_FILECLOSE,\r
+       OPJFRAME_SETSDECO,\r
+\r
+       OPJFRAME_BROWSEWIN = 10000,\r
+       OPJFRAME_LOGWIN\r
+};\r
 \r
-#define ID_WINDOW_TOP       100\r
-#define ID_WINDOW_LEFT1     101\r
-#define ID_WINDOW_LEFT2     102\r
-#define ID_WINDOW_BOTTOM    103\r
 \r
 // menu and control ids\r
 enum\r
@@ -466,4 +510,56 @@ private:
 \r
 };\r
 \r
+\r
+// Drag and drop files target\r
+class OPJDnDFile: public wxFileDropTarget\r
+{\r
+public:\r
+    OPJDnDFile(OPJFrame *pOwner) { m_pOwner = pOwner; }\r
+    virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames);\r
+\r
+private:\r
+    OPJFrame *m_pOwner;\r
+};\r
+\r
+\r
+\r
+// Property sheet dialog\r
+class OPJDecoderDialog: public wxPropertySheetDialog\r
+{\r
+DECLARE_CLASS(OPJDecoderDialog)\r
+public:\r
+    OPJDecoderDialog(wxWindow* parent, int dialogType);\r
+    ~OPJDecoderDialog();\r
+\r
+       wxSpinCtrl *m_reduceCtrl, *m_layerCtrl, *m_numcompsCtrl;\r
+\r
+    wxPanel* CreateMainSettingsPage(wxWindow* parent);\r
+#ifdef USE_JPWL\r
+       void OnEnableJPWL(wxCommandEvent& event);\r
+    wxPanel* CreateJPWLSettingsPage(wxWindow* parent);\r
+       wxSpinCtrl *m_expcompsCtrl, *m_maxtilesCtrl;\r
+       wxCheckBox *m_enablejpwlCheck;\r
+#endif // USE_JPWL\r
+\r
+\r
+protected:\r
+\r
+    enum {\r
+               OPJDECO_REDUCEFACTOR = 100,\r
+               OPJDECO_QUALITYLAYERS,\r
+               OPJDECO_NUMCOMPS,\r
+               OPJDECO_ENABLEJPWL,\r
+               OPJDECO_EXPCOMPS,\r
+               OPJDECO_MAXTILES\r
+    };\r
+\r
+    wxImageList*    m_imageList;\r
+\r
+DECLARE_EVENT_TABLE()\r
+};\r
+\r
 #endif //__OPJ_VIEWER_H__\r
+\r
+\r
+\r
index 56e5b6981c39631f74cc48f53b180004baa408de..fb5a5def077becba2bbb5a99f2722ad9002cd31f 100644 (file)
@@ -1,2 +1,3 @@
+OPJChild16 ICON OPJChild.ico\r
 OPJViewer16 ICON OPJViewer.ico\r
 #include "wx/msw/wx.rc"
\ No newline at end of file
index 16bcdd1631a0dbb0eaa1874f89234ad7f6fc7eac..2442aa4ee26b9cc6d15cc30d55d263679754de1b 100644 (file)
     #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
@@ -150,12 +146,18 @@ bool wxJ2KHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        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 = JPWL_EXPECTED_COMPONENTS;\r
-       parameters.jpwl_max_tiles = JPWL_MAXIMUM_TILES;\r
-       parameters.jpwl_correct = true;\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
@@ -183,7 +185,7 @@ bool wxJ2KHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        opjimage = opj_decode(dinfo, cio);\r
        if (!opjimage) {\r
                wxMutexGuiEnter();\r
-               wxLogError("J2K: failed to decode image!");\r
+               wxLogError(wxT("J2K: failed to decode image!"));\r
                wxMutexGuiLeave();\r
                opj_destroy_decompress(dinfo);\r
                opj_cio_close(cio);\r
@@ -198,7 +200,7 @@ bool wxJ2KHandler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        // check image components\r
        if ((opjimage->numcomps != 1) && (opjimage->numcomps != 3)) {\r
                wxMutexGuiEnter();\r
-               wxLogError("J2K: weird number of components");\r
+               wxLogError(wxT("J2K: weird number of components"));\r
                wxMutexGuiLeave();\r
                opj_destroy_decompress(dinfo);\r
                free(src);\r
index c98fdd2e2f9657eb0a2f91c1979fe92874876122..b262ec6bdec533adfcc13c4e7d50edecc0087358 100644 (file)
 #if wxUSE_LIBOPENJPEG\r
 \r
 #include "wx/image.h"\r
+#include "libopenjpeg/openjpeg.h"\r
 \r
 #define wxBITMAP_TYPE_J2K      47\r
 \r
+#define wxIMAGE_OPTION_REDUCEFACTOR  wxString(_T("reducefactor"))\r
+#define wxIMAGE_OPTION_QUALITYLAYERS  wxString(_T("qualitylayers"))\r
+#define wxIMAGE_OPTION_MAXCOMPS  wxString(_T("maxcomps"))\r
+#ifdef USE_JPWL\r
+#define wxIMAGE_OPTION_ENABLEJPWL  wxString(_T("enablejpwl"))\r
+#define wxIMAGE_OPTION_EXPCOMPS  wxString(_T("expcomps"))\r
+#define wxIMAGE_OPTION_MAXTILES  wxString(_T("maxtiles"))\r
+#endif // USE_JPWL\r
+\r
 class WXDLLEXPORT wxJ2KHandler: public wxImageHandler\r
 {\r
 public:\r
@@ -56,8 +66,24 @@ public:
         m_extension = wxT("j2k");\r
         m_type = wxBITMAP_TYPE_J2K;\r
         m_mime = wxT("image/j2k");\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;\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
index 99ef23c99526d19540c244e5531f71e73afb83dc..ce25bb1e796cbb60a11b24cae01185007ecb0ba2 100644 (file)
@@ -149,6 +149,19 @@ bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        strncpy(parameters.outfile, "", sizeof(parameters.outfile)-1);\r
        parameters.decod_format = JP2_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_JP2);\r
@@ -175,7 +188,7 @@ bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        opjimage = opj_decode(dinfo, cio);\r
        if (!opjimage) {\r
                wxMutexGuiEnter();\r
-               wxLogError("JP2: failed to decode image!");\r
+               wxLogError(wxT("JP2: failed to decode image!"));\r
                wxMutexGuiLeave();\r
                opj_destroy_decompress(dinfo);\r
                opj_cio_close(cio);\r
@@ -189,7 +202,7 @@ bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        // check image size\r
        if ((opjimage->numcomps != 1) && (opjimage->numcomps != 3)) {\r
                wxMutexGuiEnter();\r
-               wxLogError("JP2: weird number of components");\r
+               wxLogError(wxT("JP2: weird number of components"));\r
                wxMutexGuiLeave();\r
                opj_destroy_decompress(dinfo);\r
                free(src);\r
index 1ebad878c93662636e7b6a1326d5979a25515816..b30f111ae2c6f30d0a7fdcdda90eceb2491f9c88 100644 (file)
@@ -44,6 +44,7 @@
 #if wxUSE_LIBOPENJPEG\r
 \r
 #include "wx/image.h"\r
+#include "libopenjpeg/openjpeg.h"\r
 \r
 #define wxBITMAP_TYPE_JP2      48\r
 \r
@@ -56,8 +57,24 @@ public:
         m_extension = wxT("jp2");\r
         m_type = wxBITMAP_TYPE_JP2;\r
         m_mime = wxT("image/jp2");\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;\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
index 65c9ca73325bda32c0d35a240af28debe07e3227..2a4d2e58333dfa1964ee59f4ba074e6db0d9e399 100644 (file)
@@ -199,6 +199,7 @@ typedef enum {
 #define TKHD_SIGN           "tkhd"\r
 #define MDIA_SIGN           "mdia"\r
 #define MINF_SIGN           "minf"\r
+#define VMHD_SIGN           "vmhd"\r
 #define STBL_SIGN           "stbl"\r
 #define STSD_SIGN           "stsd"\r
 #define MJP2_SIGN           "mjp2"\r
@@ -503,14 +504,14 @@ searchfirstjp2c(wxInputStream& stream, unsigned long int fsize)
        char scansign[] = "jp2c";\r
        unsigned long int scanpoint = 0L;\r
 \r
-       wxLogMessage("MJ2: searching jp2c box... ");\r
+       wxLogMessage(wxT("MJ2: searching jp2c box... "));\r
 \r
        /* do the parsing */\r
        if (my_jpeg2000parse(stream, 0, fsize, 0, scansign, &scanpoint) < 0)            \r
-               wxLogMessage("MJ2: Unrecoverable error during file parsing: stopping");\r
+               wxLogMessage(wxT("MJ2: Unrecoverable error during file parsing: stopping"));\r
 \r
        if (strcmp(scansign, "    "))\r
-               wxLogMessage("MJ2: not found");\r
+               wxLogMessage(wxT("MJ2: not found"));\r
        else {\r
 \r
                wxLogMessage(wxString::Format("MJ2: found at byte %d", scanpoint));\r
@@ -528,16 +529,16 @@ searchjpegheaderbox(wxInputStream& stream, unsigned long int fsize)
        char scansign[] = "jp2h";\r
        unsigned long int scanpoint = 0L;\r
 \r
-       wxLogMessage("MJ2: searching jp2h box... ");\r
+       wxLogMessage(wxT("MJ2: searching jp2h box... "));\r
 \r
        /* do the parsing */\r
        if (my_jpeg2000parse(stream, 0, fsize, 0, scansign, &scanpoint) < 0)            \r
-               wxLogMessage("Unrecoverable error during file parsing: stopping");\r
+               wxLogMessage(wxT("Unrecoverable error during file parsing: stopping"));\r
 \r
        if (strcmp(scansign, "    "))\r
-               wxLogMessage("MJ2: not found");\r
+               wxLogMessage(wxT("MJ2: not found"));\r
        else\r
-               wxLogMessage(wxString::Format("MJ2: found at byte %d", scanpoint));\r
+               wxLogMessage(wxString::Format(wxT("MJ2: found at byte %d"), scanpoint));\r
 \r
        return (scanpoint);\r
 }\r
@@ -615,6 +616,19 @@ bool wxMJ2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        strncpy(parameters.outfile, "", sizeof(parameters.outfile)-1);\r
        parameters.decod_format = JP2_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_JP2);\r
@@ -664,7 +678,7 @@ bool wxMJ2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        opjimage = opj_decode(dinfo, cio);\r
        if (!opjimage) {\r
                wxMutexGuiEnter();\r
-               wxLogError("MJ2: failed to decode image!");\r
+               wxLogError(wxT("MJ2: failed to decode image!"));\r
                wxMutexGuiLeave();\r
                opj_destroy_decompress(dinfo);\r
                opj_cio_close(cio);\r
@@ -678,7 +692,7 @@ bool wxMJ2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose,
        // check image size\r
        if ((opjimage->numcomps != 1) && (opjimage->numcomps != 3)) {\r
                wxMutexGuiEnter();\r
-               wxLogError("MJ2: weird number of components");\r
+               wxLogError(wxT("MJ2: weird number of components"));\r
                wxMutexGuiLeave();\r
                opj_destroy_decompress(dinfo);\r
                free(src);\r
index 1c9667f8cb344601bc7ce88dac4c341e0726b1c5..e1737275ba27c9789cf45ad971e93972b229fa7a 100644 (file)
@@ -44,6 +44,7 @@
 #if wxUSE_LIBOPENJPEG\r
 \r
 #include "wx/image.h"\r
+#include "libopenjpeg/openjpeg.h"\r
 \r
 #define wxBITMAP_TYPE_MJ2      49\r
 \r
@@ -56,8 +57,24 @@ public:
         m_extension = wxT("mj2");\r
         m_type = wxBITMAP_TYPE_MJ2;\r
         m_mime = wxT("image/mj2");\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;\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
diff --git a/OPJViewer/source/license.txt b/OPJViewer/source/license.txt
new file mode 100644 (file)
index 0000000..2d0f584
--- /dev/null
@@ -0,0 +1,13 @@
+Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium\r
+Copyright (c) 2002-2007, Professor Benoit Macq\r
+Copyright (c) 2001-2003, David Janssens\r
+Copyright (c) 2002-2003, Yannick Verschueren\r
+Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe\r
+Copyright (c) 2005, Herve Drolon, FreeImage Team\r
+All rights reserved.\r
+\r
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditionsare met:\r
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\r
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\r
+\r
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/OPJViewer/source/readmeafter.txt b/OPJViewer/source/readmeafter.txt
new file mode 100644 (file)
index 0000000..deffff3
--- /dev/null
@@ -0,0 +1 @@
+Good choice!
\ No newline at end of file
diff --git a/OPJViewer/source/readmebefore.txt b/OPJViewer/source/readmebefore.txt
new file mode 100644 (file)
index 0000000..c5e1ed8
--- /dev/null
@@ -0,0 +1,11 @@
+What is OpenJPEG ?\r
+==================\r
+The OpenJPEG library is an open-source JPEG 2000 codec written in C language. It has been developed in order to promote the use of JPEG 2000, the new still-image compression standard from the Joint Photographic Experts Group (JPEG). In addition to the basic codec, various other features are under development, among them the JP2 and MJ2 (Motion JPEG 2000) file formats, an indexing tool useful for the JPIP protocol, JPWL-tools for error-resilience, a Java-viewer for j2k-images, ... \r
+\r
+Who can use the library ?\r
+=========================\r
+Anybody. As the OpenJPEG library is released under the BSD license, anybody can use or modify the library, even for commercial applications. The only restriction is to retain the copyright in the sources or the binaries documentation.\r
+\r
+Who is developing the library ?\r
+===============================\r
+The library is developed by the Communications and Remote Sensing Lab (TELE), in the Université Catholique de Louvain (UCL). The JPWL module is developped and maintained by the Digital Signal Processing Lab (DSPLab) of the University of Perugia, Italy (UNIPG). As our purpose is to make OpenJPEG really useful for those interested in the image compression field, any feedback/advices are obviously welcome ! We will do our best to handle them quickly. 
\ No newline at end of file
index 7e189d7b4609eb788b5e46494b35c9cfbaf16f6a..3028956755c6853fafb03621feafb990e62ede2c 100644 (file)
@@ -196,7 +196,7 @@ void OPJParseThread::ParseJ2KFile(wxFile *m_file, wxFileOffset offset, wxFileOff
 \r
                                // marker name\r
                                wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,\r
-                                       wxT("*** ") + wxString(marker_descr[m]) + wxT(" ***"),\r
+                                       wxT("*** ") + wxString::Format(wxT("%s"), marker_descr[m]) + wxT(" ***"),\r
                                        image, imageSel,\r
                                        new OPJMarkerData(wxT("INFO"))\r
                                        );\r
index 7d8f3447dc3cd6f285a0e65bdca7e1b623c7a300..c929418dea5ecda0b2b80e9d0aafb0d39c4a1aa5 100644 (file)
@@ -61,8 +61,10 @@ typedef enum {
                        TKHD_BOX,\r
                        MDIA_BOX,\r
                        MINF_BOX,\r
+                       VMHD_BOX,\r
                        STBL_BOX,\r
                        STSD_BOX,\r
+                       STSZ_BOX,\r
                        MJP2_BOX,\r
                        MDAT_BOX,\r
                        ANY_BOX,\r
@@ -377,15 +379,15 @@ int OPJParseThread::box_handler_function(int boxtype, wxFile *fileid, wxFileOffs
                                        new OPJMarkerData(wxT("INFO"))\r
                                        );\r
                        } else {\r
-                               unsigned __int64 creation_time, modification_time, duration;\r
+                               int8byte creation_time, modification_time, duration;\r
                                unsigned long int timescale;\r
-                               fileid->Read(&creation_time, sizeof(unsigned __int64));\r
+                               fileid->Read(&creation_time, sizeof(int8byte));\r
                                creation_time = BYTE_SWAP8(creation_time);\r
-                               fileid->Read(&modification_time, sizeof(unsigned __int64));\r
+                               fileid->Read(&modification_time, sizeof(int8byte));\r
                                modification_time = BYTE_SWAP8(modification_time);\r
                                fileid->Read(&timescale, sizeof(unsigned long int));\r
                                timescale = BYTE_SWAP4(timescale);\r
-                               fileid->Read(&duration, sizeof(unsigned __int64));\r
+                               fileid->Read(&duration, sizeof(int8byte));\r
                                duration = BYTE_SWAP8(duration);\r
                                wxTreeItemId currid = m_tree->AppendItem(parentid,\r
                                        wxString::Format(wxT("Creation time: %u"), creation_time),\r
@@ -454,6 +456,110 @@ int OPJParseThread::box_handler_function(int boxtype, wxFile *fileid, wxFileOffs
                break;\r
 \r
 \r
+                       /* Sample Size box */\r
+       case (STSZ_BOX): {\r
+\r
+                       unsigned long int version, sample_size, sample_count, entry_size;\r
+                       \r
+                       fileid->Read(&version, sizeof(unsigned long int));\r
+                       version = BYTE_SWAP4(version);\r
+                       \r
+                       fileid->Read(&sample_size, sizeof(unsigned long int));\r
+                       sample_size = BYTE_SWAP4(sample_size);\r
+\r
+                       if (sample_size == 0) {\r
+                               fileid->Read(&sample_count, sizeof(unsigned long int));\r
+                               sample_count = BYTE_SWAP4(sample_count);\r
+\r
+                               wxTreeItemId currid = m_tree->AppendItem(parentid,\r
+                                       wxString::Format(wxT("Sample count: %d"), sample_count),\r
+                                       m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
+                                       new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit)\r
+                                       );\r
+\r
+                               currid = m_tree->AppendItem(parentid,\r
+                                       wxT("Entries size (bytes)"),\r
+                                       m_tree->TreeCtrlIcon_Folder, m_tree->TreeCtrlIcon_Folder + 1,\r
+                                       new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit)\r
+                                       );\r
+\r
+                               wxString text;\r
+                               for (int s = 0; s < sample_count; s++) {\r
+                                       fileid->Read(&entry_size, sizeof(unsigned long int));\r
+                                       entry_size = BYTE_SWAP4(entry_size);\r
+                                       \r
+                                       text << wxString::Format(wxT("%d, "), entry_size);\r
+\r
+                                       if (((s % 10) == (ITEM_PER_ROW - 1)) || (s == (sample_count - 1))) {\r
+                                               m_tree->AppendItem(currid,\r
+                                                       text,\r
+                                                       m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
+                                                       new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit)\r
+                                                       );\r
+                                               text = wxT("");\r
+                                       }\r
+\r
+                               }\r
+                               \r
+                       }\r
+\r
+               };\r
+               break;\r
+\r
+\r
+                       /* Video Media Header box */\r
+       case (VMHD_BOX): {\r
+\r
+                       unsigned long int version;\r
+                       unsigned short int graphicsmode, opcolor[3];\r
+                       char graphicsdescr[100];\r
+\r
+                       fileid->Read(&version, sizeof(unsigned long int));\r
+                       version = BYTE_SWAP4(version);\r
+\r
+                       fileid->Read(&graphicsmode, sizeof(unsigned short int));\r
+                       graphicsmode = BYTE_SWAP2(graphicsmode);\r
+                       switch (graphicsmode) {\r
+                       case (0x00):\r
+                                       strcpy(graphicsdescr, "copy");\r
+                                       break;\r
+                       case (0x24):\r
+                                       strcpy(graphicsdescr, "transparent");\r
+                                       break;\r
+                       case (0x0100):\r
+                                       strcpy(graphicsdescr, "alpha");\r
+                                       break;\r
+                       case (0x0101):\r
+                                       strcpy(graphicsdescr, "whitealpha");\r
+                                       break;\r
+                       case (0x0102):\r
+                                       strcpy(graphicsdescr, "blackalpha");\r
+                                       break;\r
+                       default:\r
+                                       strcpy(graphicsdescr, "unknown");\r
+                                       break;\r
+                       };\r
+\r
+                       fileid->Read(opcolor, 3 * sizeof(unsigned short int));\r
+                       opcolor[0] = BYTE_SWAP2(opcolor[0]);\r
+                       opcolor[1] = BYTE_SWAP2(opcolor[1]);\r
+                       opcolor[2] = BYTE_SWAP2(opcolor[2]);\r
+\r
+                       wxTreeItemId currid = m_tree->AppendItem(parentid,\r
+                               wxString::Format(wxT("Composition mode: %d (%s)"), graphicsmode, graphicsdescr),\r
+                               m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
+                               new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit)\r
+                               );\r
+\r
+                       currid = m_tree->AppendItem(parentid,\r
+                               wxString::Format(wxT("OP color: %d %d %d"), opcolor[0], opcolor[1], opcolor[2]),\r
+                               m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
+                               new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit)\r
+                               );\r
+               };\r
+               break;\r
+\r
+\r
 \r
                        /* MJP2 Sample Description box */\r
        case (MJP2_BOX): {\r
@@ -500,8 +606,6 @@ int OPJParseThread::box_handler_function(int boxtype, wxFile *fileid, wxFileOffs
        default:\r
                break;\r
 \r
-\r
-\r
        };\r
 \r
        return (0);\r
@@ -525,8 +629,10 @@ int OPJParseThread::box_handler_function(int boxtype, wxFile *fileid, wxFileOffs
 #define TKHD_SIGN           "tkhd"\r
 #define MDIA_SIGN           "mdia"\r
 #define MINF_SIGN           "minf"\r
+#define VMHD_SIGN           "vmhd"\r
 #define STBL_SIGN           "stbl"\r
 #define STSD_SIGN           "stsd"\r
+#define STSZ_SIGN           "stsz"\r
 #define MJP2_SIGN           "mjp2"\r
 #define MDAT_SIGN           "mdat"\r
 #define ANY_SIGN                       ""\r
@@ -658,6 +764,13 @@ struct boxdef j2box[] =
 /* req */      {1, 1, 1},\r
 /* ins */      MDIA_BOX},\r
 \r
+/* sign */     {VMHD_SIGN,\r
+/* short */    "Video Media Header box",\r
+/* long */     "The video media header contains general presentation information, independent of the coding, for video media",\r
+/* sbox */     0,\r
+/* req */      {1, 1, 1},\r
+/* ins */      MINF_BOX},\r
+\r
 /* sign */     {STBL_SIGN,\r
 /* short */    "Sample Table box",\r
 /* long */     "The sample table contains all the time and data indexing of the media samples in a track",\r
@@ -666,13 +779,20 @@ struct boxdef j2box[] =
 /* ins */      MINF_BOX},\r
 \r
 /* sign */     {STSD_SIGN,\r
-/* short */    "Sample Description box",\r
+/* short */    "STSD Sample Description box",\r
 /* long */     "The sample description table gives detailed information about the coding type used, and any initialization "\r
                        "information needed for that coding",\r
 /* sbox */     0,\r
 /* req */      {1, 1, 1},\r
 /* ins */      MINF_BOX},\r
 \r
+/* sign */     {STSZ_SIGN,\r
+/* short */    "Sample Size box",\r
+/* long */     "This box contains the sample count and a table giving the size of each sample",\r
+/* sbox */     0,\r
+/* req */      {1, 1, 1},\r
+/* ins */      STBL_BOX},\r
+\r
 /* sign */     {MJP2_SIGN,\r
 /* short */    "MJP2 Sample Description box",\r
 /* long */     "The MJP2 sample description table gives detailed information about the coding type used, and any initialization "\r
@@ -727,7 +847,7 @@ int OPJParseThread::jpeg2000parse(wxFile *fileid, wxFileOffset filepoint, wxFile
        int                     LBox_read;\r
        char                    TBox[5] = "\0\0\0\0";\r
        int                     TBox_read;\r
-       __int64              XLBox = 0x0000000000000000;\r
+       int8byte                                XLBox = 0x0000000000000000;\r
        int                     XLBox_read;\r
        unsigned long int       box_length = 0;\r
        int                     last_box = 0, box_num = 0;\r