Browse Source

More fixes for java viewer performance regression

tags/v1.7.90
Brian P. Hinz 7 years ago
parent
commit
606ca31f38

+ 3
- 4
java/com/tigervnc/rfb/JpegDecompressor.java View File

@@ -29,7 +29,7 @@ public class JpegDecompressor {
public JpegDecompressor() {}

public void decompress(ByteBuffer jpegBuf, int jpegBufLen,
WritableRaster buf, Rect r, PixelFormat pf)
PixelBuffer pb, Rect r, PixelFormat pf)
{

byte[] src = new byte[jpegBufLen];
@@ -39,10 +39,9 @@ public class JpegDecompressor {
ImageIO.setUseCache(false);
BufferedImage jpeg =
ImageIO.read(new MemoryCacheImageInputStream(new ByteArrayInputStream(src)));
ColorModel cm = pf.getColorModel();
BufferedImage image = new BufferedImage(cm, buf, true, null);
BufferedImage image = (BufferedImage)pb.getImage();
Graphics2D g2 = image.createGraphics();
g2.drawImage(jpeg, 0, 0, null);
g2.drawImage(jpeg, r.tl.x, r.tl.y, r.width(), r.height(), null);
g2.dispose();
image.flush();
jpeg.flush();

+ 3
- 0
java/com/tigervnc/rfb/PixelBuffer.java View File

@@ -21,6 +21,7 @@

package com.tigervnc.rfb;

import java.awt.*;
import java.awt.image.*;
import java.awt.Color;
import java.nio.*;
@@ -69,6 +70,7 @@ public abstract class PixelBuffer {
// specific format.
//void getImage(const PixelFormat& pf, void* imageBuf,
// const Rect& r, int stride=0) const;
public Image getImage() { return image; }

///////////////////////////////////////////////
// Framebuffer update methods
@@ -81,4 +83,5 @@ public abstract class PixelBuffer {

protected PixelFormat format;
protected int width_, height_;
protected Image image;
}

+ 1
- 2
java/com/tigervnc/rfb/TightDecoder.java View File

@@ -236,8 +236,7 @@ public class TightDecoder extends Decoder {
buflen -= 4;

// We always use direct decoding with JPEG images
buf = pb.getBufferRW(r);
jd.decompress(bufptr, len, buf, r, pb.getPF());
jd.decompress(bufptr, len, pb, r, pb.getPF());
pb.commitBufferRW(r);
return;
}

+ 17
- 1
java/com/tigervnc/vncviewer/JavaPixelBuffer.java View File

@@ -21,7 +21,7 @@ package com.tigervnc.vncviewer;

import java.awt.*;
import java.awt.image.*;
import java.nio.ByteOrder;
import java.nio.*;

import com.tigervnc.rfb.*;

@@ -31,6 +31,22 @@ public class JavaPixelBuffer extends PlatformPixelBuffer
public JavaPixelBuffer(int w, int h) {
super(getPreferredPF(), w, h,
getPreferredPF().getColorModel().createCompatibleWritableRaster(w,h));
image = new BufferedImage(getPreferredPF().getColorModel(),
getBufferRW(new Rect(0, 0, w, h)), true, null);
}

public synchronized void fillRect(Rect r, byte[] pix)
{
ColorModel cm = format.getColorModel();
int pixel =
ByteBuffer.wrap(pix).order(format.getByteOrder()).asIntBuffer().get(0);
Color c = new Color(cm.getRGB(pixel));
Graphics2D g2 = ((BufferedImage)image).createGraphics();
g2.setColor(c);
g2.fillRect(r.tl.x, r.tl.y, r.width(), r.height());
g2.dispose();

commitBufferRW(r);
}

private static PixelFormat getPreferredPF()

+ 2
- 3
java/com/tigervnc/vncviewer/Viewport.java View File

@@ -101,8 +101,7 @@ class Viewport extends JPanel implements MouseListener,
Rect r = frameBuffer.getDamage();
if (!r.is_empty()) {
if (image == null)
image = (BufferedImage)createImage(frameBuffer.width(), frameBuffer.height());
image.getRaster().setDataElements(r.tl.x, r.tl.y, frameBuffer.getBuffer(r));
image = (BufferedImage)frameBuffer.getImage();
if (cc.cp.width != scaledWidth ||
cc.cp.height != scaledHeight) {
AffineTransform t = new AffineTransform();
@@ -198,7 +197,7 @@ class Viewport extends JPanel implements MouseListener,
frameBuffer = createFramebuffer(frameBuffer.getPF(), w, h);
assert(frameBuffer != null);
cc.setFramebuffer(frameBuffer);
image = null;
image = (BufferedImage)frameBuffer.getImage();
}
setScaledSize(w, h);
}

Loading…
Cancel
Save