Browse Source

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
tags/fop-2_0
Chris Bowditch 11 years ago
parent
commit
04e4c552f3

+ 4
- 4
src/java/org/apache/fop/afp/AFPBorderPainter.java View File

@@ -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 );

+ 3
- 0
src/java/org/apache/fop/render/intermediate/BorderPainter.java View File

@@ -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);

+ 76
- 0
test/java/org/apache/fop/render/afp/AFPBorderPainterTestCase.java View File

@@ -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;
}
}
}

+ 1
- 1
test/java/org/apache/fop/render/pdf/PDFBorderPainterTestCase.java View File

@@ -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() {

+ 1
- 1
test/java/org/apache/fop/render/ps/PSBorderPainterTestCase.java View File

@@ -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() {

Loading…
Cancel
Save