Browse Source

FOP-2980: Reduce filesize for AFP Graphics2D

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1882752 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-2_6
Simon Steiner 3 years ago
parent
commit
e92a71fbd6

+ 32
- 7
fop-core/src/main/java/org/apache/fop/afp/AFPGraphics2D.java View File

import java.awt.image.RenderedImage; import java.awt.image.RenderedImage;
import java.awt.image.renderable.RenderableImage; import java.awt.image.renderable.RenderableImage;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
private void processPathIterator(PathIterator iter) { private void processPathIterator(PathIterator iter) {
double[] dstPts = new double[6]; double[] dstPts = new double[6];
double[] currentPosition = new double[2]; double[] currentPosition = new double[2];
List<Integer> fillets = new ArrayList<Integer>();
for (int[] openingCoords = new int[2]; !iter.isDone(); iter.next()) { for (int[] openingCoords = new int[2]; !iter.isDone(); iter.next()) {
switch (iter.currentSegment(dstPts)) { switch (iter.currentSegment(dstPts)) {
case PathIterator.SEG_LINETO: case PathIterator.SEG_LINETO:
flush(fillets);
graphicsObj.addLine(new int[] { graphicsObj.addLine(new int[] {
(int)Math.round(dstPts[X]), (int)Math.round(dstPts[X]),
(int)Math.round(dstPts[Y]) (int)Math.round(dstPts[Y])
currentPosition = new double[]{dstPts[X], dstPts[Y]}; currentPosition = new double[]{dstPts[X], dstPts[Y]};
break; break;
case PathIterator.SEG_QUADTO: case PathIterator.SEG_QUADTO:
flush(fillets);
graphicsObj.addFillet(new int[] { graphicsObj.addFillet(new int[] {
(int)Math.round(dstPts[X1]), (int)Math.round(dstPts[X1]),
(int)Math.round(dstPts[Y1]), (int)Math.round(dstPts[Y1]),
(int)Math.round(dstPts[X2]), (int)Math.round(dstPts[X2]),
(int)Math.round(dstPts[Y2]) (int)Math.round(dstPts[Y2])
}, true);
}, true);
currentPosition = new double[]{dstPts[X2], dstPts[Y2]}; currentPosition = new double[]{dstPts[X2], dstPts[Y2]};
break; break;
case PathIterator.SEG_CUBICTO: case PathIterator.SEG_CUBICTO:
if (quadParts.length >= 4) { if (quadParts.length >= 4) {
for (double[] quadPts : quadParts) { for (double[] quadPts : quadParts) {
if (quadPts != null && quadPts.length == 4) { if (quadPts != null && quadPts.length == 4) {
graphicsObj.addFillet(new int[]{
(int) Math.round(quadPts[X1]),
(int) Math.round(quadPts[Y1]),
(int) Math.round(quadPts[X2]),
(int) Math.round(quadPts[Y2])
}, true);
fillets.add((int) Math.round(quadPts[X1]));
fillets.add((int) Math.round(quadPts[Y1]));
fillets.add((int) Math.round(quadPts[X2]));
fillets.add((int) Math.round(quadPts[Y2]));
currentPosition = new double[]{quadPts[X2], quadPts[Y2]}; currentPosition = new double[]{quadPts[X2], quadPts[Y2]};
} }
} }
} }
break; break;
case PathIterator.SEG_MOVETO: case PathIterator.SEG_MOVETO:
flush(fillets);
openingCoords = new int[] { openingCoords = new int[] {
(int)Math.round(dstPts[X]), (int)Math.round(dstPts[X]),
(int)Math.round(dstPts[Y]) (int)Math.round(dstPts[Y])
graphicsObj.setCurrentPosition(openingCoords); graphicsObj.setCurrentPosition(openingCoords);
break; break;
case PathIterator.SEG_CLOSE: case PathIterator.SEG_CLOSE:
flush(fillets);
graphicsObj.addLine(openingCoords, true); graphicsObj.addLine(openingCoords, true);
currentPosition = new double[]{openingCoords[0], openingCoords[1]}; currentPosition = new double[]{openingCoords[0], openingCoords[1]};
break; break;
break; break;
} }
} }
flush(fillets);
}

private void flush(List<Integer> fillets) {
List<int[]> intList = listToIntLists(fillets);
for (int[] ints : intList) {
graphicsObj.addFillet(ints, true);
}
}

private List<int[]> listToIntLists(List<Integer> input) {
List<int[]> out = new ArrayList<int[]>();
while (!input.isEmpty()) {
int[] data = new int[Math.min(100, input.size())];
for (int i = 0; i < data.length; i++) {
data[i] = input.remove(0);
}
out.add(data);
}
return out;
} }


/** {@inheritDoc} */ /** {@inheritDoc} */

+ 26
- 0
fop-core/src/test/java/org/apache/fop/afp/AFPGraphics2DTestCase.java View File

package org.apache.fop.afp; package org.apache.fop.afp;


import java.awt.BasicStroke; import java.awt.BasicStroke;
import java.awt.Rectangle;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;


import org.junit.Assert;
import org.junit.Test; import org.junit.Test;


import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;


import org.apache.xmlgraphics.java2d.GraphicContext;

import org.apache.fop.afp.modca.GraphicsObject; import org.apache.fop.afp.modca.GraphicsObject;
import org.apache.fop.fonts.FontInfo; import org.apache.fop.fonts.FontInfo;


verify(gObject).setLineWidth(correctedLineWidth); verify(gObject).setLineWidth(correctedLineWidth);
} }


@Test
public void testDrawGraphicsFillet() throws IOException {
GraphicContext gc = new GraphicContext();
gc.setClip(new Rectangle(0, 0, 2, 2));
graphics2D.setGraphicContext(gc);
GraphicsObject go = new GraphicsObject(new Factory(), "test");
graphics2D.setGraphicsObject(go);
graphics2D.draw(new Area(new Ellipse2D.Double(0, 0, 100, 100)));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
go.writeToStream(bos);
ByteArrayInputStream is = new ByteArrayInputStream(bos.toByteArray());
is.skip(17 + 9 + 14 + 6);
int graphicsFilletMarker = 0x85;
Assert.assertEquals(is.read(), graphicsFilletMarker);
int sizeOfGraphicsFillet = 128;
Assert.assertEquals(is.read(), sizeOfGraphicsFillet);
}
} }

Loading…
Cancel
Save