mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			236 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Java
		
	
	
	
/* 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.gcj.xlib;
 | 
						|
 | 
						|
import gnu.gcj.RawData;
 | 
						|
 | 
						|
/** 
 | 
						|
 * Structure containing image data that resides on the client side.
 | 
						|
 * The format, depth and offset attributes of an XImage determines how
 | 
						|
 * bitfields are encoded in a raster image. However, it does not
 | 
						|
 * determine how a color is encoded into a bitfield. I.e. the XImage
 | 
						|
 * pixel values in a specific structure, but does not determine what
 | 
						|
 * colors that will be used to represent these pixel values on the
 | 
						|
 * screen.
 | 
						|
 *
 | 
						|
 * @author Rolf W. Rasmussen <rolfwr@ii.uib.no>
 | 
						|
 */
 | 
						|
public class XImage
 | 
						|
{
 | 
						|
  /** This object reference points to the data, hindering garbage
 | 
						|
      collection of the data. */
 | 
						|
  Object dataRef;
 | 
						|
 | 
						|
  // Must match definitions in X.h:
 | 
						|
  public static final int XYBITMAP_FORMAT = 0,
 | 
						|
                          XYPIXMAP_FORMAT = 1,
 | 
						|
                          ZPIXMAP_FORMAT  = 2;
 | 
						|
  
 | 
						|
  // Must match definitions in X.h:
 | 
						|
  public static final int LEAST_SIGNIFICANT_B_FIRST_ORDER  = 0,
 | 
						|
                          MOST_SIGNIFICANT_B_FIRST_ORDER   = 1;
 | 
						|
  
 | 
						|
  public XImage(Visual visual, int depth, int format, int xoffset,
 | 
						|
		int width, int height, int bitmapPad,
 | 
						|
		int bytesPerLine)
 | 
						|
  {
 | 
						|
    this(visual, depth, format, xoffset, width, height, bitmapPad,
 | 
						|
	 bytesPerLine,
 | 
						|
	 0 // bitsPerPixel
 | 
						|
	 );
 | 
						|
  }
 | 
						|
 | 
						|
  public XImage(Visual visual, int depth, int format, int xoffset,
 | 
						|
		int width, int height, int bitmapPad,
 | 
						|
		int bytesPerLine, int bitsPerPixel)
 | 
						|
  {
 | 
						|
    if (visual == null) throw new 
 | 
						|
      NullPointerException("a visual must be specified");
 | 
						|
	
 | 
						|
    init(visual, depth, format, xoffset, width, height,
 | 
						|
	 bitmapPad, bytesPerLine, bitsPerPixel);
 | 
						|
  }
 | 
						|
 | 
						|
  public native void init(Visual visual, int depth, int format, int xoffset,
 | 
						|
			  int width, int height, int bitmapPad,
 | 
						|
			  int bytesPerLine, int bitsPerPixel);
 | 
						|
  
 | 
						|
  private native void init(Visual visual, int width, int height);
 | 
						|
 | 
						|
    
 | 
						|
  public XImage(Visual visual, int width, int height)
 | 
						|
  {
 | 
						|
    this(visual, width, height,
 | 
						|
	 true // Automatically allocate memory
 | 
						|
	 );
 | 
						|
  }
 | 
						|
 | 
						|
  /** 
 | 
						|
   * Create a new XImage.
 | 
						|
   *
 | 
						|
   * @param allocate specifies whether to automatically allocate
 | 
						|
   * memory for the image.  It is possible to create the data array
 | 
						|
   * elsewhere, so that we can for instance use a DataBufferUShort as
 | 
						|
   * data.  Ie. not limit ourself to byte arrays.  This is done by
 | 
						|
   * passing false and calling a setData() method manually after
 | 
						|
   * creation.
 | 
						|
   */
 | 
						|
  public XImage(Visual visual, int width, int height, boolean allocate)
 | 
						|
  {
 | 
						|
    if (visual == null)
 | 
						|
      throw new NullPointerException("a visual must be specified");
 | 
						|
    
 | 
						|
    init(visual, width, height);
 | 
						|
 | 
						|
    if (allocate)
 | 
						|
      {
 | 
						|
	/* Now that Xlib has figured out the appropriate bytes per
 | 
						|
	   line, we can allocate memory for the image.  */
 | 
						|
	// FIXME: What about formats with several layers/bands?
 | 
						|
	byte[] data = new byte[getBytesPerLine()*height];
 | 
						|
 | 
						|
	setData(data, 0);
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Attach image data to this XImage.
 | 
						|
   *
 | 
						|
   * @param offset the index of the first actual data element in the array.
 | 
						|
   */
 | 
						|
  public void setData(byte[] data, int offset)
 | 
						|
  {
 | 
						|
    dataRef = data;
 | 
						|
    internalSetData(data, offset);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Attach image data to this XImage. 
 | 
						|
   *
 | 
						|
   * @param offset the index of the first actual data element in the
 | 
						|
   *  array.  Note: this is short offset, not a byte offset.
 | 
						|
   */
 | 
						|
  public void setData(short[] data, int offset)
 | 
						|
  {
 | 
						|
    dataRef = data;
 | 
						|
    internalSetData(data, offset);
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Attach image data to this XImage
 | 
						|
   * 
 | 
						|
   * @param offset the index of the first actual data element in the array.
 | 
						|
   * Note: this is not a byte offset.
 | 
						|
   */
 | 
						|
  public void setData(int[] data, int offset)
 | 
						|
  {
 | 
						|
    dataRef = data;
 | 
						|
    internalSetData(data, offset);
 | 
						|
  }
 | 
						|
  
 | 
						|
  private native void internalSetData(byte[] data, int offset);
 | 
						|
  private native void internalSetData(short[] data, int offset);
 | 
						|
  private native void internalSetData(int[] data, int offset);
 | 
						|
    
 | 
						|
  protected native void finalize();
 | 
						|
 | 
						|
  boolean ownsData = false;
 | 
						|
  RawData structure = null;
 | 
						|
 | 
						|
  public final native int getWidth();
 | 
						|
  public final native int getHeight();
 | 
						|
  public final native int getDepth();
 | 
						|
  public final native int getFormat();
 | 
						|
 | 
						|
  public final boolean isZPixmapFormat()
 | 
						|
  {
 | 
						|
    return getFormat() == ZPIXMAP_FORMAT;
 | 
						|
  } 
 | 
						|
 | 
						|
 | 
						|
  /** 
 | 
						|
   * Get the xoffset. The xoffset avoids the need of shifting the
 | 
						|
   * scanlines into place.
 | 
						|
   */
 | 
						|
  public final native int getXOffset();
 | 
						|
 | 
						|
  public native final int getBytesPerLine();
 | 
						|
  public native final int getBitsPerPixel();
 | 
						|
 | 
						|
  public native final int getImageByteOrder();
 | 
						|
  public native final int getBitmapBitOrder();
 | 
						|
  public native final int getBitmapUnit();
 | 
						|
  public native final int getBitmapPad();
 | 
						|
 | 
						|
 | 
						|
  // True/Direct Color specific:
 | 
						|
  public native int getRedMask();
 | 
						|
  public native int getGreenMask();
 | 
						|
  public native int getBlueMask();
 | 
						|
 | 
						|
 | 
						|
  /**
 | 
						|
   * Set a pixel value at a given position in the image. This method
 | 
						|
   * is slow. Don't use it, except as a fall-back.
 | 
						|
   */
 | 
						|
  public native final void setPixel(int x, int y, int pixel);
 | 
						|
 | 
						|
  public String toString()
 | 
						|
  {
 | 
						|
    String format;
 | 
						|
    switch(getFormat())
 | 
						|
      {
 | 
						|
      case ZPIXMAP_FORMAT:
 | 
						|
	format = "ZPixmapFormat";
 | 
						|
	break;
 | 
						|
      default:
 | 
						|
	format = "unknown";
 | 
						|
      }
 | 
						|
    
 | 
						|
    String imageByteOrder;
 | 
						|
    switch(getImageByteOrder())
 | 
						|
      {
 | 
						|
      case LEAST_SIGNIFICANT_B_FIRST_ORDER:
 | 
						|
	imageByteOrder = "leastSignificantByteFirst";
 | 
						|
	break;
 | 
						|
      case MOST_SIGNIFICANT_B_FIRST_ORDER:
 | 
						|
	imageByteOrder = "mostSignificantByteFirst";
 | 
						|
	break;
 | 
						|
      default:
 | 
						|
	imageByteOrder = "unknwon";
 | 
						|
      }
 | 
						|
    
 | 
						|
    String bitmapBitOrder;
 | 
						|
    switch(getBitmapBitOrder())
 | 
						|
      {
 | 
						|
      case LEAST_SIGNIFICANT_B_FIRST_ORDER:
 | 
						|
	bitmapBitOrder = "leastSignificantBitFirst";
 | 
						|
	break;
 | 
						|
      case MOST_SIGNIFICANT_B_FIRST_ORDER:
 | 
						|
	bitmapBitOrder = "mostSignificantBitFirst";
 | 
						|
	break;
 | 
						|
      default:
 | 
						|
	bitmapBitOrder = "unknown";
 | 
						|
      }
 | 
						|
    
 | 
						|
    return getClass().getName() + "[" + format +
 | 
						|
      ", width=" + getWidth() +
 | 
						|
      ", height=" + getHeight() +
 | 
						|
      ", bytesPerLine=" + getBytesPerLine() +
 | 
						|
      ", xoffset=" + getXOffset() +
 | 
						|
      ", depth=" + getDepth() +
 | 
						|
      ", bitsPerPixel=" + getBitsPerPixel() +
 | 
						|
      ", bitmapUnit=" + getBitmapUnit() +
 | 
						|
      ", bitmapPad=" + getBitmapPad() +
 | 
						|
      ", byteOrder=" + imageByteOrder +
 | 
						|
      ", bitOrder=" + bitmapBitOrder +
 | 
						|
      "]";
 | 
						|
  }
 | 
						|
}
 |