This fixes a couple of issues in the X peers. See below. 2007-07-13 Roman Kennke <[EMAIL PROTECTED]>
* gnu/java/awt/java2d/AbstractGraphics2D.java (clip(Shape)): Call setClip when the clip changes. (drawImage): Add translation. (drawLine): Add translation. * gnu/java/awt/peer/x/PixmapVolatileImage.java (getPixmap): New method. * gnu/java/awt/peer/x/XEventPump.java (XEventPump): Name thread. Start as daemon thread. * gnu/java/awt/peer/x/XGraphics2D.java (rawDrawImage): Special handling for PixmapVolatileImage. (rawDrawLine): Don't add translation here. This is done in the superclass. (rawFillRect): Don't add translation here. This is done in the superclass. (renderScanline): Added null check. /Roman -- Dipl.-Inform. (FH) Roman Kennke, Software Engineer, http://kennke.org aicas Allerton Interworks Computer Automated Systems GmbH Haid-und-Neu-Straße 18 * D-76131 Karlsruhe * Germany http://www.aicas.com * Tel: +49-721-663 968-0 USt-Id: DE216375633, Handelsregister HRB 109481, AG Karlsruhe Geschäftsführer: Dr. James J. Hunt
Index: gnu/java/awt/java2d/AbstractGraphics2D.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java,v retrieving revision 1.18 diff -u -1 -0 -r1.18 AbstractGraphics2D.java --- gnu/java/awt/java2d/AbstractGraphics2D.java 24 May 2007 20:28:43 -0000 1.18 +++ gnu/java/awt/java2d/AbstractGraphics2D.java 16 Jul 2007 15:04:24 -0000 @@ -907,22 +907,22 @@ /** * Intersects the clip of this graphics object with the specified clip. * * @param s the clip with which the current clip should be intersected */ public void clip(Shape s) { // Initialize clip if not already present. if (clip == null) - clip = s; - + setClip(s); + // This is so common, let's optimize this. else if (clip instanceof Rectangle && s instanceof Rectangle) { Rectangle clipRect = (Rectangle) clip; Rectangle r = (Rectangle) s; computeIntersection(r.x, r.y, r.width, r.height, clipRect); // Call setClip so that subclasses get notified. setClip(clipRect); } else @@ -1150,21 +1150,23 @@ /** * Draws a line from (x1, y1) to (x2, y2). * * This implementation transforms the coordinates and forwards the call to * [EMAIL PROTECTED] #rawDrawLine}. */ public void drawLine(int x1, int y1, int x2, int y2) { if (isOptimized) { - rawDrawLine(x1, y1, x2, y2); + int tx = (int) transform.getTranslateX(); + int ty = (int) transform.getTranslateY(); + rawDrawLine(x1 + tx, y1 + ty, x2 + tx, y2 + ty); } else { ShapeCache sc = getShapeCache(); if (sc.line == null) sc.line = new Line2D.Float(); sc.line.setLine(x1, y1, x2, y2); draw(sc.line); } } @@ -1190,21 +1192,22 @@ * * @param x the upper left corner, X coordinate * @param y the upper left corner, Y coordinate * @param width the width of the rectangle * @param height the height of the rectangle */ public void fillRect(int x, int y, int width, int height) { if (isOptimized) { - rawFillRect(x, y, width, height); + rawFillRect(x + (int) transform.getTranslateX(), + y + (int) transform.getTranslateY(), width, height); } else { ShapeCache sc = getShapeCache(); if (sc.rect == null) sc.rect = new Rectangle(); sc.rect.setBounds(x, y, width, height); fill(sc.rect); } } @@ -1383,21 +1386,24 @@ * * @param image the image to render * @param x the x location to render to * @param y the y location to render to * @param observer the image observer to receive notification */ public boolean drawImage(Image image, int x, int y, ImageObserver observer) { boolean ret; if (isOptimized) - ret = rawDrawImage(image, x, y, observer); + { + ret = rawDrawImage(image, x + (int) transform.getTranslateX(), + y + (int) transform.getTranslateY(), observer); + } else { AffineTransform t = new AffineTransform(); t.translate(x, y); ret = drawImage(image, t, observer); } return ret; } /** Index: gnu/java/awt/peer/x/PixmapVolatileImage.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/x/PixmapVolatileImage.java,v retrieving revision 1.1 diff -u -1 -0 -r1.1 PixmapVolatileImage.java --- gnu/java/awt/peer/x/PixmapVolatileImage.java 13 Jul 2007 19:43:44 -0000 1.1 +++ gnu/java/awt/peer/x/PixmapVolatileImage.java 16 Jul 2007 15:04:24 -0000 @@ -166,11 +166,20 @@ { return null; } @Override public int getWidth(ImageObserver observer) { return getWidth(); } + /** + * Returns the underlying X pixmap. This is used for the graphics code. + * + * @return the underlying X pixmap + */ + Pixmap getPixmap() + { + return pixmap; + } } Index: gnu/java/awt/peer/x/XEventPump.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/x/XEventPump.java,v retrieving revision 1.6 diff -u -1 -0 -r1.6 XEventPump.java --- gnu/java/awt/peer/x/XEventPump.java 22 May 2007 22:25:14 -0000 1.6 +++ gnu/java/awt/peer/x/XEventPump.java 16 Jul 2007 15:04:24 -0000 @@ -90,22 +90,23 @@ /** * Creates a new XEventPump for the specified X Display. * * @param d the X Display */ XEventPump(Display d) { display = d; windows = new HashMap(); drag = -1; - Thread t = new Thread(this); - t.start(); + Thread thread = new Thread(this, "X Event Pump"); + thread.setDaemon(true); + thread.start(); } /** * The main event pump loop. This basically fetches events from the * X Display and pumps them into the system event queue. */ public void run() { while (display.connected) { Index: gnu/java/awt/peer/x/XGraphics2D.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/x/XGraphics2D.java,v retrieving revision 1.5 diff -u -1 -0 -r1.5 XGraphics2D.java --- gnu/java/awt/peer/x/XGraphics2D.java 25 May 2007 11:11:14 -0000 1.5 +++ gnu/java/awt/peer/x/XGraphics2D.java 16 Jul 2007 15:04:24 -0000 @@ -87,29 +87,26 @@ super(); xdrawable = d; xgc = new GC(d); init(); disposed = false; //setClip(new Rectangle(0, 0, xdrawable.width, xdrawable.height)); } protected void rawDrawLine(int x0, int y0, int x1, int y1) { - int tx = (int) transform.getTranslateX(); - int ty = (int) transform.getTranslateY(); - xdrawable.segment(xgc, x0 + tx, y0 + ty, x1 + tx, y1 + ty); + xdrawable.segment(xgc, x0, y0, x1, y1); } protected void rawFillRect(int x, int y, int w, int h) { - xdrawable.rectangle(xgc, x + (int) transform.getTranslateX(), - y + (int) transform.getTranslateY(), w, h, true); + xdrawable.rectangle(xgc, x, y, w, h, true); } /** * Returns the color model of this Graphics object. * * @return the color model of this Graphics object */ protected ColorModel getColorModel() { return Toolkit.getDefaultToolkit().getColorModel(); @@ -245,21 +242,22 @@ red = 255 - (int) ((255 - red) * alpha); green = 255 - (int) ((255 - green) * alpha); blue = 255 - (int) ((255 - blue) * alpha); } xgc.set_foreground(red << 16 | green << 8 | blue); int x0 = range.getXPos(); int l = range.getLength(); xdrawable.fill_rectangle(xgc, x0, y, l, 1); } } - xgc.set_foreground(old.getRGB()); + if (old != null) + xgc.set_foreground(old.getRGB()); } protected void fillScanline(int x0, int x1, int y) { xdrawable.segment(xgc, x0, y, x1, y); } protected void fillScanlineAA(int x0, int x1, int y, int alpha) { //System.err.println("fillScanlineAA: " + x0 + ", " + x1 + ", " + y + ", " + alpha); @@ -307,20 +305,27 @@ protected boolean rawDrawImage(Image image, int x, int y, ImageObserver obs) { boolean ret; if (image instanceof XImage) { XImage xImage = (XImage) image; xdrawable.copy_area(xImage.pixmap, xgc, 0, 0, xImage.getWidth(obs), xImage.getHeight(obs), x, y); ret = true; } + else if (image instanceof PixmapVolatileImage) + { + PixmapVolatileImage pvi = (PixmapVolatileImage) image; + xdrawable.copy_area(pvi.getPixmap(), xgc, 0, 0, pvi.getWidth(obs), + pvi.getHeight(obs), x, y); + ret = true; + } else { ret = super.rawDrawImage(image, x, y, obs); } return ret; } }