summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Torre <neugens@limasoftware.net>2008-09-01 16:07:30 +0000
committerMario Torre <neugens@limasoftware.net>2008-09-01 16:07:30 +0000
commite6b426c06016fe3f2c5ad814caf42d486564b9a0 (patch)
tree831509d84a40566f79d42464fcc3ca7b486868e6
parentb42079a4f1e4738c5ba9d30b4b9afb0f4bd3f2e3 (diff)
downloadclasspath-e6b426c06016fe3f2c5ad814caf42d486564b9a0.tar.gz
2008-09-01 Mario Torre <neugens@aicas.com>
* 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.
-rw-r--r--ChangeLog8
-rw-r--r--gnu/java/awt/peer/x/XGraphicsDevice.java27
-rw-r--r--gnu/java/awt/peer/x/XImage.java76
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 <neugens@aicas.com>
+
+ * 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_andrew@member.fsf.org>
* 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<ImageConsumer> consumers = new Vector<ImageConsumer>();
+
+ @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!");
+ }
+ }
}