@@ -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(); |
@@ -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; | |||
} |
@@ -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; | |||
} |
@@ -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() |
@@ -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); | |||
} |