diff options
author | Paul Fisher <rao@gnu.org> | 1999-03-01 21:26:17 +0000 |
---|---|---|
committer | Paul Fisher <rao@gnu.org> | 1999-03-01 21:26:17 +0000 |
commit | c7c43c3038f6561f97bc6f92a6cf46212e91407b (patch) | |
tree | 4051f2d660a4a2b1ee79bd6d2d41237efeee2fe1 /gnu/java/awt/peer/gtk | |
parent | b057c245049777e336e29423c3803d62830aa357 (diff) | |
download | classpath-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.java | 10 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkImage.java | 213 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkImagePainter.java | 121 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/GtkToolkit.java | 2 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/Makefile | 5 | ||||
-rw-r--r-- | gnu/java/awt/peer/gtk/Test.java | 18 |
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"); |