Skip to content

Commit ee1d5a0

Browse files
committed
Support %-unit for transform:translate()
DEVSIX-1310
1 parent 25659fb commit ee1d5a0

File tree

3 files changed

+23
-7
lines changed

3 files changed

+23
-7
lines changed

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ protected boolean clipBackgroundArea(DrawContext drawContext, Rectangle outerBor
788788
public void drawChildren(DrawContext drawContext) {
789789
List<IRenderer> waitingRenderers = new ArrayList<>();
790790
for (IRenderer child : childRenderers) {
791-
if (FloatingHelper.isRendererFloating(child) || child.getProperty(Property.TRANSFORM) != null) {
791+
if (FloatingHelper.isRendererFloating(child) || child.<String[]>getProperty(Property.TRANSFORM) != null) {
792792
RootRenderer rootRenderer = getRootRenderer();
793793
if (rootRenderer != null && !rootRenderer.waitingDrawingElements.contains(child)) {
794794
rootRenderer.waitingDrawingElements.add(child);
@@ -1522,7 +1522,7 @@ protected Rectangle calculateAbsolutePdfBBox() {
15221522
}
15231523
}
15241524

1525-
float[] transform = renderer.<float[]>getProperty(Property.TRANSFORM);
1525+
String[] transform = renderer.<String[]>getProperty(Property.TRANSFORM);
15261526
if (transform != null) {
15271527
if (renderer instanceof BlockRenderer) {
15281528
BlockRenderer blockRenderer = (BlockRenderer) renderer;
@@ -1831,22 +1831,38 @@ protected AffineTransform createTransformationInsideOccupiedArea() {
18311831
float width = backgroundArea.getWidth();
18321832

18331833
AffineTransform transform = AffineTransform.getTranslateInstance(-1 * (x + width / 2), -1 * (y + height / 2));
1834-
transform.preConcatenate((new AffineTransform((float[]) this.getProperty(Property.TRANSFORM))));
1834+
transform.preConcatenate(new AffineTransform(this.getCssTransformMatrix(width, height)));
18351835
transform.preConcatenate(AffineTransform.getTranslateInstance(x + width / 2, y + height / 2));
18361836

18371837
return transform;
18381838
}
18391839

18401840
protected void beginTranformationIfApplied(PdfCanvas canvas) {
1841-
if (this.getProperty(Property.TRANSFORM) != null) {
1841+
if (this.<String[]>getProperty(Property.TRANSFORM) != null) {
18421842
AffineTransform transform = createTransformationInsideOccupiedArea();
18431843
canvas.saveState().concatMatrix(transform);
18441844
}
18451845
}
18461846

18471847
protected void endTranformationIfApplied(PdfCanvas canvas) {
1848-
if (this.getProperty(Property.TRANSFORM) != null) {
1848+
if (this.<String[]>getProperty(Property.TRANSFORM) != null) {
18491849
canvas.restoreState();
18501850
}
18511851
}
1852+
1853+
private float[] getCssTransformMatrix(float width, float height) {
1854+
String[] strings = this.<String[]>getProperty(Property.TRANSFORM);
1855+
float[] floats = new float[6];
1856+
for (int i = 0; i < 6; i++)
1857+
if (i == 4 || i == 5) {
1858+
int indexOfPercent = strings[i].indexOf('%');
1859+
if (indexOfPercent > 0)
1860+
floats[i] = Float.parseFloat(strings[i].substring(0, indexOfPercent)) / 100 * (i == 4 ? width : height);
1861+
else
1862+
floats[i] = Float.parseFloat(strings[i]);
1863+
}
1864+
else
1865+
floats[i] = Float.parseFloat(strings[i]);
1866+
return floats;
1867+
}
18521868
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public void addChild(IRenderer renderer) {
9292
*/
9393
@Override
9494
protected void flushSingleRenderer(IRenderer resultRenderer) {
95-
if (!waitingDrawingElements.contains(resultRenderer) && (FloatingHelper.isRendererFloating(resultRenderer) || resultRenderer.getProperty(Property.TRANSFORM) != null)) {
95+
if (!waitingDrawingElements.contains(resultRenderer) && (FloatingHelper.isRendererFloating(resultRenderer) || resultRenderer.<String[]>getProperty(Property.TRANSFORM) != null)) {
9696
waitingDrawingElements.add(resultRenderer);
9797
return;
9898
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
110110
}
111111

112112
protected void flushSingleRenderer(IRenderer resultRenderer) {
113-
if (!waitingDrawingElements.contains(resultRenderer) && (FloatingHelper.isRendererFloating(resultRenderer) || resultRenderer.getProperty(Property.TRANSFORM) != null)) {
113+
if (!waitingDrawingElements.contains(resultRenderer) && (FloatingHelper.isRendererFloating(resultRenderer) || resultRenderer.<String[]>getProperty(Property.TRANSFORM) != null)) {
114114
waitingDrawingElements.add(resultRenderer);
115115
return;
116116
}

0 commit comments

Comments
 (0)