Skip to content

Commit 832c058

Browse files
multiple fixes: code review, margin collapse issues during float elements splitting and some other minor issues.
DEVSIX-1267
1 parent 29a58d6 commit 832c058

File tree

6 files changed

+158
-131
lines changed

6 files changed

+158
-131
lines changed

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

Lines changed: 125 additions & 118 deletions
Large diffs are not rendered by default.

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,13 @@ static boolean isRendererFloating(IRenderer renderer, FloatPropertyValue kidFloa
317317
return notAbsolutePos && kidFloatPropertyVal != null && !kidFloatPropertyVal.equals(FloatPropertyValue.NONE);
318318
}
319319

320+
static boolean isFloatAffectedByClear(FloatPropertyValue floatPropertyValue, ClearPropertyValue clearPropertyValue) {
321+
return !(clearPropertyValue == null || clearPropertyValue.equals(ClearPropertyValue.NONE)) &&
322+
(clearPropertyValue.equals(ClearPropertyValue.BOTH) || (floatPropertyValue.equals(FloatPropertyValue.LEFT) &&
323+
clearPropertyValue.equals(ClearPropertyValue.LEFT)) || (floatPropertyValue.equals(FloatPropertyValue.RIGHT) &&
324+
clearPropertyValue.equals(ClearPropertyValue.RIGHT)));
325+
}
326+
320327
private static void adjustBoxForFloatRight(Rectangle layoutBox, float blockWidth) {
321328
layoutBox.setX(layoutBox.getRight() - blockWidth);
322329
layoutBox.setWidth(blockWidth);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ public LayoutResult layout(LayoutContext layoutContext) {
213213
if (Boolean.TRUE.equals(getPropertyAsBoolean(Property.FORCED_PLACEMENT))) {
214214
isPlacingForced = true;
215215
} else {
216+
occupiedArea.getBBox().setHeight(initialOccupiedAreaBBox.getHeight());
216217
return new MinMaxWidthLayoutResult(LayoutResult.NOTHING, occupiedArea, null, this, this);
217218
}
218219
}

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

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,18 @@ This file is part of the iText (R) project.
4444
package com.itextpdf.layout.renderer;
4545

4646
import com.itextpdf.io.LogMessageConstant;
47+
import com.itextpdf.io.util.MessageFormatUtil;
4748
import com.itextpdf.kernel.geom.Rectangle;
4849
import com.itextpdf.layout.layout.LayoutArea;
4950
import com.itextpdf.layout.layout.LayoutContext;
5051
import com.itextpdf.layout.layout.LayoutPosition;
5152
import com.itextpdf.layout.layout.LayoutResult;
5253
import com.itextpdf.layout.margincollapse.MarginsCollapseHandler;
5354
import com.itextpdf.layout.margincollapse.MarginsCollapseInfo;
54-
import com.itextpdf.layout.property.FloatPropertyValue;
5555
import com.itextpdf.layout.property.Property;
5656
import org.slf4j.Logger;
5757
import org.slf4j.LoggerFactory;
5858

59-
import com.itextpdf.io.util.MessageFormatUtil;
6059
import java.util.ArrayList;
6160
import java.util.List;
6261

@@ -80,7 +79,7 @@ public void addChild(IRenderer renderer) {
8079
int numberOfPositionedChildRenderers = positionedRenderers.size();
8180
super.addChild(renderer);
8281
List<IRenderer> addedRenderers = new ArrayList<>(1);
83-
if (currentArea != null && currentArea.getPageNumber() > 1) {
82+
if (currentArea != null && currentArea.isEmptyArea()) {
8483
addedRenderers.addAll(waitingRenderers);
8584
waitingRenderers.clear();
8685
}
@@ -117,14 +116,14 @@ public void addChild(IRenderer renderer) {
117116
if (marginsCollapsingEnabled && currentArea != null && renderer != null) {
118117
childMarginsInfo = marginsCollapseHandler.startChildMarginsHandling(renderer, currentArea.getBBox());
119118
}
120-
FloatPropertyValue floatPropertyValue = renderer.getProperty(Property.FLOAT);
121-
boolean rendererIsFloat = floatPropertyValue != null && !floatPropertyValue.equals(FloatPropertyValue.NONE);
119+
boolean rendererIsFloat = FloatingHelper.isRendererFloating(renderer);
122120
while (currentArea != null && renderer != null && (result = renderer.setParent(this).layout(
123121
new LayoutContext(currentArea.clone(), childMarginsInfo, floatRendererAreas)))
124122
.getStatus() != LayoutResult.FULL) {
125123
if (result.getStatus() == LayoutResult.PARTIAL) {
126124
if (rendererIsFloat) {
127125
waitingRenderers.add(result.getOverflowRenderer());
126+
floatRendererAreas.add(renderer.getOccupiedArea().getBBox());
128127
} else if (result.getOverflowRenderer() instanceof ImageRenderer) {
129128
((ImageRenderer) result.getOverflowRenderer()).autoScale(currentArea);
130129
} else {
@@ -139,13 +138,17 @@ public void addChild(IRenderer renderer) {
139138
}
140139
} else if (result.getStatus() == LayoutResult.NOTHING) {
141140
if (result.getOverflowRenderer() instanceof ImageRenderer) {
142-
if (currentArea.getBBox().getHeight() < ((ImageRenderer) result.getOverflowRenderer()).imageHeight && !currentArea.isEmptyArea()) {
141+
if (currentArea.getBBox().getHeight() < ((ImageRenderer) result.getOverflowRenderer()).getOccupiedArea().getBBox().getHeight() && !currentArea.isEmptyArea()
142+
&& !rendererIsFloat) {
143143
updateCurrentAndInitialArea(result);
144+
} else if (rendererIsFloat) {
145+
waitingRenderers.add(result.getOverflowRenderer());
146+
} else {
147+
((ImageRenderer) result.getOverflowRenderer()).autoScale(currentArea);
148+
result.getOverflowRenderer().setProperty(Property.FORCED_PLACEMENT, true);
149+
Logger logger = LoggerFactory.getLogger(RootRenderer.class);
150+
logger.warn(MessageFormatUtil.format(LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, ""));
144151
}
145-
((ImageRenderer)result.getOverflowRenderer()).autoScale(currentArea);
146-
result.getOverflowRenderer().setProperty(Property.FORCED_PLACEMENT, true);
147-
Logger logger = LoggerFactory.getLogger(RootRenderer.class);
148-
logger.warn(MessageFormatUtil.format(LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA, ""));
149152
} else {
150153
if (currentArea.isEmptyArea() && result.getAreaBreak() == null) {
151154
if (Boolean.TRUE.equals(result.getOverflowRenderer().getModelElement().<Boolean>getProperty(Property.KEEP_TOGETHER))) {
@@ -185,9 +188,9 @@ public void addChild(IRenderer renderer) {
185188
}
186189
}
187190
}
188-
if (rendererIsFloat && result.getStatus() != LayoutResult.NOTHING) {
191+
if (rendererIsFloat && (result.getStatus() != LayoutResult.NOTHING || renderer instanceof ImageRenderer)) {
189192
renderer = null;
190-
continue;
193+
break;
191194
}
192195
if (!waitingRenderers.isEmpty()) {
193196
renderer = waitingRenderers.remove(0);
@@ -276,6 +279,16 @@ public void flush() {
276279
* and when no consequent element has been added. This method addresses such situations.
277280
*/
278281
public void close() {
282+
List<IRenderer> waitingFloatRenderers = new ArrayList<>(waitingRenderers);
283+
while (!waitingFloatRenderers.isEmpty()) {
284+
marginsCollapseHandler = new MarginsCollapseHandler(this, null);
285+
waitingRenderers.clear();
286+
updateCurrentAndInitialArea(null);
287+
for (IRenderer renderer : waitingFloatRenderers) {
288+
addChild(renderer);
289+
}
290+
waitingFloatRenderers = new ArrayList<>(waitingRenderers);
291+
}
279292
if (keepWithNextHangingRenderer != null) {
280293
keepWithNextHangingRenderer.setProperty(Property.KEEP_WITH_NEXT, false);
281294
IRenderer rendererToBeAdded = keepWithNextHangingRenderer;

layout/src/test/java/com/itextpdf/layout/FloatTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,6 @@ public void floatingImageInCell() throws IOException, InterruptedException {
283283
}
284284

285285
@Test
286-
@LogMessages(messages = @LogMessage(messageTemplate = LogMessageConstant.ELEMENT_DOES_NOT_FIT_AREA))
287286
public void floatingImageToNextPage() throws IOException, InterruptedException {
288287
String cmpFileName = sourceFolder + "cmp_floatingImageToNextPage.pdf";
289288
String outFile = destinationFolder + "floatingImageToNextPage.pdf";

0 commit comments

Comments
 (0)