From e6b426c06016fe3f2c5ad814caf42d486564b9a0 Mon Sep 17 00:00:00 2001 From: Mario Torre Date: Mon, 1 Sep 2008 16:07:30 +0000 Subject: 2008-09-01 Mario Torre * gnu/java/awt/peer/x/XGraphicsDevice.java (getDisplay): fix to support new Escher API. * gnu/java/awt/peer/x/XImage.java (getSource): method implemented. * gnu/java/awt/peer/x/XImage.java (XImageProducer): implement ImageProducer for getSource. --- ChangeLog | 8 ++++ gnu/java/awt/peer/x/XGraphicsDevice.java | 27 +++++++++--- gnu/java/awt/peer/x/XImage.java | 76 +++++++++++++++++++++++++++++++- 3 files changed, 104 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1c9a12aa8..89d32d24a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-09-01 Mario Torre + + * gnu/java/awt/peer/x/XGraphicsDevice.java (getDisplay): fix to support + new Escher API. + * gnu/java/awt/peer/x/XImage.java (getSource): method implemented. + * gnu/java/awt/peer/x/XImage.java (XImageProducer): implement ImageProducer + for getSource. + 2008-09-01 Andrew John Hughes * gnu/java/util/regex/RETokenStart.java: diff --git a/gnu/java/awt/peer/x/XGraphicsDevice.java b/gnu/java/awt/peer/x/XGraphicsDevice.java index eff5902d2..ca37f3adb 100644 --- a/gnu/java/awt/peer/x/XGraphicsDevice.java +++ b/gnu/java/awt/peer/x/XGraphicsDevice.java @@ -39,6 +39,7 @@ package gnu.java.awt.peer.x; import gnu.classpath.SystemProperties; import gnu.x11.Display; +import gnu.x11.EscherServerConnectionException; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; @@ -127,9 +128,16 @@ public class XGraphicsDevice Socket socket = createLocalSocket(); if (socket != null) { - display = new Display(socket, "localhost", - displayName.display_no, - displayName.screen_no); + try + { + display = new Display(socket, "localhost", + displayName.display_no, + displayName.screen_no); + } + catch (EscherServerConnectionException e) + { + throw new RuntimeException(e.getCause()); + } } } @@ -137,8 +145,17 @@ public class XGraphicsDevice // when the connection is probably remote or when we couldn't load // the LocalSocket class stuff. if (display == null) - display = new Display(displayName); - + { + try + { + display = new Display(displayName); + } + catch (EscherServerConnectionException e) + { + throw new RuntimeException(e.getCause()); + } + } + eventPump = new XEventPump(display); } return display; diff --git a/gnu/java/awt/peer/x/XImage.java b/gnu/java/awt/peer/x/XImage.java index 7d4636b95..0db5ae3dd 100644 --- a/gnu/java/awt/peer/x/XImage.java +++ b/gnu/java/awt/peer/x/XImage.java @@ -39,13 +39,19 @@ exception statement from your version. */ package gnu.java.awt.peer.x; import gnu.x11.Pixmap; +import gnu.x11.image.ZPixmap; import java.awt.Graphics; import java.awt.GraphicsEnvironment; import java.awt.Image; + +import java.awt.image.ColorModel; +import java.awt.image.ImageConsumer; import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; + import java.util.Hashtable; +import java.util.Vector; public class XImage extends Image @@ -75,8 +81,7 @@ public class XImage public ImageProducer getSource() { - // TODO: Implement this. - throw new UnsupportedOperationException("Not yet implemented."); + return new XImageProducer(); } /** @@ -108,4 +113,71 @@ public class XImage { pixmap.free(); } + + protected class XImageProducer implements ImageProducer + { + private Vector consumers = new Vector(); + + @Override + public void addConsumer(ImageConsumer ic) + { + if (ic != null && !isConsumer(ic)) + this.consumers.add(ic); + } + + @Override + public boolean isConsumer(ImageConsumer ic) + { + return this.consumers.contains(ic); + } + + @Override + public void removeConsumer(ImageConsumer ic) + { + if (ic != null) + this.consumers.remove(ic); + } + + @Override + public void requestTopDownLeftRightResend(ImageConsumer ic) + { + /* just ignore the call */ + } + + @Override + public void startProduction(ImageConsumer ic) + { + this.addConsumer(ic); + + for (ImageConsumer consumer : this.consumers) + { + int width = XImage.this.getWidth(null); + int height = XImage.this.getHeight(null); + + XGraphics2D graphics = (XGraphics2D) getGraphics(); + ColorModel model = graphics.getColorModel(); + graphics.dispose(); + + ZPixmap zpixmap = (ZPixmap) + XImage.this.pixmap.image(0, 0, width, height, + 0xffffffff, + gnu.x11.image.Image.Format.ZPIXMAP); + + int size = zpixmap.get_data_length(); + System.out.println("size: " + size + ", w = " + width + ", h = " + height); + + int [] pixel = new int[size]; + for (int i = 0; i < size; i++) + pixel[i] = zpixmap.get_data_element(i); + + consumer.setHints(ImageConsumer.SINGLEPASS); + + consumer.setDimensions(width, height); + consumer.setPixels(0, 0, width, height, model, pixel, 0, width); + consumer.imageComplete(ImageConsumer.STATICIMAGEDONE); + } + + System.out.println("done!"); + } + } } -- cgit v1.2.1