package org.mapfish.print.processor.map.scalebar;
import org.junit.Test;
import org.mapfish.print.AbstractMapfishSpringTest;
import org.mapfish.print.attribute.ScalebarAttribute;
import org.mapfish.print.attribute.ScalebarAttribute.ScalebarAttributeValues;
import org.mapfish.print.map.DistanceUnit;
import org.mapfish.print.test.util.ImageSimilarity;
import javax.imageio.ImageIO;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertNotNull;
public class ScalebarDrawerTest {
public static String expectedDir;
static {
if (System.getProperty("os.name", "linux").toLowerCase().contains("win")) {
expectedDir = "expected-win/";
} else {
expectedDir = "expected-linux/";
}
}
@Test
public void testCreate() {
assertNotNull(Type.LINE.createDrawer(null, new ScaleBarRenderSettings()));
assertNotNull(Type.BAR.createDrawer(null, new ScaleBarRenderSettings()));
assertNotNull(Type.BAR_SUB.createDrawer(null, new ScaleBarRenderSettings()));
}
@Test
public void testDrawLine() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// ImageSimilarity.writeUncompressedImage(bufferedImage, "/tmp/expected-scalebar-line.tiff");
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line.tiff"), 5);
}
@Test
public void testDrawLineLabelRotated() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 80, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().labelRotation = 90;
settings.getParams().getSize().width = 180;
settings.getParams().getSize().height = 80;
settings.setMaxSize(new Dimension(180, 80));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// final File output = new File("/tmp/expected-scalebar-line-labels-rotated.png");
// output.getParentFile().mkdirs();
// ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-rotated.png"), 5);
}
@Test
public void testDrawLineLabelRotatedNegative() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 80, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().labelRotation = -90;
settings.getParams().getSize().width = 180;
settings.getParams().getSize().height = 80;
settings.setMaxSize(new Dimension(180, 80));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
final File output = new File("/tmp/expected-scalebar-line-labels-rotated-negative.png");
output.getParentFile().mkdirs();
ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-rotated-negative.png"), 5);
}
@Test
public void testDrawLineLabelPartiallyRotated() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 80, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().labelRotation = 45;
settings.getParams().getSize().width = 180;
settings.getParams().getSize().height = 80;
settings.setMaxSize(new Dimension(180, 80));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// final File output = new File("/tmp/expected-scalebar-line-labels-partially-rotated.png");
// output.getParentFile().mkdirs();
// ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-partially-rotated.png"), 5);
}
@Test
public void testDrawLineLabelsAboveRotated() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 80, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().orientation = Orientation.HORIZONTAL_LABELS_ABOVE.getLabel();
settings.getParams().labelRotation = 90;
settings.getParams().getSize().width = 180;
settings.getParams().getSize().height = 80;
settings.setMaxSize(new Dimension(180, 80));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// final File output = new File("/tmp/expected-scalebar-line-labels-above-rotated.png");
// output.getParentFile().mkdirs();
// ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-above-rotated.png"), 5);
}
@Test
public void testDrawLineLabelsAbovePartiallyRotated() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 80, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().orientation = Orientation.HORIZONTAL_LABELS_ABOVE.getLabel();
settings.getParams().labelRotation = 45;
settings.getParams().getSize().width = 180;
settings.getParams().getSize().height = 80;
settings.setMaxSize(new Dimension(180, 80));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// final File output = new File("/tmp/expected-scalebar-line-labels-above-partially-rotated.png");
// output.getParentFile().mkdirs();
// ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-above-partially-rotated.png"), 5);
}
@Test
public void testDrawLineLabelsVerticalLeftRotated() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(80, 180, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().orientation = Orientation.VERTICAL_LABELS_LEFT.getLabel();
settings.getParams().labelRotation = 90;
settings.getParams().getSize().width = 80;
settings.getParams().getSize().height = 180;
settings.setMaxSize(new Dimension(80, 180));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// final File output = new File("/tmp/expected-scalebar-line-labels-left-rotated.png");
// output.getParentFile().mkdirs();
// ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-left-rotated.png"), 5);
}
@Test
public void testDrawLineLabelsVerticalLeftPartiallyRotated() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(80, 180, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().orientation = Orientation.VERTICAL_LABELS_LEFT.getLabel();
settings.getParams().labelRotation = 45;
settings.getParams().getSize().width = 80;
settings.getParams().getSize().height = 180;
settings.setMaxSize(new Dimension(80, 180));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// final File output = new File("/tmp/expected-scalebar-line-labels-left-partially-rotated.png");
// output.getParentFile().mkdirs();
// ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-left-partially-rotated.png"), 5);
}
@Test
public void testDrawLineLabelsVerticalRightRotated() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(80, 180, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().orientation = Orientation.VERTICAL_LABELS_RIGHT.getLabel();
settings.getParams().labelRotation = 90;
settings.getParams().getSize().width = 80;
settings.getParams().getSize().height = 180;
settings.setMaxSize(new Dimension(80, 180));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// final File output = new File("/tmp/expected-scalebar-line-labels-right-rotated.png");
// output.getParentFile().mkdirs();
// ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-right-rotated.png"), 5);
}
@Test
public void testDrawLineLabelsVerticalRightPartiallyRotated() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(80, 180, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().orientation = Orientation.VERTICAL_LABELS_RIGHT.getLabel();
settings.getParams().labelRotation = 45;
settings.getParams().getSize().width = 80;
settings.getParams().getSize().height = 180;
settings.setMaxSize(new Dimension(80, 180));
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// final File output = new File("/tmp/expected-scalebar-line-labels-right-partially-rotated.png");
// output.getParentFile().mkdirs();
// ImageIO.write(bufferedImage, "png", output);
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-labels-right-partially-rotated.png"), 5);
}
@Test
public void testDrawLineWithSubIntervals() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 2);
ScalebarDrawer drawer = Type.LINE.createDrawer(graphics2d, settings);
drawer.draw();
// ImageSimilarity.writeUncompressedImage(bufferedImage, "/tmp/expected-scalebar-line-subs.tiff");
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-line-subs.tiff"), 5);
}
@Test
public void testDrawBar() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
ScalebarDrawer drawer = Type.BAR.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-bar.png"), 300);
}
@Test
public void testDrawBarWithSubIntervals() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 2);
ScalebarDrawer drawer = Type.BAR.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-bar-subs.png"), 350);
}
@Test
public void testDrawBarWithBackground() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().backgroundColor = "rgb(214, 214, 214)";
ScalebarDrawer drawer = Type.BAR.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-bar-bg.png"), 450);
}
@Test
public void testDrawBarSub() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
ScalebarDrawer drawer = Type.BAR_SUB.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-barsub.png"), 300);
}
@Test
public void testDrawBarSubWithSubIntervals() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 2);
ScalebarDrawer drawer = Type.BAR_SUB.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-barsub-subs.png"), 350);
}
@Test
public void testDrawBarHorizontalTextAbove() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().backgroundColor = "rgb(214, 214, 214)";
settings.getParams().orientation = Orientation.HORIZONTAL_LABELS_ABOVE.getLabel();
ScalebarDrawer drawer = Type.BAR.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-bar-text-above.png"), 300);
}
@Test
public void testDrawBarVerticalTextLeft() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(80, 180, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().getSize().width = 80;
settings.getParams().getSize().height = 180;
settings.setMaxSize(new Dimension(80, 180));
settings.getParams().backgroundColor = "rgb(214, 214, 214)";
settings.getParams().orientation = Orientation.VERTICAL_LABELS_LEFT.getLabel();
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.BAR.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-bar-vertical-text-left.png"), 300);
}
@Test
public void testDrawBarVerticalTextRight() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(80, 180, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().getSize().width = 80;
settings.getParams().getSize().height = 180;
settings.setMaxSize(new Dimension(80, 180));
settings.getParams().backgroundColor = "rgb(214, 214, 214)";
settings.getParams().orientation = Orientation.VERTICAL_LABELS_RIGHT.getLabel();
settings.setSize(ScalebarGraphic.getSize(settings.getParams(), settings, settings.getMaxLabelSize()));
ScalebarDrawer drawer = Type.BAR.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-bar-vertical-text-right.png"), 250);
}
@Test
public void testDrawBarTopRight() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().backgroundColor = "rgb(214, 214, 214)";
settings.getParams().align = HorizontalAlign.RIGHT.getLabel();
settings.getParams().verticalAlign = VerticalAlign.TOP.getLabel();
ScalebarDrawer drawer = Type.BAR.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-top-right.png"), 400);
}
@Test
public void testDrawBarMiddleCenter() throws Exception {
final BufferedImage bufferedImage = new BufferedImage(180, 40, BufferedImage.TYPE_4BYTE_ABGR);
final Graphics2D graphics2d = bufferedImage.createGraphics();
ScaleBarRenderSettings settings = getSettings(graphics2d, 1);
settings.getParams().backgroundColor = "rgb(214, 214, 214)";
settings.getParams().align = HorizontalAlign.CENTER.getLabel();
settings.getParams().verticalAlign = VerticalAlign.MIDDLE.getLabel();
ScalebarDrawer drawer = Type.BAR.createDrawer(graphics2d, settings);
drawer.draw();
new ImageSimilarity(bufferedImage, 4).assertSimilarity(getFile("expected-scalebar-middle-center.png"), 600);
}
private ScaleBarRenderSettings getSettings(final Graphics2D graphics2d, int numSubIntervals) {
ScalebarAttribute attribute = new ScalebarAttribute();
attribute.setWidth(180);
attribute.setHeight(40);
ScalebarAttributeValues params = attribute.createValue(null);
params.labelDistance = 4;
params.barSize = 10;
params.font = "Liberation Sans";
ScaleBarRenderSettings settings = new ScaleBarRenderSettings();
settings.setParams(params);
setLabels(settings, graphics2d, params, 40, 50);
settings.setScaleUnit(DistanceUnit.M);
settings.setIntervalLengthInPixels(40);
settings.setIntervalLengthInWorldUnits(0);
settings.setIntervalUnit(DistanceUnit.M);
settings.setBarSize(10);
settings.setLabelDistance(4);
settings.setLineWidth(2);
settings.setNumSubIntervals(numSubIntervals);
settings.setPadding(4);
settings.setDpiRatio(1.0);
final Dimension maxLabelSize = ScalebarGraphic.getMaxLabelSize(settings);
settings.setMaxSize(new Dimension(180, 40));
settings.setSize(ScalebarGraphic.getSize(params, settings, maxLabelSize));
settings.setMaxLabelSize(maxLabelSize);
return settings;
}
private void setLabels(ScaleBarRenderSettings settings, Graphics2D graphics2d, ScalebarAttributeValues params,
int intervalWidthInPixels, int intervalWidthInWorldUnits) {
final Font font = new Font(params.font, Font.PLAIN, params.fontSize);
final FontRenderContext frc = new FontRenderContext(null, true, true);
final List<Label> labels = new ArrayList<Label>(params.intervals + 1);
for (int i = 0; i <= params.intervals; i++) {
String labelText = ScalebarGraphic.createLabelText(DistanceUnit.M, intervalWidthInWorldUnits * i, DistanceUnit.M);
if (i == params.intervals) {
labelText += DistanceUnit.M;
}
TextLayout labelLayout = new TextLayout(labelText, font, frc);
labels.add(new Label(intervalWidthInPixels * i, labelLayout, graphics2d));
}
settings.setLabels(labels);
settings.setLeftLabelMargin(labels.get(0).getWidth() / 2.0f);
settings.setRightLabelMargin(labels.get(labels.size() - 1).getWidth() / 2.0f);
settings.setTopLabelMargin(labels.get(0).getHeight() / 2.0f);
settings.setBottomLabelMargin(labels.get(labels.size() - 1).getHeight() / 2.0f);
}
private File getFile(String fileName) {
return AbstractMapfishSpringTest.getFile(getClass(), fileName);
}
}