From 2622c79d2d51f6bf9122a3b5f458daa50c0baf19 Mon Sep 17 00:00:00 2001
From: "Rolf W. Rasmussen" <rolfwr@ii.uib.no>
Date: Sun, 22 Oct 2000 19:46:09 +0200
Subject: Makefile.am: Added rules for libgcjx library.

	* Makefile.am: Added rules for libgcjx library.
	* Makefile.in: Rebuilt.
	* configure.in: Added check for X.
	* configure: Rebuilt.
	* gnu/awt/LightweightRedirector.java: New file.
	* gnu/awt/j2d/AbstractGraphicsState.java: New file.
	* gnu/awt/j2d/DirectRasterGraphics.java: New file.
	* gnu/awt/j2d/Graphics2DImpl.java: New file.
	* gnu/awt/j2d/IntegerGraphicsState.java: New file.
	* gnu/awt/j2d/MappedRaster.java: New file.
	* gnu/awt/xlib/XCanvasPeer.java: New file.
	* gnu/awt/xlib/XEventLoop.java: New file.
	* gnu/awt/xlib/XEventQueue.java: New file.
	* gnu/awt/xlib/XFontMetrics.java: New file.
	* gnu/awt/xlib/XFramePeer.java: New file.
	* gnu/awt/xlib/XGraphics.java: New file.
	* gnu/awt/xlib/XGraphicsConfiguration.java: New file.
	* gnu/awt/xlib/XPanelPeer.java: New file.
	* gnu/awt/xlib/XToolkit.java: New file.
	* gnu/gcj/xlib/Clip.java: New file.
	* gnu/gcj/xlib/Colormap.java: New file.
	* gnu/gcj/xlib/Display.java: New file.
	* gnu/gcj/xlib/Drawable.java: New file.
	* gnu/gcj/xlib/Font.java: New file.
	* gnu/gcj/xlib/GC.java: New file.
	* gnu/gcj/xlib/Pixmap.java: New file.
	* gnu/gcj/xlib/Screen.java: New file.
	* gnu/gcj/xlib/Visual.java: New file.
	* gnu/gcj/xlib/WMSizeHints.java: New file.
	* gnu/gcj/xlib/Window.java: New file.
	* gnu/gcj/xlib/WindowAttributes.java: New file.
	* gnu/gcj/xlib/XAnyEvent.java: New file.
	* gnu/gcj/xlib/XButtonEvent.java: New file.
	* gnu/gcj/xlib/XColor.java: New file.
	* gnu/gcj/xlib/XConfigureEvent.java: New file.
	* gnu/gcj/xlib/XConnectException.java: New file.
	* gnu/gcj/xlib/XEvent.java: New file.
	* gnu/gcj/xlib/XException.java: New file.
	* gnu/gcj/xlib/XExposeEvent.java: New file.
	* gnu/gcj/xlib/XID.java: New file.
	* gnu/gcj/xlib/XImage.java: New file.
	* gnu/gcj/xlib/XUnmapEvent.java: New file.
	* gnu/gcj/xlib/natClip.cc: New file.
	* gnu/gcj/xlib/natColormap.cc: New file.
	* gnu/gcj/xlib/natDisplay.cc: New file.
	* gnu/gcj/xlib/natDrawable.cc: New file.
	* gnu/gcj/xlib/natFont.cc: New file.
	* gnu/gcj/xlib/natGC.cc: New file.
	* gnu/gcj/xlib/natPixmap.cc: New file.
	* gnu/gcj/xlib/natScreen.cc: New file.
	* gnu/gcj/xlib/natVisual.cc: New file.
	* gnu/gcj/xlib/natWMSizeHints.cc: New file.
	* gnu/gcj/xlib/natWindow.cc: New file.
	* gnu/gcj/xlib/natWindowAttributes.cc: New file.
	* gnu/gcj/xlib/natXAnyEvent.cc: New file.
	* gnu/gcj/xlib/natXButtonEvent.cc: New file.
	* gnu/gcj/xlib/natXColor.cc: New file.
	* gnu/gcj/xlib/natXConfigureEvent.cc: New file.
	* gnu/gcj/xlib/natXException.cc: New file.
	* gnu/gcj/xlib/natXExposeEvent.cc: New file.
	* gnu/gcj/xlib/natXImage.cc: New file.
	* gnu/gcj/xlib/natXUnmapEvent.cc: New file.
	* java/awt/EventDispatchThread.java: Start thead on creation.

From-SVN: r37005
---
 libjava/gnu/awt/xlib/XGraphicsConfiguration.java | 367 +++++++++++++++++++++++
 1 file changed, 367 insertions(+)
 create mode 100644 libjava/gnu/awt/xlib/XGraphicsConfiguration.java

(limited to 'libjava/gnu/awt/xlib/XGraphicsConfiguration.java')

diff --git a/libjava/gnu/awt/xlib/XGraphicsConfiguration.java b/libjava/gnu/awt/xlib/XGraphicsConfiguration.java
new file mode 100644
index 0000000..af2663b
--- /dev/null
+++ b/libjava/gnu/awt/xlib/XGraphicsConfiguration.java
@@ -0,0 +1,367 @@
+/* Copyright (C) 2000  Free Software Foundation
+
+   This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
+details.  */
+
+package gnu.awt.xlib;
+
+import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
+import java.awt.Graphics2D;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Color;
+import java.awt.color.ColorSpace;
+import java.awt.image.*;
+import java.awt.geom.AffineTransform;
+import gnu.gcj.xlib.GC;
+import gnu.gcj.xlib.Drawable;
+import gnu.gcj.xlib.Window;
+import gnu.gcj.xlib.XImage;
+import gnu.gcj.xlib.Visual;
+import gnu.gcj.xlib.Colormap;
+import gnu.gcj.xlib.XColor;
+import gnu.gcj.xlib.Screen;
+import gnu.gcj.xlib.Display;
+import gnu.gcj.awt.Buffers;
+import java.util.Hashtable;
+
+public class XGraphicsConfiguration extends GraphicsConfiguration
+{
+  //public abstract GraphicsDevice getDevice();
+  
+  Visual visual;
+  int format;
+  Colormap colormap;
+  ColorModel imageCM;
+  ColorModel pixelCM;
+  
+  public XGraphicsConfiguration(Visual visual)
+  {
+    this.visual = visual;
+  }
+
+  public BufferedImage createCompatibleImage(int width, int height)
+  {
+    XImage ximg = new XImage(visual, width, height,
+			     false // do not auto allocate memory
+			     );
+
+    Point origin = new Point(0, 0);
+    WritableRaster raster = createRasterForXImage(ximg, origin);
+
+    /* This is not a good way of doing this. Multiple toolkits may
+       want to share the BufferedImage. */
+    Hashtable props = new Hashtable();
+    props.put("gnu.gcj.xlib.XImage", ximg);
+    props.put("java.awt.GraphicsConfiguration", this);
+    
+    BufferedImage bimg = new BufferedImage(imageCM,raster, false, props);
+
+    DataBuffer dataB = raster.getDataBuffer();
+    attachData(ximg, dataB, 0);
+    return bimg;
+  }
+
+  WritableRaster createRasterForXImage(XImage ximage, Point origin)
+  {
+    if (imageCM == null) prepareColorModel(ximage);
+    
+    /*
+      This will not work, since it creates a sample model that
+      does not necessarily match the format of the XImage.
+      
+      WritableRaster raster =
+      imageCM.createCompatibleWritableRaster(width, height); */
+    
+    // Create a sample model matching the XImage:
+
+    SampleModel imageSM = null;
+
+    int width = ximage.getWidth();
+    int height = ximage.getHeight();
+    int bitsPerPixel = ximage.getBitsPerPixel();
+    int dataType =
+      Buffers.smallestAppropriateTransferType(bitsPerPixel);
+    int bitsPerDataElement = DataBuffer.getDataTypeSize(dataType);
+    int scanlineStride = ximage.getBytesPerLine()*8/bitsPerDataElement;
+    
+    if (imageCM instanceof IndexColorModel)
+      {
+	int[] bandOffsets = {0};
+	imageSM = new ComponentSampleModel(dataType,
+					   width, height,
+					   1, // pixel stride
+					   scanlineStride,
+					   bandOffsets);
+      }
+    else if (imageCM instanceof PackedColorModel)
+      {
+	PackedColorModel pcm = (PackedColorModel) imageCM;
+	int[] masks = pcm.getMasks();
+	
+	imageSM = new SinglePixelPackedSampleModel(dataType,
+						   width, height,
+						   scanlineStride,
+						   masks);
+      }
+
+    if (imageSM == null)
+      {
+	throw new UnsupportedOperationException("creating sample model " +
+						"for " + imageCM +
+						" not implemented");
+      }
+
+    WritableRaster raster = Raster.createWritableRaster(imageSM, origin);
+    return raster;
+  }
+
+
+
+  /**
+   * Attach a the memory of a data buffer to an XImage
+   * structure. [This method is not gnu.awt.xlib specific, and should
+   * maybe be moved to a different location.]
+   *
+   * @param offset Offset to data. The given offset does not include
+   * data buffer offset, which will also be added.  */
+  static void attachData(XImage ximage, DataBuffer dataB, int offset)
+  {
+    offset += dataB.getOffset();
+    switch (dataB.getDataType())
+      {
+      case DataBuffer.TYPE_BYTE:
+	ximage.setData(((DataBufferByte) dataB).getData(), offset);
+	break;
+      case DataBuffer.TYPE_USHORT:
+	ximage.setData(((DataBufferUShort) dataB).getData(), offset);
+	break;
+      case DataBuffer.TYPE_INT:
+	ximage.setData(((DataBufferInt) dataB).getData(), offset);
+	break;
+      default:
+	throw
+	  new UnsupportedOperationException("Do not know how to " +
+					    "set data for data " +
+					    "type " +
+					    dataB.getDataType());
+      }
+  }
+    
+  void prepareColorModel(XImage ximage)
+  {
+    format = ximage.getFormat();
+    int bitsPerPixel = ximage.getBitsPerPixel();
+    switch (format) {
+    case XImage.ZPIXMAP_FORMAT:
+      calcZPixmapModels(bitsPerPixel);
+      break;
+      
+    default:
+      throw new UnsupportedOperationException("unimplemented format");
+    }
+  }
+
+  void calcZPixmapModels(int bitsPerPixel)
+  {
+    switch (visual.getVisualClass())
+      {
+      case Visual.VC_TRUE_COLOR:
+	calcDecomposedRGBModels(bitsPerPixel);
+	break;
+      case Visual.VC_PSEUDO_COLOR:
+	calcPseudoColorModels(bitsPerPixel);
+	break;
+      default:
+	String msg = "unimplemented visual class";
+	throw new UnsupportedOperationException(msg);
+      }
+  }
+    
+  void calcDecomposedRGBModels(int bitsPerPixel)
+  {
+    int dataType = Buffers.smallestAppropriateTransferType(bitsPerPixel);
+    
+    
+    if (DataBuffer.getDataTypeSize(dataType) == bitsPerPixel)
+      {	
+	ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+	
+	imageCM = new DirectColorModel(cs,
+				       visual.getDepth(),
+				       visual.getRedMask(),
+				       visual.getGreenMask(),
+				       visual.getBlueMask(),
+				       0, // no alpha
+				       false,
+				       dataType);
+      }
+    else
+      {
+	throw new
+	  UnsupportedOperationException("unimplemented bits per pixel");
+      }
+    }
+    
+  void calcPseudoColorModels(int bitsPerPixel)
+  {
+    if (colormap == null)
+      colormap = visual.getScreen().getDefaultColormap();
+    
+    XColor[] colArray = colormap.getXColors();
+	
+    int numCol = colArray.length;
+    byte[] rmap = new byte[numCol];
+    byte[] gmap = new byte[numCol];
+    byte[] bmap = new byte[numCol];
+    byte[] amap = new byte[numCol];
+    
+    for (int i=0; i < numCol; i++)
+      {
+	XColor color = colArray[i];
+	if (color.getFlags() == Colormap.FLAG_SHARED)
+	  {
+	    rmap[i] = (byte) (color.getRed()   >> 8);
+	    gmap[i] = (byte) (color.getGreen() >> 8);
+	    bmap[i] = (byte) (color.getBlue()  >> 8);
+	    amap[i] = (byte) 0xff;
+	  } // else, leave default zero values...
+      }
+
+    imageCM = new IndexColorModel(visual.getDepth(), numCol,
+				  rmap, gmap, bmap, amap);
+  }
+
+  public BufferedImage createCompatibleImage(int width,
+					     int height,
+					     int transparency)
+  {
+    throw new UnsupportedOperationException("not implemented");
+  }
+    
+  /**
+   * FIXME: I'm not sure which color model that should be returned here.
+   */
+  public ColorModel getColorModel()
+  {
+    if (pixelCM == null)
+      preparePixelCM();
+    return pixelCM;
+  }
+
+  void preparePixelCM()
+  {
+    switch (visual.getVisualClass())
+      {
+      case Visual.VC_TRUE_COLOR:
+	pixelCM = new DirectColorModel(visual.getDepth(),
+				       visual.getRedMask(),
+				       visual.getGreenMask(),
+				       visual.getBlueMask());
+	break;
+      case Visual.VC_PSEUDO_COLOR:
+
+	if (colormap == null)
+	  colormap = visual.getScreen().getDefaultColormap();
+	
+	XColor[] colArray = colormap.getXColors();
+	
+	int numCol = colArray.length;
+	byte[] rmap = new byte[numCol];
+	byte[] gmap = new byte[numCol];
+	byte[] bmap = new byte[numCol];
+	byte[] amap = new byte[numCol];
+	
+	for (int i=0; i < numCol; i++)
+	  {
+	    XColor color = colArray[i];
+	    if (color.getFlags() == Colormap.FLAG_SHARED) {
+	      rmap[i] = (byte) (color.getRed()   >> 8);
+	      gmap[i] = (byte) (color.getGreen() >> 8);
+	      bmap[i] = (byte) (color.getBlue()  >> 8);
+	      amap[i] = (byte) 0xff;
+	    } // else, leave default zero values...
+
+	  }
+
+	pixelCM = new IndexColorModel(visual.getDepth(), numCol,
+				      rmap, gmap, bmap, amap);
+	break;
+      default:
+	throw new UnsupportedOperationException("not implemented");
+      }
+  }
+  
+  public ColorModel getColorModel(int transparency)
+  {
+    throw new UnsupportedOperationException("not implemented");
+  }
+    
+  public AffineTransform getDefaultTransform()
+  {
+    throw new UnsupportedOperationException("not implemented");
+  }
+
+  public AffineTransform getNormalizingTransform()
+  {
+    throw new UnsupportedOperationException("not implemented");
+  }
+ 
+  public Rectangle getBounds()
+  {
+    throw new UnsupportedOperationException("not implemented");
+  }
+
+  Visual getVisual()
+  {
+    return visual;
+  }
+    
+  /* FIXME: This should be moved to XGraphicsDevice... */
+  XFontMetrics getXFontMetrics(java.awt.Font awtFont)
+  {
+    // FIXME: do caching...
+    
+    String family       = "*";
+    String name         = awtFont.getName();
+    String weight       = awtFont.isBold() ? "bold" : "medium";
+    String slant        = awtFont.isItalic() ? "i" : "r";
+    String addStyle     = "*";
+    String pixelSize    = "*";
+    String pointSize    = awtFont.getSize() + "0";
+    String xres         = "*";
+    String yres         = "*";
+    String spacing      = "*";
+    String averageWidth = "*";
+    String charset      = "*";
+    
+    String logicalFontDescription =
+      family    + "-" + name         + "-" + weight    + "-" +
+      slant     + "-" + addStyle     + "-" + pixelSize + "-" +
+      pointSize + "-" + xres         + "-" + yres      + "-" +
+      spacing   + "-" + averageWidth + "-" + charset;
+    
+    Display display = visual.getScreen().getDisplay();
+    gnu.gcj.xlib.Font xfont =
+      new gnu.gcj.xlib.Font(display, logicalFontDescription);
+    return new XFontMetrics(xfont, awtFont);
+  }
+
+  int getPixel(Color color)
+  {
+    int[] components =
+        {
+	  color.getRed(),
+	  color.getGreen(),
+	  color.getBlue(),
+	  0xff
+	};
+	
+    ColorModel cm = getColorModel();
+    return cm.getDataElement(components, 0);
+  }
+}
-- 
cgit v1.1