I haven't run your example, but I am pretty sure that this is happening because thin non-dashed lines are rendered using a fairly fast Bresenham algorithm, but dashed lines are rendered using a fairly complex but accurate technique of generating "widened" geometry for the line and then filling the "widened" geometry.
You can work around this by either turning on antialiasing or by using a line width of 1.01 or so for both dashed and non-dashed lines. This is because the antialiasing pipeline always uses the accurate line widening technique to draw even thin lines and in the second case because a line that is greater than 1.0 pixels in width will always go through the widening algorithm...
...jim
--On Tuesday, July 01, 2003 18:26:08 -0400 David Eisner <[EMAIL PROTECTED]> wrote:
I have a GeneralPath that I draw with two different BasicStrokes. The two strokes are (intended to be) identical except that one is dashed.
What I'm observing is that in some cases the two stroked outlines do not overlap, as I'd expect them to. Are my expectations incorrect?
I'm including a simple program that demonstrates the problem.
You can find a (blown up) screen capture here:
http://cradle.brokenglass.com/images/dash.png
This is occurring with (at least) the following:
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28) Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
Thanks in advance.
-David
----
import java.awt.*; import java.awt.geom.*; import javax.swing.*;
public class DashTest extends JFrame {
class BoxCanvas extends JPanel {
Stroke dashStroke_; Stroke lineStroke_; Shape shape_;
BoxCanvas() {
BasicStroke ds = new BasicStroke();
lineStroke_ = ds; dashStroke_ = new BasicStroke( ds.getLineWidth(), ds.getEndCap(), ds.getLineJoin(), ds.getMiterLimit() , new float[] {8, 8}, 0 );
shape_ = makeShape();
setBackground( new Color( 0, 200, 0)); setPreferredSize( new Dimension(100, 100)); }
private Shape makeShape() {
GeneralPath p = new GeneralPath();
p.moveTo( 20.0f, 70.0f ); p.lineTo( 70.9f, 70.0f); p.lineTo( 70.9f, 20.0f); p.lineTo( 20.0f, 20.0f ); p.closePath();
return p; }
public void paintComponent( Graphics g ) { super.paintComponent( g ); Graphics2D g2 = (Graphics2D) g;
g2.setStroke( lineStroke_ ); g2.setColor( Color.BLACK ); g2.draw( shape_ );
g2.setStroke( dashStroke_ ); g2.setColor( Color.WHITE ); g2.draw( shape_ ); } }
public DashTest() { super( "DashTest" );
JPanel canvas = new BoxCanvas(); getContentPane().add( canvas ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); }
public static void main( String[] args ) {
DashTest app = new DashTest(); app.pack(); app.setVisible( true ); } }
------------------------+--------------------------+ David Eisner | E-mail: [EMAIL PROTECTED] | CALCE EPSC | Phone: 301-405-5341 | University of Maryland | Fax: 301-314-9269 | ------------------------+--------------------------+
========================================================================= == To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA2D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".
=========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA2D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".
