Hi all!

this patch fixes the renderScanline method.
It would be great if it was a little faster and less generic, I'm
searching for some algorithm that we may use, though it's like moving in
a minefield, this kind of code is always very subject to patents (well,
I'm in the old Europe, but, you know...)

I'm committing it in, have a nice day,
Mario

2008-05-29  Mario Torre  <[EMAIL PROTECTED]>

        * gnu/java/awt/java2d/AbstractGraphics2D.java (setColor): now set
directly
        the foreground color the application wants to use to draw. On null,
behave
        like OpenJDK, drawing black.
        (renderScanline): fixed NPE, paintContext never initialized. Correctely
        retrieve destination raster
        (getColor): Return the correct type.
        (static initializer): HashMap now typed.
        (background): now defaults to black and not null.
        (getPaintContext): new method. Initialize lazily the PaintContext.
        (foreground): new field.
        (isForegroundColorNull): likewise.
        (getDeviceBounds): made abstract.
        * gnu/java/awt/java2d/RasterGraphics.java (getDeviceBounds): new
method.
        * gnu/java/awt/java2d/ScanlineConverter.java (renderShape): pass
correct
        value of Y to doScanline.
        * gnu/java/awt/peer/x/GLGraphics.java (getDeviceBounds): new method.
        (setBackground): synch with new Escher 2.0 API.
        * gnu/java/awt/peer/x/XGraphicsConfiguration.java
(getDefaultTransform):
        implemented.
        (getBounds): new method.
        * java/awt/AlphaComposite.java (derive(int) and derive(float)):
        new methods.
        * java/awt/image/WritableRaster.java (createWritableTranslatedChild):
        now call createWritableChild.
        (createWritableChild): reformatted.

-- 
Mario Torre, Software Developer, http://www.jroller.com/neugens/
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-53
pgp key: http://subkeys.pgp.net/ PGP Key ID: 80F240CF
Fingerprint: BA39 9666 94EC 8B73 27FA  FC7C 4086 63E3 80F2 40CF

USt-Id: DE216375633, Handelsregister HRB 109481, AG Mannheim
Geschäftsführer: Dr. James J. Hunt

Please, support open standards:
http://opendocumentfellowship.org/petition/
http://www.nosoftwarepatents.com/
### Eclipse Workspace Patch 1.0
#P classpath
Index: gnu/java/awt/peer/x/XGraphicsConfiguration.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java,v
retrieving revision 1.3
diff -u -r1.3 XGraphicsConfiguration.java
--- gnu/java/awt/peer/x/XGraphicsConfiguration.java	20 Sep 2007 14:01:08 -0000	1.3
+++ gnu/java/awt/peer/x/XGraphicsConfiguration.java	29 May 2008 16:34:26 -0000
@@ -146,8 +146,7 @@
 
   public AffineTransform getDefaultTransform()
   {
-    // TODO: Implement this.
-    throw new UnsupportedOperationException("Not yet implemented.");
+    return new AffineTransform();
   }
 
   public AffineTransform getNormalizingTransform()
@@ -158,8 +157,10 @@
 
   public Rectangle getBounds()
   {
-    // TODO: Implement this.
-    throw new UnsupportedOperationException("Not yet implemented.");
+    Display d = device.getDisplay();
+    Screen screen = d.default_screen;
+    
+    return new Rectangle(0, 0, screen.width, screen.height); 
   }
 
   /**
Index: gnu/java/awt/peer/x/GLGraphics.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/awt/peer/x/GLGraphics.java,v
retrieving revision 1.1
diff -u -r1.1 GLGraphics.java
--- gnu/java/awt/peer/x/GLGraphics.java	29 Jun 2006 15:15:56 -0000	1.1
+++ gnu/java/awt/peer/x/GLGraphics.java	29 May 2008 16:34:26 -0000
@@ -39,7 +39,9 @@
 
 import java.awt.Color;
 import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
 import java.awt.image.ColorModel;
+import java.util.Map;
 
 import gnu.java.awt.java2d.AbstractGraphics2D;
 import gnu.x11.extension.glx.GL;
@@ -70,7 +72,7 @@
   public void setBackground(Color b)
   {
     super.setBackground(b);
-    gl.clear_color(b.getRed() / 255.F, b.getGreen() / 255.F,
+    gl.clearColor(b.getRed() / 255.F, b.getGreen() / 255.F,
                    b.getBlue() / 255.F, b.getAlpha() / 255.F);
   }
 
@@ -120,4 +122,12 @@
     throw new UnsupportedOperationException("Not yet implemented");
   }
 
+  @Override
+  protected Rectangle getDeviceBounds()
+  {
+    // FIXME: not sure it's correct
+    return new Rectangle(0, 0,
+                         gl.display.default_screen.width, 
+                         gl.display.default_screen.height);
+  }
 }
Index: java/awt/AlphaComposite.java
===================================================================
RCS file: /sources/classpath/classpath/java/awt/AlphaComposite.java,v
retrieving revision 1.10
diff -u -r1.10 AlphaComposite.java
--- java/awt/AlphaComposite.java	21 Jun 2007 05:35:45 -0000	1.10
+++ java/awt/AlphaComposite.java	29 May 2008 16:34:26 -0000
@@ -158,18 +158,53 @@
     return new AlphaCompositeContext(this, srcColorModel, dstColorModel);
   }
 
+  /**
+   * Return an <code>AlphaComposite</code> similar to <code>this</code>,
+   * that uses the specified rule. If <code>rule</code> is the same as
+   * <code>this.rule</code>, then <code>this</code> is returned.
+   * 
+   * @since 1.6
+   */
+  public AlphaComposite derive(int rule)
+  {
+    if (this.rule == rule)
+      return this;
+    else
+      return AlphaComposite.getInstance(rule, this.getAlpha());
+  }
+  
+  /**
+   * Return an <code>AlphaComposite</code> similar to <code>this</code>,
+   * that uses the specified <code>alpha</code>.
+   * 
+   * If <code>alph</code> is the same as <code>this.alpha</code>,
+   * then <code>this</code> is returned.
+   * 
+   * @since 1.6
+   */
+  public AlphaComposite derive(float alpha)
+  {
+      if (this.getAlpha() == alpha)
+        return this;
+      else
+        return AlphaComposite.getInstance(this.getRule(), alpha);
+  }
+  
   public float getAlpha()
   {
     return alpha;
   }
+  
   public int getRule()
   {
     return rule;
   }
+  
   public int hashCode()
   {
     return 31 * Float.floatToIntBits(alpha) + rule;
   }
+  
   public boolean equals(Object o)
   {
     if (! (o instanceof AlphaComposite))
Index: gnu/java/awt/java2d/AbstractGraphics2D.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java,v
retrieving revision 1.20
diff -u -r1.20 AbstractGraphics2D.java
--- gnu/java/awt/java2d/AbstractGraphics2D.java	20 Sep 2007 14:01:08 -0000	1.20
+++ gnu/java/awt/java2d/AbstractGraphics2D.java	29 May 2008 16:34:26 -0000
@@ -37,6 +37,7 @@
 
 package gnu.java.awt.java2d;
 
+import gnu.java.awt.peer.x.XDialogPeer;
 import gnu.java.util.LRUCache;
 
 import java.awt.AWTError;
@@ -210,14 +211,20 @@
   /**
    * The paint context during rendering.
    */
-  private PaintContext paintContext;
+  private PaintContext paintContext = null;
 
   /**
    * The background.
    */
-  private Color background;
+  private Color background = Color.WHITE;
 
   /**
+   * Foreground color, as set by setColor.
+   */
+  private Color foreground = Color.BLACK;
+  private boolean isForegroundColorNull = true;
+  
+  /**
    * The current font.
    */
   private Font font;
@@ -266,15 +273,19 @@
 
   private static final BasicStroke STANDARD_STROKE = new BasicStroke();
 
-  private static final HashMap STANDARD_HINTS;
-  static {
-    HashMap hints = new HashMap();
-  hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
-            RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
-  hints.put(RenderingHints.KEY_ANTIALIASING,
-            RenderingHints.VALUE_ANTIALIAS_DEFAULT);
-  STANDARD_HINTS = hints;
-  }
+  private static final HashMap<Key, Object> STANDARD_HINTS;
+  static
+    {
+    
+      HashMap<Key, Object> hints = new HashMap<Key, Object>();
+      hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
+                RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
+      hints.put(RenderingHints.KEY_ANTIALIASING,
+                RenderingHints.VALUE_ANTIALIAS_DEFAULT);
+    
+      STANDARD_HINTS = hints;
+    }
+  
   /**
    * Creates a new AbstractGraphics2D instance.
    */
@@ -1058,10 +1069,10 @@
    */
   public Color getColor()
   {
-    Color c = null;
-    if (paint instanceof Color)
-      c = (Color) paint;
-    return c;
+    if (isForegroundColorNull)
+      return null;
+    
+    return this.foreground;
   }
 
   /**
@@ -1071,7 +1082,22 @@
    */
   public void setColor(Color color)
   {
-    setPaint(color);
+    if (color == null)
+      {
+        this.foreground = Color.BLACK;
+        isForegroundColorNull = true;
+      }
+    else
+      {
+        this.foreground = color;
+        isForegroundColorNull = false;
+      }
+    
+    // free resources if needed, then put the paint context to null
+    if (this.paintContext != null)
+      this.paintContext.dispose();
+    
+    this.paintContext = null;
   }
 
   public void setPaintMode()
@@ -1639,10 +1665,7 @@
    *
    * @return the bounds of the target
    */
-  protected Rectangle getDeviceBounds()
-  {
-    return destinationRaster.getBounds();
-  }
+  protected abstract Rectangle getDeviceBounds();
 
   /**
    * Draws a line in optimization mode. The implementation should respect the
@@ -1763,7 +1786,8 @@
    */
   public void renderScanline(int y, ScanlineCoverage c)
   {
-    PaintContext pCtx = paintContext;
+    PaintContext pCtx = getPaintContext();
+    
     int x0 = c.getMinX();
     int x1 = c.getMaxX();
     Raster paintRaster = pCtx.getRaster(x0, y, x1 - x0, 1);
@@ -1797,9 +1821,11 @@
     CompositeContext cCtx = composite.createContext(paintColorModel,
                                                     getColorModel(),
                                                     renderingHints);
-    WritableRaster targetChild = destinationRaster.createWritableTranslatedChild(-x0,- y);
+    WritableRaster raster = getDestinationRaster();
+    WritableRaster targetChild = raster.createWritableTranslatedChild(-x0, -y);
+    
     cCtx.compose(paintRaster, targetChild, targetChild);
-    updateRaster(destinationRaster, x0, y, x1 - x0, 1);
+    updateRaster(raster, x0, y, x1 - x0, 1);
     cCtx.dispose();
   }
 
@@ -1986,4 +2012,20 @@
       }
   }
 
+  private PaintContext getPaintContext()
+  {
+    if (this.paintContext == null)
+      {
+        return this.foreground.createContext(getColorModel(),
+                                             getDeviceBounds(),
+                                             getClipBounds(),
+                                             getTransform(),
+                                             getRenderingHints());
+      }
+    else
+      {
+        return this.paintContext;
+      }
+  }
+
 }
Index: gnu/java/awt/java2d/ScanlineConverter.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/awt/java2d/ScanlineConverter.java,v
retrieving revision 1.6
diff -u -r1.6 ScanlineConverter.java
--- gnu/java/awt/java2d/ScanlineConverter.java	20 Sep 2007 14:01:08 -0000	1.6
+++ gnu/java/awt/java2d/ScanlineConverter.java	29 May 2008 16:34:26 -0000
@@ -206,7 +206,7 @@
         // Ok, now we can perform the actual scanlining.
         int realY = Fixed.intValue(FIXED_DIGITS, y + resolution);
         boolean push = lastRealY != realY;
-        doScanline(p, y, push, haveClip);
+        doScanline(p, realY, push, haveClip);
 
         // Remove obsolete active edges.
         //activeEdges.remove(y + halfStep);
Index: gnu/java/awt/java2d/RasterGraphics.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/awt/java2d/RasterGraphics.java,v
retrieving revision 1.3
diff -u -r1.3 RasterGraphics.java
--- gnu/java/awt/java2d/RasterGraphics.java	10 May 2006 09:13:20 -0000	1.3
+++ gnu/java/awt/java2d/RasterGraphics.java	29 May 2008 16:34:26 -0000
@@ -39,6 +39,7 @@
 package gnu.java.awt.java2d;
 
 import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
 import java.awt.image.ColorModel;
 import java.awt.image.WritableRaster;
 
@@ -100,4 +101,9 @@
     return null;
   }
 
+  @Override
+  protected Rectangle getDeviceBounds()
+  {
+    return this.raster.getBounds();
+  }
 }
Index: java/awt/image/WritableRaster.java
===================================================================
RCS file: /sources/classpath/classpath/java/awt/image/WritableRaster.java,v
retrieving revision 1.10
diff -u -r1.10 WritableRaster.java
--- java/awt/image/WritableRaster.java	27 Nov 2006 21:54:41 -0000	1.10
+++ java/awt/image/WritableRaster.java	29 May 2008 16:34:26 -0000
@@ -111,13 +111,8 @@
   public WritableRaster createWritableTranslatedChild(int childMinX,
                                                       int childMinY)
   {
-    // This mirrors the code from the super class
-    int tcx = sampleModelTranslateX - minX + childMinX;
-    int tcy = sampleModelTranslateY - minY + childMinY;
-    
-    return new WritableRaster(sampleModel, dataBuffer,
-        new Rectangle(childMinX, childMinY, width, height), 
-        new Point(tcx, tcy), this);
+    return createWritableChild(minX, minY, width, height,
+                               childMinX, childMinY, null);
   }
 
   /**
@@ -143,12 +138,14 @@
     SampleModel sm = (bandList == null) ?
       sampleModel :
       sampleModel.createSubsetSampleModel(bandList);
-    
-    return new WritableRaster(sm, dataBuffer,
-        new Rectangle(childMinX, childMinY, w, h),
-        new Point(sampleModelTranslateX + childMinX - parentX,
-                  sampleModelTranslateY + childMinY - parentY),
-        this);
+
+    return new WritableRaster(sm, getDataBuffer(),
+                              new Rectangle(childMinX, childMinY, w, h),
+                              new Point(sampleModelTranslateX + childMinX -
+                                          parentX,
+                                        sampleModelTranslateY + childMinY -
+                                          parentY),
+                              this);
   }
   
   public Raster createChild(int parentX, int parentY, int width,

Reply via email to