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

public JpegDecompressor() {} public JpegDecompressor() {}


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


byte[] src = new byte[jpegBufLen]; byte[] src = new byte[jpegBufLen];
ImageIO.setUseCache(false); ImageIO.setUseCache(false);
BufferedImage jpeg = BufferedImage jpeg =
ImageIO.read(new MemoryCacheImageInputStream(new ByteArrayInputStream(src))); 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(); 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(); g2.dispose();
image.flush(); image.flush();
jpeg.flush(); jpeg.flush();

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



package com.tigervnc.rfb; package com.tigervnc.rfb;


import java.awt.*;
import java.awt.image.*; import java.awt.image.*;
import java.awt.Color; import java.awt.Color;
import java.nio.*; import java.nio.*;
// specific format. // specific format.
//void getImage(const PixelFormat& pf, void* imageBuf, //void getImage(const PixelFormat& pf, void* imageBuf,
// const Rect& r, int stride=0) const; // const Rect& r, int stride=0) const;
public Image getImage() { return image; }


/////////////////////////////////////////////// ///////////////////////////////////////////////
// Framebuffer update methods // Framebuffer update methods


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

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

buflen -= 4; buflen -= 4;


// We always use direct decoding with JPEG images // 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); pb.commitBufferRW(r);
return; return;
} }

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



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


import com.tigervnc.rfb.*; import com.tigervnc.rfb.*;


public JavaPixelBuffer(int w, int h) { public JavaPixelBuffer(int w, int h) {
super(getPreferredPF(), w, h, super(getPreferredPF(), w, h,
getPreferredPF().getColorModel().createCompatibleWritableRaster(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() private static PixelFormat getPreferredPF()

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

Rect r = frameBuffer.getDamage(); Rect r = frameBuffer.getDamage();
if (!r.is_empty()) { if (!r.is_empty()) {
if (image == null) 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 || if (cc.cp.width != scaledWidth ||
cc.cp.height != scaledHeight) { cc.cp.height != scaledHeight) {
AffineTransform t = new AffineTransform(); AffineTransform t = new AffineTransform();
frameBuffer = createFramebuffer(frameBuffer.getPF(), w, h); frameBuffer = createFramebuffer(frameBuffer.getPF(), w, h);
assert(frameBuffer != null); assert(frameBuffer != null);
cc.setFramebuffer(frameBuffer); cc.setFramebuffer(frameBuffer);
image = null;
image = (BufferedImage)frameBuffer.getImage();
} }
setScaledSize(w, h); setScaledSize(w, h);
} }

Loading…
Cancel
Save