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