From 6ed015d1bd8abe5af7dae2820ba4a0816b2ed24f Mon Sep 17 00:00:00 2001
From: Tim Molter <tim.molter@gmail.com>
Date: Fri, 26 Apr 2013 23:28:45 +0200
Subject: [PATCH] converting all painting to double precision

---
 .../xchart/demo/charts/bar/BarChart01.java    |  4 +-
 .../xeiam/xchart/internal/chartpart/Axis.java | 71 ++++++++++---------
 .../xchart/internal/chartpart/AxisTick.java   |  5 +-
 .../chartpart/AxisTickCalculator.java         |  1 -
 .../internal/chartpart/AxisTickLabels.java    |  4 +-
 .../internal/chartpart/AxisTickMarks.java     | 35 ++++++---
 .../xchart/internal/chartpart/AxisTitle.java  |  4 +-
 .../internal/chartpart/ChartPainter.java      |  5 +-
 .../xchart/internal/chartpart/ChartPart.java  |  4 +-
 .../xchart/internal/chartpart/ChartTitle.java | 20 +++---
 .../xchart/internal/chartpart/Legend.java     | 55 +++++++-------
 .../xeiam/xchart/internal/chartpart/Plot.java |  5 +-
 .../internal/chartpart/PlotContent.java       |  4 +-
 .../chartpart/PlotContentBarChart.java        | 29 +++++---
 .../chartpart/PlotContentLineChart.java       | 39 +++++++---
 .../internal/chartpart/PlotSurface.java       | 40 ++++++-----
 .../xeiam/xchart/internal/markers/Circle.java |  5 +-
 .../xchart/internal/markers/Diamond.java      | 34 +++------
 .../xeiam/xchart/internal/markers/Marker.java |  2 +-
 .../xeiam/xchart/internal/markers/Square.java |  5 +-
 .../xchart/internal/markers/TriangleDown.java | 31 +++-----
 .../xchart/internal/markers/TriangleUp.java   | 31 +++-----
 22 files changed, 220 insertions(+), 213 deletions(-)

diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java
index 076fbdf9..8ee0c82c 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java
@@ -23,9 +23,9 @@ package com.xeiam.xchart.demo.charts.bar;
 
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.ChartBuilder;
-import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.StyleManager.ChartType;
 import com.xeiam.xchart.StyleManager.LegendPosition;
+import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
@@ -51,7 +51,7 @@ public class BarChart01 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Score Histgram").xAxisTitle("Score").yAxisTitle("Number").build();
+    Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Score Histogram").xAxisTitle("Score").yAxisTitle("Number").build();
     chart.addSeries("test 1", new double[] { 0, 1, 2, 3, 4 }, new double[] { 4, 5, 9, 6, 5 });
 
     // Customize Chart
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java
index 4d156ed8..39fd0e0d 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java
@@ -56,10 +56,10 @@ public class Axis implements ChartPart {
   private BigDecimal max = null;
 
   /** the bounds */
-  private Rectangle bounds;
+  private Rectangle2D bounds;
 
   /** the paint zone */
-  private Rectangle paintZone;
+  private Rectangle2D paintZone;
 
   /** An axis direction */
   public enum Direction {
@@ -113,7 +113,7 @@ public class Axis implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return bounds;
   }
@@ -121,7 +121,7 @@ public class Axis implements ChartPart {
   /**
    * @return
    */
-  protected int getSizeHint() {
+  protected double getSizeHint() {
 
     if (direction == Direction.X) { // X-Axis
 
@@ -140,7 +140,7 @@ public class Axis implements ChartPart {
         Rectangle2D rectangle = textLayout.getBounds();
         axisTickLabelsHeight = rectangle.getHeight() + getChartPainter().getStyleManager().getAxisTickPadding() + getChartPainter().getStyleManager().getAxisTickMarkLength();
       }
-      return (int) (titleHeight + axisTickLabelsHeight);
+      return titleHeight + axisTickLabelsHeight;
     } else { // Y-Axis
       return 0; // We layout the yAxis first depending in the xAxis height hint. We don't care about the yAxis height hint
     }
@@ -162,13 +162,14 @@ public class Axis implements ChartPart {
       // |
       // |
       // ----
-      int xOffset = getChartPainter().getStyleManager().getChartPadding();
-      int yOffset = getChartPainter().getChartTitle().getSizeHint();
-      int width = 80; // arbitrary, final width depends on Axis tick labels
+      double xOffset = getChartPainter().getStyleManager().getChartPadding();
+      double yOffset = getChartPainter().getChartTitle().getSizeHint();
+      double width = 80; // arbitrary, final width depends on Axis tick labels
 
-      int height = getChartPainter().getHeight() - yOffset - axisPair.getxAxis().getSizeHint() - getChartPainter().getStyleManager().getPlotPadding()
+      double height = getChartPainter().getHeight() - yOffset - axisPair.getxAxis().getSizeHint() - getChartPainter().getStyleManager().getPlotPadding()
           - getChartPainter().getStyleManager().getChartPadding();
-      Rectangle yAxisRectangle = new Rectangle(xOffset, yOffset, width, height);
+      Rectangle2D yAxisRectangle = new Rectangle2D.Double(xOffset, yOffset, width, height);
+
       this.paintZone = yAxisRectangle;
       // g.setColor(Color.green);
       // g.draw(yAxisRectangle);
@@ -177,11 +178,12 @@ public class Axis implements ChartPart {
       axisTitle.paint(g);
       axisTick.paint(g);
 
-      xOffset = (int) paintZone.getX();
-      yOffset = (int) paintZone.getY();
-      width = (int) (getChartPainter().getStyleManager().isYAxisTitleVisible() ? axisTitle.getBounds().getWidth() : 0) + (int) axisTick.getBounds().getWidth();
-      height = (int) paintZone.getHeight();
-      bounds = new Rectangle(xOffset, yOffset, width, height);
+      xOffset = paintZone.getX();
+      yOffset = paintZone.getY();
+      width = (getChartPainter().getStyleManager().isYAxisTitleVisible() ? axisTitle.getBounds().getWidth() : 0) + (int) axisTick.getBounds().getWidth();
+      height = paintZone.getHeight();
+      bounds = new Rectangle2D.Double(xOffset, yOffset, width, height);
+
       // g.setColor(Color.yellow);
       // g.draw(bounds);
 
@@ -190,34 +192,36 @@ public class Axis implements ChartPart {
       // calculate paint zone
       // |____________________|
 
-      int xOffset = (int) (axisPair.getyAxis().getBounds().getWidth() + (getChartPainter().getStyleManager().isYAxisTicksVisible() ? getChartPainter().getStyleManager().getPlotPadding() : 0) + getChartPainter()
+      double xOffset = (int) (axisPair.getyAxis().getBounds().getWidth() + (getChartPainter().getStyleManager().isYAxisTicksVisible() ? getChartPainter().getStyleManager().getPlotPadding() : 0) + getChartPainter()
           .getStyleManager().getChartPadding());
-      int yOffset = (int) (axisPair.getyAxis().getBounds().getY() + axisPair.getyAxis().getBounds().getHeight() + getChartPainter().getStyleManager().getPlotPadding());
+      double yOffset = (int) (axisPair.getyAxis().getBounds().getY() + axisPair.getyAxis().getBounds().getHeight() + getChartPainter().getStyleManager().getPlotPadding());
 
       double chartLegendWidth = 0;
       if (getChartPainter().getStyleManager().getLegendPosition() == LegendPosition.OutsideE) {
         chartLegendWidth = getChartPainter().getChartLegend().getSizeHint()[0];
       }
 
-      int width = (int) (
+      double width =
 
       getChartPainter().getWidth()
 
-      - axisPair.getyAxis().getBounds().getWidth()
+          - axisPair.getyAxis().getBounds().getWidth()
+
+          - chartLegendWidth
 
-      - chartLegendWidth
+          - 2
+          * getChartPainter().getStyleManager().getChartPadding()
 
-      - 2 * getChartPainter().getStyleManager().getChartPadding()
+          - (getChartPainter().getStyleManager().isYAxisTicksVisible() ? (getChartPainter().getStyleManager().getPlotPadding() + 1) : 0)
 
-      - (getChartPainter().getStyleManager().isYAxisTicksVisible() ? (getChartPainter().getStyleManager().getPlotPadding() + 1) : 0)
+          - (getChartPainter().getStyleManager().getLegendPosition() == LegendPosition.OutsideE && getChartPainter().getStyleManager().isLegendVisible() ? getChartPainter().getStyleManager()
+              .getChartPadding() : 0)
 
-      - (getChartPainter().getStyleManager().getLegendPosition() == LegendPosition.OutsideE && getChartPainter().getStyleManager().isLegendVisible() ? getChartPainter().getStyleManager()
-          .getChartPadding() : 0)
+      ;
 
-      );
+      double height = this.getSizeHint();
+      Rectangle2D xAxisRectangle = new Rectangle2D.Double(xOffset, yOffset, width, height);
 
-      int height = this.getSizeHint();
-      Rectangle xAxisRectangle = new Rectangle(xOffset, yOffset, width, height);
       this.paintZone = xAxisRectangle;
       // g.setColor(Color.green);
       // g.draw(xAxisRectangle);
@@ -225,12 +229,11 @@ public class Axis implements ChartPart {
       axisTitle.paint(g);
       axisTick.paint(g);
 
-      xOffset = (int) paintZone.getX();
-      yOffset = (int) paintZone.getY();
-      width = (int) paintZone.getWidth();
-      height = (int) ((getChartPainter().getStyleManager().isXAxisTitleVisible() ? axisTitle.getBounds().getHeight() : 0) + (int) axisTick.getBounds().getHeight());
-      bounds = new Rectangle(xOffset, yOffset, width, height);
-      bounds = new Rectangle(xOffset, yOffset, width, height);
+      xOffset = paintZone.getX();
+      yOffset = paintZone.getY();
+      width = paintZone.getWidth();
+      height = (getChartPainter().getStyleManager().isXAxisTitleVisible() ? axisTitle.getBounds().getHeight() : 0) + (int) axisTick.getBounds().getHeight();
+      bounds = new Rectangle2D.Double(xOffset, yOffset, width, height);
       // g.setColor(Color.yellow);
       // g.draw(bounds);
     }
@@ -270,7 +273,7 @@ public class Axis implements ChartPart {
     return direction;
   }
 
-  protected Rectangle getPaintZone() {
+  protected Rectangle2D getPaintZone() {
 
     return paintZone;
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java
index 9cb22fdc..86174fa9 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java
@@ -17,6 +17,7 @@ package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
 import java.util.List;
 
 import com.xeiam.xchart.StyleManager.ChartType;
@@ -37,7 +38,7 @@ public class AxisTick implements ChartPart {
   private AxisTickMarks axisTickMarks;
 
   /** the bounds */
-  private Rectangle bounds = new Rectangle();;
+  private Rectangle2D bounds = new Rectangle2D.Double(0, 0, 0, 0);
 
   AxisTickCalculator gridStep = null;
 
@@ -54,7 +55,7 @@ public class AxisTick implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return bounds;
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java
index 507c89ab..82ed5de3 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java
@@ -101,7 +101,6 @@ public abstract class AxisTickCalculator {
     this.axisDirection = axisDirection;
     this.workingSpace = workingSpace;
     this.minValue = overrideMinValue;
-    // this.minValue = new BigDecimal(10000);
     this.maxValue = overrideMaxValue;
     this.styleManager = styleManager;
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java
index 52285376..7c16c821 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java
@@ -30,7 +30,7 @@ public class AxisTickLabels implements ChartPart {
   private final AxisTick axisTick;
 
   /** the bounds */
-  private Rectangle bounds = new Rectangle();
+  private Rectangle2D bounds = new Rectangle2D.Double(0, 0, 0, 0);
 
   /**
    * Constructor
@@ -43,7 +43,7 @@ public class AxisTickLabels implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return bounds;
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java
index 488c6316..3b512125 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickMarks.java
@@ -17,9 +17,12 @@ package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.Line2D;
+import java.awt.geom.Rectangle2D;
 
 /**
- * Axis tick marks.
+ * Axis tick marks. This includes the little tick marks and the line that hugs the plot area.
  */
 public class AxisTickMarks implements ChartPart {
 
@@ -27,7 +30,7 @@ public class AxisTickMarks implements ChartPart {
   private AxisTick axisTick;
 
   /** the bounds */
-  private Rectangle bounds = new Rectangle();
+  private Rectangle2D bounds = new Rectangle2D.Double(0, 0, 0, 0);
 
   /**
    * Constructor
@@ -40,7 +43,7 @@ public class AxisTickMarks implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return bounds;
   }
@@ -65,16 +68,24 @@ public class AxisTickMarks implements ChartPart {
 
           // g.setColor(getChart().getStyleManager().getChartBordersColor());
           // g.setStroke(stroke);
+          Shape line = new Line2D.Double(xOffset, yOffset + axisTick.getAxis().getPaintZone().getHeight() - tickLocation, xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(),
+              yOffset + axisTick.getAxis().getPaintZone().getHeight() - tickLocation);
+          g.draw(line);
 
-          g.drawLine(xOffset, yOffset + (int) (axisTick.getAxis().getPaintZone().getHeight() - tickLocation), xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset
-              + (int) (axisTick.getAxis().getPaintZone().getHeight() - tickLocation));
+          // g.drawLine(xOffset, yOffset + (int) (axisTick.getAxis().getPaintZone().getHeight() - tickLocation), xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset
+          // + (int) (axisTick.getAxis().getPaintZone().getHeight() - tickLocation));
 
         }
       }
       // Line
       if (getChartPainter().getStyleManager().isAxisTicksLineVisible()) {
-        g.drawLine(xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset, xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset
-            + (int) axisTick.getAxis().getPaintZone().getHeight());
+
+        Shape line = new Line2D.Double(xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset, xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset
+            + axisTick.getAxis().getPaintZone().getHeight());
+        g.draw(line);
+
+        // g.drawLine(xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset, xOffset + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset
+        // + (int) axisTick.getAxis().getPaintZone().getHeight());
       }
 
       // bounds
@@ -97,15 +108,19 @@ public class AxisTickMarks implements ChartPart {
 
           // g.setColor(getChart().getStyleManager().getChartBordersColor());
           // g.setStroke(stroke);
-
-          g.drawLine(xOffset + tickLocation, yOffset, xOffset + tickLocation, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength());
+          Shape line = new Line2D.Double(xOffset + tickLocation, yOffset, xOffset + tickLocation, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength());
+          g.draw(line);
+          // g.drawLine(xOffset + tickLocation, yOffset, xOffset + tickLocation, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength());
         }
       }
       // Line
       if (getChartPainter().getStyleManager().isAxisTicksLineVisible()) {
 
-        g.drawLine(xOffset, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength(), xOffset + (int) axisTick.getAxis().getPaintZone().getWidth(), yOffset
+        Shape line = new Line2D.Double(xOffset, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength(), xOffset + axisTick.getAxis().getPaintZone().getWidth(), yOffset
             - getChartPainter().getStyleManager().getAxisTickMarkLength());
+        g.draw(line);
+        // g.drawLine(xOffset, yOffset - getChartPainter().getStyleManager().getAxisTickMarkLength(), xOffset + (int) axisTick.getAxis().getPaintZone().getWidth(), yOffset
+        // - getChartPainter().getStyleManager().getAxisTickMarkLength());
       }
 
       // bounds
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java
index 5c6985fb..1af0d40a 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTitle.java
@@ -34,7 +34,7 @@ public class AxisTitle implements ChartPart {
   private String text = ""; // default to ""
 
   /** the bounds */
-  private Rectangle bounds;
+  private Rectangle2D bounds;
 
   /**
    * Constructor
@@ -47,7 +47,7 @@ public class AxisTitle implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return bounds;
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPainter.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPainter.java
index 3df4ac6b..2090d96a 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPainter.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPainter.java
@@ -23,6 +23,8 @@ package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
+import java.awt.Shape;
+import java.awt.geom.Rectangle2D;
 import java.math.BigDecimal;
 
 import com.xeiam.xchart.StyleManager;
@@ -92,7 +94,8 @@ public class ChartPainter {
 
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // global rendering hint
     g.setColor(styleManager.getChartBackgroundColor());
-    g.fillRect(0, 0, width, height);
+    Shape rect = new Rectangle2D.Double(0, 0, width, height);
+    g.fill(rect);
 
     axisPair.paint(g);
     plot.paint(g);
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPart.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPart.java
index 934af8e6..78d61a16 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPart.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartPart.java
@@ -16,7 +16,7 @@
 package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.Graphics2D;
-import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
 
 /**
  * All components of a chart that need to be painted should implement this interface
@@ -25,7 +25,7 @@ import java.awt.Rectangle;
  */
 public interface ChartPart {
 
-  public Rectangle getBounds();
+  public Rectangle2D getBounds();
 
   public void paint(final Graphics2D g);
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java
index a840a5bc..ca676d8f 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/ChartTitle.java
@@ -17,7 +17,7 @@ package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.BasicStroke;
 import java.awt.Graphics2D;
-import java.awt.Rectangle;
+import java.awt.Shape;
 import java.awt.font.FontRenderContext;
 import java.awt.font.TextLayout;
 import java.awt.geom.Rectangle2D;
@@ -30,12 +30,12 @@ public class ChartTitle implements ChartPart {
   /** parent */
   private final ChartPainter chartPainter;
 
-  /** the bounds */
-  private Rectangle bounds;
-
   /** the title text */
   private String text = ""; // default to ""
 
+  /** the bounds */
+  private Rectangle2D bounds;
+
   /**
    * Constructor
    * 
@@ -102,17 +102,19 @@ public class ChartTitle implements ChartPart {
         int chartTitleBoxHeight = (int) (rectangle.getHeight() + 2 * chartPainter.getStyleManager().getChartTitlePadding());
 
         g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
-        g.setColor(chartPainter.getStyleManager().getChartTitleBoxBorderColor());
-        g.drawRect(xOffset - 1, yOffset, chartTitleBoxWidth, chartTitleBoxHeight);
+        Shape rect = new Rectangle2D.Double(xOffset, yOffset, chartTitleBoxWidth, chartTitleBoxHeight);
         g.setColor(chartPainter.getStyleManager().getChartTitleBoxBackgroundColor());
-        g.fillRect(xOffset, yOffset + 1, chartTitleBoxWidth - 1, chartTitleBoxHeight - 1);
+        g.fill(rect);
+        g.setColor(chartPainter.getStyleManager().getChartTitleBoxBorderColor());
+        g.draw(rect);
+
       }
 
       // paint title
       xOffset = (int) (chartPainter.getPlot().getBounds().getX() + (chartPainter.getPlot().getBounds().getWidth() - rectangle.getWidth()) / 2.0);
       yOffset = (int) (chartPainter.getStyleManager().getChartPadding() - rectangle.getY() + chartPainter.getStyleManager().getChartTitlePadding());
 
-      bounds = new Rectangle(xOffset, yOffset + ((int) rectangle.getY()), (int) rectangle.getWidth(), (int) (rectangle.getHeight()));
+      bounds = new Rectangle2D.Double(xOffset, yOffset + rectangle.getY(), rectangle.getWidth(), rectangle.getHeight());
       // g.setColor(Color.green);
       // g.draw(bounds);
 
@@ -123,7 +125,7 @@ public class ChartTitle implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return null; // this should never be needed
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java
index 847f08f6..b175c603 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java
@@ -18,7 +18,6 @@ package com.xeiam.xchart.internal.chartpart;
 import java.awt.BasicStroke;
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
-import java.awt.RenderingHints;
 import java.awt.Shape;
 import java.awt.font.FontRenderContext;
 import java.awt.font.TextLayout;
@@ -42,7 +41,7 @@ public class Legend implements ChartPart {
   private final ChartPainter chartPainter;
 
   /** the bounds */
-  private Rectangle bounds;
+  private Rectangle2D bounds;
 
   /**
    * Constructor
@@ -120,48 +119,45 @@ public class Legend implements ChartPart {
       double legendBoxWidth = getSizeHint()[0];
       double legendBoxHeight = getSizeHint()[1];
       double maxContentHeight = getSizeHint()[2];
-      // System.out.println(legendBoxWidth);
-      // System.out.println(legendBoxHeight);
-      // System.out.println(maxContentHeight);
 
       // legend draw position
-      int xOffset = 0;
-      int yOffset = 0;
+      double xOffset = 0;
+      double yOffset = 0;
       switch (chartPainter.getStyleManager().getLegendPosition()) {
       case OutsideE:
-        xOffset = (int) (chartPainter.getWidth() - legendBoxWidth - chartPainter.getStyleManager().getChartPadding());
-        yOffset = (int) (chartPainter.getPlot().getBounds().getY() + (chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight) / 2.0);
+        xOffset = chartPainter.getWidth() - legendBoxWidth - chartPainter.getStyleManager().getChartPadding();
+        yOffset = chartPainter.getPlot().getBounds().getY() + (chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight) / 2.0;
         break;
       case InsideNW:
-        xOffset = (int) (chartPainter.getPlot().getBounds().getX() + LEGEND_MARGIN);
-        yOffset = (int) (chartPainter.getPlot().getBounds().getY() + LEGEND_MARGIN);
+        xOffset = chartPainter.getPlot().getBounds().getX() + LEGEND_MARGIN;
+        yOffset = chartPainter.getPlot().getBounds().getY() + LEGEND_MARGIN;
         break;
       case InsideNE:
-        xOffset = (int) (chartPainter.getPlot().getBounds().getX() + chartPainter.getPlot().getBounds().getWidth() - legendBoxWidth - LEGEND_MARGIN);
-        yOffset = (int) (chartPainter.getPlot().getBounds().getY() + LEGEND_MARGIN);
+        xOffset = chartPainter.getPlot().getBounds().getX() + chartPainter.getPlot().getBounds().getWidth() - legendBoxWidth - LEGEND_MARGIN;
+        yOffset = chartPainter.getPlot().getBounds().getY() + LEGEND_MARGIN;
         break;
       case InsideSE:
-        xOffset = (int) (chartPainter.getPlot().getBounds().getX() + chartPainter.getPlot().getBounds().getWidth() - legendBoxWidth - LEGEND_MARGIN);
-        yOffset = (int) (chartPainter.getPlot().getBounds().getY() + chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight - LEGEND_MARGIN);
+        xOffset = chartPainter.getPlot().getBounds().getX() + chartPainter.getPlot().getBounds().getWidth() - legendBoxWidth - LEGEND_MARGIN;
+        yOffset = chartPainter.getPlot().getBounds().getY() + chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight - LEGEND_MARGIN;
         break;
       case InsideSW:
-        xOffset = (int) (chartPainter.getPlot().getBounds().getX() + LEGEND_MARGIN);
-        yOffset = (int) (chartPainter.getPlot().getBounds().getY() + chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight - LEGEND_MARGIN);
+        xOffset = chartPainter.getPlot().getBounds().getX() + LEGEND_MARGIN;
+        yOffset = chartPainter.getPlot().getBounds().getY() + chartPainter.getPlot().getBounds().getHeight() - legendBoxHeight - LEGEND_MARGIN;
         break;
 
       default:
         break;
       }
       g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
-      Rectangle2D rect = new Rectangle2D.Double(xOffset + 1, yOffset + 1, (int) (legendBoxWidth - 2), (int) (legendBoxHeight - 2));
+      Shape rect = new Rectangle2D.Double(xOffset + 1, yOffset + 1, legendBoxWidth - 2, legendBoxHeight - 2);
       g.setColor(chartPainter.getStyleManager().getLegendBackgroundColor());
       g.fill(rect);
       g.setColor(chartPainter.getStyleManager().getLegendBorderColor());
       g.draw(rect);
 
       // Draw legend content inside legend box
-      int startx = xOffset + chartPainter.getStyleManager().getLegendPadding();
-      int starty = yOffset + chartPainter.getStyleManager().getLegendPadding();
+      double startx = xOffset + chartPainter.getStyleManager().getLegendPadding();
+      double starty = yOffset + chartPainter.getStyleManager().getLegendPadding();
       for (Integer seriesId : seriesMap.keySet()) {
         Series series = seriesMap.get(seriesId);
 
@@ -169,12 +165,10 @@ public class Legend implements ChartPart {
 
           // paint line
           if (getChartPainter().getStyleManager().getChartType() != ChartType.Scatter && series.getStroke() != null) {
-            g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
             g.setColor(series.getStrokeColor());
             g.setStroke(series.getStroke());
-            Shape line = new Line2D.Double(startx, (int) (starty + maxContentHeight / 2.0), (startx + Marker.SIZE * 3.0), (starty + maxContentHeight / 2.0));
+            Shape line = new Line2D.Double(startx, starty + maxContentHeight / 2.0, startx + Marker.SIZE * 3.0, starty + maxContentHeight / 2.0);
             g.draw(line);
-            g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
           }
 
           // paint marker
@@ -186,9 +180,8 @@ public class Legend implements ChartPart {
           // paint little box
           if (series.getStroke() != null) {
             g.setColor(series.getStrokeColor());
-            g.fillPolygon(new int[] { startx, startx + BOX_SIZE, startx + BOX_SIZE, startx }, new int[] { starty, starty, starty + BOX_SIZE, starty + BOX_SIZE }, 4);
-            // g.setStroke(series.getStroke());
-            // g.drawPolygon(new int[] { startx, startx + BOX_SIZE, startx + BOX_SIZE, startx }, new int[] { starty, starty, starty + BOX_SIZE, starty + BOX_SIZE }, 4);
+            Shape rectSmall = new Rectangle2D.Double(startx, starty, BOX_SIZE, BOX_SIZE);
+            g.fill(rectSmall);
           }
         }
 
@@ -197,16 +190,16 @@ public class Legend implements ChartPart {
         g.setColor(chartPainter.getStyleManager().getChartFontColor());
         TextLayout layout = new TextLayout(series.getName(), chartPainter.getStyleManager().getLegendFont(), new FontRenderContext(null, true, false));
         if (getChartPainter().getStyleManager().getChartType() != ChartType.Bar) {
-          layout.draw(g, (float) (startx + Marker.SIZE + (Marker.SIZE * 1.5) + chartPainter.getStyleManager().getLegendPadding()), starty
-              + (int) ((maxContentHeight - 1 + layout.getBounds().getHeight()) / 2.0));
+          layout.draw(g, (float) (startx + Marker.SIZE + (Marker.SIZE * 1.5) + chartPainter.getStyleManager().getLegendPadding()), (float) (starty + (maxContentHeight - 1 + layout.getBounds()
+              .getHeight()) / 2.0));
         } else {
-          layout.draw(g, startx + BOX_SIZE + chartPainter.getStyleManager().getLegendPadding(), starty + (int) ((maxContentHeight + layout.getBounds().getHeight()) / 2.0));
+          layout.draw(g, (float) (startx + BOX_SIZE + chartPainter.getStyleManager().getLegendPadding()), (float) (starty + (maxContentHeight + layout.getBounds().getHeight()) / 2.0));
         }
         starty = (int) (starty + maxContentHeight + chartPainter.getStyleManager().getLegendPadding());
       }
 
       // bounds
-      bounds = new Rectangle(xOffset, yOffset, (int) (legendBoxWidth), (int) (legendBoxHeight));
+      bounds = new Rectangle2D.Double(xOffset, yOffset, legendBoxWidth, legendBoxHeight);
       // g.setColor(Color.blue);
       // g.draw(bounds);
     }
@@ -214,7 +207,7 @@ public class Legend implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return bounds;
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Plot.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Plot.java
index 32bf69a3..7bd3e766 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Plot.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Plot.java
@@ -17,6 +17,7 @@ package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
+import java.awt.geom.Rectangle2D;
 
 import com.xeiam.xchart.StyleManager.ChartType;
 
@@ -29,7 +30,7 @@ public class Plot implements ChartPart {
   private final ChartPainter chartPainter;
 
   /** the bounds */
-  private Rectangle bounds;
+  private Rectangle2D bounds;
 
   private PlotSurface plotSurface;
 
@@ -48,7 +49,7 @@ public class Plot implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return bounds;
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java
index db7a4a8f..23644b9f 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java
@@ -16,8 +16,8 @@
 package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.BasicStroke;
-import java.awt.Rectangle;
 import java.awt.Stroke;
+import java.awt.geom.Rectangle2D;
 
 /**
  * @author timmolter
@@ -40,7 +40,7 @@ public abstract class PlotContent implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return plot.getBounds();
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java
index 26a2d4e0..19daa507 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java
@@ -16,7 +16,8 @@
 package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.Graphics2D;
-import java.awt.Rectangle;
+import java.awt.geom.Path2D;
+import java.awt.geom.Rectangle2D;
 import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.Iterator;
@@ -45,7 +46,7 @@ public class PlotContentBarChart extends PlotContent {
   @Override
   public void paint(Graphics2D g) {
 
-    Rectangle bounds = plot.getBounds();
+    Rectangle2D bounds = plot.getBounds();
 
     // X-Axis
     int xTickSpace = Utils.getTickSpace((int) bounds.getWidth());
@@ -159,19 +160,27 @@ public class PlotContentBarChart extends PlotContent {
             break;
           }
 
-          int yTransform = (int) (bounds.getHeight() - (yTopMargin + yTop.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace));
+          double yTransform = bounds.getHeight() - (yTopMargin + yTop.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace);
 
-          int yOffset = (int) (bounds.getY() + yTransform) + 1;
+          double yOffset = bounds.getY() + yTransform + 1;
 
-          int zeroTransform = (int) (bounds.getHeight() - (yTopMargin + (yBottom.subtract(yMin).doubleValue()) / (yMax.subtract(yMin).doubleValue()) * yTickSpace));
-          int zeroOffset = (int) (bounds.getY() + zeroTransform) + 1;
+          double zeroTransform = bounds.getHeight() - (yTopMargin + (yBottom.subtract(yMin).doubleValue()) / (yMax.subtract(yMin).doubleValue()) * yTickSpace);
+          double zeroOffset = bounds.getY() + zeroTransform + 1;
 
           // paint bar
-          int barWidth = (int) (gridStep / seriesMap.size() / 1.1);
-          int barMargin = (int) (gridStep * .05);
-          int xOffset = (int) (bounds.getX() + xLeftMargin + gridStep * barCounter++ + seriesCounter * barWidth + barMargin);
+          double barWidth = gridStep / seriesMap.size() / 1.1;
+          double barMargin = gridStep * .05;
+          double xOffset = bounds.getX() + xLeftMargin + gridStep * barCounter++ + seriesCounter * barWidth + barMargin;
           g.setColor(series.getStrokeColor());
-          g.fillPolygon(new int[] { xOffset, xOffset + barWidth, xOffset + barWidth, xOffset }, new int[] { yOffset, yOffset, zeroOffset, zeroOffset }, 4);
+
+          Path2D.Double path = new Path2D.Double();
+          path.moveTo(xOffset, yOffset);
+          path.lineTo(xOffset + barWidth, yOffset);
+          path.lineTo(xOffset + barWidth, zeroOffset);
+          path.lineTo(xOffset, zeroOffset);
+          path.closePath();
+          g.fill(path);
+
         } else {
           barCounter++;
         }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java
index 1b81274c..493d3aa4 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java
@@ -16,7 +16,10 @@
 package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.Graphics2D;
-import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.Line2D;
+import java.awt.geom.Path2D;
+import java.awt.geom.Rectangle2D;
 import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.Date;
@@ -46,7 +49,7 @@ public class PlotContentLineChart extends PlotContent {
   @Override
   public void paint(Graphics2D g) {
 
-    Rectangle bounds = plot.getBounds();
+    Rectangle2D bounds = plot.getBounds();
 
     // X-Axis
     int xTickSpace = Utils.getTickSpace((int) bounds.getWidth());
@@ -95,8 +98,8 @@ public class PlotContentLineChart extends PlotContent {
       }
       Collection<Number> errorBars = series.getErrorBars();
 
-      int previousX = Integer.MIN_VALUE;
-      int previousY = Integer.MIN_VALUE;
+      double previousX = Integer.MIN_VALUE;
+      double previousY = Integer.MIN_VALUE;
 
       Iterator<?> xItr = xData.iterator();
       Iterator<Number> yItr = yData.iterator();
@@ -121,6 +124,8 @@ public class PlotContentLineChart extends PlotContent {
 
         Number next = yItr.next();
         if (next == null) {
+          previousX = Integer.MIN_VALUE;
+          previousY = Integer.MIN_VALUE;
           continue;
         }
         BigDecimal yOrig = new BigDecimal(next.doubleValue());
@@ -151,17 +156,19 @@ public class PlotContentLineChart extends PlotContent {
           yTransform = (int) (bounds.getHeight() / 2.0);
         }
 
-        int xOffset = (int) (bounds.getX() + xTransform - 1);
-        int yOffset = (int) (bounds.getY() + yTransform);
+        double xOffset = bounds.getX() + xTransform - 1;
+        double yOffset = bounds.getY() + yTransform;
         // System.out.println(yOffset);
         // System.out.println(yTransform);
 
         // paint line
         if (series.getStroke() != null && getChartPainter().getStyleManager().getChartType() != ChartType.Scatter) {
+
           if (previousX != Integer.MIN_VALUE && previousY != Integer.MIN_VALUE) {
             g.setColor(series.getStrokeColor());
             g.setStroke(series.getStroke());
-            g.drawLine(previousX, previousY, xOffset, yOffset);
+            Shape line = new Line2D.Double(previousX, previousY, xOffset, yOffset);
+            g.draw(line);
           }
         }
 
@@ -170,7 +177,14 @@ public class PlotContentLineChart extends PlotContent {
           if (previousX != Integer.MIN_VALUE && previousY != Integer.MIN_VALUE) {
             g.setColor(series.getStrokeColor());
             int yBottomOfArea = (int) (bounds.getY() + bounds.getHeight() - yTopMargin + 1);
-            g.fillPolygon(new int[] { previousX, xOffset, xOffset, previousX }, new int[] { previousY, yOffset, yBottomOfArea, yBottomOfArea }, 4);
+
+            Path2D.Double path = new Path2D.Double();
+            path.moveTo(previousX, previousY);
+            path.lineTo(xOffset, yOffset);
+            path.lineTo(xOffset, yBottomOfArea);
+            path.lineTo(previousX, yBottomOfArea);
+            path.closePath();
+            g.fill(path);
           }
         }
 
@@ -210,9 +224,12 @@ public class PlotContentLineChart extends PlotContent {
           int bottomEBTransform = (int) (bounds.getHeight() - (yTopMargin + bottomValue.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace));
           int bottomEBOffset = (int) (bounds.getY() + bottomEBTransform);
 
-          g.drawLine(xOffset, topEBOffset, xOffset, bottomEBOffset);
-          g.drawLine(xOffset - 3, bottomEBOffset, xOffset + 3, bottomEBOffset);
-          g.drawLine(xOffset - 3, topEBOffset, xOffset + 3, topEBOffset);
+          Shape line = new Line2D.Double(xOffset, topEBOffset, xOffset, bottomEBOffset);
+          g.draw(line);
+          line = new Line2D.Double(xOffset - 3, bottomEBOffset, xOffset + 3, bottomEBOffset);
+          g.draw(line);
+          line = new Line2D.Double(xOffset - 3, topEBOffset, xOffset + 3, topEBOffset);
+          g.draw(line);
         }
       }
     }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java
index 7e45bf1f..1cde8841 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotSurface.java
@@ -16,7 +16,9 @@
 package com.xeiam.xchart.internal.chartpart;
 
 import java.awt.Graphics2D;
-import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.Line2D;
+import java.awt.geom.Rectangle2D;
 import java.util.List;
 
 import com.xeiam.xchart.StyleManager.ChartType;
@@ -40,7 +42,7 @@ public class PlotSurface implements ChartPart {
   }
 
   @Override
-  public Rectangle getBounds() {
+  public Rectangle2D getBounds() {
 
     return plot.getBounds();
   }
@@ -48,21 +50,20 @@ public class PlotSurface implements ChartPart {
   @Override
   public void paint(Graphics2D g) {
 
-    Rectangle bounds = plot.getBounds();
+    Rectangle2D bounds = plot.getBounds();
 
     // paint plot background
-    Rectangle backgroundRectangle = new Rectangle((int) bounds.getX() - 1, (int) bounds.getY(), (int) (bounds.getWidth()), (int) bounds.getHeight());
+    Shape rect = new Rectangle2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight());
     g.setColor(getChartPainter().getStyleManager().getPlotBackgroundColor());
-    g.fill(backgroundRectangle);
+    g.fill(rect);
 
     // paint plot border
     if (getChartPainter().getStyleManager().isPlotBorderVisible()) {
-      Rectangle borderRectangle = new Rectangle((int) bounds.getX() - 1, (int) bounds.getY(), (int) (bounds.getWidth()), (int) bounds.getHeight());
       g.setColor(getChartPainter().getStyleManager().getPlotBorderColor());
-      g.draw(borderRectangle);
+      g.draw(rect);
     }
 
-    // paint grid lines and/or inner plot tics
+    // paint grid lines and/or inner plot ticks
     if (getChartPainter().getStyleManager().isPlotGridLinesVisible() || getChartPainter().getStyleManager().isPlotTicksMarksVisible()) {
 
       // horizontal
@@ -77,18 +78,18 @@ public class PlotSurface implements ChartPart {
 
           g.setColor(getChartPainter().getStyleManager().getPlotGridLinesColor());
           g.setStroke(getChartPainter().getStyleManager().getPlotGridLinesStroke());
-          // System.out.println("bounds.getY()= " + bounds.getY());
-          g.drawLine((int) bounds.getX(), yOffset, (int) (bounds.getX() + bounds.getWidth() - 2), yOffset);
+          Shape line = new Line2D.Double((int) bounds.getX(), yOffset, bounds.getX() + bounds.getWidth() - 2, yOffset);
+          g.draw(line);
         }
         // tick marks
         if (getChartPainter().getStyleManager().isPlotTicksMarksVisible()) {
 
           g.setColor(getChartPainter().getStyleManager().getAxisTickMarksColor());
           g.setStroke(getChartPainter().getStyleManager().getAxisTickMarksStroke());
-
-          g.drawLine((int) bounds.getX(), yOffset, (int) bounds.getX() + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset);
-          g.drawLine((int) (bounds.getX() + bounds.getWidth() - 2), yOffset, (int) (bounds.getX() + bounds.getWidth() - 2) - getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset);
-
+          Shape line = new Line2D.Double(bounds.getX(), yOffset, bounds.getX() + getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset);
+          g.draw(line);
+          line = new Line2D.Double((bounds.getX() + bounds.getWidth() - 2), yOffset, (bounds.getX() + bounds.getWidth() - 2) - getChartPainter().getStyleManager().getAxisTickMarkLength(), yOffset);
+          g.draw(line);
         }
       }
 
@@ -107,7 +108,8 @@ public class PlotSurface implements ChartPart {
             g.setColor(getChartPainter().getStyleManager().getPlotGridLinesColor());
             g.setStroke(getChartPainter().getStyleManager().getPlotGridLinesStroke());
 
-            g.drawLine(xOffset, (int) (bounds.getY()), xOffset, (int) (bounds.getY() + bounds.getHeight() - 1));
+            Shape line = new Line2D.Double(xOffset, bounds.getY(), xOffset, bounds.getY() + bounds.getHeight() - 1);
+            g.draw(line);
           }
           // tick marks
           if (getChartPainter().getStyleManager().isPlotTicksMarksVisible()) {
@@ -115,9 +117,11 @@ public class PlotSurface implements ChartPart {
             g.setColor(getChartPainter().getStyleManager().getAxisTickMarksColor());
             g.setStroke(getChartPainter().getStyleManager().getAxisTickMarksStroke());
 
-            g.drawLine(xOffset, (int) (bounds.getY()), xOffset, (int) (bounds.getY()) + getChartPainter().getStyleManager().getAxisTickMarkLength());
-            g.drawLine(xOffset, (int) (bounds.getY() + bounds.getHeight() - 1), xOffset, (int) (bounds.getY() + bounds.getHeight() - 1) - getChartPainter().getStyleManager().getAxisTickMarkLength());
-
+            Shape line = new Line2D.Double(xOffset, (int) (bounds.getY()), xOffset, (int) (bounds.getY()) + getChartPainter().getStyleManager().getAxisTickMarkLength());
+            g.draw(line);
+            line = new Line2D.Double(xOffset, (int) (bounds.getY() + bounds.getHeight() - 1), xOffset, (int) (bounds.getY() + bounds.getHeight() - 1)
+                - getChartPainter().getStyleManager().getAxisTickMarkLength());
+            g.draw(line);
           }
         }
       }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java
index 94df961e..e146f43a 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java
@@ -16,7 +16,6 @@
 package com.xeiam.xchart.internal.markers;
 
 import java.awt.Graphics2D;
-import java.awt.RenderingHints;
 import java.awt.Shape;
 import java.awt.geom.Ellipse2D;
 
@@ -26,13 +25,11 @@ import java.awt.geom.Ellipse2D;
 public class Circle extends Marker {
 
   @Override
-  public void paint(Graphics2D g, int xOffset, int yOffset) {
+  public void paint(Graphics2D g, double xOffset, double yOffset) {
 
     g.setStroke(stroke);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
     Shape circle = new Ellipse2D.Double(xOffset + Marker.X_OFFSET, yOffset + Marker.Y_OFFSET, Marker.SIZE, Marker.SIZE);
     g.fill(circle);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
 
   }
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java
index 4d2dac52..5fb4cb1f 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java
@@ -16,9 +16,7 @@
 package com.xeiam.xchart.internal.markers;
 
 import java.awt.Graphics2D;
-import java.awt.Polygon;
-import java.awt.RenderingHints;
-import java.awt.Shape;
+import java.awt.geom.Path2D;
 
 /**
  * @author timmolter
@@ -26,30 +24,20 @@ import java.awt.Shape;
 public class Diamond extends Marker {
 
   @Override
-  public void paint(Graphics2D g, int xOffset, int yOffset) {
+  public void paint(Graphics2D g, double xOffset, double yOffset) {
 
     g.setStroke(stroke);
 
-    int[] x = new int[4];
-    int[] y = new int[4];
-    int n = 4;
-
     // Make a diamond
-    int halfSize = (int) (Math.ceil((Marker.SIZE + 3) / 2.0));
-    x[0] = xOffset - halfSize + 0;
-    x[1] = xOffset - halfSize + halfSize;
-    x[2] = (int) (xOffset - halfSize + Marker.SIZE + 3);
-    x[3] = xOffset - halfSize + halfSize;
-
-    y[0] = 1 + yOffset - halfSize + halfSize;
-    y[1] = (int) (1 + yOffset - halfSize + Marker.SIZE + 3);
-    y[2] = 1 + yOffset - halfSize + halfSize;
-    y[3] = 1 + yOffset - halfSize + 0;
-
-    Shape diamond = new Polygon(x, y, n);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
-    g.fill(diamond);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
+    double halfSize = Math.ceil((Marker.SIZE + 3) / 2.0);
+
+    Path2D.Double path = new Path2D.Double();
+    path.moveTo(xOffset - halfSize, yOffset - halfSize + halfSize);
+    path.lineTo(xOffset - halfSize + halfSize, yOffset - halfSize + Marker.SIZE + 3);
+    path.lineTo(xOffset - halfSize + Marker.SIZE + 3, yOffset - halfSize + halfSize);
+    path.lineTo(xOffset - halfSize + halfSize, yOffset - halfSize);
+    path.closePath();
+    g.fill(path);
 
   }
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java
index d4e28326..cac88797 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java
@@ -30,5 +30,5 @@ public abstract class Marker {
   public static final double X_OFFSET = (int) (-1.0 * (SIZE / 2.0));
   public static final double Y_OFFSET = (int) (-1.0 * (SIZE / 2.0));
 
-  public abstract void paint(Graphics2D g, int xOffset, int yOffset);
+  public abstract void paint(Graphics2D g, double xOffset, double yOffset);
 }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java
index 7012ee24..84dbc41d 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java
@@ -16,7 +16,6 @@
 package com.xeiam.xchart.internal.markers;
 
 import java.awt.Graphics2D;
-import java.awt.RenderingHints;
 import java.awt.Shape;
 import java.awt.geom.Rectangle2D;
 
@@ -26,13 +25,11 @@ import java.awt.geom.Rectangle2D;
 public class Square extends Marker {
 
   @Override
-  public void paint(Graphics2D g, int xOffset, int yOffset) {
+  public void paint(Graphics2D g, double xOffset, double yOffset) {
 
     g.setStroke(stroke);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
     Shape square = new Rectangle2D.Double(xOffset + Marker.X_OFFSET, yOffset + Marker.Y_OFFSET, Marker.SIZE, Marker.SIZE);
     g.fill(square);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
 
   }
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java
index 8730551c..3a0e0537 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java
@@ -16,9 +16,7 @@
 package com.xeiam.xchart.internal.markers;
 
 import java.awt.Graphics2D;
-import java.awt.Polygon;
-import java.awt.RenderingHints;
-import java.awt.Shape;
+import java.awt.geom.Path2D;
 
 /**
  * @author timmolter
@@ -26,28 +24,19 @@ import java.awt.Shape;
 public class TriangleDown extends Marker {
 
   @Override
-  public void paint(Graphics2D g, int xOffset, int yOffset) {
+  public void paint(Graphics2D g, double xOffset, double yOffset) {
 
     g.setStroke(stroke);
 
-    int[] x = new int[3];
-    int[] y = new int[3];
-    int n = 3;
-
     // Make a triangle
-    int halfSize = (int) (Math.ceil((Marker.SIZE + 1) / 2.0));
-    x[0] = xOffset - halfSize + 0;
-    x[1] = xOffset - halfSize + halfSize;
-    x[2] = (int) (xOffset - halfSize + Marker.SIZE + 1);
-
-    y[0] = 1 + yOffset - halfSize + 0;
-    y[1] = (int) (1 + yOffset - halfSize + Marker.SIZE + 1);
-    y[2] = 1 + yOffset - halfSize + 0;
-
-    Shape triangle = new Polygon(x, y, n);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
-    g.fill(triangle);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
+    double halfSize = Math.ceil((Marker.SIZE + 1) / 2.0);
+
+    Path2D.Double path = new Path2D.Double();
+    path.moveTo(xOffset - halfSize + 0, 1 + yOffset - halfSize + 0);
+    path.lineTo(xOffset - halfSize + halfSize, 1 + yOffset - halfSize + Marker.SIZE + 1);
+    path.lineTo(xOffset - halfSize + Marker.SIZE + 1, 1 + yOffset - halfSize + 0);
+    path.closePath();
+    g.fill(path);
 
   }
 }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java
index d8b48281..21d8358c 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java
@@ -16,9 +16,7 @@
 package com.xeiam.xchart.internal.markers;
 
 import java.awt.Graphics2D;
-import java.awt.Polygon;
-import java.awt.RenderingHints;
-import java.awt.Shape;
+import java.awt.geom.Path2D;
 
 /**
  * @author timmolter
@@ -26,28 +24,19 @@ import java.awt.Shape;
 public class TriangleUp extends Marker {
 
   @Override
-  public void paint(Graphics2D g, int xOffset, int yOffset) {
+  public void paint(Graphics2D g, double xOffset, double yOffset) {
 
     g.setStroke(stroke);
 
-    int[] x = new int[3];
-    int[] y = new int[3];
-    int n = 3;
-
     // Make a triangle
-    int halfSize = (int) (Math.ceil((Marker.SIZE + 1) / 2.0));
-    x[0] = xOffset - halfSize + 0;
-    x[1] = (int) (xOffset - halfSize + Marker.SIZE + 1);
-    x[2] = xOffset - halfSize + halfSize;
-
-    y[0] = (int) (yOffset - halfSize + Marker.SIZE + 1);
-    y[1] = (int) (yOffset - halfSize + Marker.SIZE + 1);
-    y[2] = yOffset - halfSize + 0;
-
-    Shape triangle = new Polygon(x, y, n);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
-    g.fill(triangle);
-    g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
+    double halfSize = Math.ceil((Marker.SIZE + 1) / 2.0);
+
+    Path2D.Double path = new Path2D.Double();
+    path.moveTo(xOffset - halfSize, yOffset - halfSize + Marker.SIZE + 1);
+    path.lineTo(xOffset - halfSize + Marker.SIZE + 1, yOffset - halfSize + Marker.SIZE + 1);
+    path.lineTo(xOffset - halfSize + halfSize, yOffset - halfSize + 0);
+    path.closePath();
+    g.fill(path);
 
   }
 }
-- 
GitLab