XCanvasPeer.java (createImage): Implement.
authorScott Gilbertson <scottg@mantatest.com>
Mon, 12 Jul 2004 16:26:07 +0000 (16:26 +0000)
committerScott Gilbertson <sgilbertson@gcc.gnu.org>
Mon, 12 Jul 2004 16:26:07 +0000 (16:26 +0000)
2004-07-12  Scott Gilbertson  <scottg@mantatest.com>

* gnu/awt/xlib/XCanvasPeer.java (createImage): Implement.
* gnu/awt/xlib/XOffScreenImage.java
  (XOffScreenImage): Add ImageConsumer interface. Add ColorModel
  constructor argument. Add constructor using ImageProducer.
  (getSource): Implement.
  (imageComplete): New method.
  (setColorModel): New method.
  (setDimensions): New method.
  (setHints): New method.
  (setPixels): New method.
  (setProperties): New method.
* gnu/gcj/xlib/GC.java (drawPoint): New native method.
* gnu/gcj/xlib/natGC.cc (drawPoint): New native method.

From-SVN: r84564

libjava/ChangeLog
libjava/gnu/awt/xlib/XCanvasPeer.java
libjava/gnu/awt/xlib/XOffScreenImage.java
libjava/gnu/gcj/xlib/GC.java
libjava/gnu/gcj/xlib/natGC.cc

index 34f5a85fa751d716ee8582da1fafadc04d83dae4..e8b80b6ce24f84981d9cfae34b2d2499be6681e7 100644 (file)
@@ -1,3 +1,19 @@
+2004-07-12  Scott Gilbertson  <scottg@mantatest.com>
+
+       * gnu/awt/xlib/XCanvasPeer.java (createImage): Implement.
+       * gnu/awt/xlib/XOffScreenImage.java
+         (XOffScreenImage): Add ImageConsumer interface. Add ColorModel
+         constructor argument. Add constructor using ImageProducer.
+         (getSource): Implement.
+         (imageComplete): New method.
+         (setColorModel): New method.
+         (setDimensions): New method.
+         (setHints): New method.
+         (setPixels): New method.
+         (setProperties): New method.
+       * gnu/gcj/xlib/GC.java (drawPoint): New native method. 
+       * gnu/gcj/xlib/natGC.cc (drawPoint): New native method.
+
 2004-07-11  Bryce McKinlay  <mckinlay@redhat.com>
 
        PR libgcj/16478 
index d8a00db9d0aa14caadaab1f9c0475d792c13387b..5daee59dcd711f08815454a3d8515195099bb972 100644 (file)
@@ -210,11 +210,11 @@ public class XCanvasPeer implements CanvasPeer
   }
   public Image createImage(ImageProducer prod)
   {
-    throw new UnsupportedOperationException("FIXME, not implemented");
+    return new XOffScreenImage (config, window, prod, config.getColorModel());
   }
   public Image createImage(int width, int height)
   {
-    return new XOffScreenImage (config, window, width, height);
+    return new XOffScreenImage (config, window, width, height, config.getColorModel());
   }
   public void dispose()
   {
index 71791c1be5f4fddc5dbb922d1812c7755e51ab52..0ea6c1b3a0ae22dc0b4e04034355acc6d228e19b 100644 (file)
@@ -15,6 +15,7 @@ import java.awt.GraphicsConfiguration;
 import java.awt.image.ColorModel;
 import java.awt.image.ImageObserver;
 import java.awt.image.ImageProducer;
+import java.awt.image.ImageConsumer;
 import java.util.Hashtable;
 import gnu.awt.j2d.DirectRasterGraphics;
 import gnu.awt.j2d.Graphics2DImpl;
@@ -23,6 +24,7 @@ import gnu.gcj.xlib.Drawable;
 import gnu.gcj.xlib.Pixmap;
 import gnu.gcj.xlib.Screen;
 import gnu.gcj.xlib.Visual;
+import gnu.gcj.xlib.GC;
 
 /** Image class for xlib off-screen buffers.
  * The image is stored in a server-side pixmap for best performance.
@@ -34,12 +36,17 @@ import gnu.gcj.xlib.Visual;
  * @author  scott gilbertson <scottg@mantatest.com> <sgilbertson@cogeco.ca>
  */
 public class XOffScreenImage extends Image 
-                             implements IntegerGraphicsState.ScreenCoupledImage
+                             implements IntegerGraphicsState.ScreenCoupledImage,
+                             ImageConsumer
 {
   private Pixmap pixmap;
   private XGraphicsConfiguration config;
   private int width;
   private int height;
+  private Drawable drawable;
+  private ImageProducer prod;
+  private GC gc;
+  private ColorModel pixmapColorModel;
   
   /** Create a new XOffScreenImage
    * @param config Graphics configuration, to compare against on-screen 
@@ -47,13 +54,35 @@ public class XOffScreenImage extends Image
    * @param drawable The drawable with which the image is compatible
    * @param width The width of the image
    * @param height The height of the image
+   * @param cm The ColorModel associated with drawable
    */
-  XOffScreenImage (XGraphicsConfiguration config, Drawable drawable, int width, int height)
+  XOffScreenImage (XGraphicsConfiguration config, Drawable drawable, int width, int height, ColorModel cm)
   {
     this.config = config;
     this.width = width;
     this.height = height;
+    this.drawable = drawable;
+    pixmapColorModel = cm;
     pixmap = new Pixmap (drawable, width, height, drawable.getDepth ());
+    gc = GC.create (pixmap);
+  }
+  
+  /** Create a new XOffScreenImage and obtain image data from an ImageProducer
+   * @param config Graphics configuration, to compare against on-screen 
+   *               components and to create the appropriate Graphics
+   * @param drawable The drawable with which the image is compatible
+   * @param prod The source of image data for this image
+   * @param cm The ColorModel associated with drawable
+   */
+  XOffScreenImage (XGraphicsConfiguration config, Drawable drawable, ImageProducer prod, ColorModel cm)
+  {
+    this.config = config;
+    this.width = 0;  // size will be overridden in a moment
+    this.height = 0;
+    this.drawable = drawable;
+    this.prod = prod;
+    pixmapColorModel = cm;
+    prod.startProduction (this);
   }
   
   /** Get the pixmap which contains this image
@@ -120,7 +149,10 @@ public class XOffScreenImage extends Image
    */
   public ImageProducer getSource ()
   {
-    throw new UnsupportedOperationException ("getSource not supported");
+    if (prod == null)
+      throw new UnsupportedOperationException ("getSource not supported");
+    else
+      return prod;
   }
   
   /** Returns the width of the image, or -1 if it is unknown.  If the
@@ -172,4 +204,77 @@ public class XOffScreenImage extends Image
   {
     return config;
   }
+  
+  public void imageComplete (int status)
+  {
+  }
+  
+  public void setColorModel (ColorModel model)
+  {
+  }
+  
+  public void setDimensions (int width, int height)
+  {
+    this.width = width;
+    this.height = height;
+    pixmap = new Pixmap (drawable, width, height, drawable.getDepth ());
+    gc = GC.create (pixmap);
+  }
+  
+  public void setHints (int flags)
+  {
+  }
+  
+  public void setPixels (int x, int y, int w, int h, ColorModel model, int[] pixels, int offset, int scansize)
+  {
+    int idx = 0;
+    float[] normalizedComponents = new float [4];
+    int[] unnormalizedComponents = { 0, 0, 0, 0xff };
+    normalizedComponents[3] = 1;
+    for (int yp=y; yp < (y + h); yp++)
+    {
+      for (int xp=x; xp < (x + w); xp++)
+      {
+        int p = (yp - y) * scansize + (xp - x) + offset;
+        // FIXME: there HAS to be a more efficient mechanism for color mapping
+        normalizedComponents[0] = (float)model.getRed (pixels[p]) / 255F;
+        normalizedComponents[1] = (float)model.getGreen (pixels[p]) / 255F;
+        normalizedComponents[2] = (float)model.getBlue (pixels[p]) / 255F;
+        pixmapColorModel.getUnnormalizedComponents (normalizedComponents, 0,
+          unnormalizedComponents, 0);
+        int pixelColor = pixmapColorModel.getDataElement (unnormalizedComponents, 0);
+        gc.setForeground (pixelColor);
+        gc.drawPoint (xp, yp);
+      }
+    }
+  }
+  
+  public void setPixels (int x, int y, int w, int h, ColorModel model, byte[] pixels, int offset, int scansize)
+  {
+    int idx = 0;
+    float[] normalizedComponents = new float [4];
+    int[] unnormalizedComponents = { 0, 0, 0, 0xff };
+    normalizedComponents[3] = 1;
+    for (int yp=y; yp < (y + h); yp++)
+    {
+      for (int xp=x; xp < (x + w); xp++)
+      {
+        // FIXME: there HAS to be a more efficient mechanism for color mapping
+        int p = (yp - y) * scansize + (xp - x) + offset;
+        normalizedComponents[0] = (float)model.getRed (pixels[p]) / 255F;
+        normalizedComponents[1] = (float)model.getGreen (pixels[p]) / 255F;
+        normalizedComponents[2] = (float)model.getBlue (pixels[p]) / 255F;
+        pixmapColorModel.getUnnormalizedComponents (normalizedComponents, 0,
+          unnormalizedComponents, 0);
+        int pixelColor = pixmapColorModel.getDataElement (unnormalizedComponents, 0);
+        gc.setForeground (pixelColor);
+        gc.drawPoint (xp, yp);
+      }
+    }
+  }
+  
+  public void setProperties (Hashtable props)
+  {
+  }
+  
 }
index da427c9ab9dd73cb4e01d4699e87b98559a30cc7..1a47cf66da93a5c32a036f1345ef0367c1f41fca 100644 (file)
@@ -132,6 +132,11 @@ public class GC implements Cloneable
   public native void clearArea(int x, int y, int w, int h,
                               boolean exposures);
 
+  /** Draw a point using the current foreground color
+   * @param x The x coordinate at which to draw
+   * @param t The y coordinate at which to draw
+   */
+  public native void drawPoint (int x, int y);
 
   public native void putImage(XImage image,
                              int srcX, int srcY,
index 3819da450052a710c972cd4b2d4707c9c7076f13..4529ebb609fb82cf553edf98b88bc4bdb7e1658e 100644 (file)
@@ -117,6 +117,15 @@ void gnu::gcj::xlib::GC::drawString(jstring text, jint x, jint y)
   XDrawString16(dpy, drawableXID, gc, x, y, xwchars, length);
 }
 
+void gnu::gcj::xlib::GC::drawPoint(jint x, jint y)
+{
+  Display* display = target->getDisplay();
+  ::Display* dpy = (::Display*) (display->display);
+  ::Drawable drawableXID = target->getXID();
+  ::GC gc = (::GC) structure;
+  XDrawPoint (dpy, drawableXID, gc, x, y);
+}
+
 void gnu::gcj::xlib::GC::drawLine(jint x1, jint y1, jint x2, jint y2)
 {
   Display* display = target->getDisplay();