From 04e4c552f3581754352e43cd901b46aebe0af984 Mon Sep 17 00:00:00 2001 From: Chris Bowditch Date: Tue, 5 Mar 2013 10:57:28 +0000 Subject: [PATCH] FOP-2215; Thin dashed border look like dots Submitted by Simon Steiner (ssteiner.at.thunderhead.com) git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1452734 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/fop/afp/AFPBorderPainter.java | 8 +- .../render/intermediate/BorderPainter.java | 3 + .../render/afp/AFPBorderPainterTestCase.java | 76 +++++++++++++++++++ .../render/pdf/PDFBorderPainterTestCase.java | 2 +- .../render/ps/PSBorderPainterTestCase.java | 2 +- 5 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 test/java/org/apache/fop/render/afp/AFPBorderPainterTestCase.java diff --git a/src/java/org/apache/fop/afp/AFPBorderPainter.java b/src/java/org/apache/fop/afp/AFPBorderPainter.java index 06f1ecd11..0e293bf45 100644 --- a/src/java/org/apache/fop/afp/AFPBorderPainter.java +++ b/src/java/org/apache/fop/afp/AFPBorderPainter.java @@ -128,23 +128,23 @@ public class AFPBorderPainter extends AbstractAFPPainter { break; case Constants.EN_DASHED: if (borderPaintInfo.isHorizontal()) { - int dashWidth = (int) (BorderPainter.dashWidthCalculator(x2 - x1, thickness)); + int dashWidth = (int) unitConv.pt2units(BorderPainter.dashWidthCalculator(w, h)); lineDataInfo.setX2 ( lineDataInfo.getX1() + dashWidth ); lineDataInfo.setY2 ( lineDataInfo.getY1() ); int ex2 = Math.round(x2); int spaceWidth = (int) (BorderPainter.DASHED_BORDER_SPACE_RATIO * dashWidth); - while (lineDataInfo.getX2() < ex2) { + while (lineDataInfo.getX2() <= ex2) { dataStream.createLine(lineDataInfo); lineDataInfo.setX1 ( lineDataInfo.getX2() + spaceWidth ); lineDataInfo.setX2 ( lineDataInfo.getX1() + dashWidth ); } } else { - int dashWidth = (int) BorderPainter.dashWidthCalculator(y2 - y1, thickness); + int dashWidth = (int) unitConv.pt2units(BorderPainter.dashWidthCalculator(h, w)); lineDataInfo.setX2 ( lineDataInfo.getX1() ); lineDataInfo.setY2 ( lineDataInfo.getY1() + dashWidth ); int ey2 = Math.round(y2); int spaceWidth = (int) (BorderPainter.DASHED_BORDER_SPACE_RATIO * dashWidth); - while (lineDataInfo.getY2() < ey2) { + while (lineDataInfo.getY2() <= ey2) { dataStream.createLine(lineDataInfo); lineDataInfo.setY1 ( lineDataInfo.getY2() + spaceWidth ); lineDataInfo.setY2 ( lineDataInfo.getY1() + dashWidth ); diff --git a/src/java/org/apache/fop/render/intermediate/BorderPainter.java b/src/java/org/apache/fop/render/intermediate/BorderPainter.java index 3653dd1f3..0e6268884 100644 --- a/src/java/org/apache/fop/render/intermediate/BorderPainter.java +++ b/src/java/org/apache/fop/render/intermediate/BorderPainter.java @@ -289,6 +289,9 @@ public class BorderPainter { */ public static float dashWidthCalculator(float borderLength, float borderWidth) { float dashWidth = DASHED_BORDER_LENGTH_FACTOR * borderWidth; + if (borderWidth < 3) { + dashWidth = (DASHED_BORDER_LENGTH_FACTOR * 3) * borderWidth; + } int period = (int) ((borderLength - dashWidth) / dashWidth / (1.0f + DASHED_BORDER_SPACE_RATIO)); period = period < 0 ? 0 : period; return borderLength / (period * (1.0f + DASHED_BORDER_SPACE_RATIO) + 1.0f); diff --git a/test/java/org/apache/fop/render/afp/AFPBorderPainterTestCase.java b/test/java/org/apache/fop/render/afp/AFPBorderPainterTestCase.java new file mode 100644 index 000000000..691d75f3f --- /dev/null +++ b/test/java/org/apache/fop/render/afp/AFPBorderPainterTestCase.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.afp; + +import static org.junit.Assert.assertTrue; + +import java.awt.Color; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; + +import org.apache.fop.afp.AFPBorderPainter; +import org.apache.fop.afp.AFPLineDataInfo; +import org.apache.fop.afp.AFPPaintingState; +import org.apache.fop.afp.BorderPaintingInfo; +import org.apache.fop.afp.DataStream; +import org.apache.fop.afp.Factory; +import org.apache.fop.fo.Constants; +import org.junit.Before; +import org.junit.Test; + +public class AFPBorderPainterTestCase { + private ByteArrayOutputStream outStream; + private AFPBorderPainter borderPainter; + private DataStream ds; + private AFPLineDataInfo line; + + @Before + public void setUp() throws Exception { + outStream = new ByteArrayOutputStream(); + ds = new MyDataStream(new Factory(), null, outStream); + ds.startDocument(); + ds.startPage(1000, 1000, 90, 72, 72); + borderPainter = new AFPBorderPainter(new AFPPaintingState(), ds); + } + + /** + * This test will fail if either of the below statements isn't true: + * org.apache.fop.render.intermediate.BorderPainter.DASHED_BORDER_SPACE_RATIO = 0.5f:q + * org.apache.fop.render.intermediate.BorderPainter.DASHED_BORDER_LENGTH_FACTOR = 4.0f. + */ + @Test + public void testDrawBorderLine() throws Exception { + BorderPaintingInfo paintInfo = new BorderPaintingInfo(0f, 0f, 1000f, 1000f, true, + Constants.EN_DASHED, Color.BLACK); + borderPainter.paint(paintInfo); + ds.endDocument(); + assertTrue(line.getX1() == 4999 && line.getX2() == 8332); + } + + class MyDataStream extends DataStream { + public MyDataStream(Factory factory, AFPPaintingState paintingState, OutputStream outputStream) { + super(factory, paintingState, outputStream); + } + + public void createLine(AFPLineDataInfo lineDataInfo) { + line = lineDataInfo; + } + } +} diff --git a/test/java/org/apache/fop/render/pdf/PDFBorderPainterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBorderPainterTestCase.java index 6bb6da2d8..ed8156001 100644 --- a/test/java/org/apache/fop/render/pdf/PDFBorderPainterTestCase.java +++ b/test/java/org/apache/fop/render/pdf/PDFBorderPainterTestCase.java @@ -56,7 +56,7 @@ public class PDFBorderPainterTestCase { generator.flushPDFDoc(); OutputStream outStream = new ByteArrayOutputStream(); outStream = generator.getStream().getBufferOutputStream(); - assertTrue(((ByteArrayOutputStream) outStream).toString().contains("[2.105263 1.052632] 0 d 1 w")); + assertTrue(((ByteArrayOutputStream) outStream).toString().contains("[7.272727 3.636364] 0 d 1 w")); } public void tearDown() { diff --git a/test/java/org/apache/fop/render/ps/PSBorderPainterTestCase.java b/test/java/org/apache/fop/render/ps/PSBorderPainterTestCase.java index a83cd53e0..602431231 100644 --- a/test/java/org/apache/fop/render/ps/PSBorderPainterTestCase.java +++ b/test/java/org/apache/fop/render/ps/PSBorderPainterTestCase.java @@ -53,7 +53,7 @@ public class PSBorderPainterTestCase { public void testDrawBorderLine() throws Exception { borderPainter.drawBorderLine(0, 0, 40000, 1000, true, true, Constants.EN_DASHED, Color.BLACK); - assertTrue(outStream.toString().contains("[2.1052632 1.0526316] 0 setdash")); + assertTrue(outStream.toString().contains("[7.2727275 3.6363637] 0 setdash")); } public void tearDown() { -- 2.39.5