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);