Revision: 4820 http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4820&view=rev Author: bphinz Date: 2011-12-01 00:50:38 +0000 (Thu, 01 Dec 2011) Log Message: ----------- Tight decoder fixes to address issues described in bug #3444605
Modified Paths: -------------- trunk/java/com/tigervnc/rfb/CMsgReader.java trunk/java/com/tigervnc/rfb/TightDecoder.java Modified: trunk/java/com/tigervnc/rfb/CMsgReader.java =================================================================== --- trunk/java/com/tigervnc/rfb/CMsgReader.java 2011-11-27 20:43:47 UTC (rev 4819) +++ trunk/java/com/tigervnc/rfb/CMsgReader.java 2011-12-01 00:50:38 UTC (rev 4820) @@ -138,8 +138,8 @@ public int[] getImageBuf(int required, int requested, int nPixels) { - int requiredBytes = required * (handler.cp.pf().bpp / 8); - int requestedBytes = requested * (handler.cp.pf().bpp / 8); + int requiredBytes = required; + int requestedBytes = requested; int size = requestedBytes; if (size > imageBufIdealSize) size = imageBufIdealSize; Modified: trunk/java/com/tigervnc/rfb/TightDecoder.java =================================================================== --- trunk/java/com/tigervnc/rfb/TightDecoder.java 2011-11-27 20:43:47 UTC (rev 4819) +++ trunk/java/com/tigervnc/rfb/TightDecoder.java 2011-12-01 00:50:38 UTC (rev 4820) @@ -25,6 +25,8 @@ 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 { @@ -157,7 +159,6 @@ int stride = r.width(); int[] buf = reader.getImageBuf(r.area()); - if (palSize == 0) { // Truecolor data. @@ -170,12 +171,26 @@ } else { // Copy int h = r.height(); + int ptr = 0; + int srcPtr = 0; int w = r.width(); if (cutZeros) { - serverpf.bufferFromRGB(buf, 0, netbuf, 0, w*h); + serverpf.bufferFromRGB(buf, ptr, netbuf, srcPtr, w*h); } else { - for (int i = 0; i < dataSize; i++) - buf[i] = netbuf[i] & 0xff; + int pixelSize = (bpp >= 24) ? 3 : bpp/8; + while (h > 0) { + for (int i = 0; i < w; i++) { + if (bpp == 8) { + buf[ptr+i] = netbuf[srcPtr+i] & 0xff; + } else { + for (int j = pixelSize-1; j >= 0; j--) + buf[ptr+i] |= ((netbuf[srcPtr+i+j] & 0xff) << j*8); + } + } + ptr += stride; + srcPtr += w * pixelSize; + h--; + } } } } else { @@ -235,16 +250,18 @@ // Create an Image object from the JPEG data. int imageType = BufferedImage.TYPE_4BYTE_ABGR_PRE; + int w = r.width(); + int h = r.height(); BufferedImage jpeg = - new BufferedImage(r.width(), r.height(), imageType); + new BufferedImage(w, h, imageType); jpeg.setAccelerationPriority(1); try { jpeg = ImageIO.read(new ByteArrayInputStream(netbuf)); } catch (java.io.IOException e) { e.printStackTrace(); } - int[] buf = reader.getImageBuf(r.area()); - jpeg.getRGB(0, 0, r.width(), r.height(), buf, 0, r.width()); + int[] buf = reader.getImageBuf(w*h); + jpeg.getRGB(0, 0, w, h, buf, 0, w); jpeg = null; handler.imageRect(r, buf); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ All the data continuously generated in your IT infrastructure contains a definitive record of customers, application performance, security threats, fraudulent activity, and more. Splunk takes this data and makes sense of it. IT sense. And common sense. http://p.sf.net/sfu/splunk-novd2d _______________________________________________ Tigervnc-commits mailing list Tigervnc-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tigervnc-commits