summaryrefslogtreecommitdiff
path: root/gnu/java/awt/peer/gtk
diff options
context:
space:
mode:
authorPaul Fisher <rao@gnu.org>1999-03-01 21:26:17 +0000
committerPaul Fisher <rao@gnu.org>1999-03-01 21:26:17 +0000
commitc7c43c3038f6561f97bc6f92a6cf46212e91407b (patch)
tree4051f2d660a4a2b1ee79bd6d2d41237efeee2fe1 /gnu/java/awt/peer/gtk
parentb057c245049777e336e29423c3803d62830aa357 (diff)
downloadclasspath-c7c43c3038f6561f97bc6f92a6cf46212e91407b.tar.gz
Initial image code support (scaling methods of Graphics are not
yet supported).
Diffstat (limited to 'gnu/java/awt/peer/gtk')
-rw-r--r--gnu/java/awt/peer/gtk/GdkGraphics.java10
-rw-r--r--gnu/java/awt/peer/gtk/GtkImage.java213
-rw-r--r--gnu/java/awt/peer/gtk/GtkImagePainter.java121
-rw-r--r--gnu/java/awt/peer/gtk/GtkToolkit.java2
-rw-r--r--gnu/java/awt/peer/gtk/Makefile5
-rw-r--r--gnu/java/awt/peer/gtk/Test.java18
6 files changed, 360 insertions, 9 deletions
diff --git a/gnu/java/awt/peer/gtk/GdkGraphics.java b/gnu/java/awt/peer/gtk/GdkGraphics.java
index 6e9fb4297..e894fa96b 100644
--- a/gnu/java/awt/peer/gtk/GdkGraphics.java
+++ b/gnu/java/awt/peer/gtk/GdkGraphics.java
@@ -9,11 +9,13 @@ public class GdkGraphics extends Graphics
int xOrigin = 0, yOrigin = 0;
Color color;
+ GtkComponentPeer component;
native int[] initState (GtkComponentPeer component);
GdkGraphics (GtkComponentPeer component)
{
+ this.component = component;
int rgb[] = initState (component);
color = new Color (rgb[0], rgb[1], rgb[2]);
}
@@ -34,7 +36,7 @@ public class GdkGraphics extends Graphics
public Graphics create ()
{
- return null;
+ return new GdkGraphics (component);
}
native public void dispose ();
@@ -51,12 +53,14 @@ public class GdkGraphics extends Graphics
public boolean drawImage (Image img, int x, int y,
Color bgcolor, ImageObserver observer)
{
- return false;
+ GtkImage image = (GtkImage) img;
+ new GtkImagePainter (image, this, x, y, bgcolor);
+ return image.isLoaded ();
}
public boolean drawImage (Image img, int x, int y, ImageObserver observer)
{
- return false;
+ return drawImage (img, x, y, component.getBackground (), observer);
}
public boolean drawImage (Image img, int x, int y, int width, int height,
diff --git a/gnu/java/awt/peer/gtk/GtkImage.java b/gnu/java/awt/peer/gtk/GtkImage.java
new file mode 100644
index 000000000..f2ff139bd
--- /dev/null
+++ b/gnu/java/awt/peer/gtk/GtkImage.java
@@ -0,0 +1,213 @@
+package gnu.java.awt.peer.gtk;
+
+import java.awt.*;
+import java.util.*;
+import java.awt.image.*;
+
+public class GtkImage extends Image implements ImageConsumer
+{
+ int width = -1, height = -1;
+ Hashtable props = null;
+ boolean isLoaded = false;
+ boolean isCacheable = true;
+
+ Vector widthObservers = new Vector ();
+ Vector heightObservers = new Vector ();
+ Vector propertyObservers = new Vector ();
+
+ ImageProducer source;
+ Graphics g;
+
+ /* Variables in which we stored cached data, if possible.
+
+ An image is cached if the following properties are true:
+ 1. The ColorModel passed into setColorModel is the same ColorModel
+ passed to all invocations of setPixels.
+ 2. The image contains a single frame.
+
+ */
+ int[] pixelCache;
+ ColorModel model;
+
+ public
+ GtkImage (ImageProducer producer, Graphics g)
+ {
+ source = producer;
+ this.g = g;
+
+ source.addConsumer (this);
+ }
+
+ public synchronized int
+ getWidth (ImageObserver observer)
+ {
+ if (width == -1)
+ widthObservers.addElement (observer);
+
+ return width;
+ }
+
+ public synchronized int
+ getHeight (ImageObserver observer)
+ {
+ if (height == -1)
+ heightObservers.addElement (observer);
+
+ return height;
+ }
+
+ public ImageProducer
+ getSource ()
+ {
+ return source;
+ }
+
+ public Graphics
+ getGraphics ()
+ {
+ return g;
+ }
+
+ public synchronized Object
+ getProperty (String name, ImageObserver observer)
+ {
+ if (props == null)
+ {
+ propertyObservers.addElement (observer);
+ return null;
+ }
+
+ Object value = props.get (name);
+ return (value == null) ? UndefinedProperty : value;
+ }
+
+ public synchronized void
+ flush ()
+ {
+ isLoaded = false;
+ isCacheable = true;
+ width = height = -1;
+ props = null;
+ pixelCache = null;
+ model = null;
+
+ source.removeConsumer (this);
+ source.addConsumer (this);
+ }
+
+ public boolean
+ isLoaded ()
+ {
+ return isLoaded;
+ }
+
+ /* ImageConsumer methods */
+
+ public synchronized void
+ setDimensions (int width, int height)
+ {
+ pixelCache = new int[width*height];
+
+ this.width = width;
+ this.height = height;
+
+ for (int i = 0; i < widthObservers.size (); i++)
+ {
+ ImageObserver io = (ImageObserver) widthObservers.elementAt (i);
+ io.imageUpdate (this, ImageObserver.WIDTH, -1, -1, width, height);
+ }
+
+ for (int i = 0; i < heightObservers.size (); i++)
+ {
+ ImageObserver io = (ImageObserver) heightObservers.elementAt (i);
+ io.imageUpdate (this, ImageObserver.HEIGHT, -1, -1, width, height);
+ }
+ }
+
+ public synchronized void
+ setProperties (Hashtable props)
+ {
+ this.props = props;
+
+ for (int i = 0; i < propertyObservers.size (); i++)
+ {
+ ImageObserver io = (ImageObserver) propertyObservers.elementAt (i);
+ io.imageUpdate (this, ImageObserver.PROPERTIES, -1, -1, width, height);
+ }
+ }
+
+ public synchronized void
+ setColorModel (ColorModel model)
+ {
+ if (this.model == null || this.model == model)
+ this.model = model;
+ else
+ isCacheable = false;
+ }
+
+ public synchronized void
+ setHints (int flags)
+ {
+ }
+
+ public synchronized void
+ setPixels (int x, int y, int width, int height, ColorModel cm, byte[] pixels,
+ int offset, int scansize)
+ {
+ setPixels (x, y, width, height, cm, convertPixels (pixels), offset,
+ scansize);
+ }
+
+ public synchronized void
+ setPixels (int x, int y, int width, int height, ColorModel cm, int[] pixels,
+ int offset, int scansize)
+ {
+ if (!isCacheable)
+ return;
+
+ if (cm != model || pixelCache == null)
+ {
+ isCacheable = false;
+ return;
+ }
+
+ System.arraycopy (pixels, offset,
+ pixelCache, y * this.width + x,
+ pixels.length - offset);
+ }
+
+ public synchronized void
+ imageComplete (int status)
+ {
+ if (status == ImageConsumer.STATICIMAGEDONE && isCacheable)
+ isLoaded = true;
+
+ if (status == ImageConsumer.SINGLEFRAMEDONE)
+ isCacheable = false;
+
+ source.removeConsumer (this);
+ }
+
+ public synchronized void
+ startProduction (GtkImagePainter painter)
+ {
+ if (isLoaded)
+ painter.setPixels (0, 0, width, height, model, pixelCache, 0, width);
+ else
+ {
+ source.startProduction (painter);
+ source.removeConsumer (painter);
+ }
+ }
+
+ private int[]
+ convertPixels (byte[] pixels)
+ {
+ int ret[] = new int[pixels.length];
+
+ for (int i = 0; i < pixels.length; i++)
+ ret[i] = pixels[i];
+
+ return ret;
+ }
+}
diff --git a/gnu/java/awt/peer/gtk/GtkImagePainter.java b/gnu/java/awt/peer/gtk/GtkImagePainter.java
new file mode 100644
index 000000000..d6ea387fa
--- /dev/null
+++ b/gnu/java/awt/peer/gtk/GtkImagePainter.java
@@ -0,0 +1,121 @@
+package gnu.java.awt.peer.gtk;
+
+import java.awt.*;
+import java.awt.image.*;
+import java.util.*;
+
+public class GtkImagePainter implements Runnable, ImageConsumer
+{
+ GtkImage image;
+ GdkGraphics gc;
+ int startX, startY;
+ int redBG;
+ int greenBG;
+ int blueBG;
+
+ public
+ GtkImagePainter (GtkImage image, GdkGraphics gc, int x, int y, Color bgcolor)
+ {
+ this.image = image;
+ this.gc = (GdkGraphics) gc.create ();
+ startX = x;
+ startY = y;
+ redBG = bgcolor.getRed ();
+ greenBG = bgcolor.getGreen ();
+ blueBG = bgcolor.getBlue ();
+
+ new Thread (this).start ();
+ }
+
+ public void
+ run ()
+ {
+ image.startProduction (this);
+ gc.dispose ();
+ }
+
+ /* Convert pixel data into a format that gdkrgb can understand */
+ static int[]
+ convertPixels (int[] pixels, ColorModel model)
+ {
+ if (model instanceof DirectColorModel)
+ return pixels;
+
+ int ret[] = new int[pixels.length];
+
+ for (int i = 0; i < pixels.length; i++)
+ ret[i] = model.getRGB (pixels[i]);
+
+ return ret;
+ }
+
+ static int[]
+ convertPixels (byte[] pixels, ColorModel model)
+ {
+ int ret[] = new int[pixels.length];
+
+ if (model instanceof DirectColorModel)
+ {
+ for (int i = 0; i < pixels.length; i++)
+ ret[i] = pixels[i];
+ }
+ else
+ {
+ for (int i = 0; i < pixels.length; i++)
+ ret[i] = model.getRGB (pixels[i]);
+ }
+
+ return ret;
+ }
+
+ native void
+ drawPixels (GdkGraphics gc, int bg_red, int bg_green, int bg_blue,
+ int x, int y, int width, int height, int[] pixels, int offset,
+ int scansize);
+
+
+ public void
+ setPixels (int x, int y, int width, int height, ColorModel model,
+ int[] pixels, int offset, int scansize)
+ {
+ drawPixels (gc, redBG, greenBG, blueBG,
+ startX + x, startY + y,
+ width, height, convertPixels (pixels, model), offset,
+ scansize);
+ }
+
+ public void
+ setPixels (int x, int y, int width, int height, ColorModel model,
+ byte[] pixels, int offset, int scansize)
+ {
+ drawPixels (gc, redBG, greenBG, blueBG,
+ startX + x, startY + y,
+ width, height, convertPixels (pixels, model), offset,
+ scansize);
+ }
+
+ public void
+ setDimensions (int width, int height)
+ {
+ }
+
+ public void
+ setProperties (Hashtable props)
+ {
+ }
+
+ public void
+ setColorModel (ColorModel model)
+ {
+ }
+
+ public void
+ setHints (int flags)
+ {
+ }
+
+ public void
+ imageComplete (int status)
+ {
+ }
+}
diff --git a/gnu/java/awt/peer/gtk/GtkToolkit.java b/gnu/java/awt/peer/gtk/GtkToolkit.java
index 371a47e85..3a4f462df 100644
--- a/gnu/java/awt/peer/gtk/GtkToolkit.java
+++ b/gnu/java/awt/peer/gtk/GtkToolkit.java
@@ -63,7 +63,7 @@ public class GtkToolkit extends java.awt.Toolkit
public Image createImage (ImageProducer producer)
{
- return null;
+ return new GtkImage (producer, null);
}
public Image createImage (byte[] imagedata, int imageoffset,
diff --git a/gnu/java/awt/peer/gtk/Makefile b/gnu/java/awt/peer/gtk/Makefile
index 20a6a9ecb..d178f8824 100644
--- a/gnu/java/awt/peer/gtk/Makefile
+++ b/gnu/java/awt/peer/gtk/Makefile
@@ -14,14 +14,15 @@ objects = GtkButtonPeer.class GtkFileDialogPeer.class GtkPanelPeer.class \
GtkGenericPeer.class GtkCheckboxPeer.class Test.class \
GtkTextComponentPeer.class GtkTextFieldPeer.class \
GtkTextAreaPeer.class GtkLabelPeer.class GtkListPeer.class \
- GtkScrollbarPeer.class GdkGraphics.class GtkCanvasPeer.class
+ GtkScrollbarPeer.class GdkGraphics.class GtkCanvasPeer.class \
+ GtkImage.class GtkImagePainter.class
jniclass = GtkButtonPeer GtkFileDialogPeer GtkComponentPeer \
GtkContainerPeer GtkWindowPeer GtkMainThread \
GtkScrollPanePeer GtkCheckboxPeer GtkToolkit \
GtkChoicePeer GtkTextComponentPeer \
GtkTextFieldPeer GtkTextAreaPeer GtkLabelPeer \
GtkListPeer GtkScrollbarPeer GdkGraphics GtkCanvasPeer \
- GtkPanelPeer GtkDialogPeer
+ GtkPanelPeer GtkDialogPeer GtkImagePainter
jnideps := $(foreach class,$(jniclass),$(package)_$(strip $(class)).h)
all: Test headers
diff --git a/gnu/java/awt/peer/gtk/Test.java b/gnu/java/awt/peer/gtk/Test.java
index dce52282c..cc72af962 100644
--- a/gnu/java/awt/peer/gtk/Test.java
+++ b/gnu/java/awt/peer/gtk/Test.java
@@ -23,6 +23,8 @@ import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.peer.*;
+import gnu.java.awt.image.*;
+import java.io.*;
class Test
{
@@ -54,13 +56,23 @@ class Test
TextField tf = new TextField("Hello world!");
pan.add(tf);
+ final Image img;
+ try {
+ img = Toolkit.getDefaultToolkit ().createImage (new XBMDecoder (new FileInputStream ("/home/rao/fvwm.xbm")));
+ } catch (FileNotFoundException ex) { img = null; }
+
+
final Canvas ch = new Canvas () {
public void paint (Graphics g) {
- g.setColor (Color.blue);
- g.drawLine (xs,ys,xs+20,ys+20);
+// g.setColor (Color.blue);
+// g.drawLine (xs,ys,xs+20,ys+20);
+
+
+ System.out.println (g.drawImage (img, 0, 0, this));
}
};
- ch.setSize(50, 50);
+
+ ch.setSize(60, 60);
// List ch=new List();
// ch.add("Ding");
// ch.add("September");