Skip to content

Commit 9375cf0

Browse files
committed
Add Transform class to be used instead of List<String[]> as propety value
DEVSIX-1310
1 parent e5f8c0b commit 9375cf0

File tree

4 files changed

+81
-30
lines changed

4 files changed

+81
-30
lines changed
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.itextpdf.layout.property;
2+
3+
4+
import com.itextpdf.kernel.geom.AffineTransform;
5+
import com.itextpdf.layout.renderer.IRenderer;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
public class Transform {
11+
private List<SingleTransform> multipleTransform;
12+
13+
public Transform(int length) {
14+
multipleTransform = new ArrayList<SingleTransform>(length);
15+
}
16+
17+
public void addSingleTransform(SingleTransform singleTransform) {
18+
multipleTransform.add(singleTransform);
19+
}
20+
21+
private List<SingleTransform> getMultipleTransform() {
22+
return multipleTransform;
23+
}
24+
25+
public static AffineTransform getAffineTransform(Transform t, float width, float height) {
26+
List<SingleTransform> multipleTransform = t.getMultipleTransform();
27+
AffineTransform affineTransform = new AffineTransform();
28+
for (int k = multipleTransform.size() - 1; k >= 0; k--) {
29+
SingleTransform transform = multipleTransform.get(k);
30+
float[] floats = new float[6];
31+
for (int i = 0; i < 4; i++)
32+
floats[i] = transform.getFloats()[i];
33+
for (int i = 4; i < 6; i++)
34+
floats[i] = transform.getUnitValues()[i - 4].getUnitType() == UnitValue.POINT ?
35+
transform.getUnitValues()[i - 4].getValue() : transform.getUnitValues()[i - 4].getValue() / 100 * (i == 4 ? width : height);
36+
affineTransform.preConcatenate(new AffineTransform(floats));
37+
}
38+
return affineTransform;
39+
}
40+
41+
public static class SingleTransform {
42+
private float a, b, c, d;
43+
private UnitValue tx, ty;
44+
45+
public SingleTransform() {
46+
this.a = 1;
47+
this.b = 0;
48+
this.c = 0;
49+
this.d = 1;
50+
this.tx = new UnitValue(UnitValue.POINT, 0);
51+
this.ty = new UnitValue(UnitValue.POINT, 0);
52+
}
53+
54+
public SingleTransform(float a, float b, float c, float d, UnitValue tx, UnitValue ty) {
55+
this.a = a;
56+
this.b = b;
57+
this.c = c;
58+
this.d = d;
59+
this.tx = tx;
60+
this.ty = ty;
61+
}
62+
63+
private float[] getFloats() {
64+
return new float[]{a, b, c, d};
65+
}
66+
67+
private UnitValue[] getUnitValues() {
68+
return new UnitValue[]{tx, ty};
69+
}
70+
}
71+
}

layout/src/main/java/com/itextpdf/layout/renderer/AbstractRenderer.java

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ This file is part of the iText (R) project.
8585
import com.itextpdf.layout.property.HorizontalAlignment;
8686
import com.itextpdf.layout.property.Property;
8787
import com.itextpdf.layout.property.TransparentColor;
88+
import com.itextpdf.layout.property.Transform;
8889
import com.itextpdf.layout.property.UnitValue;
8990
import org.slf4j.Logger;
9091
import org.slf4j.LoggerFactory;
@@ -788,7 +789,7 @@ protected boolean clipBackgroundArea(DrawContext drawContext, Rectangle outerBor
788789
public void drawChildren(DrawContext drawContext) {
789790
List<IRenderer> waitingRenderers = new ArrayList<>();
790791
for (IRenderer child : childRenderers) {
791-
if (FloatingHelper.isRendererFloating(child) || child.<List<String[]>>getProperty(Property.TRANSFORM) != null) {
792+
if (FloatingHelper.isRendererFloating(child) || child.<Transform>getProperty(Property.TRANSFORM) != null) {
792793
RootRenderer rootRenderer = getRootRenderer();
793794
if (rootRenderer != null && !rootRenderer.waitingDrawingElements.contains(child)) {
794795
rootRenderer.waitingDrawingElements.add(child);
@@ -1522,7 +1523,7 @@ protected Rectangle calculateAbsolutePdfBBox() {
15221523
}
15231524
}
15241525

1525-
if (renderer.<List<String[]>>getProperty(Property.TRANSFORM) != null) {
1526+
if (renderer.<Transform>getProperty(Property.TRANSFORM) != null) {
15261527
if (renderer instanceof BlockRenderer || renderer instanceof ImageRenderer || renderer instanceof TableRenderer) {
15271528
AffineTransform rotationTransform = renderer.createTransformationInsideOccupiedArea();
15281529
transformPoints(contentBoxPoints, rotationTransform);
@@ -1821,43 +1822,22 @@ private AffineTransform createTransformationInsideOccupiedArea() {
18211822
float width = backgroundArea.getWidth();
18221823

18231824
AffineTransform transform = AffineTransform.getTranslateInstance(-1 * (x + width / 2), -1 * (y + height / 2));
1824-
transform.preConcatenate(new AffineTransform(this.getTransformMatrix(width, height)));
1825+
transform.preConcatenate(Transform.getAffineTransform(this.<Transform>getProperty(Property.TRANSFORM), width, height));
18251826
transform.preConcatenate(AffineTransform.getTranslateInstance(x + width / 2, y + height / 2));
18261827

18271828
return transform;
18281829
}
18291830

18301831
protected void beginTranformationIfApplied(PdfCanvas canvas) {
1831-
if (this.<List<String[]>>getProperty(Property.TRANSFORM) != null) {
1832+
if (this.<Transform>getProperty(Property.TRANSFORM) != null) {
18321833
AffineTransform transform = createTransformationInsideOccupiedArea();
18331834
canvas.saveState().concatMatrix(transform);
18341835
}
18351836
}
18361837

18371838
protected void endTranformationIfApplied(PdfCanvas canvas) {
1838-
if (this.<List<String[]>>getProperty(Property.TRANSFORM) != null) {
1839+
if (this.<Transform>getProperty(Property.TRANSFORM) != null) {
18391840
canvas.restoreState();
18401841
}
18411842
}
1842-
1843-
private AffineTransform getTransformMatrix(float width, float height) {
1844-
List<String[]> multipleTransform = this.<List<String[]>>getProperty(Property.TRANSFORM);
1845-
AffineTransform affineTransform = new AffineTransform();
1846-
for (int k = multipleTransform.size() - 1; k >=0; k--) {
1847-
String[] transform = multipleTransform.get(k);
1848-
float[] floats = new float[6];
1849-
for (int i = 0; i < 6; i++)
1850-
if (i == 4 || i == 5) {
1851-
int indexOfPercent = transform[i].indexOf('%');
1852-
if (indexOfPercent > 0)
1853-
floats[i] = Float.parseFloat(transform[i].substring(0, indexOfPercent)) / 100 * (i == 4 ? width : height);
1854-
else
1855-
floats[i] = Float.parseFloat(transform[i]);
1856-
}
1857-
else
1858-
floats[i] = Float.parseFloat(transform[i]);
1859-
affineTransform.preConcatenate(new AffineTransform(floats));
1860-
}
1861-
return affineTransform;
1862-
}
18631843
}

layout/src/main/java/com/itextpdf/layout/renderer/CanvasRenderer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ This file is part of the iText (R) project.
4949
import com.itextpdf.layout.layout.LayoutResult;
5050
import com.itextpdf.layout.property.Property;
5151

52+
import com.itextpdf.layout.property.Transform;
5253
import org.slf4j.LoggerFactory;
5354

54-
import java.util.List;
55-
5655
public class CanvasRenderer extends RootRenderer {
5756

5857
protected Canvas canvas;
@@ -94,7 +93,7 @@ public void addChild(IRenderer renderer) {
9493
*/
9594
@Override
9695
protected void flushSingleRenderer(IRenderer resultRenderer) {
97-
if (!waitingDrawingElements.contains(resultRenderer) && (FloatingHelper.isRendererFloating(resultRenderer) || resultRenderer.<List<String[]>>getProperty(Property.TRANSFORM) != null)) {
96+
if (!waitingDrawingElements.contains(resultRenderer) && (FloatingHelper.isRendererFloating(resultRenderer) || resultRenderer.<Transform>getProperty(Property.TRANSFORM) != null)) {
9897
waitingDrawingElements.add(resultRenderer);
9998
return;
10099
}

layout/src/main/java/com/itextpdf/layout/renderer/DocumentRenderer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ This file is part of the iText (R) project.
5353
import com.itextpdf.layout.layout.LayoutResult;
5454
import com.itextpdf.layout.property.AreaBreakType;
5555
import com.itextpdf.layout.property.Property;
56+
import com.itextpdf.layout.property.Transform;
5657

5758
import java.util.ArrayList;
5859
import java.util.List;
@@ -110,7 +111,7 @@ protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
110111
}
111112

112113
protected void flushSingleRenderer(IRenderer resultRenderer) {
113-
if (!waitingDrawingElements.contains(resultRenderer) && (FloatingHelper.isRendererFloating(resultRenderer) || resultRenderer.<List<String[]>>getProperty(Property.TRANSFORM) != null)) {
114+
if (!waitingDrawingElements.contains(resultRenderer) && (FloatingHelper.isRendererFloating(resultRenderer) || resultRenderer.<Transform>getProperty(Property.TRANSFORM) != null)) {
114115
waitingDrawingElements.add(resultRenderer);
115116
return;
116117
}

0 commit comments

Comments
 (0)