@@ -44,19 +44,18 @@ This file is part of the iText (R) project.
44
44
package com .itextpdf .layout .renderer ;
45
45
46
46
import com .itextpdf .io .LogMessageConstant ;
47
+ import com .itextpdf .io .util .MessageFormatUtil ;
47
48
import com .itextpdf .kernel .geom .Rectangle ;
48
49
import com .itextpdf .layout .layout .LayoutArea ;
49
50
import com .itextpdf .layout .layout .LayoutContext ;
50
51
import com .itextpdf .layout .layout .LayoutPosition ;
51
52
import com .itextpdf .layout .layout .LayoutResult ;
52
53
import com .itextpdf .layout .margincollapse .MarginsCollapseHandler ;
53
54
import com .itextpdf .layout .margincollapse .MarginsCollapseInfo ;
54
- import com .itextpdf .layout .property .FloatPropertyValue ;
55
55
import com .itextpdf .layout .property .Property ;
56
56
import org .slf4j .Logger ;
57
57
import org .slf4j .LoggerFactory ;
58
58
59
- import com .itextpdf .io .util .MessageFormatUtil ;
60
59
import java .util .ArrayList ;
61
60
import java .util .List ;
62
61
@@ -80,7 +79,7 @@ public void addChild(IRenderer renderer) {
80
79
int numberOfPositionedChildRenderers = positionedRenderers .size ();
81
80
super .addChild (renderer );
82
81
List <IRenderer > addedRenderers = new ArrayList <>(1 );
83
- if (currentArea != null && currentArea .getPageNumber () > 1 ) {
82
+ if (currentArea != null && currentArea .isEmptyArea () ) {
84
83
addedRenderers .addAll (waitingRenderers );
85
84
waitingRenderers .clear ();
86
85
}
@@ -117,14 +116,14 @@ public void addChild(IRenderer renderer) {
117
116
if (marginsCollapsingEnabled && currentArea != null && renderer != null ) {
118
117
childMarginsInfo = marginsCollapseHandler .startChildMarginsHandling (renderer , currentArea .getBBox ());
119
118
}
120
- FloatPropertyValue floatPropertyValue = renderer .getProperty (Property .FLOAT );
121
- boolean rendererIsFloat = floatPropertyValue != null && !floatPropertyValue .equals (FloatPropertyValue .NONE );
119
+ boolean rendererIsFloat = FloatingHelper .isRendererFloating (renderer );
122
120
while (currentArea != null && renderer != null && (result = renderer .setParent (this ).layout (
123
121
new LayoutContext (currentArea .clone (), childMarginsInfo , floatRendererAreas )))
124
122
.getStatus () != LayoutResult .FULL ) {
125
123
if (result .getStatus () == LayoutResult .PARTIAL ) {
126
124
if (rendererIsFloat ) {
127
125
waitingRenderers .add (result .getOverflowRenderer ());
126
+ floatRendererAreas .add (renderer .getOccupiedArea ().getBBox ());
128
127
} else if (result .getOverflowRenderer () instanceof ImageRenderer ) {
129
128
((ImageRenderer ) result .getOverflowRenderer ()).autoScale (currentArea );
130
129
} else {
@@ -139,13 +138,17 @@ public void addChild(IRenderer renderer) {
139
138
}
140
139
} else if (result .getStatus () == LayoutResult .NOTHING ) {
141
140
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 ) {
143
143
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 , "" ));
144
151
}
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 , "" ));
149
152
} else {
150
153
if (currentArea .isEmptyArea () && result .getAreaBreak () == null ) {
151
154
if (Boolean .TRUE .equals (result .getOverflowRenderer ().getModelElement ().<Boolean >getProperty (Property .KEEP_TOGETHER ))) {
@@ -185,9 +188,9 @@ public void addChild(IRenderer renderer) {
185
188
}
186
189
}
187
190
}
188
- if (rendererIsFloat && result .getStatus () != LayoutResult .NOTHING ) {
191
+ if (rendererIsFloat && ( result .getStatus () != LayoutResult .NOTHING || renderer instanceof ImageRenderer ) ) {
189
192
renderer = null ;
190
- continue ;
193
+ break ;
191
194
}
192
195
if (!waitingRenderers .isEmpty ()) {
193
196
renderer = waitingRenderers .remove (0 );
@@ -276,6 +279,16 @@ public void flush() {
276
279
* and when no consequent element has been added. This method addresses such situations.
277
280
*/
278
281
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
+ }
279
292
if (keepWithNextHangingRenderer != null ) {
280
293
keepWithNextHangingRenderer .setProperty (Property .KEEP_WITH_NEXT , false );
281
294
IRenderer rendererToBeAdded = keepWithNextHangingRenderer ;
0 commit comments