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-ffa450edef68tags/fop-2_0
@@ -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 ); |
@@ -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); |
@@ -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; | |||
} | |||
} | |||
} |
@@ -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() { |
@@ -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() { |