Skip to content

Commit c19c59f

Browse files
committed
Implement 2D transform CSS properties in renderers
DEVSIX-1310 Autoported commit. Original commit hash: [25659fb3d]
1 parent a53717e commit c19c59f

File tree

8 files changed

+77
-8
lines changed

8 files changed

+77
-8
lines changed

itext/itext.layout/itext/layout/properties/Property.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,8 @@ private Property() {
288288

289289
public const int TOP = 73;
290290

291+
public const int TRANSFORM = 101;
292+
291293
public const int UNDERLINE = 74;
292294

293295
public const int VERTICAL_ALIGNMENT = 75;

itext/itext.layout/itext/layout/renderer/AbstractRenderer.cs

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -691,11 +691,10 @@ protected internal virtual bool ClipBackgroundArea(DrawContext drawContext, Rect
691691
public virtual void DrawChildren(DrawContext drawContext) {
692692
IList<IRenderer> waitingRenderers = new List<IRenderer>();
693693
foreach (IRenderer child in childRenderers) {
694-
if (FloatingHelper.IsRendererFloating(child)) {
694+
if (FloatingHelper.IsRendererFloating(child) || child.GetProperty(Property.TRANSFORM) != null) {
695695
RootRenderer rootRenderer = GetRootRenderer();
696-
if (rootRenderer != null) {
696+
if (rootRenderer != null && !rootRenderer.waitingDrawingElements.Contains(child)) {
697697
rootRenderer.waitingDrawingElements.Add(child);
698-
child.SetProperty(Property.FLOAT, null);
699698
}
700699
else {
701700
waitingRenderers.Add(child);
@@ -1510,6 +1509,28 @@ protected internal virtual Rectangle CalculateAbsolutePdfBBox() {
15101509
TransformPoints(contentBoxPoints, rotationTransform);
15111510
}
15121511
}
1512+
float[] transform = renderer.GetProperty<float[]>(Property.TRANSFORM);
1513+
if (transform != null) {
1514+
if (renderer is BlockRenderer) {
1515+
BlockRenderer blockRenderer = (BlockRenderer)renderer;
1516+
AffineTransform rotationTransform = blockRenderer.CreateTransformationInsideOccupiedArea();
1517+
TransformPoints(contentBoxPoints, rotationTransform);
1518+
}
1519+
else {
1520+
if (renderer is ImageRenderer) {
1521+
ImageRenderer imageRenderer = (ImageRenderer)renderer;
1522+
AffineTransform rotationTransform = imageRenderer.CreateTransformationInsideOccupiedArea();
1523+
TransformPoints(contentBoxPoints, rotationTransform);
1524+
}
1525+
else {
1526+
if (renderer is TableRenderer) {
1527+
TableRenderer tableRenderer = (TableRenderer)renderer;
1528+
AffineTransform rotationTransform = tableRenderer.CreateTransformationInsideOccupiedArea();
1529+
TransformPoints(contentBoxPoints, rotationTransform);
1530+
}
1531+
}
1532+
}
1533+
}
15131534
renderer = (iText.Layout.Renderer.AbstractRenderer)renderer.parent;
15141535
}
15151536
return CalculateBBox(contentBoxPoints);
@@ -1805,6 +1826,44 @@ private static float CalculatePaddingBorderHeight(iText.Layout.Renderer.Abstract
18051826
return dummy.GetHeight();
18061827
}
18071828

1829+
/// <summary>
1830+
/// This method creates
1831+
/// <see cref="iText.Kernel.Geom.AffineTransform"/>
1832+
/// instance that could be used
1833+
/// to transform content inside the occupied area,
1834+
/// considering the centre of the occupiedArea as the origin of a coordinate system for transformation.
1835+
/// </summary>
1836+
/// <returns>
1837+
///
1838+
/// <see cref="iText.Kernel.Geom.AffineTransform"/>
1839+
/// that transforms the content and places it inside occupied area.
1840+
/// </returns>
1841+
protected internal virtual AffineTransform CreateTransformationInsideOccupiedArea() {
1842+
Rectangle backgroundArea = ApplyMargins(occupiedArea.Clone().GetBBox(), false);
1843+
float x = backgroundArea.GetX();
1844+
float y = backgroundArea.GetY();
1845+
float height = backgroundArea.GetHeight();
1846+
float width = backgroundArea.GetWidth();
1847+
AffineTransform transform = AffineTransform.GetTranslateInstance(-1 * (x + width / 2), -1 * (y + height /
1848+
2));
1849+
transform.PreConcatenate((new AffineTransform((float[])this.GetProperty(Property.TRANSFORM))));
1850+
transform.PreConcatenate(AffineTransform.GetTranslateInstance(x + width / 2, y + height / 2));
1851+
return transform;
1852+
}
1853+
1854+
protected internal virtual void BeginTranformationIfApplied(PdfCanvas canvas) {
1855+
if (this.GetProperty(Property.TRANSFORM) != null) {
1856+
AffineTransform transform = CreateTransformationInsideOccupiedArea();
1857+
canvas.SaveState().ConcatMatrix(transform);
1858+
}
1859+
}
1860+
1861+
protected internal virtual void EndTranformationIfApplied(PdfCanvas canvas) {
1862+
if (this.GetProperty(Property.TRANSFORM) != null) {
1863+
canvas.RestoreState();
1864+
}
1865+
}
1866+
18081867
public abstract IRenderer GetNextRenderer();
18091868

18101869
public abstract LayoutResult Layout(LayoutContext arg1);

itext/itext.layout/itext/layout/renderer/BlockRenderer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,7 @@ public override void Draw(DrawContext drawContext) {
492492
isTagged = false;
493493
}
494494
}
495+
BeginTranformationIfApplied(drawContext.GetCanvas());
495496
ApplyDestinationsAndAnnotation(drawContext);
496497
bool isRelativePosition = IsRelativePosition();
497498
if (isRelativePosition) {
@@ -534,6 +535,7 @@ public override void Draw(DrawContext drawContext) {
534535
}
535536
}
536537
flushed = true;
538+
EndTranformationIfApplied(drawContext.GetCanvas());
537539
}
538540

539541
public override Rectangle GetOccupiedAreaBBox() {

itext/itext.layout/itext/layout/renderer/CanvasRenderer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ public override void AddChild(IRenderer renderer) {
9898

9999
/// <summary><inheritDoc/></summary>
100100
protected internal override void FlushSingleRenderer(IRenderer resultRenderer) {
101-
if (FloatingHelper.IsRendererFloating(resultRenderer)) {
101+
if (!waitingDrawingElements.Contains(resultRenderer) && (FloatingHelper.IsRendererFloating(resultRenderer)
102+
|| resultRenderer.GetProperty(Property.TRANSFORM) != null)) {
102103
waitingDrawingElements.Add(resultRenderer);
103-
resultRenderer.SetProperty(Property.FLOAT, null);
104104
return;
105105
}
106106
if (!resultRenderer.IsFlushed()) {

itext/itext.layout/itext/layout/renderer/DocumentRenderer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ protected internal override LayoutArea UpdateCurrentArea(LayoutResult overflowRe
106106
}
107107

108108
protected internal override void FlushSingleRenderer(IRenderer resultRenderer) {
109-
if (FloatingHelper.IsRendererFloating(resultRenderer)) {
109+
if (!waitingDrawingElements.Contains(resultRenderer) && (FloatingHelper.IsRendererFloating(resultRenderer)
110+
|| resultRenderer.GetProperty(Property.TRANSFORM) != null)) {
110111
waitingDrawingElements.Add(resultRenderer);
111-
resultRenderer.SetProperty(Property.FLOAT, null);
112112
return;
113113
}
114114
if (!resultRenderer.IsFlushed()) {

itext/itext.layout/itext/layout/renderer/ImageRenderer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ public override void Draw(DrawContext drawContext) {
311311
drawContext.GetCanvas().SaveState();
312312
ApplyConcatMatrix(drawContext, angle);
313313
}
314+
BeginTranformationIfApplied(drawContext.GetCanvas());
314315
base.Draw(drawContext);
315316
if (angle != null) {
316317
drawContext.GetCanvas().RestoreState();
@@ -328,6 +329,7 @@ public override void Draw(DrawContext drawContext) {
328329
BeginElementOpacityApplying(drawContext);
329330
canvas.AddXObject(xObject, matrix[0], matrix[1], matrix[2], matrix[3], (float)fixedXPosition + deltaX, (float
330331
)fixedYPosition);
332+
EndTranformationIfApplied(drawContext.GetCanvas());
331333
EndElementOpacityApplying(drawContext);
332334
if (true.Equals(GetPropertyAsBoolean(Property.FLUSH_ON_DRAW))) {
333335
xObject.Flush();

itext/itext.layout/itext/layout/renderer/TableRenderer.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,15 +949,19 @@ public override void Draw(DrawContext drawContext) {
949949
PdfDictionary layoutAttributes = AccessibleAttributesApplier.GetLayoutAttributes(role, this, tagPointer);
950950
ApplyGeneratedAccessibleAttributes(tagPointer, layoutAttributes);
951951
}
952+
BeginTranformationIfApplied(drawContext.GetCanvas());
952953
base.Draw(drawContext);
954+
EndTranformationIfApplied(drawContext.GetCanvas());
953955
tagPointer.MoveToParent();
954956
bool toRemoveConnectionsWithTag = isLastRendererForModelElement && ((Table)GetModelElement()).IsComplete();
955957
if (toRemoveConnectionsWithTag) {
956958
tagPointer.RemoveElementConnectionToTag(accessibleElement);
957959
}
958960
}
959961
else {
962+
BeginTranformationIfApplied(drawContext.GetCanvas());
960963
base.Draw(drawContext);
964+
EndTranformationIfApplied(drawContext.GetCanvas());
961965
}
962966
}
963967

port-hash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
cedd23750ff07cbcca5439921b17c2139eec2e71
1+
25659fb3d9ab9b283297715d4fb9c1f40f48cd83

0 commit comments

Comments
 (0)