! : changed
+ : added
+March 30, 2007
+* [GB] OPJViewer should now work under Linux, at least with not big j2k files. Tested under Suse 10.1 64 bit.
+
March 29, 2007
* [Parvatha] Enable accepting file names with `-´ symbol .Modification getopt.c
* [Parvatha] Rsiz profile name generation to be STD_RSIZ for profiles which are not DCI compliant.Modification in image_to_j2k.c
--- /dev/null
+# Makefile for the main JPWL OpenJPEG codecs: JPWL_ j2k_to_image and JPWL_image_to_j2k
+
+# General configuration variables:
+CC = $(shell wx-config-2.8 --cxx)
+AR = ar
+
+CFLAGS = -DUSE_JPWL -DwxUSE_LIBOPENJPEG -DwxUSE_GUI=1 -DOPJ_STATIC -DOPJ_HTMLABOUT $(shell wx-config-2.8 --cxxflags) # -g -p -pg -DUSE_JPWL
+
+OPJV_SRCS = source/imagj2k.cpp source/imagmj2.cpp source/wxj2kparser.cpp source/imagjp2.cpp source/OPJViewer.cpp source/wxjp2parser.cpp
+
+MODULES = $(OPJV_SRCS:.cpp=.o)
+
+all: opjviewer lib
+
+.cpp.o:
+ $(CC) $(CFLAGS) -c $< -o $@
+
+lib:
+ cd ../jpwl; make
+
+opjviewer: $(OPJV_SRCS) lib
+ $(CC) $(CFLAGS) -I .. $(OPJV_SRCS) -o OPJViewer -L ../jpwl -lopenjpeg_JPWL -lm -lstdc++ -ltiff $(shell wx-config-2.8 --libs)
+
+
+clean:
+ rm -f OPJViewer *.o *.a
+ cd ../libopenjpeg; rm -f *.o
+
+
+
+
+#.cpp.o :
+# $(CXX) -g -c `wx-config-2.8 --cxxflags` -I ../.. -D wxUSE_LIBOPENJPEG -D wxHACK_BOOLEAN -o $@ $<
+
+#all: $(PROGRAM)
+
+#$(PROGRAM): $(OBJECTS)
+# $(CXX) -o $(PROGRAM) $(OBJECTS) -lopenjpeg -L ../.. `wx-config-2.8 --libs`
+
+#clean:
+# rm -f *.o $(PROGRAM)
/*\r
- * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy\r
+ * Copyright (c) 2007, Digital Signal Processing Laboratory, Università degli studi di Perugia (UPG), Italy\r
* All rights reserved.\r
*\r
* Redistribution and use in source and binary forms, with or without\r
// create the text control of the logger\r
m_textCtrl = new wxTextCtrl(m_bookCtrlbottom, wxID_ANY, wxT(""),\r
wxDefaultPosition, wxDefaultSize,\r
- wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY \r
+ wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY\r
);\r
m_textCtrl->SetValue(_T("Logging window\n"));\r
\r
// 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 | wxTE_RICH \r
+ wxTE_MULTILINE | wxSUNKEN_BORDER | wxTE_READONLY | wxTE_RICH\r
);\r
wxFont *browsefont = new wxFont(wxNORMAL_FONT->GetPointSize(),\r
wxFONTFAMILY_TELETYPE, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);\r
\r
m_bookCtrl->GetPageText(sel).ToLong(&childnum);\r
\r
- m_childhash[childnum]->Activate();\r
+ if (m_childhash[childnum])\r
+ m_childhash[childnum]->Activate();\r
\r
//wxLogMessage(wxT("Selection changed (now %d --> %d)"), childnum, m_childhash[childnum]->m_winnumber);\r
\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
+#endif // USE_JPWL\r
+\r
+ };\r
}\r
\r
void OPJFrame::OnQuit(wxCommandEvent& WXUNUSED(event))\r
\r
m_fname = fname;\r
m_childframe = (OPJChildFrame *) parent;\r
+ // 100% zoom\r
+ m_zooml = 100;\r
\r
OPJDecoThread *dthread = CreateDecoThread();\r
\r
wxLogMessage(wxT("New deco thread started."));\r
\r
// 100% zoom\r
- m_zooml = 100;\r
+ //m_zooml = 100;\r
+\r
}\r
\r
OPJDecoThread *OPJCanvas::CreateDecoThread(void)\r
else\r
//m_tree->SetItemText(rootid, wxString::Format(wxT("%s (%d B)"), fname.GetFullName(), m_file.Length()));\r
m_tree->SetItemText(rootid, fname.GetFullName());\r
- \r
+\r
// close the file\r
m_file.Close();\r
\r
fp->Seek(data->m_start, wxFromStart);\r
\r
// read a bunch\r
- int max_read = wxMin(WXSIZEOF(buffer), data->m_length - data->m_start + 1);\r
+ int max_read = wxMin(wxFileOffset(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
// before doing any GUI calls we must ensure that this thread is the only\r
// one doing it!\r
\r
+#ifndef __WXGTK__ \r
wxMutexGuiEnter();\r
+#endif // __WXGTK__\r
\r
msg << text;\r
m_canvas->WriteText(msg);\r
\r
+#ifndef __WXGTK__ \r
wxMutexGuiLeave();\r
+#endif // __WXGTK__\r
}\r
\r
void OPJDecoThread::OnExit()\r
wxString text;\r
\r
srand(GetId());\r
- int m_countnum = rand() % 9;\r
+ //int m_countnum = rand() % 9;\r
//text.Printf(wxT("Deco thread 0x%lx started (priority = %u, time = %d)."),\r
// GetId(), GetPriority(), m_countnum);\r
text.Printf(wxT("Deco thread %d started"), m_canvas->m_childframe->m_winnumber);\r
+\r
+\r
+\r
+\r
WriteText(text);\r
\r
wxBitmap bitmap(100, 100);\r
- wxImage image = bitmap.ConvertToImage();\r
+ wxImage image(100, 100, true); //= bitmap.ConvertToImage();\r
image.Destroy();\r
\r
WriteText(m_canvas->m_fname.GetFullPath());\r
\r
+\r
// set handler properties\r
wxJ2KHandler *j2kkkhandler = (wxJ2KHandler *) wxImage::FindHandler( wxBITMAP_TYPE_J2K);\r
j2kkkhandler->m_reducefactor = wxGetApp().m_reducefactor;\r
zooml = wxMin(100, wxMin(wzooml, hzooml));\r
\r
// fit to width\r
+#ifndef __WXGTK__\r
m_canvas->m_childframe->m_frame->Rescale(zooml, m_canvas->m_childframe);\r
+#endif // __WXGTK__\r
\r
//m_canvas->m_image = m_canvas->m_image100;\r
//m_canvas->Refresh();\r
//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
-\r
return NULL;\r
+\r
}\r
\r
/////////////////////////////////////////////////////////////////////\r
// before doing any GUI calls we must ensure that this thread is the only\r
// one doing it!\r
\r
+#ifndef __WXGTK__ \r
wxMutexGuiEnter();\r
+#endif // __WXGTK\r
\r
msg << text;\r
m_tree->WriteText(msg);\r
\r
+#ifndef __WXGTK__ \r
wxMutexGuiLeave();\r
+#endif // __WXGTK\r
}\r
\r
void OPJParseThread::OnExit()\r
void *OPJParseThread::Entry()\r
{\r
\r
+ printf("Entering\n\n");\r
+\r
wxString text;\r
\r
srand(GetId());\r
text.Printf(wxT("Parse thread 0x%lx started (priority = %u, time = %d)."),\r
GetId(), GetPriority(), m_countnum);\r
WriteText(text);\r
- // wxLogMessage(text); -- test wxLog thread safeness\r
+ LoadFile(m_tree->m_fname);\r
+ text.Printf(wxT("Parse thread 0x%lx finished."), GetId());\r
+ WriteText(text);\r
+\r
+\r
+ //wxLogMessage(wxT("Entering\n")); //test wxLog thread safeness\r
\r
//wxBusyCursor wait;\r
//wxBusyInfo wait(wxT("Decoding image ..."));\r
wxThread::Sleep(10);\r
}*/\r
\r
-\r
- LoadFile(m_tree->m_fname);\r
-\r
- text.Printf(wxT("Parse thread 0x%lx finished."), GetId());\r
- WriteText(text);\r
// wxLogMessage(text); -- test wxLog thread safeness\r
\r
+ printf("Exiting\n\n");\r
+\r
return NULL;\r
}\r
\r
\r
virtual void OnDraw(wxDC& dc);\r
void OnEvent(wxMouseEvent& event);\r
- void WriteText(const wxString& text) { wxMutexGuiEnter(); wxLogMessage(text); wxMutexGuiLeave();}\r
+ void WriteText(const wxString& text) {\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiEnter();\r
+#endif //__WXGTK__\r
+ wxLogMessage(text);\r
+#ifndef __WXGTK__ \r
+ wxMutexGuiLeave();\r
+#endif //__WXGTK__\r
+ }\r
OPJDecoThread *CreateDecoThread(void);\r
OPJChildFrame *m_childframe;\r
\r
int message_len = strlen(msg) - 1;\r
if (msg[message_len] != '\n')\r
message_len = MAX_MESSAGE_LEN;\r
- wxMutexGuiEnter();\r
+ /*wxMutexGuiEnter();\r
wxLogMessage(wxT("[ERROR] %.*s"), message_len, msg);\r
- wxMutexGuiLeave();\r
+ wxMutexGuiLeave();*/\r
}\r
/* sample warning callback expecting a FILE* client object */\r
void j2k_warning_callback(const char *msg, void *client_data) {\r
int message_len = strlen(msg) - 1;\r
if (msg[message_len] != '\n')\r
message_len = MAX_MESSAGE_LEN;\r
- wxMutexGuiEnter();\r
+ /*wxMutexGuiEnter();\r
wxLogMessage(wxT("[WARNING] %.*s"), message_len, msg);\r
- wxMutexGuiLeave();\r
+ wxMutexGuiLeave();*/\r
}\r
/* sample debug callback expecting no client object */\r
void j2k_info_callback(const char *msg, void *client_data) {\r
int message_len = strlen(msg) - 1;\r
if (msg[message_len] != '\n')\r
message_len = MAX_MESSAGE_LEN;\r
- wxMutexGuiEnter();\r
+ /*wxMutexGuiEnter();\r
wxLogMessage(wxT("[INFO] %.*s"), message_len, msg);\r
- wxMutexGuiLeave();\r
+ wxMutexGuiLeave();*/\r
}\r
\r
// load the j2k codestream\r
opj_dinfo_t* dinfo = NULL; \r
opj_cio_t *cio = NULL;\r
\r
+\r
/* configure the event callbacks (not required) */\r
memset(&event_mgr, 0, sizeof(opj_event_mgr_t));\r
event_mgr.error_handler = j2k_error_callback;\r
wxMutexGuiLeave();\r
}\r
\r
+\r
// load the jp2 file format\r
bool wxJP2Handler::LoadFile(wxImage *image, wxInputStream& stream, bool verbose, int index)\r
{\r
\r
// append the marker\r
wxTreeItemId currid = m_tree->AppendItem(parentid,\r
- wxString::Format(wxT("%03d: %s (0x%04X)"), nmarks, marker_name[m], marker_val[m]),\r
+ wxString::Format(wxT("%03d: "), nmarks) +\r
+ wxString::FromAscii(marker_name[m]) + \r
+ wxString::Format(wxT(" (0x%04X)"), marker_val[m]),\r
image, imageSel,\r
new OPJMarkerData(wxT("MARK"), m_tree->m_fname.GetFullPath(), offset, offset + currlen + 1)\r
);\r
\r
// marker name\r
wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,\r
- wxT("*** ") + wxString::Format(wxT("%s"), marker_descr[m]) + wxT(" ***"),\r
+ wxT("*** ") + wxString::FromAscii(marker_descr[m]) + wxT(" ***"),\r
image, imageSel,\r
new OPJMarkerData(wxT("INFO"))\r
);\r
case SIZ_VAL:\r
{\r
int c;\r
-\r
+ \r
if (m_file->Read(twobytes, 2) != 2)\r
break;\r
unsigned short int rsiz = STREAM_TO_UINT16(twobytes, 0);\r
case COM_VAL:\r
{\r
#define showlen 25\r
- unsigned char comment[showlen];\r
+ char comment[showlen];\r
+ wxString comments;\r
\r
if (m_file->Read(twobytes, 2) != 2)\r
break;\r
\r
if (m_file->Read(comment, showlen) != showlen)\r
break;\r
+ comments = wxString::FromAscii(comment).Truncate(wxMin(showlen, currlen - 4));\r
+ if ((currlen - 4) > showlen)\r
+ comments << wxT("...");\r
subcurrid3 = m_tree->AppendItem(currid,\r
- wxString::Format(wxT("%.*s%s"), wxMin(showlen, currlen - 4), comment,\r
- (((currlen - 4) > showlen) ? "..." : "")),\r
+ comments,\r
image, imageSel,\r
new OPJMarkerData(wxT("INFO"))\r
);\r
\r
// add info\r
wxTreeItemId currid = m_tree->AppendItem(parentid,\r
- wxString::Format(wxT("Brand/Minor version: %.4s/%d"), BR, MinV),\r
+ wxT("Brand/Minor version: ") +\r
+ wxString::FromAscii(BR).Truncate(4) +\r
+ wxString::Format(wxT("/%d"), MinV),\r
m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
new OPJMarkerData(wxT("INFO"))\r
);\r
for (i = 0; i < numCL; i++) {\r
fileid->Read(CL, sizeof(char) * 4);\r
m_tree->AppendItem(currid,\r
- wxString::Format(wxT("%.4s"), CL),\r
+ wxString::FromAscii(CL).Truncate(4),\r
m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
new OPJMarkerData(wxT("INFO"))\r
);\r
\r
// add info\r
wxTreeItemId currid = m_tree->AppendItem(parentid,\r
- wxString::Format(wxT("Specification method: %d (%s)"), METH, methdescr),\r
+ wxString::Format(wxT("Specification method: %d ("), METH) +\r
+ wxString::FromAscii(methdescr) +\r
+ wxT(")"),\r
m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
new OPJMarkerData(wxT("INFO"))\r
);\r
\r
if (METH != 2)\r
currid = m_tree->AppendItem(parentid,\r
- wxString::Format(wxT("Enumerated colourspace: %d (%s)"), EnumCS, enumcsdescr),\r
+ wxString::Format(wxT("Enumerated colourspace: %d ("), EnumCS) +\r
+ wxString::FromAscii(enumcsdescr) +\r
+ wxT(")"),\r
m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
new OPJMarkerData(wxT("INFO"))\r
);\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
+ wxString::Format(wxT("Composition mode: %d (")) + \r
+ wxString::FromAscii(graphicsdescr) +\r
+ wxT(")"),\r
m_tree->TreeCtrlIcon_File, m_tree->TreeCtrlIcon_File + 1,\r
new OPJMarkerData(wxT("INFO"), m_tree->m_fname.GetFullPath(), filepoint, filelimit)\r
);\r
image = m_tree->TreeCtrlIcon_Folder;\r
imageSel = image + 1;\r
wxTreeItemId currid = m_tree->AppendItem(parentid,\r
- wxString::Format(wxT("%03d: %s (0x%04X)"), box_num, TBox,\r
+ wxString::Format(wxT("%03d: "), box_num) +\r
+ wxString::FromAscii(TBox) +\r
+ wxString::Format(wxT(" (0x%04X)"),\r
((unsigned long int) TBox[3]) + ((unsigned long int) TBox[2] << 8) +\r
((unsigned long int) TBox[1] << 16) + ((unsigned long int) TBox[0] << 24)\r
),\r
\r
// box name\r
wxTreeItemId subcurrid1 = m_tree->AppendItem(currid,\r
- wxT("*** ") + wxString::Format(wxT("%s"), j22box[box_type].name) + wxT(" ***"),\r
+ wxT("*** ") + wxString::FromAscii(j22box[box_type].name) + wxT(" ***"),\r
image, imageSel,\r
new OPJMarkerData(wxT("INFO"))\r
);\r