diff options
author | Brian Hinz <bphinz@users.sourceforge.net> | 2011-12-04 22:06:21 +0000 |
---|---|---|
committer | Brian Hinz <bphinz@users.sourceforge.net> | 2011-12-04 22:06:21 +0000 |
commit | 57e6143f0856fa8708fe37b4b44eefde4ac7848b (patch) | |
tree | 4d7ea84bd865d813ad49830a3176dc385f25f61b | |
parent | 16ec1a0e4a020eafde41b183d240757751caa417 (diff) | |
download | tigervnc-57e6143f0856fa8708fe37b4b44eefde4ac7848b.tar.gz tigervnc-57e6143f0856fa8708fe37b4b44eefde4ac7848b.zip |
Grabbing the RGB components from the BufferedImage one at a time and converting the to a 24bpp RGB color manually is about 25% faster than using BufferedImage.getRGB().
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4821 3789f03b-4d11-0410-bbf8-ca57d06f2519
-rw-r--r-- | java/com/tigervnc/rdr/InStream.java | 29 | ||||
-rw-r--r-- | java/com/tigervnc/rdr/JavaInStream.java | 107 | ||||
-rw-r--r-- | java/com/tigervnc/rdr/ZlibInStream.java | 1 | ||||
-rw-r--r-- | java/com/tigervnc/rfb/PixelBuffer.java | 5 | ||||
-rw-r--r-- | java/com/tigervnc/rfb/TightDecoder.java | 11 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/CConn.java | 4 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/DesktopWindow.java | 11 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/OptionsDialog.java | 1 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/PixelBufferImage.java | 8 | ||||
-rw-r--r-- | java/com/tigervnc/vncviewer/VncViewer.java | 6 |
10 files changed, 129 insertions, 54 deletions
diff --git a/java/com/tigervnc/rdr/InStream.java b/java/com/tigervnc/rdr/InStream.java index a18ea4ed..f998025f 100644 --- a/java/com/tigervnc/rdr/InStream.java +++ b/java/com/tigervnc/rdr/InStream.java @@ -30,6 +30,7 @@ abstract public class InStream { // maximum of nItems). public int check(int itemSize, int nItems, boolean wait) { +/* int available = end - ptr; if (itemSize * nItems > available) { if (itemSize > available) @@ -38,6 +39,14 @@ abstract public class InStream { nItems = available / itemSize; } return nItems; +*/ + if (ptr + itemSize * nItems > end) { + if (ptr + itemSize > end) + return overrun(itemSize, nItems, wait); + + nItems = (end - ptr) / itemSize; + } + return nItems; } public int check(int itemSize, int nItems) { return check(itemSize, nItems, true); } @@ -111,14 +120,17 @@ abstract public class InStream { // no byte-ordering, we just use big-endian. public final int readOpaque8() { return readU8(); } - public final int readOpaque16() { return readU16(); } - public final int readOpaque32() { return readU32(); } - public final int readOpaque24A() { check(3, 1, true); int b0 = b[ptr++]; - int b1 = b[ptr++]; int b2 = b[ptr++]; - return b0 << 24 | b1 << 16 | b2 << 8; } - public final int readOpaque24B() { check(3, 1, true); int b0 = b[ptr++]; - int b1 = b[ptr++]; int b2 = b[ptr++]; - return b0 << 16 | b1 << 8 | b2; } + public final int readOpaque16() { check(2); int r0 = b[ptr++]; + int r1 = b[ptr++]; return r0 << 8 | r1; } + public final int readOpaque32() { check(4); int r0 = b[ptr++]; int r1 = b[ptr++]; + int r2 = b[ptr++]; int r3 = b[ptr++]; + return r0 << 24 | r1 << 16 | r2 << 8 | r3; } + public final int readOpaque24A() { check(3, 1, true); int r0 = b[ptr++]; + int r1 = b[ptr++]; int r2 = b[ptr++]; + return r0 << 24 | r1 << 16 | r2 << 8; } + public final int readOpaque24B() { check(3, 1, true); int r0 = b[ptr++]; + int r1 = b[ptr++]; int r2 = b[ptr++]; + return r0 << 16 | r1 << 8 | r2; } public final int readPixel(int bytesPerPixel, boolean bigEndian) { byte[] pix = new byte[4]; @@ -190,4 +202,5 @@ abstract public class InStream { protected byte[] b; protected int ptr; protected int end; + protected int start; } diff --git a/java/com/tigervnc/rdr/JavaInStream.java b/java/com/tigervnc/rdr/JavaInStream.java index faa968ac..fb6ab8b6 100644 --- a/java/com/tigervnc/rdr/JavaInStream.java +++ b/java/com/tigervnc/rdr/JavaInStream.java @@ -21,25 +21,37 @@ // package com.tigervnc.rdr; +import java.io.InputStream; +import java.io.DataInputStream; public class JavaInStream extends InStream { static final int defaultBufSize = 8192; static final int minBulkSize = 1024; - public JavaInStream(java.io.InputStream jis_, int bufSize_) { - jis = jis_; + public JavaInStream(InputStream jis_, int bufSize_) + { + jis = new DataInputStream(jis_); bufSize = bufSize_; b = new byte[bufSize]; - ptr = end = offset = 0; + ptr = end = offset = start = 0; timing = false; timeWaitedIn100us = 5; timedKbits = 0; } - public JavaInStream(java.io.InputStream jis_) { this(jis_, defaultBufSize); } + public JavaInStream(InputStream jis_) + { + this(jis_, defaultBufSize); + } + + public int pos() + { + return offset + ptr - start; + } - public void readBytes(byte[] data, int dataPtr, int length) { + public void readBytes(byte[] data, int dataPtr, int length) + { if (length < minBulkSize) { super.readBytes(data, dataPtr, length); return; @@ -61,56 +73,32 @@ public class JavaInStream extends InStream { } } - public int pos() { return offset + ptr; } - - public void startTiming() { - timing = true; - - // Carry over up to 1s worth of previous rate for smoothing. - - if (timeWaitedIn100us > 10000) { - timedKbits = timedKbits * 10000 / timeWaitedIn100us; - timeWaitedIn100us = 10000; - } - } - - public void stopTiming() { - timing = false; - if (timeWaitedIn100us < timedKbits/2) - timeWaitedIn100us = timedKbits/2; // upper limit 20Mbit/s - } - - public long kbitsPerSecond() { - return timedKbits * 10000 / timeWaitedIn100us; - } - - public long timeWaited() { return timeWaitedIn100us; } - protected int overrun(int itemSize, int nItems, boolean wait) { if (itemSize > bufSize) throw new Exception("JavaInStream overrun: max itemSize exceeded"); if (end - ptr != 0) - System.arraycopy(b, ptr, b, 0, end - ptr); + System.arraycopy(b, ptr, b, start, end - ptr); - offset += ptr; - end -= ptr; - ptr = 0; + offset += ptr - start; + end -= ptr - start; + ptr = start; - while (end < itemSize) { - int bytes_to_read = bufSize - end; + int bytes_to_read; + while (end < start + itemSize) { + bytes_to_read = start + bufSize - end; if (!timing) { bytes_to_read = Math.min(bytes_to_read, Math.max(itemSize*nItems, 8)); } int n = read(b, end, bytes_to_read, wait); - + if (n == 0) return 0; end += n; } - if (itemSize * nItems > end) - nItems = end / itemSize; + if (itemSize * nItems > end - ptr) + nItems = (end - ptr) / itemSize; return nItems; } @@ -122,7 +110,17 @@ public class JavaInStream extends InStream { int n = -1; try { - n = jis.read(buf, bufPtr, len); + //System.out.println("available: "+jis.available()); + //int available = jis.available(); + //if (!wait && (available == 0)) + // return 0; + //if (available > 0 && available < len) { + // n = jis.read(buf, bufPtr, available); + //} else { + n = jis.read(buf, bufPtr, len); + //} + } catch (java.net.SocketTimeoutException e) { + return Math.max(n,0); } catch (java.io.IOException e) { throw new IOException(e); } @@ -150,9 +148,34 @@ public class JavaInStream extends InStream { return n; } - private int read(byte[] buf, int bufPtr, int len) { return read(buf, bufPtr, len, true); } + private int read(byte[] buf, int bufPtr, int len) { + return read(buf, bufPtr, len, true); + } + + public void startTiming() { + timing = true; + + // Carry over up to 1s worth of previous rate for smoothing. + + if (timeWaitedIn100us > 10000) { + timedKbits = timedKbits * 10000 / timeWaitedIn100us; + timeWaitedIn100us = 10000; + } + } + + public void stopTiming() { + timing = false; + if (timeWaitedIn100us < timedKbits/2) + timeWaitedIn100us = timedKbits/2; // upper limit 20Mbit/s + } + + public long kbitsPerSecond() { + return timedKbits * 10000 / timeWaitedIn100us; + } + + public long timeWaited() { return timeWaitedIn100us; } - private java.io.InputStream jis; + private DataInputStream jis; private int offset; private int bufSize; diff --git a/java/com/tigervnc/rdr/ZlibInStream.java b/java/com/tigervnc/rdr/ZlibInStream.java index 46b1c509..44f48282 100644 --- a/java/com/tigervnc/rdr/ZlibInStream.java +++ b/java/com/tigervnc/rdr/ZlibInStream.java @@ -138,5 +138,4 @@ public class ZlibInStream extends InStream { private int offset; private com.jcraft.jzlib.ZStream zs; private int bytesIn; - private int start; } diff --git a/java/com/tigervnc/rfb/PixelBuffer.java b/java/com/tigervnc/rfb/PixelBuffer.java index f87fead8..967d4695 100644 --- a/java/com/tigervnc/rfb/PixelBuffer.java +++ b/java/com/tigervnc/rfb/PixelBuffer.java @@ -65,6 +65,11 @@ public class PixelBuffer { System.arraycopy(pix, (w * j), data, width_ * (y + j) + x, w); } + public void imageRect(int x, int y, int w, int h, byte[] pix) { + for (int j = 0; j < h; j++) + System.arraycopy(pix, (w * j), data, width_ * (y + j) + x, w); + } + public void copyRect(int x, int y, int w, int h, int srcX, int srcY) { int dest = (width_ * y) + x; int src = (width_ * srcY) + srcX; diff --git a/java/com/tigervnc/rfb/TightDecoder.java b/java/com/tigervnc/rfb/TightDecoder.java index c029d690..3e894c0b 100644 --- a/java/com/tigervnc/rfb/TightDecoder.java +++ b/java/com/tigervnc/rfb/TightDecoder.java @@ -25,7 +25,6 @@ import java.util.ArrayList; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import javax.imageio.ImageIO; -import com.sun.image.codec.jpeg.*; import java.io.InputStream; public class TightDecoder extends Decoder { @@ -261,8 +260,14 @@ public class TightDecoder extends Decoder { e.printStackTrace(); } int[] buf = reader.getImageBuf(w*h); - jpeg.getRGB(0, 0, w, h, buf, 0, w); - jpeg = null; + int[] pix = new int[3]; + for (int y=0; y < h; y++) { + for (int x=0; x < w; x++) { + jpeg.getRaster().getPixel(x, y, pix); + buf[y*w+x] = (0xff << 24) | (pix[0] & 0xff) << 16 | (pix[1] & 0xff) << 8 | pix[2]; + } + } + jpeg.flush(); handler.imageRect(r, buf); } diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java index ae03b524..47868d61 100644 --- a/java/com/tigervnc/vncviewer/CConn.java +++ b/java/com/tigervnc/vncviewer/CConn.java @@ -181,6 +181,10 @@ public class CConn extends CConnection cp.compressLevel = viewer.compressLevel.getValue(); cp.noJpeg = viewer.noJpeg.getValue(); cp.qualityLevel = viewer.qualityLevel.getValue(); + if (viewer.x509ca.getValue() != viewer.x509ca.getDefaultStr()) + CSecurityTLS.x509ca.setParam(viewer.x509ca.getValue()); + if (viewer.x509crl.getValue() != viewer.x509crl.getDefaultStr()) + CSecurityTLS.x509crl.setParam(viewer.x509crl.getValue()); initMenu(); if (sock != null) { diff --git a/java/com/tigervnc/vncviewer/DesktopWindow.java b/java/com/tigervnc/vncviewer/DesktopWindow.java index 087b58fd..4b9cd195 100644 --- a/java/com/tigervnc/vncviewer/DesktopWindow.java +++ b/java/com/tigervnc/vncviewer/DesktopWindow.java @@ -282,6 +282,17 @@ class DesktopWindow extends JPanel implements showLocalCursor(); } + final public void imageRect(int x, int y, int w, int h, + byte[] pix) { + if (overlapsCursor(x, y, w, h)) hideLocalCursor(); + synchronized (im) { + im.imageRect(x, y, w, h, pix); + } + invalidate(x, y, w, h); + if (softCursor == null) + showLocalCursor(); + } + final public void copyRect(int x, int y, int w, int h, int srcX, int srcY) { if (overlapsCursor(x, y, w, h) || overlapsCursor(srcX, srcY, w, h)) diff --git a/java/com/tigervnc/vncviewer/OptionsDialog.java b/java/com/tigervnc/vncviewer/OptionsDialog.java index 9a463fb3..593effd7 100644 --- a/java/com/tigervnc/vncviewer/OptionsDialog.java +++ b/java/com/tigervnc/vncviewer/OptionsDialog.java @@ -20,6 +20,7 @@ package com.tigervnc.vncviewer; import java.awt.*; import java.awt.event.*; +import java.io.File; import javax.swing.*; import javax.swing.border.*; diff --git a/java/com/tigervnc/vncviewer/PixelBufferImage.java b/java/com/tigervnc/vncviewer/PixelBufferImage.java index 648e6388..45688f4b 100644 --- a/java/com/tigervnc/vncviewer/PixelBufferImage.java +++ b/java/com/tigervnc/vncviewer/PixelBufferImage.java @@ -62,6 +62,8 @@ public class PixelBufferImage extends PixelBuffer implements ImageProducer width_ = w; height_ = h; + //source = new MemoryImageSource(w,h,cm,data,0,w); + //source.setAnimated(true); image = desktop.createImage(this); image.setAccelerationPriority(1); @@ -70,6 +72,9 @@ public class PixelBufferImage extends PixelBuffer implements ImageProducer for (int i = 0; i < rowsToCopy; i++) System.arraycopy(oldData, copyWidth * i, data, width() * i, copyWidth); + //source.newPixels(data, cm, 0, w); + //source.newPixels(0, 0, w, h, true); + //source.setFullBufferUpdates(true); } public PixelFormat getNativePF() { @@ -103,6 +108,7 @@ public class PixelBufferImage extends PixelBuffer implements ImageProducer public void put(int x, int y, int w, int h, Graphics g) { if (ic != null) { ic.setPixels(x, y, w, h, cm, data, width() * y + x, width()); + //source.newPixels(x, y, w, h, true); g.setClip(x, y, w, h); ic.imageComplete(ImageConsumer.SINGLEFRAMEDONE); } @@ -116,6 +122,7 @@ public class PixelBufferImage extends PixelBuffer implements ImageProducer super.copyRect(x, y, w, h, srcX, srcY); if (ic == null) return; ic.setPixels(x, y, w, h, cm, data, width() * y + x, width()); + //source.newPixels(x, y, w, h, true); g.setClip(x, y, w, h); ic.imageComplete(ImageConsumer.SINGLEFRAMEDONE); } @@ -171,6 +178,7 @@ public class PixelBufferImage extends PixelBuffer implements ImageProducer public void requestTopDownLeftRightResend(ImageConsumer c) {} public void startProduction(ImageConsumer c) { addConsumer(c); } + MemoryImageSource source; Image image; ImageConsumer ic; diff --git a/java/com/tigervnc/vncviewer/VncViewer.java b/java/com/tigervnc/vncviewer/VncViewer.java index 97b9427c..0bf8db0a 100644 --- a/java/com/tigervnc/vncviewer/VncViewer.java +++ b/java/com/tigervnc/vncviewer/VncViewer.java @@ -258,6 +258,12 @@ public class VncViewer extends java.applet.Applet implements Runnable "Password file for VNC authentication", ""); AliasParameter passwd = new AliasParameter("passwd", "Alias for PasswordFile", passwordFile); + StringParameter x509crl + = new StringParameter("X509crl", + "Path to X509 CRL certificate file", ""); + StringParameter x509ca + = new StringParameter("X509ca", + "Path to X509 CA certificate file", ""); BoolParameter autoSelect = new BoolParameter("AutoSelect", "Auto select pixel format and encoding", true); |