OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-dev/] [fsf-gcc-snapshot-1-mar-12/] [or1k-gcc/] [libjava/] [gnu/] [awt/] [xlib/] [XGraphics.java] - Diff between revs 756 and 783

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 756 Rev 783
/* Copyright (C) 2000, 2003, 2004  Free Software Foundation
/* Copyright (C) 2000, 2003, 2004  Free Software Foundation
 
 
   This file is part of libgcj.
   This file is part of libgcj.
 
 
This software is copyrighted work licensed under the terms of the
This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */
details.  */
 
 
package gnu.awt.xlib;
package gnu.awt.xlib;
 
 
import java.awt.*;
import java.awt.*;
import java.awt.image.WritableRaster;
import java.awt.image.WritableRaster;
import java.awt.image.Raster;
import java.awt.image.Raster;
import java.awt.image.DataBuffer;
import java.awt.image.DataBuffer;
import java.awt.image.ColorModel;
import java.awt.image.ColorModel;
import java.awt.image.ImageObserver;
import java.awt.image.ImageObserver;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImage;
import gnu.gcj.xlib.GC;
import gnu.gcj.xlib.GC;
import gnu.gcj.xlib.XImage;
import gnu.gcj.xlib.XImage;
import gnu.gcj.xlib.Drawable;
import gnu.gcj.xlib.Drawable;
import gnu.gcj.xlib.Window;
import gnu.gcj.xlib.Window;
import gnu.gcj.xlib.Drawable;
import gnu.gcj.xlib.Drawable;
import gnu.gcj.xlib.Pixmap;
import gnu.gcj.xlib.Pixmap;
import gnu.gcj.xlib.Visual;
import gnu.gcj.xlib.Visual;
import gnu.awt.j2d.DirectRasterGraphics;
import gnu.awt.j2d.DirectRasterGraphics;
import gnu.awt.j2d.MappedRaster;
import gnu.awt.j2d.MappedRaster;
 
 
public class XGraphics implements Cloneable, DirectRasterGraphics
public class XGraphics implements Cloneable, DirectRasterGraphics
{
{
  static class XRaster extends MappedRaster
  static class XRaster extends MappedRaster
  {
  {
    XImage ximage;
    XImage ximage;
 
 
    public XRaster(WritableRaster raster, XImage ximage, ColorModel cm)
    public XRaster(WritableRaster raster, XImage ximage, ColorModel cm)
    {
    {
      super(raster, cm);
      super(raster, cm);
      this.ximage = ximage;
      this.ximage = ximage;
    }
    }
  }
  }
 
 
  GC context;
  GC context;
  XGraphicsConfiguration config;
  XGraphicsConfiguration config;
  Rectangle clipBounds;
  Rectangle clipBounds;
 
 
  XFontMetrics metrics;
  XFontMetrics metrics;
 
 
 
 
  public Object clone()
  public Object clone()
  {
  {
    try
    try
      {
      {
        XGraphics gfxCopy = (XGraphics) super.clone();
        XGraphics gfxCopy = (XGraphics) super.clone();
        gfxCopy.context = context.create();
        gfxCopy.context = context.create();
 
 
        return gfxCopy;
        return gfxCopy;
      }
      }
    catch (CloneNotSupportedException ex)
    catch (CloneNotSupportedException ex)
      {
      {
        // This should never happen.
        // This should never happen.
        throw new InternalError ();
        throw new InternalError ();
      }
      }
  }
  }
 
 
  public void dispose()
  public void dispose()
  {
  {
    GC lContext = context;
    GC lContext = context;
    context = null;
    context = null;
    config = null;
    config = null;
    clipBounds = null;
    clipBounds = null;
    metrics = null;
    metrics = null;
 
 
    if (lContext != null)
    if (lContext != null)
    {
    {
      lContext.dispose();
      lContext.dispose();
    }
    }
  }
  }
 
 
  public XGraphics(Drawable drawable, XGraphicsConfiguration config)
  public XGraphics(Drawable drawable, XGraphicsConfiguration config)
  {
  {
    context = GC.create(drawable);
    context = GC.create(drawable);
    this.config = config;
    this.config = config;
  }
  }
 
 
  public void setColor(Color color)
  public void setColor(Color color)
  {
  {
    if (color != null)
    if (color != null)
      context.setForeground(config.getPixel(color));
      context.setForeground(config.getPixel(color));
  }
  }
 
 
  public void setPaintMode()
  public void setPaintMode()
  {
  {
    throw new UnsupportedOperationException("not implemented");
    throw new UnsupportedOperationException("not implemented");
  }
  }
 
 
  public void setXORMode(Color c1)
  public void setXORMode(Color c1)
  {
  {
    throw new UnsupportedOperationException("not implemented");
    throw new UnsupportedOperationException("not implemented");
  }
  }
 
 
  public void setFont(Font font)
  public void setFont(Font font)
  {
  {
    if (font == null)
    if (font == null)
      return;
      return;
    if ((metrics != null) && font.equals(metrics.getFont()))
    if ((metrics != null) && font.equals(metrics.getFont()))
      return;
      return;
    metrics = config.getXFontMetrics(font);
    metrics = config.getXFontMetrics(font);
    if (metrics != null)
    if (metrics != null)
      context.setFont(metrics.xfont);
      context.setFont(metrics.xfont);
  }
  }
 
 
  public FontMetrics getFontMetrics(Font font)
  public FontMetrics getFontMetrics(Font font)
  {
  {
    if ((metrics != null) && font.equals(metrics.getFont()))
    if ((metrics != null) && font.equals(metrics.getFont()))
      return metrics;
      return metrics;
 
 
    return config.getXFontMetrics(font);
    return config.getXFontMetrics(font);
  }
  }
 
 
  public void setClip(int x, int y, int width, int height)
  public void setClip(int x, int y, int width, int height)
  {
  {
    Rectangle[] rects = { new Rectangle(x, y, width, height) };
    Rectangle[] rects = { new Rectangle(x, y, width, height) };
    context.setClipRectangles(rects);
    context.setClipRectangles(rects);
  }
  }
 
 
  public void setClip(Shape clip)
  public void setClip(Shape clip)
  {
  {
    /* TODO: create a special RectangleUnion shape that can be
    /* TODO: create a special RectangleUnion shape that can be
       used to draw advantage of the GCs ability to set multiple
       used to draw advantage of the GCs ability to set multiple
       rectangles.
       rectangles.
    */
    */
 
 
    /* FIXME: creating all these objects is wasteful and can be
    /* FIXME: creating all these objects is wasteful and can be
       costly in the long run, since this code is run at every
       costly in the long run, since this code is run at every
       expose. */
       expose. */
    Rectangle newClipBounds = clip.getBounds();
    Rectangle newClipBounds = clip.getBounds();
 
 
    /* FIXME: decide whether this test code is worth anything
    /* FIXME: decide whether this test code is worth anything
     * (as of 2004-01-29, it prints frequently)
     * (as of 2004-01-29, it prints frequently)
    if ((clipBounds != null) && !clipBounds.contains(newClipBounds))
    if ((clipBounds != null) && !clipBounds.contains(newClipBounds))
      {
      {
        System.err.println("warning: old clip ("+ clipBounds +") does " +
        System.err.println("warning: old clip ("+ clipBounds +") does " +
                           "not fully contain new clip (" +
                           "not fully contain new clip (" +
                           newClipBounds + ")");
                           newClipBounds + ")");
      }
      }
     */
     */
    clipBounds = newClipBounds;
    clipBounds = newClipBounds;
    Rectangle[] rects = { clipBounds };
    Rectangle[] rects = { clipBounds };
    context.setClipRectangles(rects);
    context.setClipRectangles(rects);
  }
  }
 
 
  public void copyArea(int x, int y, int width, int height, int
  public void copyArea(int x, int y, int width, int height, int
                       dx, int dy)
                       dx, int dy)
  {
  {
    throw new UnsupportedOperationException("not implemented");
    throw new UnsupportedOperationException("not implemented");
  }
  }
 
 
  public void drawLine(int x1, int y1, int x2, int y2)
  public void drawLine(int x1, int y1, int x2, int y2)
  {
  {
    context.drawLine(x1, y1, x2, y2);
    context.drawLine(x1, y1, x2, y2);
  }
  }
 
 
  public void drawRect(int x, int y, int width, int height)
  public void drawRect(int x, int y, int width, int height)
  {
  {
    throw new UnsupportedOperationException("not implemented yet");
    throw new UnsupportedOperationException("not implemented yet");
  }
  }
 
 
  public void fillRect(int x, int y, int width, int height)
  public void fillRect(int x, int y, int width, int height)
  {
  {
    context.fillRectangle(x, y, width, height);
    context.fillRectangle(x, y, width, height);
  }
  }
 
 
  public void drawArc(int x, int y, int width, int height, int
  public void drawArc(int x, int y, int width, int height, int
                      startAngle, int arcAngle)
                      startAngle, int arcAngle)
  {
  {
    context.drawArc (x, y, width, height, startAngle, arcAngle);
    context.drawArc (x, y, width, height, startAngle, arcAngle);
  }
  }
 
 
  public void fillArc(int x, int y, int width, int height, int
  public void fillArc(int x, int y, int width, int height, int
                      startAngle, int arcAngle)
                      startAngle, int arcAngle)
  {
  {
    context.fillArc (x, y, width, height, startAngle, arcAngle);
    context.fillArc (x, y, width, height, startAngle, arcAngle);
  }
  }
 
 
  public void drawPolyline(int[] xPoints, int[] yPoints, int
  public void drawPolyline(int[] xPoints, int[] yPoints, int
                           nPoints)
                           nPoints)
  {
  {
    throw new UnsupportedOperationException("not implemented");
    throw new UnsupportedOperationException("not implemented");
  }
  }
 
 
  public void drawPolygon(int[] xPoints, int[] yPoints, int
  public void drawPolygon(int[] xPoints, int[] yPoints, int
                          nPoints)
                          nPoints)
  {
  {
    throw new UnsupportedOperationException("not implemented");
    throw new UnsupportedOperationException("not implemented");
  }
  }
 
 
  public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints,
  public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints,
                          int translateX, int translateY)
                          int translateX, int translateY)
  {
  {
    context.fillPolygon(xPoints, yPoints, nPoints, translateX, translateY);
    context.fillPolygon(xPoints, yPoints, nPoints, translateX, translateY);
  }
  }
 
 
  public void drawString(String str, int x, int y)
  public void drawString(String str, int x, int y)
  {
  {
    context.drawString(str, x, y);
    context.drawString(str, x, y);
  }
  }
 
 
  public boolean drawImage(Image img, int x, int y,
  public boolean drawImage(Image img, int x, int y,
                           ImageObserver observer)
                           ImageObserver observer)
  {
  {
    if (img instanceof XOffScreenImage)
    if (img instanceof XOffScreenImage)
    {
    {
      // FIXME: have to enforce clip, or is it OK as-is?
      // FIXME: have to enforce clip, or is it OK as-is?
      XOffScreenImage offScreenImage = (XOffScreenImage) img;
      XOffScreenImage offScreenImage = (XOffScreenImage) img;
      Pixmap pixmap = offScreenImage.getPixmap ();
      Pixmap pixmap = offScreenImage.getPixmap ();
      context.copyArea (pixmap, 0, 0, x, y,
      context.copyArea (pixmap, 0, 0, x, y,
        offScreenImage.getWidth (), offScreenImage.getHeight ());
        offScreenImage.getWidth (), offScreenImage.getHeight ());
      return true;
      return true;
    }
    }
    if (clipBounds == null)
    if (clipBounds == null)
      return false; // ***FIXME***
      return false; // ***FIXME***
 
 
    if (!(img instanceof BufferedImage))
    if (!(img instanceof BufferedImage))
      {
      {
        throw new AWTError("unknown image class");
        throw new AWTError("unknown image class");
      }
      }
 
 
    BufferedImage bimg = (BufferedImage) img;
    BufferedImage bimg = (BufferedImage) img;
 
 
    XImage ximg = (XImage) bimg.getProperty("gnu.gcj.xlib.XImage");
    XImage ximg = (XImage) bimg.getProperty("gnu.gcj.xlib.XImage");
    if (ximg == null)
    if (ximg == null)
      {
      {
        System.err.println("FIXME: skipping null XImage, should " +
        System.err.println("FIXME: skipping null XImage, should " +
                           "really do on the spot conversion");
                           "really do on the spot conversion");
        return false;
        return false;
      }
      }
 
 
    /*
    /*
      +------------------
      +------------------
      |    clip
      |    clip
      |     +---------+
      |     +---------+
      | img |         |
      | img |         |
      |  +--+-------+ |
      |  +--+-------+ |
      |  |  |       | |
      |  |  |       | |
      |  |  |       | |
      |  |  |       | |
      |  |  +-------+-+
      |  |  +-------+-+
      |  |          |
      |  |          |
      |  +----------+
      |  +----------+
    */
    */
 
 
    int iLeft   = Math.max(x, clipBounds.x);
    int iLeft   = Math.max(x, clipBounds.x);
    int iTop    = Math.max(y, clipBounds.y);
    int iTop    = Math.max(y, clipBounds.y);
    int iRight  = Math.min(x + bimg.getWidth(),
    int iRight  = Math.min(x + bimg.getWidth(),
                           clipBounds.x + clipBounds.width);
                           clipBounds.x + clipBounds.width);
    int iBottom = Math.min(y + bimg.getHeight(),
    int iBottom = Math.min(y + bimg.getHeight(),
                           clipBounds.y + clipBounds.height);
                           clipBounds.y + clipBounds.height);
 
 
    int srcX = iLeft - x;
    int srcX = iLeft - x;
    int srcY = iTop  - y;
    int srcY = iTop  - y;
 
 
    int width  = iRight  - iLeft;
    int width  = iRight  - iLeft;
    int height = iBottom - iTop;
    int height = iBottom - iTop;
 
 
    if ((width > 0) && (height > 0))
    if ((width > 0) && (height > 0))
      context.putImage(ximg, srcX, srcY, iLeft, iTop, width, height);
      context.putImage(ximg, srcX, srcY, iLeft, iTop, width, height);
 
 
    return true;
    return true;
  }
  }
 
 
  public MappedRaster mapRaster(Rectangle bounds)
  public MappedRaster mapRaster(Rectangle bounds)
  {
  {
    Visual visual = config.getVisual();
    Visual visual = config.getVisual();
    XImage ximage = new XImage(visual, bounds.width, bounds.height,
    XImage ximage = new XImage(visual, bounds.width, bounds.height,
                               false // do not auto allocate memory
                               false // do not auto allocate memory
                               );
                               );
 
 
    WritableRaster raster =
    WritableRaster raster =
      config.createRasterForXImage(ximage,
      config.createRasterForXImage(ximage,
                                   new Point(bounds.x, bounds.y));
                                   new Point(bounds.x, bounds.y));
 
 
    DataBuffer dataB = raster.getDataBuffer();
    DataBuffer dataB = raster.getDataBuffer();
    XGraphicsConfiguration.attachData(ximage, dataB, 0);
    XGraphicsConfiguration.attachData(ximage, dataB, 0);
 
 
    Drawable drawable = context.getDrawable();
    Drawable drawable = context.getDrawable();
 
 
    // TODO: restrict to clipping
    // TODO: restrict to clipping
 
 
    Rectangle mBounds = drawable.copyIntoXImage(ximage, bounds, 0, 0);
    Rectangle mBounds = drawable.copyIntoXImage(ximage, bounds, 0, 0);
 
 
    return new XRaster(raster, ximage, config.imageCM);
    return new XRaster(raster, ximage, config.imageCM);
  }
  }
 
 
 
 
  public void unmapRaster(MappedRaster mappedRaster)
  public void unmapRaster(MappedRaster mappedRaster)
  {
  {
    XRaster xraster = (XRaster) mappedRaster;
    XRaster xraster = (XRaster) mappedRaster;
    XImage ximage = xraster.ximage;
    XImage ximage = xraster.ximage;
    Raster raster = xraster.getRaster();
    Raster raster = xraster.getRaster();
    int x = raster.getMinX();
    int x = raster.getMinX();
    int y = raster.getMinY();
    int y = raster.getMinY();
    int width = raster.getWidth();
    int width = raster.getWidth();
    int height = raster.getHeight();
    int height = raster.getHeight();
 
 
    context.putImage(ximage, 0, 0, x, y, width, height);
    context.putImage(ximage, 0, 0, x, y, width, height);
  }
  }
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.