This brings the X peers up to the recent enhancement of the rasterizer.

2007-05-22  Roman Kennke  <[EMAIL PROTECTED]>

        * gnu/java/awt/peer/x/XFontPeer2.java
        (XFontMetrics.charWidth): Use cached Point2D instance.
        * gnu/java/awt/peer/x/XGraphics2D.java
        (renderScanline): New method. Renders a scanline according to
        the coverage information.
        (setPaint): Call super, so that the state is updated correctly.

/Roman
-- 
Dipl.-Inf. 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/peer/x/XFontPeer2.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/x/XFontPeer2.java,v
retrieving revision 1.4
diff -u -1 -5 -r1.4 XFontPeer2.java
--- gnu/java/awt/peer/x/XFontPeer2.java	8 May 2007 15:03:07 -0000	1.4
+++ gnu/java/awt/peer/x/XFontPeer2.java	22 May 2007 13:12:05 -0000
@@ -194,31 +194,31 @@
                                            false, false, false);
     }
     
     public int getHeight()
     {
       GlyphVector gv = fontDelegate.createGlyphVector(getFont(),
                     new FontRenderContext(IDENDITY, false, false),
                     new StringCharacterIterator("m"));
       Rectangle2D b = gv.getVisualBounds();
       return (int) b.getHeight();
     }
 
     public int charWidth(char c)
     {
       int code = fontDelegate.getGlyphIndex(c);
-      Point2D advance = new Point2D.Double();
+      Point2D advance = cachedPoint;
       fontDelegate.getAdvance(code, font.getSize2D(), IDENDITY,
                               false, false, true, advance);
       return (int) advance.getX();
     }
 
     public int charsWidth(char[] chars, int offs, int len)
     {
       return stringWidth(new String(chars, offs, len));
     }
 
     public int stringWidth(String s)
     {
       GlyphVector gv = fontDelegate.createGlyphVector(getFont(),
                     new FontRenderContext(IDENDITY, false, false),
                     new StringCharacterIterator(s));
Index: gnu/java/awt/peer/x/XGraphics2D.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/x/XGraphics2D.java,v
retrieving revision 1.2
diff -u -1 -5 -r1.2 XGraphics2D.java
--- gnu/java/awt/peer/x/XGraphics2D.java	30 Apr 2007 20:30:56 -0000	1.2
+++ gnu/java/awt/peer/x/XGraphics2D.java	22 May 2007 13:12:05 -0000
@@ -40,30 +40,31 @@
 import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.GraphicsConfiguration;
 import java.awt.Image;
 import java.awt.Paint;
 import java.awt.Rectangle;
 import java.awt.Shape;
 import java.awt.Toolkit;
 import java.awt.geom.AffineTransform;
 import java.awt.image.ColorModel;
 import java.awt.image.ImageObserver;
 import java.awt.image.Raster;
 import java.util.HashMap;
 
 import gnu.java.awt.java2d.AbstractGraphics2D;
+import gnu.java.awt.java2d.ScanlineCoverage;
 import gnu.x11.Colormap;
 import gnu.x11.Drawable;
 import gnu.x11.GC;
 import gnu.x11.image.ZPixmap;
 
 public class XGraphics2D
   extends AbstractGraphics2D
 {
 
   /**
    * The X Drawable to draw on.
    */
   private Drawable xdrawable;
 
   /**
@@ -204,52 +205,92 @@
               {
                 pixel = raster.getPixel(tx, ty, pixel);
                 //System.err.println("tx: " + tx + ", ty: " + ty + ", pixel: " + pixel[0] + ", " + pixel[1] + ", " + pixel[2]);
 //              System.err.print("r: " + pixel[0]);
 //              System.err.print(", g: " + pixel[1]);
 //              System.err.println(", b: " + pixel[2]);
                 zPixmap.set_red(tx - x, ty - y, pixel[0]);
                 zPixmap.set_green(tx - x, ty - y, pixel[1]);
                 zPixmap.set_blue(tx - x, ty - y, pixel[2]);
               }
           }
         xdrawable.put_image(xgc, zPixmap, x, y);
       }
   }
 
+  public void renderScanline(int y, ScanlineCoverage c)
+  {
+    ScanlineCoverage.Coverage start = c.iterate();
+    ScanlineCoverage.Coverage end = c.next();
+    assert (start != null);
+    assert (end != null);
+    int coverageAlpha = 0;
+    int maxCoverage = c.getMaxCoverage();
+    Color old = getColor();
+    Color col = getColor();
+    if (col == null)
+      col = Color.BLACK;
+    do
+      {
+        // TODO: Dumb implementation for testing.
+        coverageAlpha = coverageAlpha + start.getCoverageDelta();
+        if (coverageAlpha > 0)
+          {
+            int red = col.getRed();
+            int green = col.getGreen();
+            int blue = col.getBlue();
+            if (coverageAlpha < c.getMaxCoverage())
+              {
+                float alpha = coverageAlpha / maxCoverage;
+                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 = start.getXPos();
+            int x1 = end.getXPos();
+            xdrawable.fill_rectangle(xgc, x0, y, x1 - x0, 1);
+          }
+        start = end;
+        end = c.next();
+      } while (end != 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);
     // FIXME: This is for testing only.
     Color c = getColor();
     setColor(new Color(255-alpha, 255-alpha, 255-alpha));
     xdrawable.segment(xgc, x0, y, x1, y);
     setColor(c);
   }
 
   protected void init()
   {
     super.init();
   }
 
   public void setPaint(Paint p)
   {
+    super.setPaint(p);
     if (p instanceof Color)
       {
         Color c = (Color) p;
         XToolkit tk = (XToolkit) Toolkit.getDefaultToolkit();
         HashMap colorMap = tk.colorMap;
         gnu.x11.Color col = (gnu.x11.Color) colorMap.get(c);
         if (col == null)
           {
             Colormap map = xdrawable.display.default_colormap;
             col = map.alloc_color (c.getRed() * 256,
                                    c.getGreen() * 256,
                                    c.getBlue() * 256);
             colorMap.put(c, col);
           }
         xgc.set_foreground(col);

Reply via email to