Skip to content
Snippets Groups Projects
Commit 8dd8fa72 authored by Tim Molter's avatar Tim Molter
Browse files

roughed in vector export

parent 168aedd2
No related branches found
No related tags found
No related merge requests found
......@@ -20,6 +20,8 @@ import com.xeiam.xchart.BitmapEncoder.BitmapFormat;
import com.xeiam.xchart.Chart;
import com.xeiam.xchart.Series;
import com.xeiam.xchart.SeriesMarker;
import com.xeiam.xchart.VectorGraphicsEncoder;
import com.xeiam.xchart.VectorGraphicsEncoder.VectorGraphicsFormat;
/**
* Creates a simple Chart and saves it as a PNG and JPEG image file.
......@@ -48,5 +50,9 @@ public class Example1 {
BitmapEncoder.saveBitmapWithDPI(chart, "./Sample_Chart_300_DPI", BitmapFormat.JPG, 300);
BitmapEncoder.saveBitmapWithDPI(chart, "./Sample_Chart_300_DPI", BitmapFormat.GIF, 300);
VectorGraphicsEncoder.saveVectorGraphic(chart, "./Sample_Chart", VectorGraphicsFormat.EPS);
VectorGraphicsEncoder.saveVectorGraphic(chart, "./Sample_Chart", VectorGraphicsFormat.PDF);
VectorGraphicsEncoder.saveVectorGraphic(chart, "./Sample_Chart", VectorGraphicsFormat.SVG);
}
}
......@@ -18,7 +18,10 @@ package com.xeiam.xchart;
import java.io.FileOutputStream;
import java.io.IOException;
import de.erichseifert.vectorgraphics2d.EPSGraphics2D;
import de.erichseifert.vectorgraphics2d.PDFGraphics2D;
import de.erichseifert.vectorgraphics2d.SVGGraphics2D;
import de.erichseifert.vectorgraphics2d.VectorGraphics2D;
/**
* A helper class with static methods for saving Charts as bitmaps
......@@ -40,10 +43,28 @@ public final class VectorGraphicsEncoder {
public static void saveVectorGraphic(Chart chart, String fileName, VectorGraphicsFormat vectorGraphicsFormat) throws IOException {
SVGGraphics2D g = new SVGGraphics2D(0.0, 0.0, chart.getWidth(), chart.getHeight());
VectorGraphics2D g = null;
switch (vectorGraphicsFormat) {
case EPS:
g = new EPSGraphics2D(0.0, 0.0, chart.getWidth(), chart.getHeight());
break;
case PDF:
g = new PDFGraphics2D(0.0, 0.0, chart.getWidth(), chart.getHeight());
break;
case SVG:
g = new SVGGraphics2D(0.0, 0.0, chart.getWidth(), chart.getHeight());
break;
default:
break;
}
chart.paint(g, chart.getWidth(), chart.getHeight());
// Write the vector graphic output to a file
FileOutputStream file = new FileOutputStream("./ellipse.svg");
FileOutputStream file = new FileOutputStream(fileName + "." + vectorGraphicsFormat.toString().toLowerCase());
try {
file.write(g.getBytes());
} finally {
......
......@@ -84,7 +84,7 @@ public class AxisTickLabels implements ChartPart {
AffineTransform orig = g.getTransform();
AffineTransform at = new AffineTransform();
at.translate((float) xOffset, (float) (yOffset + axisTick.getAxis().getPaintZone().getHeight() - tickLocation + tickLabelBounds.getHeight() / 2.0));
at.translate(xOffset, yOffset + axisTick.getAxis().getPaintZone().getHeight() - tickLocation + tickLabelBounds.getHeight() / 2.0);
g.transform(at);
g.fill(shape);
g.setTransform(orig);
......@@ -114,22 +114,24 @@ public class AxisTickLabels implements ChartPart {
if (tickLabel != null) { // some are null for logarithmic axes
FontRenderContext frc = g.getFontRenderContext();
TextLayout layout = new TextLayout(tickLabel, getChartPainter().getStyleManager().getAxisTickLabelsFont(), frc);
Rectangle2D tickLabelBounds = layout.getBounds();
// layout.draw(g, (float) (xOffset + tickLocation - tickLabelBounds.getWidth() / 2.0), (float) yOffset);
TextLayout textLayout = new TextLayout(tickLabel, getChartPainter().getStyleManager().getAxisTickLabelsFont(), frc);
// GlyphVector v = getChartPainter().getStyleManager().getAxisTickLabelsFont().createGlyphVector(frc, tickLabel);
Shape shape = layout.getOutline(null);
// Shape shape = v.getOutline();
Shape shape = textLayout.getOutline(null);
Rectangle2D tickLabelBounds = shape.getBounds2D();
// Graphics2D gTemp = (Graphics2D) g.create();
// gTemp.setTransform(g.getTransform());
// gTemp.translate((float) (xOffset + tickLocation - tickLabelBounds.getWidth() / 2.0), (float) yOffset);
AffineTransform orig = g.getTransform();
AffineTransform at = new AffineTransform();
at.translate((float) (xOffset + tickLocation - tickLabelBounds.getWidth() / 2.0), (float) yOffset);
at.translate(xOffset + tickLocation - tickLabelBounds.getWidth() / 2.0, yOffset);
g.transform(at);
g.fill(shape);
g.setTransform(orig);
// // debug box
// g.setColor(Color.blue);
// g.draw(new Rectangle2D.Double(xOffset + tickLocation - tickLabelBounds.getWidth() / 2.0, yOffset - tickLabelBounds.getHeight(), tickLabelBounds.getWidth(), tickLabelBounds.getHeight()));
if (tickLabelBounds.getHeight() > maxTickLabelHeight) {
maxTickLabelHeight = tickLabelBounds.getHeight();
}
......
......@@ -23,9 +23,7 @@ import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.List;
import java.util.LinkedHashMap;
import java.util.Map;
import com.xeiam.xchart.Series;
......@@ -84,10 +82,10 @@ public class Legend implements ChartPart {
for (Series series : chartPainter.getAxisPair().getSeriesMap().values()) {
List<Map.Entry<String, Rectangle2D>> seriesBounds = getSeriesTextBounds(series, g);
Map<String, Rectangle2D> seriesBounds = getSeriesTextBounds(series, g);
double blockHeight = 0;
for (Map.Entry<String, Rectangle2D> entry : seriesBounds) {
for (Map.Entry<String, Rectangle2D> entry : seriesBounds.entrySet()) {
blockHeight += entry.getValue().getHeight() + MULTI_LINE_SPACE;
legendTextContentMaxWidth = Math.max(legendTextContentMaxWidth, entry.getValue().getWidth());
}
......@@ -130,8 +128,6 @@ public class Legend implements ChartPart {
double legendBoxWidth = sizeHint[0];
double legendBoxHeight = sizeHint[1];
// FontMetrics fontMetrics = g.getFontMetrics(styleManager.getLegendFont());
// legend draw position
double xOffset = 0;
double yOffset = 0;
......@@ -178,11 +174,11 @@ public class Legend implements ChartPart {
for (Series series : chartPainter.getAxisPair().getSeriesMap().values()) {
List<Map.Entry<String, Rectangle2D>> seriesTextBounds = getSeriesTextBounds(series, g);
Map<String, Rectangle2D> seriesTextBounds = getSeriesTextBounds(series, g);
float blockHeight = 0;
double legendTextContentMaxWidth = 0;
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds) {
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
blockHeight += entry.getValue().getHeight() + MULTI_LINE_SPACE;
legendTextContentMaxWidth = Math.max(legendTextContentMaxWidth, entry.getValue().getWidth());
}
......@@ -227,7 +223,7 @@ public class Legend implements ChartPart {
// g.draw(boundsTemp);
}
// paint series name
// paint series text
g.setColor(chartPainter.getStyleManager().getChartFontColor());
double multiLineOffset = 0.0;
......@@ -235,10 +231,7 @@ public class Legend implements ChartPart {
if (styleManager.getChartType() != ChartType.Bar) {
double x = startx + styleManager.getLegendSeriesLineLength() + styleManager.getLegendPadding();
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds) {
// float itemOffsetY = -fontMetrics.getDescent();
// System.out.println(itemOffsetY);
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
double height = entry.getValue().getHeight();
double centerOffsetY = (Math.max(getChartPainter().getStyleManager().getMarkerSize(), height) - height) / 2.0;
......@@ -266,7 +259,7 @@ public class Legend implements ChartPart {
else {
final double x = startx + BOX_SIZE + styleManager.getLegendPadding();
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds) {
for (Map.Entry<String, Rectangle2D> entry : seriesTextBounds.entrySet()) {
double height = entry.getValue().getHeight();
double centerOffsetY = (Math.max(BOX_SIZE, height) - height) / 2.0;
......@@ -301,16 +294,24 @@ public class Legend implements ChartPart {
}
private List<Map.Entry<String, Rectangle2D>> getSeriesTextBounds(Series series, Graphics2D g) {
private Map<String, Rectangle2D> getSeriesTextBounds(Series series, Graphics2D g) {
// FontMetrics fontMetrics = g.getFontMetrics(getChartPainter().getStyleManager().getLegendFont());
// float fontDescent = fontMetrics.getDescent();
String lines[] = series.getName().split("\\n");
List<Map.Entry<String, Rectangle2D>> seriesTextBounds = new ArrayList<Map.Entry<String, Rectangle2D>>(lines.length);
Map<String, Rectangle2D> seriesTextBounds = new LinkedHashMap<String, Rectangle2D>(lines.length);
for (String line : lines) {
FontRenderContext frc = g.getFontRenderContext();
TextLayout tl = new TextLayout(line, getChartPainter().getStyleManager().getLegendFont(), frc);
Shape shape = tl.getOutline(null);
Rectangle2D bounds = shape.getBounds2D();
seriesTextBounds.add(new AbstractMap.SimpleEntry<String, Rectangle2D>(line, bounds));
// System.out.println(tl.getAscent());
// System.out.println(tl.getDescent());
// System.out.println(tl.getBounds());
// seriesTextBounds.put(line, new Rectangle2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight() - tl.getDescent()));
// seriesTextBounds.put(line, new Rectangle2D.Double(bounds.getX(), bounds.getY(), bounds.getWidth(), tl.getAscent()));
seriesTextBounds.put(line, bounds);
}
return seriesTextBounds;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment