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
break; | break; | ||||
case Constants.EN_DASHED: | case Constants.EN_DASHED: | ||||
if (borderPaintInfo.isHorizontal()) { | 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.setX2 ( lineDataInfo.getX1() + dashWidth ); | ||||
lineDataInfo.setY2 ( lineDataInfo.getY1() ); | lineDataInfo.setY2 ( lineDataInfo.getY1() ); | ||||
int ex2 = Math.round(x2); | int ex2 = Math.round(x2); | ||||
int spaceWidth = (int) (BorderPainter.DASHED_BORDER_SPACE_RATIO * dashWidth); | int spaceWidth = (int) (BorderPainter.DASHED_BORDER_SPACE_RATIO * dashWidth); | ||||
while (lineDataInfo.getX2() < ex2) { | |||||
while (lineDataInfo.getX2() <= ex2) { | |||||
dataStream.createLine(lineDataInfo); | dataStream.createLine(lineDataInfo); | ||||
lineDataInfo.setX1 ( lineDataInfo.getX2() + spaceWidth ); | lineDataInfo.setX1 ( lineDataInfo.getX2() + spaceWidth ); | ||||
lineDataInfo.setX2 ( lineDataInfo.getX1() + dashWidth ); | lineDataInfo.setX2 ( lineDataInfo.getX1() + dashWidth ); | ||||
} | } | ||||
} else { | } else { | ||||
int dashWidth = (int) BorderPainter.dashWidthCalculator(y2 - y1, thickness); | |||||
int dashWidth = (int) unitConv.pt2units(BorderPainter.dashWidthCalculator(h, w)); | |||||
lineDataInfo.setX2 ( lineDataInfo.getX1() ); | lineDataInfo.setX2 ( lineDataInfo.getX1() ); | ||||
lineDataInfo.setY2 ( lineDataInfo.getY1() + dashWidth ); | lineDataInfo.setY2 ( lineDataInfo.getY1() + dashWidth ); | ||||
int ey2 = Math.round(y2); | int ey2 = Math.round(y2); | ||||
int spaceWidth = (int) (BorderPainter.DASHED_BORDER_SPACE_RATIO * dashWidth); | int spaceWidth = (int) (BorderPainter.DASHED_BORDER_SPACE_RATIO * dashWidth); | ||||
while (lineDataInfo.getY2() < ey2) { | |||||
while (lineDataInfo.getY2() <= ey2) { | |||||
dataStream.createLine(lineDataInfo); | dataStream.createLine(lineDataInfo); | ||||
lineDataInfo.setY1 ( lineDataInfo.getY2() + spaceWidth ); | lineDataInfo.setY1 ( lineDataInfo.getY2() + spaceWidth ); | ||||
lineDataInfo.setY2 ( lineDataInfo.getY1() + dashWidth ); | lineDataInfo.setY2 ( lineDataInfo.getY1() + dashWidth ); |
*/ | */ | ||||
public static float dashWidthCalculator(float borderLength, float borderWidth) { | public static float dashWidthCalculator(float borderLength, float borderWidth) { | ||||
float dashWidth = DASHED_BORDER_LENGTH_FACTOR * 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)); | int period = (int) ((borderLength - dashWidth) / dashWidth / (1.0f + DASHED_BORDER_SPACE_RATIO)); | ||||
period = period < 0 ? 0 : period; | period = period < 0 ? 0 : period; | ||||
return borderLength / (period * (1.0f + DASHED_BORDER_SPACE_RATIO) + 1.0f); | return borderLength / (period * (1.0f + DASHED_BORDER_SPACE_RATIO) + 1.0f); |
/* | |||||
* 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; | |||||
} | |||||
} | |||||
} |
generator.flushPDFDoc(); | generator.flushPDFDoc(); | ||||
OutputStream outStream = new ByteArrayOutputStream(); | OutputStream outStream = new ByteArrayOutputStream(); | ||||
outStream = generator.getStream().getBufferOutputStream(); | 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() { | public void tearDown() { |
public void testDrawBorderLine() throws Exception { | public void testDrawBorderLine() throws Exception { | ||||
borderPainter.drawBorderLine(0, 0, 40000, 1000, true, true, | borderPainter.drawBorderLine(0, 0, 40000, 1000, true, true, | ||||
Constants.EN_DASHED, Color.BLACK); | 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() { | public void tearDown() { |