diff --git a/applications/jpip/CHANGES b/applications/jpip/CHANGES
index 8744dcf8..a3a92ce9 100644
--- a/applications/jpip/CHANGES
+++ b/applications/jpip/CHANGES
@@ -6,6 +6,8 @@ What's New for OpenJPIP
+ : added
May 10, 2011
+! [kaori] opj_viewer removed the xml functions (for users without Xersus2)
++ [kaori] renamed opj_viewer to opj_viewer_xerces ( needs Xersus2)
! [kaori] Modification of opj_dec_server to be portable to windows
May 9, 2011
diff --git a/applications/jpip/opj_client/opj_viewer/build.xml b/applications/jpip/opj_client/opj_viewer/build.xml
new file mode 100644
index 00000000..0608132a
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/build.xml
@@ -0,0 +1,35 @@
+
+ OpenJPIP client image viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/applications/jpip/opj_client/opj_viewer/dist/manifest.txt b/applications/jpip/opj_client/opj_viewer/dist/manifest.txt
new file mode 100644
index 00000000..537c33dd
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/dist/manifest.txt
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.7.0
+Created-By: Kaori Hagihara
+Main-Class: ImageWindow
diff --git a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110510.jar b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110510.jar
new file mode 100644
index 00000000..a4ac470a
Binary files /dev/null and b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer-20110510.jar differ
diff --git a/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar
new file mode 120000
index 00000000..3f6bf194
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/dist/opj_viewer.jar
@@ -0,0 +1 @@
+opj_viewer-20110510.jar
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer/src/ImageManager.java b/applications/jpip/opj_client/opj_viewer/src/ImageManager.java
new file mode 100644
index 00000000..f3d01bef
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/src/ImageManager.java
@@ -0,0 +1,99 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.awt.Image;
+
+public class ImageManager extends JPIPHttpClient
+{
+ private PnmImage pnmimage;
+
+ public ImageManager( String uri)
+ {
+ super( uri);
+ pnmimage = null;
+ }
+
+ public int getOrigWidth(){ return pnmimage.width;}
+ public int getOrigHeight(){ return pnmimage.height;}
+
+ public Image getImage( String j2kfilename, int reqfw, int reqfh)
+ {
+ System.err.println();
+
+ String refcid = ImgdecClient.query_cid( j2kfilename);
+ byte[] jptstream;
+
+ if( refcid == null)
+ jptstream = super.requestViewWindow( j2kfilename, reqfw, reqfh, true);
+ else
+ jptstream = super.requestViewWindow( reqfw, reqfh, refcid, true);
+
+ System.err.println( "decoding to PNM image");
+ pnmimage = ImgdecClient.decode_jptstream( jptstream, j2kfilename, cid, fw, fh);
+ System.err.println( " done");
+
+ // System.out.println( "fw: " + fw + " fh: " + fh + "pnm w: ");
+
+ return pnmimage.createROIImage( rx, ry, rw, rh);
+ }
+
+ public Image getImage( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh)
+ {
+ System.err.println();
+
+ byte[] jptstream = super.requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh);
+
+ System.err.println( "decoding to PNM image");
+ pnmimage = ImgdecClient.decode_jptstream( jptstream, cid, fw, fh);
+ System.err.println( " done");
+
+ return pnmimage.createROIImage( rx, ry, rw, rh);
+ }
+
+ public byte[] getXML()
+ {
+ System.err.println();
+
+ byte []xmldata = null;
+ byte[] jptstream = super.requestXML();
+
+ if( jptstream != null){
+ ImgdecClient.send_JPTstream( jptstream);
+
+ xmldata = ImgdecClient.get_XMLstream( cid);
+ }
+ return xmldata;
+ }
+ public void closeChannel()
+ {
+ ImgdecClient.destroy_cid( cid);
+ super.closeChannel();
+ }
+}
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer/src/ImageViewer.java b/applications/jpip/opj_client/opj_viewer/src/ImageViewer.java
new file mode 100644
index 00000000..fe6f7eb4
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/src/ImageViewer.java
@@ -0,0 +1,267 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import java.awt.image.*;
+import java.awt.geom.*;
+import java.net.URL;
+import javax.swing.border.*;
+import java.util.*;
+import java.io.*;
+
+public class ImageViewer extends JPanel
+{
+ private MML myMML;
+ private ResizeListener myRL;
+ private ImageManager imgmanager;
+ private int vw, vh;
+ private int iw, ih;
+ private int selected = 0;
+ private Image img;
+
+ private String cmdline = new String();
+ private boolean fullRefresh = false;
+ private Point offset = new Point(0,0);
+ private Rectangle rect = new Rectangle();
+ private Rectangle roirect[] = null;
+ private String roiname[] = null;
+
+ public ImageViewer( String j2kfilename, ImageManager manager)
+ {
+ String str;
+
+ this.setSize( 200, 200);
+ Dimension asz = this.getSize();
+
+ vw = asz.width;
+ vh = asz.height;
+
+ setBackground(Color.black);
+ myMML = new MML(this);
+ myRL = new ResizeListener(this);
+
+ imgmanager = manager;
+ img = imgmanager.getImage( j2kfilename, vw, vh);
+
+ addMouseListener(myMML);
+ addMouseMotionListener(myMML);
+ addComponentListener(myRL);
+ }
+
+ public Image getImage()
+ {
+ return img;
+ }
+
+ public void zoomIn()
+ {
+ roirect = null;
+ roiname = null;
+
+ double scalex = vw/(double)rect.width;
+ double scaley = vh/(double)rect.height;
+
+ int fw = (int)(imgmanager.getFw()*scalex);
+ int fh = (int)(imgmanager.getFh()*scaley);
+ int rx = (int)((imgmanager.getRx()+rect.x)*scalex);
+ int ry = (int)((imgmanager.getRy()+rect.y)*scaley);
+
+ img = imgmanager.getImage( fw, fh, rx, ry, vw, vh);
+
+ rect.x = rect.y = rect.width = rect.height = 0;
+
+ selected = 0;
+ fullRefresh = true;
+ repaint();
+ }
+
+ public void enlarge()
+ {
+ roirect = null;
+ roiname = null;
+
+ Dimension asz = this.getSize();
+
+ vw = asz.width;
+ vh = asz.height;
+
+ double scalex = vw/(double)imgmanager.getRw();
+ double scaley = vh/(double)imgmanager.getRh();
+
+ int fw = (int)(imgmanager.getFw()*scalex);
+ int fh = (int)(imgmanager.getFh()*scaley);
+ int rx = (int)(imgmanager.getRx()*scalex);
+ int ry = (int)(imgmanager.getRy()*scaley);
+
+ img = imgmanager.getImage( fw, fh, rx, ry, vw, vh);
+
+ fullRefresh = true;
+ repaint();
+ }
+
+ public void setSelected(int state)
+ {
+ roirect = null;
+ roiname = null;
+
+ if (state != selected) {
+
+ selected = state;
+ repaint();
+ }
+ }
+
+ public boolean isInsideRect(int x, int y)
+ {
+ return rect.contains(x - offset.x, y - offset.y);
+ }
+
+ public void setRGeom(int x1, int y1, int x2, int y2)
+ {
+ rect.x = Math.min(x1,x2) - offset.x;
+ rect.y = Math.min(y1,y2) - offset.y;
+ rect.width = Math.abs(x2-x1);
+ rect.height = Math.abs(y2-y1);
+ }
+
+ // public void annotate( JP2XMLparser.ROIparams roi[])
+ // {
+ // int numofroi = roi.length;
+
+ // roirect = new Rectangle [numofroi];
+ // roiname = new String [numofroi];
+
+ // double scale_x = imgmanager.getFw()/(double)imgmanager.getOrigWidth();
+ // double scale_y = imgmanager.getFh()/(double)imgmanager.getOrigHeight();
+ // int rx = imgmanager.getRx();
+ // int ry = imgmanager.getRy();
+ // int rw = imgmanager.getRw();
+ // int rh = imgmanager.getRh();
+
+ // for( int i=0; i 0) && (rect.height > 0))
+ big.draw(rect);
+
+ if( roirect != null){
+ for( int i=0; i 0){
+ uri = s[0];
+ j2kfilename = s[1];
+ }
+ else{
+ System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2");
+ return;
+ }
+ ImageWindow frame = new ImageWindow( uri, j2kfilename);
+
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ //Display the window.
+ frame.pack();
+ frame.setSize(new Dimension(400,200));
+ frame.setLocation( 0, 50);
+ frame.setVisible(true);
+ }
+}
diff --git a/applications/jpip/opj_client/opj_viewer/src/ImgdecClient.java b/applications/jpip/opj_client/opj_viewer/src/ImgdecClient.java
new file mode 100644
index 00000000..80e8f8ba
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/src/ImgdecClient.java
@@ -0,0 +1,268 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.io.*;
+import java.net.*;
+
+public class ImgdecClient{
+
+ public static PnmImage decode_jptstream( byte[] jptstream, String cid, int fw, int fh)
+ {
+ if( jptstream != null)
+ send_JPTstream( jptstream);
+ return get_PNMstream( cid, fw, fh);
+ }
+
+ public static PnmImage decode_jptstream( byte[] jptstream, String j2kfilename, String cid, int fw, int fh)
+ {
+ send_JPTstream( jptstream, j2kfilename, cid);
+ return get_PNMstream( cid, fw, fh);
+ }
+
+ public static void send_JPTstream( byte[] jptstream)
+ {
+ try{
+ Socket imgdecSocket = new Socket( "localhost", 5000);
+ DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
+ DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
+
+ System.err.println("Sending " + jptstream.length + "Data Bytes to decodingServer");
+
+ os.writeBytes("JPT-stream\n");
+ os.writeBytes("version 1.0\n");
+ os.writeBytes( jptstream.length + "\n");
+ os.write( jptstream, 0, jptstream.length);
+
+ byte signal = is.readByte();
+
+ if( signal == 0)
+ System.err.println(" failed");
+ } catch (UnknownHostException e) {
+ System.err.println("Trying to connect to unknown host: " + e);
+ } catch (IOException e) {
+ System.err.println("IOException: " + e);
+ }
+ }
+
+ public static void send_JPTstream( byte[] jptstream, String j2kfilename, String cid)
+ {
+ try{
+ Socket imgdecSocket = new Socket( "localhost", 5000);
+ DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
+ DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
+ int length = 0;
+
+ if( jptstream != null)
+ length = jptstream.length;
+
+ System.err.println("Sending " + length + "Data Bytes to decodingServer");
+
+ os.writeBytes("JPT-stream\n");
+ os.writeBytes("version 1.0\n");
+ os.writeBytes( j2kfilename + "\n");
+ os.writeBytes( cid + "\n");
+ os.writeBytes( length + "\n");
+ os.write( jptstream, 0, length);
+
+ byte signal = is.readByte();
+
+ if( signal == 0)
+ System.err.println(" failed");
+ } catch (UnknownHostException e) {
+ System.err.println("Trying to connect to unknown host: " + e);
+ } catch (IOException e) {
+ System.err.println("IOException: " + e);
+ }
+ }
+
+ public static PnmImage get_PNMstream( String cid, int fw, int fh)
+ {
+ PnmImage pnmstream = new PnmImage();
+ try {
+ Socket imgdecSocket = new Socket( "localhost", 5000);
+ DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
+ DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
+ byte []header = new byte[7];
+
+ os.writeBytes("PNM request\n");
+ os.writeBytes( cid + "\n");
+ os.writeBytes( fw + "\n");
+ os.writeBytes( fh + "\n");
+
+ read_stream( is, header, 7);
+
+ if( header[0] == 80){
+ // P5: gray, P6: color
+ byte magicknum = header[1];
+ if( magicknum == 5 || magicknum == 6){
+ int length;
+ boolean iscolor = magicknum==6 ? true:false;
+ if( iscolor)
+ pnmstream.channel = 3;
+ else
+ pnmstream.channel = 1;
+ pnmstream.width = (header[2]&0xff)<<8 | (header[3]&0xff);
+ pnmstream.height = (header[4]&0xff)<<8 | (header[5]&0xff);
+ int maxval = header[6]&0xff;
+
+ if( maxval == 255){
+ length = pnmstream.width*pnmstream.height*pnmstream.channel;
+ pnmstream.data = new byte [ length];
+ read_stream( is, pnmstream.data, length);
+ }
+ else
+ System.err.println("Error in get_PNMstream(), only 255 is accepted");
+ }
+ else
+ System.err.println("Error in get_PNMstream(), wrong magick number" + header[1]);
+ }
+ else
+ System.err.println("Error in get_PNMstream(), Not starting with P");
+ os.close();
+ is.close();
+ imgdecSocket.close();
+ } catch (UnknownHostException e) {
+ System.err.println("Trying to connect to unknown host: " + e);
+ } catch (IOException e) {
+ System.err.println("IOException: " + e);
+ }
+ return pnmstream;
+ }
+
+ public static byte [] get_XMLstream( String cid)
+ {
+ byte []xmldata = null;
+
+ try{
+ Socket imgdecSocket = new Socket( "localhost", 5000);
+ DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
+ DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
+ byte []header = new byte[5];
+
+ os.writeBytes("XML request\n");
+ os.writeBytes( cid + "\n");
+
+ read_stream( is, header, 5);
+
+ if( header[0] == 88 && header[1] == 77 && header[2] == 76){
+ int length = (header[3]&0xff)<<8 | (header[4]&0xff);
+
+ xmldata = new byte[ length];
+ read_stream( is, xmldata, length);
+ }
+ else
+ System.err.println("Error in get_XMLstream(), not starting with XML");
+ } catch (UnknownHostException e) {
+ System.err.println("Trying to connect to unknown host: " + e);
+ } catch (IOException e) {
+ System.err.println("IOException: " + e);
+ }
+ return xmldata;
+ }
+
+ public static String query_cid( String j2kfilename)
+ {
+ String cid = null;
+
+ try{
+ Socket imgdecSocket = new Socket( "localhost", 5000);
+ DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
+ DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
+ byte []header = new byte[4];
+
+ os.writeBytes("CID request\n");
+ os.writeBytes( j2kfilename + "\n");
+
+ read_stream( is, header, 4);
+
+ if( header[0] == 67 && header[1] == 73 && header[2] == 68){
+ int length = header[3]&0xff;
+
+ if( length > 0){
+
+ byte []ciddata = new byte[ length];
+ read_stream( is, ciddata, length);
+ cid = new String( ciddata);
+ }
+ }
+ else
+ System.err.println("Error in query_cid(), not starting with CID");
+ }
+ catch (UnknownHostException e) {
+ System.err.println("Trying to connect to unknown host: " + e);
+ } catch (IOException e) {
+ System.err.println("IOException: " + e);
+ }
+
+ return cid;
+ }
+
+ public static void read_stream( DataInputStream is, byte []stream, int length)
+ {
+ int remlen = length;
+ int off = 0;
+
+ try{
+ while( remlen > 0){
+ int redlen = is.read( stream, off, remlen);
+
+ if( redlen == -1){
+ System.err.println(" failed to read_stream()");
+ break;
+ }
+ off += redlen;
+ remlen -= redlen;
+ }
+ } catch (IOException e) {
+ System.err.println("IOException: " + e);
+ }
+ }
+
+ public static void destroy_cid( String cid)
+ {
+ try{
+ Socket imgdecSocket = new Socket( "localhost", 5000);
+ DataOutputStream os = new DataOutputStream( imgdecSocket.getOutputStream());
+ DataInputStream is = new DataInputStream( imgdecSocket.getInputStream());
+
+ os.writeBytes("CID destroy\n");
+ os.writeBytes( cid + "\n");
+
+ byte signal = is.readByte();
+
+ if( signal == 0)
+ System.err.println(" failed");
+ } catch (UnknownHostException e) {
+ System.err.println("Trying to connect to unknown host: " + e);
+ } catch (IOException e) {
+ System.err.println("IOException: " + e);
+ }
+ }
+}
diff --git a/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java b/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java
new file mode 100644
index 00000000..c8f04714
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/src/JPIPHttpClient.java
@@ -0,0 +1,301 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.util.*;
+
+
+public class JPIPHttpClient
+{
+ private String comURL;
+ protected int fw, fh;
+ protected int rx, ry;
+ protected int rw, rh;
+ protected String cid;
+
+ public JPIPHttpClient( String URI)
+ {
+ comURL = URI + "?";
+ fw = fh = -1;
+ rx = ry = -1;
+ rw = rh = -1;
+ cid = null;
+ }
+
+ public int getFw(){ return fw;}
+ public int getFh(){ return fh;}
+ public int getRx(){ return rx;}
+ public int getRy(){ return ry;}
+ public int getRw(){ return rw;}
+ public int getRh(){ return rh;}
+
+ public byte[] requestViewWindow( int reqfw, int reqfh)
+ {
+ if( cid != null)
+ return requestViewWindow( reqfw, reqfh, cid);
+ else
+ return null;
+ }
+
+ public byte[] requestViewWindow( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh)
+ {
+ if( cid != null)
+ return requestViewWindow( reqfw, reqfh, reqrx, reqry, reqrw, reqrh, cid);
+ else
+ return null;
+ }
+
+ public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid)
+ {
+ return requestViewWindow( null, reqfw, reqfh, -1, -1, -1, -1, reqcid, false);
+ }
+
+ public byte[] requestViewWindow( int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh, String reqcid)
+ {
+ return requestViewWindow( null, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, reqcid, false);
+ }
+
+ public byte[] requestViewWindow( String target, int reqfw, int reqfh)
+ {
+ return requestViewWindow( target, reqfw, reqfh, -1, -1, -1, -1, null, false);
+ }
+
+ public byte[] requestViewWindow( String target, int reqfw, int reqfh, boolean reqcnew)
+ {
+ if( cid == null) // 1 channel allocation only
+ return requestViewWindow( target, reqfw, reqfh, -1, -1, -1, -1, null, reqcnew);
+ else
+ return null;
+ }
+
+ public byte[] requestViewWindow( String target, int reqfw, int reqfh, int reqrx, int reqry, int reqrw, int reqrh)
+ {
+ return requestViewWindow( target, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, null, false);
+ }
+
+
+ public byte[] requestViewWindow( int reqfw, int reqfh, String reqcid, boolean reqcnew)
+ {
+ return requestViewWindow( null, reqfw, reqfh, -1, -1, -1, -1, reqcid, reqcnew);
+ }
+
+ public byte[] requestViewWindow( String target,
+ int reqfw, int reqfh,
+ int reqrx, int reqry,
+ int reqrw, int reqrh,
+ String reqcid, boolean reqcnew)
+ {
+ String urlstring = const_urlstring( target, reqfw, reqfh, reqrx, reqry, reqrw, reqrh, reqcid, reqcnew);
+ return GETrequest( urlstring);
+ }
+
+ public byte[] requestXML()
+ {
+ String urlstring = comURL;
+
+ if( cid == null)
+ return null;
+
+ urlstring = urlstring.concat( "cid=" + cid);
+ urlstring = urlstring.concat( "&metareq=[xml_]");
+
+ return GETrequest( urlstring);
+ }
+
+ private byte[] GETrequest( String urlstring)
+ {
+ int buflen = 0;
+ URL url = null;
+ HttpURLConnection urlconn = null;
+ byte[] jptstream = null;
+
+ try{
+ url = new URL( urlstring);
+
+ System.err.println("Requesting: " + url);
+
+ urlconn = (HttpURLConnection)url.openConnection();
+ urlconn.setRequestMethod("GET");
+ urlconn.setInstanceFollowRedirects(false);
+ urlconn.connect();
+
+ Map> headers = urlconn.getHeaderFields();
+ java.util.List hvaluelist;
+
+ if(( hvaluelist = headers.get("JPIP-fsiz")) != null){
+ String hvalueline = hvaluelist.get(0);
+ fw = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue();
+ fh = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue();
+
+ System.err.println("fw,fh: " + fw + "," + fh);
+ }
+
+ if(( hvaluelist = headers.get("JPIP-roff")) != null){
+ String hvalueline = hvaluelist.get(0);
+ rx = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue();
+ ry = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue();
+ System.err.println("rx,ry: " + rx + "," + ry);
+ }
+
+ if(( hvaluelist = headers.get("JPIP-rsiz")) != null){
+ String hvalueline = hvaluelist.get(0);
+ rw = Integer.valueOf( hvalueline.substring( 0, hvalueline.indexOf(','))).intValue();
+ rh = Integer.valueOf( hvalueline.substring( hvalueline.indexOf(',')+1 )).intValue();
+ System.err.println("rw,rh: " + rw + "," + rh);
+ }
+
+ if(( hvaluelist = headers.get("JPIP-cnew")) != null){
+ String hvalueline = hvaluelist.get(0);
+ cid = hvalueline.substring( hvalueline.indexOf('=')+1, hvalueline.indexOf(','));
+ System.err.println("cid: " + cid);
+ }
+
+ InputStream input = urlconn.getInputStream();
+ buflen = input.available();
+
+ if( buflen > 0){
+ ByteArrayOutputStream tmpstream = new ByteArrayOutputStream();
+ byte[] buf = new byte[ 1024];
+
+ System.err.println("reading jptstream...");
+
+ int redlen;
+ do{
+ redlen = input.read( buf);
+
+ if( redlen == -1)
+ break;
+ tmpstream.write( buf, 0, redlen);
+ }while( redlen > 0);
+
+ buflen = tmpstream.size();
+
+ jptstream = tmpstream.toByteArray();
+
+ tmpstream = null;
+
+ System.err.println("jptlen: " + buflen);
+ System.err.println(" succeeded");
+ }
+ else{
+ System.err.println("No new jptstream");
+ }
+ input.close();
+ }
+ catch ( MalformedURLException e){
+ e.printStackTrace();
+ }
+ catch ( ProtocolException e){
+ e.printStackTrace();
+ }
+ catch( ClassCastException e){
+ e.printStackTrace();
+ }
+ catch( NullPointerException e){
+ e.printStackTrace();
+ }
+ catch( UnknownServiceException e){
+ e.printStackTrace();
+ }
+ catch ( IOException e){
+ e.printStackTrace();
+ }
+
+ urlconn.disconnect();
+
+ return jptstream;
+ }
+
+ private String const_urlstring( String target,
+ int reqfw, int reqfh,
+ int reqrx, int reqry,
+ int reqrw, int reqrh,
+ String reqcid, boolean reqcnew)
+ {
+ String urlstring = comURL;
+
+ if( target != null){
+ if( !urlstring.endsWith("?"))
+ urlstring = urlstring.concat( "&");
+ urlstring = urlstring.concat( "target=" + target);
+ }
+ if( reqfw != -1 && reqfh != -1){
+ if( !urlstring.endsWith("?"))
+ urlstring = urlstring.concat( "&");
+ urlstring = urlstring.concat( "fsiz=" + reqfw + "," + reqfh);
+ }
+ if( reqrx != -1 && reqry != -1){
+ if( !urlstring.endsWith("?"))
+ urlstring = urlstring.concat( "&");
+ urlstring = urlstring.concat( "roff=" + reqrx + "," + reqry);
+ }
+ if( reqrw != -1 && reqrh != -1){
+ if( !urlstring.endsWith("?"))
+ urlstring = urlstring.concat( "&");
+ urlstring = urlstring.concat( "rsiz=" + reqrw + "," + reqrh);
+ }
+ if( reqcid != null){
+ if( !urlstring.endsWith("?"))
+ urlstring = urlstring.concat( "&");
+ urlstring = urlstring.concat( "cid=" + reqcid);
+ }
+ if( reqcnew){
+ if( !urlstring.endsWith("?"))
+ urlstring = urlstring.concat( "&");
+ urlstring = urlstring.concat( "cnew=http");
+ }
+ return urlstring;
+ }
+
+ public void closeChannel()
+ {
+ if( cid == null)
+ return;
+
+ try{
+ URL url = new URL( comURL + "cclose=" + cid);
+ System.err.println( "closing cid: " + cid);
+
+ HttpURLConnection urlconn = (HttpURLConnection)url.openConnection();
+ urlconn.setRequestMethod("GET");
+ urlconn.setInstanceFollowRedirects(false);
+ urlconn.connect();
+
+ Map headers = urlconn.getHeaderFields();
+
+ urlconn.disconnect();
+ } catch ( MalformedURLException e){
+ e.printStackTrace();
+ } catch ( IOException e){
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/applications/jpip/opj_client/opj_viewer/src/MML.java b/applications/jpip/opj_client/opj_viewer/src/MML.java
new file mode 100644
index 00000000..983ff200
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/src/MML.java
@@ -0,0 +1,116 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.awt.event.*;
+
+class MML implements MouseMotionListener, MouseListener
+{
+ public void mouseExited(MouseEvent e) {}
+ public void mouseEntered(MouseEvent e) {}
+ public void mouseClicked(MouseEvent e) {}
+
+ private ImageViewer iv;
+ private int x1, y1, x2, y2, zf, btn;
+ private boolean zoomrq;
+
+ public MML(ImageViewer imageviewer)
+ {
+ x1 = y1 = -1;
+ iv = imageviewer;
+ zoomrq = false;
+ zf = 0;
+ }
+
+ private boolean isInside(int x, int y)
+ {
+ x -= iv.getX();
+ y -= iv.getY();
+ return (x >= 0) && (x < iv.getWidth())
+ && (y >= 0) && (y < iv.getHeight());
+ }
+
+ public void mousePressed(MouseEvent e)
+ {
+ btn = e.getButton();
+
+ if( iv.hasAnnotation()){
+ if( iv.isInsideROIRect(e.getX(), e.getY())){
+ iv.zoomIn();
+ System.out.println("annotation click");
+ return;
+ }
+ }
+ if (iv.isInsideRect(e.getX(), e.getY())) {
+ iv.setSelected(2);
+ iv.repaint();
+ zoomrq = true;
+ } else {
+ iv.setRGeom(0, 0, 0, 0);
+ iv.setSelected(0);
+ iv.repaint();
+ x1 = y1 = -1;
+ }
+ }
+
+ public void mouseReleased(MouseEvent e)
+ {
+ if(e.getButton() == 1) {
+ if (zoomrq) {
+ iv.zoomIn();
+ zoomrq = false;
+ }
+ }
+ }
+
+ public void mouseMoved(MouseEvent e)
+ {
+ }
+
+ public void mouseDragged(MouseEvent e)
+ {
+ if (btn == 1) {
+ x2 = e.getX();
+ y2 = e.getY();
+
+ iv.setSelected(0);
+ zoomrq = false;
+
+ if (isInside(x2, y2)) {
+ if (x1 == -1) {
+ x1 = x2;
+ y1 = y2;
+ } else {
+ iv.setRGeom(x1, y1, x2, y2);
+ iv.repaint();
+ }
+ }
+ }
+ }
+}
diff --git a/applications/jpip/opj_client/opj_viewer/src/PnmImage.java b/applications/jpip/opj_client/opj_viewer/src/PnmImage.java
new file mode 100644
index 00000000..5fdfb608
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/src/PnmImage.java
@@ -0,0 +1,141 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.awt.*;
+import java.awt.image.*;
+import java.io.*;
+import java.util.regex.*;
+
+public class PnmImage extends Component
+{
+ public byte[] data = null;
+ public int width = 0;
+ public int height = 0;
+ public int channel = 0;
+
+ public Image createROIImage( int rx, int ry, int rw, int rh)
+ {
+ int []pix = new int[ rw*rh];
+
+ for( int i=0; i 0){
+ try {
+ r = is.read(data, offset, bytes);
+ if( r == -1){
+ System.err.println(" failed to read()");
+ break;
+ }
+ offset += r;
+ bytes -= r;
+ }
+ catch (IOException e) { e.printStackTrace(); }
+ }
+ fis.close();
+ } catch (IOException e) { e.printStackTrace(); }
+ }
+}
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer/src/RegimViewer.java b/applications/jpip/opj_client/opj_viewer/src/RegimViewer.java
new file mode 100644
index 00000000..85beb533
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/src/RegimViewer.java
@@ -0,0 +1,115 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.image.*;
+import java.awt.geom.AffineTransform;
+
+public class RegimViewer extends JPanel
+{
+ private PnmImage refpnm;
+ private int vw, vh;
+ private Image refimg;
+ private Image jpipImg;
+ private double[] affine_matrix;
+ private AffineTransform affine;
+
+ public RegimViewer( String refname, double[] mat)
+ {
+ refpnm = new PnmImage();
+ refpnm.openimage(refname.replaceFirst("jp2", "pgm")); // decoding not realized
+ affine_matrix = new double[6];
+
+ affine_matrix[0] = mat[0];
+ affine_matrix[1] = mat[3];
+ affine_matrix[2] = mat[1];
+ affine_matrix[3] = mat[4];
+ affine_matrix[4] = mat[2];
+ affine_matrix[5] = mat[5];
+
+ affine = new AffineTransform();
+
+ for( int i=0; i<3; i++){
+ for( int j=0; j<3; j++)
+ System.out.print( mat[i*3+j] + " ");
+ System.out.println();
+ }
+ }
+
+ public void projection( Image jpipimg, double scale)
+ {
+ jpipImg = jpipimg;
+ refimg = refpnm.createScaleImage( scale);
+ vw = refimg.getWidth(this);
+ vh = refimg.getHeight(this);
+ this.setSize( vw, vh);
+
+ affine.setTransform( affine_matrix[0], affine_matrix[1], affine_matrix[2], affine_matrix[3], affine_matrix[4], affine_matrix[5]);
+ repaint();
+ }
+
+ public void paint(Graphics g)
+ {
+ int iw, ih;
+ BufferedImage bi, bi2;
+ Graphics2D big, big2;
+ Graphics2D g2 = (Graphics2D) g;
+
+ g2.clearRect(0, 0, vw, vh);
+
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+ g2.setRenderingHint(RenderingHints.KEY_RENDERING,
+ RenderingHints.VALUE_RENDER_QUALITY);
+
+ iw = refimg.getWidth(this);
+ ih = refimg.getHeight(this);
+
+ bi = new BufferedImage( iw, ih, BufferedImage.TYPE_INT_RGB);
+ big = bi.createGraphics();
+ big.drawImage(refimg, 0, 0, this);
+
+ g2.drawImage(bi, 0, 0, this);
+
+ bi2 = new BufferedImage( jpipImg.getWidth(this), jpipImg.getHeight(this), BufferedImage.TYPE_INT_RGB);
+ big2 = bi2.createGraphics();
+ big2.drawImage( jpipImg, 0, 0, this);
+
+ g2.setTransform(affine);
+
+ g2.drawImage(bi2, 0, 0, this);
+ }
+
+ public Dimension get_imsize()
+ {
+ return (new Dimension( vw, vh));
+ }
+}
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer/src/ResizeListener.java b/applications/jpip/opj_client/opj_viewer/src/ResizeListener.java
new file mode 100644
index 00000000..28688c1b
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer/src/ResizeListener.java
@@ -0,0 +1,59 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+class ResizeListener implements ComponentListener
+{
+ private ImageViewer iv;
+ private Dimension largest;
+
+ public ResizeListener( ImageViewer _iv)
+ {
+ iv = _iv;
+ largest = iv.getSize();
+ }
+
+ public void componentHidden(ComponentEvent e) {}
+
+ public void componentMoved(ComponentEvent e) {}
+
+ public void componentResized(ComponentEvent e) {
+ Dimension cursize = iv.getSize();
+ if( largest.getWidth() < cursize.getWidth() || largest.getHeight() < cursize.getHeight()){
+ largest = cursize;
+ iv.enlarge();
+ }
+ }
+
+ public void componentShown(ComponentEvent e) {}
+}
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/build.xml b/applications/jpip/opj_client/opj_viewer_xerces/build.xml
new file mode 100644
index 00000000..08a177f4
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/build.xml
@@ -0,0 +1,35 @@
+
+ OpenJPIP client image viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/dist/manifest.txt b/applications/jpip/opj_client/opj_viewer_xerces/dist/manifest.txt
new file mode 100644
index 00000000..6bba2ab8
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/dist/manifest.txt
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.7.0
+Created-By: Kaori Hagihara
+Main-Class: ImageWindow
+Class-Path: /usr/share/java/xerces-j2.jar
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110510.jar b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110510.jar
new file mode 100644
index 00000000..07304bb8
Binary files /dev/null and b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces-20110510.jar differ
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar
new file mode 120000
index 00000000..01cd91a8
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/dist/opj_viewer_xerces.jar
@@ -0,0 +1 @@
+opj_viewer_xerces-20110510.jar
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/ImageManager.java b/applications/jpip/opj_client/opj_viewer_xerces/src/ImageManager.java
new file mode 120000
index 00000000..2a30913b
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/ImageManager.java
@@ -0,0 +1 @@
+../../opj_viewer/src/ImageManager.java
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/ImageViewer.java b/applications/jpip/opj_client/opj_viewer_xerces/src/ImageViewer.java
new file mode 100644
index 00000000..9fab7f0a
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/ImageViewer.java
@@ -0,0 +1,267 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+import java.awt.image.*;
+import java.awt.geom.*;
+import java.net.URL;
+import javax.swing.border.*;
+import java.util.*;
+import java.io.*;
+
+public class ImageViewer extends JPanel
+{
+ private MML myMML;
+ private ResizeListener myRL;
+ private ImageManager imgmanager;
+ private int vw, vh;
+ private int iw, ih;
+ private int selected = 0;
+ private Image img;
+
+ private String cmdline = new String();
+ private boolean fullRefresh = false;
+ private Point offset = new Point(0,0);
+ private Rectangle rect = new Rectangle();
+ private Rectangle roirect[] = null;
+ private String roiname[] = null;
+
+ public ImageViewer( String j2kfilename, ImageManager manager)
+ {
+ String str;
+
+ this.setSize( 200, 200);
+ Dimension asz = this.getSize();
+
+ vw = asz.width;
+ vh = asz.height;
+
+ setBackground(Color.black);
+ myMML = new MML(this);
+ myRL = new ResizeListener(this);
+
+ imgmanager = manager;
+ img = imgmanager.getImage( j2kfilename, vw, vh);
+
+ addMouseListener(myMML);
+ addMouseMotionListener(myMML);
+ addComponentListener(myRL);
+ }
+
+ public Image getImage()
+ {
+ return img;
+ }
+
+ public void zoomIn()
+ {
+ roirect = null;
+ roiname = null;
+
+ double scalex = vw/(double)rect.width;
+ double scaley = vh/(double)rect.height;
+
+ int fw = (int)(imgmanager.getFw()*scalex);
+ int fh = (int)(imgmanager.getFh()*scaley);
+ int rx = (int)((imgmanager.getRx()+rect.x)*scalex);
+ int ry = (int)((imgmanager.getRy()+rect.y)*scaley);
+
+ img = imgmanager.getImage( fw, fh, rx, ry, vw, vh);
+
+ rect.x = rect.y = rect.width = rect.height = 0;
+
+ selected = 0;
+ fullRefresh = true;
+ repaint();
+ }
+
+ public void enlarge()
+ {
+ roirect = null;
+ roiname = null;
+
+ Dimension asz = this.getSize();
+
+ vw = asz.width;
+ vh = asz.height;
+
+ double scalex = vw/(double)imgmanager.getRw();
+ double scaley = vh/(double)imgmanager.getRh();
+
+ int fw = (int)(imgmanager.getFw()*scalex);
+ int fh = (int)(imgmanager.getFh()*scaley);
+ int rx = (int)(imgmanager.getRx()*scalex);
+ int ry = (int)(imgmanager.getRy()*scaley);
+
+ img = imgmanager.getImage( fw, fh, rx, ry, vw, vh);
+
+ fullRefresh = true;
+ repaint();
+ }
+
+ public void setSelected(int state)
+ {
+ roirect = null;
+ roiname = null;
+
+ if (state != selected) {
+
+ selected = state;
+ repaint();
+ }
+ }
+
+ public boolean isInsideRect(int x, int y)
+ {
+ return rect.contains(x - offset.x, y - offset.y);
+ }
+
+ public void setRGeom(int x1, int y1, int x2, int y2)
+ {
+ rect.x = Math.min(x1,x2) - offset.x;
+ rect.y = Math.min(y1,y2) - offset.y;
+ rect.width = Math.abs(x2-x1);
+ rect.height = Math.abs(y2-y1);
+ }
+
+ public void annotate( JP2XMLparser.ROIparams roi[])
+ {
+ int numofroi = roi.length;
+
+ roirect = new Rectangle [numofroi];
+ roiname = new String [numofroi];
+
+ double scale_x = imgmanager.getFw()/(double)imgmanager.getOrigWidth();
+ double scale_y = imgmanager.getFh()/(double)imgmanager.getOrigHeight();
+ int rx = imgmanager.getRx();
+ int ry = imgmanager.getRy();
+ int rw = imgmanager.getRw();
+ int rh = imgmanager.getRh();
+
+ for( int i=0; i 0) && (rect.height > 0))
+ big.draw(rect);
+
+ if( roirect != null){
+ for( int i=0; i 0){
+ uri = s[0];
+ j2kfilename = s[1];
+ }
+ else{
+ System.out.println("Usage: java -jar opj_viewer.jar HTTP_server_URI imagefile.jp2");
+ return;
+ }
+ ImageWindow frame = new ImageWindow( uri, j2kfilename);
+
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ //Display the window.
+ frame.pack();
+ frame.setSize(new Dimension(400,200));
+ frame.setLocation( 0, 50);
+ frame.setVisible(true);
+ }
+}
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/ImgdecClient.java b/applications/jpip/opj_client/opj_viewer_xerces/src/ImgdecClient.java
new file mode 120000
index 00000000..e3d2ed4a
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/ImgdecClient.java
@@ -0,0 +1 @@
+../../opj_viewer/src/ImgdecClient.java
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/JP2XMLparser.java b/applications/jpip/opj_client/opj_viewer_xerces/src/JP2XMLparser.java
new file mode 100644
index 00000000..bec1d4db
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/JP2XMLparser.java
@@ -0,0 +1,122 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.ErrorHandler;
+import org.apache.xerces.parsers.DOMParser;
+import org.xml.sax.InputSource;
+import java.io.*;
+import java.lang.Integer;
+
+public class JP2XMLparser
+{
+ Document document;
+
+ public static class ROIparams{
+ public String name = null;
+ public int x = 0;
+ public int y = 0;
+ public int w = 0;
+ public int h = 0;
+ }
+
+ public static class IRTparams{
+ public String refimg = null;
+ public double []mat = { 0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
+ }
+
+ public JP2XMLparser( byte[] buf)
+ {
+ try{
+ InputSource source = new InputSource( new ByteArrayInputStream( buf));
+ DOMParser parser = new DOMParser();
+ parser.setErrorHandler(new MyHandler());
+ parser.parse( source);
+ document = parser.getDocument();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public ROIparams [] getROIparams()
+ {
+ ROIparams roi[];
+ NodeList elements = document.getElementsByTagName("roi");
+ int elementCount = elements.getLength();
+
+ roi = new ROIparams [elementCount];
+
+ for( int i = 0; i < elementCount; i++) {
+ Element element = (Element)elements.item(i);
+
+ roi[i] = new ROIparams();
+ roi[i].name = element.getAttribute( "name");
+ roi[i].x = Integer.parseInt( element.getAttribute( "x")) ;
+ roi[i].y = Integer.parseInt( element.getAttribute( "y")) ;
+ roi[i].w = Integer.parseInt( element.getAttribute( "w")) ;
+ roi[i].h = Integer.parseInt( element.getAttribute( "h")) ;
+ }
+ return roi;
+ }
+
+ public IRTparams getIRTparams()
+ {
+ IRTparams irt = new IRTparams();
+ NodeList elements = document.getElementsByTagName("irt");
+ int elementCount = elements.getLength();
+
+ Element element = (Element)elements.item(0);
+ irt.refimg = element.getAttribute( "refimg");
+ for( int i=1; i<=9; i++)
+ irt.mat[i-1] = Double.parseDouble( element.getAttribute("m" + i));
+
+ return irt;
+ }
+}
+
+class MyHandler implements ErrorHandler {
+ public void warning(SAXParseException e) {
+ System.out.println("Warning: line" + e.getLineNumber());
+ System.out.println(e.getMessage());
+ }
+ public void error(SAXParseException e) {
+ System.out.println("Error: line" + e.getLineNumber());
+ System.out.println(e.getMessage());
+ }
+ public void fatalError(SAXParseException e) {
+ System.out.println("Critical error: line" + e.getLineNumber());
+ System.out.println(e.getMessage());
+ }
+}
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/JPIPHttpClient.java b/applications/jpip/opj_client/opj_viewer_xerces/src/JPIPHttpClient.java
new file mode 120000
index 00000000..98cdaa66
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/JPIPHttpClient.java
@@ -0,0 +1 @@
+../../opj_viewer/src/JPIPHttpClient.java
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/MML.java b/applications/jpip/opj_client/opj_viewer_xerces/src/MML.java
new file mode 120000
index 00000000..9f1f5002
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/MML.java
@@ -0,0 +1 @@
+../../opj_viewer/src/MML.java
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/OptionPanel.java b/applications/jpip/opj_client/opj_viewer_xerces/src/OptionPanel.java
new file mode 100644
index 00000000..822e2dd8
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/OptionPanel.java
@@ -0,0 +1,98 @@
+/*
+ * $Id$
+ *
+ * Copyright (c) 2002-2011, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium
+ * Copyright (c) 2002-2011, Professor Benoit Macq
+ * Copyright (c) 2010-2011, Kaori Hagihara
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 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.
+ *
+ * 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.
+ */
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+public class OptionPanel extends JPanel implements ActionListener
+{
+ private JButton roibutton;
+ private JButton imregbutton;
+ private ImageManager imgmanager;
+ private ImageViewer iv;
+ private JP2XMLparser xmlparser;
+ private JFrame regimwindow;
+ private RegimViewer regimgviewer;
+
+ public OptionPanel( ImageManager manager, ImageViewer imgviewer)
+ {
+ this.setLayout(new BoxLayout( this, BoxLayout.Y_AXIS));
+
+ roibutton = new JButton("Region Of Interest");
+ imregbutton = new JButton("Image Registration");
+
+ roibutton.setAlignmentX( Component.CENTER_ALIGNMENT);
+ imregbutton.setAlignmentX( Component.CENTER_ALIGNMENT);
+
+ add( roibutton);
+ add( imregbutton);
+ roibutton.addActionListener(this);
+ imregbutton.addActionListener(this);
+
+ imgmanager = manager;
+ iv = imgviewer;
+ xmlparser = null;
+ }
+
+ public void actionPerformed(ActionEvent e)
+ {
+ if( xmlparser == null){
+ byte []xmldata = imgmanager.getXML();
+ if( xmldata != null)
+ xmlparser = new JP2XMLparser( xmldata);
+ }
+ if( e.getSource() == roibutton){
+ if( xmlparser != null){
+ JP2XMLparser.ROIparams roi[] = xmlparser.getROIparams();
+ iv.annotate( roi);
+ }
+ }
+ if( e.getSource() == imregbutton){
+ if( xmlparser != null){
+ if( regimwindow == null){
+ JP2XMLparser.IRTparams irt = xmlparser.getIRTparams();
+
+ regimgviewer = new RegimViewer( irt.refimg, irt.mat);
+ regimgviewer.setOpaque(false);
+
+ regimwindow = new JFrame("Registered Image");
+ regimwindow.getContentPane().add("Center", regimgviewer);
+ regimwindow.pack();
+ regimwindow.setLocation( 500, 50);
+ regimwindow.setVisible(true);
+ }
+ regimgviewer.projection( iv.getImage(), (double)imgmanager.getRw()/(double)imgmanager.getOrigWidth());
+ regimwindow.setSize( regimgviewer.get_imsize());
+ regimwindow.show();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/PnmImage.java b/applications/jpip/opj_client/opj_viewer_xerces/src/PnmImage.java
new file mode 120000
index 00000000..73f70bff
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/PnmImage.java
@@ -0,0 +1 @@
+../../opj_viewer/src/PnmImage.java
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/RegimViewer.java b/applications/jpip/opj_client/opj_viewer_xerces/src/RegimViewer.java
new file mode 120000
index 00000000..c6be6518
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/RegimViewer.java
@@ -0,0 +1 @@
+../../opj_viewer/src/RegimViewer.java
\ No newline at end of file
diff --git a/applications/jpip/opj_client/opj_viewer_xerces/src/ResizeListener.java b/applications/jpip/opj_client/opj_viewer_xerces/src/ResizeListener.java
new file mode 120000
index 00000000..a09e32c1
--- /dev/null
+++ b/applications/jpip/opj_client/opj_viewer_xerces/src/ResizeListener.java
@@ -0,0 +1 @@
+../../opj_viewer/src/ResizeListener.java
\ No newline at end of file