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