[OpenJDK 2D-Dev] Displacement by one pixel if using setStroke

Roman Kennke Roman.Kennke at Sun.COM
Wed Oct 7 15:33:39 UTC 2009


Hi Christoph,

I have filed bug #6889147, it should appear shortly on bugs.sun.com.
This seems to be another problem in the Pisces renderer. It seems to be
valid both for OpenJDK6 and 7. I try to have a look as soon as I find
time.

Thanks, Roman



Am Dienstag, den 06.10.2009, 12:31 +0200 schrieb Dr. Christoph Gille:
> When using setStroke, the pixel is displaced by one position
> I guess that it is a numeric rounding error in 2d.
> The following program demonstrates the error and shows my workaround:
> g.translate(0.001,0.001);
> 
> 
> 
> 
> import java.awt.*;
> import javax.swing.*;
> 
> /**
>    You should see a dashed black-red rectangle.
> 
>    Without calling translate however, the dashed rectangle is displaced by one
>    pixel.
> 
>    Starting
>    java test.Topenjdk
> 
>    java -version
>    java version "1.6.0_0"
>    OpenJDK  Runtime Environment (build 1.6.0_0-b11)
>    OpenJDK Client VM (build 1.6.0_0-b11, mixed mode, sharing)
> */
> public final class Topenjdk extends JComponent {
>     boolean bugfixed;
>     public static void main(String argv[]) throws Exception {
>         for(boolean withWorkaround : new boolean[]{true,false}) {
>             final JFrame f=new JFrame(withWorkaround ? "With workaround" : "Bug: rectangles do not coincide ");
>             final Topenjdk component=new Topenjdk();
>             component.bugfixed=withWorkaround;
>             f.getContentPane().add(component);
>             f.setLocation(withWorkaround ? 20:0, withWorkaround ? 20:0);
>             f.setSize(300,300);
>             f.show();
>         }
>     }
>     public void paintComponent(Graphics graphics) {
>         final Graphics2D g=(Graphics2D)graphics;
>         if (bugfixed) g.translate(0.001,0.001);
>         g.setColor(Color.WHITE);
>         g.fillRect(0,0,999,999);
>         g.setColor(Color.BLACK);
>         g.drawRect(10,10,100,100);
>         g.setStroke(new BasicStroke(1f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND,1f,new float[]{12/3f, 12-12/3f},3));
>         g.setColor(Color.RED);
>         g.drawRect(10,10,100,100);
>         if (bugfixed)  g.translate(-0.001,-0.001);
>     }
> }
> 
> 




More information about the 2d-dev mailing list