Skip to content

Commit 4622b05

Browse files
Refactor text renderers sequence word wrapping logic
Extract separate TextSequenceWordWrapping class. For special scripts wrap processing apply EPS to occupied area during relayout. LineRenderer: merge and rename moveForward mode booleans and methods. LineRenderer: merge updateSpecialScriptLayoutResults and updateTextRendererLayoutResults to updateTextSequenceLayoutResults. TextRenderer: set containsPossibleBreak always, not only in case of HTML_MODE rendering mode. TextRenderer: set containsPossibleBreak in case of width overflow only if forcePartialSplitOnFirstChar. DEVSIX-1438
1 parent 02f34d5 commit 4622b05

File tree

6 files changed

+1078
-927
lines changed

6 files changed

+1078
-927
lines changed

layout/src/main/java/com/itextpdf/layout/layout/TextLayoutResult.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ public class TextLayoutResult extends MinMaxWidthLayoutResult {
6161

6262
protected boolean containsPossibleBreak = false;
6363

64-
protected boolean lineStartsWithWhiteSpace = false;
64+
protected boolean startsWithSplitCharacterWhiteSpace = false;
6565

66-
protected boolean lineEndsWithSplitCharacterOrWhiteSpace = false;
66+
protected boolean endsWithSplitCharacter = false;
6767

6868
protected float leftMinWidth;
6969

@@ -163,14 +163,15 @@ public TextLayoutResult setContainsPossibleBreak(boolean containsPossibleBreak)
163163
}
164164

165165
/**
166-
* Sets {@link #isLineStartsWithWhiteSpace()}.
166+
* Sets {@link #isStartsWithSplitCharacterWhiteSpace()}.
167167
*
168-
* @param lineStartsWithWhiteSpace indicates if TextRenderer#line starts with a whitespace.
168+
* @param startsWithSplitCharacterWhiteSpace indicates if TextRenderer#line starts with a split character that is
169+
* also a whitespace.
169170
* @return {@link com.itextpdf.layout.layout.TextLayoutResult this layout result} the setting was applied on.
170-
* @see #isLineStartsWithWhiteSpace
171+
* @see #isStartsWithSplitCharacterWhiteSpace
171172
*/
172-
public TextLayoutResult setLineStartsWithWhiteSpace(boolean lineStartsWithWhiteSpace) {
173-
this.lineStartsWithWhiteSpace = lineStartsWithWhiteSpace;
173+
public TextLayoutResult setStartsWithSplitCharacterWhiteSpace(boolean startsWithSplitCharacterWhiteSpace) {
174+
this.startsWithSplitCharacterWhiteSpace = startsWithSplitCharacterWhiteSpace;
174175
return this;
175176
}
176177

@@ -179,19 +180,19 @@ public TextLayoutResult setLineStartsWithWhiteSpace(boolean lineStartsWithWhiteS
179180
*
180181
* @return true if TextRenderer#line starts with a whitespace.
181182
*/
182-
public boolean isLineStartsWithWhiteSpace() {
183-
return lineStartsWithWhiteSpace;
183+
public boolean isStartsWithSplitCharacterWhiteSpace() {
184+
return startsWithSplitCharacterWhiteSpace;
184185
}
185186

186187
/**
187-
* Sets {@link #isLineEndsWithSplitCharacterOrWhiteSpace()}.
188+
* Sets {@link #isEndsWithSplitCharacter()}.
188189
*
189-
* @param lineEndsWithSplitCharacterOrWhiteSpace indicates if TextRenderer#line ends with a splitCharacter.
190+
* @param endsWithSplitCharacter indicates if TextRenderer#line ends with a splitCharacter.
190191
* @return {@link com.itextpdf.layout.layout.TextLayoutResult this layout result} the setting was applied on.
191-
* @see #isLineEndsWithSplitCharacterOrWhiteSpace
192+
* @see #isEndsWithSplitCharacter
192193
*/
193-
public TextLayoutResult setLineEndsWithSplitCharacterOrWhiteSpace(boolean lineEndsWithSplitCharacterOrWhiteSpace) {
194-
this.lineEndsWithSplitCharacterOrWhiteSpace = lineEndsWithSplitCharacterOrWhiteSpace;
194+
public TextLayoutResult setEndsWithSplitCharacter(boolean endsWithSplitCharacter) {
195+
this.endsWithSplitCharacter = endsWithSplitCharacter;
195196
return this;
196197
}
197198

@@ -201,8 +202,8 @@ public TextLayoutResult setLineEndsWithSplitCharacterOrWhiteSpace(boolean lineEn
201202
* @return true if TextRenderer#line ends with a splitCharacter.
202203
* @see com.itextpdf.layout.splitting.ISplitCharacters
203204
*/
204-
public boolean isLineEndsWithSplitCharacterOrWhiteSpace() {
205-
return lineEndsWithSplitCharacterOrWhiteSpace;
205+
public boolean isEndsWithSplitCharacter() {
206+
return endsWithSplitCharacter;
206207
}
207208

208209
/**

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

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,30 @@ public abstract class AbstractRenderer implements IRenderer {
124124
*/
125125
protected static final float INF = 1e6f;
126126

127+
/**
128+
* The common ordering index of top side in arrays of four elements which define top, right, bottom,
129+
* left sides values (e.g. margins, borders, paddings).
130+
*/
131+
static final int TOP_SIDE = 0;
132+
133+
/**
134+
* The common ordering index of right side in arrays of four elements which define top, right, bottom,
135+
* left sides values (e.g. margins, borders, paddings).
136+
*/
137+
static final int RIGHT_SIDE = 1;
138+
139+
/**
140+
* The common ordering index of bottom side in arrays of four elements which define top, right, bottom,
141+
* left sides values (e.g. margins, borders, paddings).
142+
*/
143+
static final int BOTTOM_SIDE = 2;
144+
145+
/**
146+
* The common ordering index of left side in arrays of four elements which define top, right, bottom,
147+
* left sides values (e.g. margins, borders, paddings).
148+
*/
149+
static final int LEFT_SIDE = 3;
150+
127151
// TODO linkedList?
128152
protected List<IRenderer> childRenderers = new ArrayList<>();
129153
protected List<IRenderer> positionedRenderers = new ArrayList<>();
@@ -1682,23 +1706,27 @@ protected boolean allowLastYLineRecursiveExtraction() {
16821706
* @return a {@link Rectangle border box} of the renderer
16831707
*/
16841708
protected Rectangle applyMargins(Rectangle rect, UnitValue[] margins, boolean reverse) {
1685-
if (!margins[0].isPointValue()) {
1709+
if (!margins[TOP_SIDE].isPointValue()) {
16861710
Logger logger = LoggerFactory.getLogger(AbstractRenderer.class);
16871711
logger.error(MessageFormatUtil.format(LogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED, Property.MARGIN_TOP));
16881712
}
1689-
if (!margins[1].isPointValue()) {
1713+
if (!margins[RIGHT_SIDE].isPointValue()) {
16901714
Logger logger = LoggerFactory.getLogger(AbstractRenderer.class);
16911715
logger.error(MessageFormatUtil.format(LogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED, Property.MARGIN_RIGHT));
16921716
}
1693-
if (!margins[2].isPointValue()) {
1717+
if (!margins[BOTTOM_SIDE].isPointValue()) {
16941718
Logger logger = LoggerFactory.getLogger(AbstractRenderer.class);
16951719
logger.error(MessageFormatUtil.format(LogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED, Property.MARGIN_BOTTOM));
16961720
}
1697-
if (!margins[3].isPointValue()) {
1721+
if (!margins[LEFT_SIDE].isPointValue()) {
16981722
Logger logger = LoggerFactory.getLogger(AbstractRenderer.class);
16991723
logger.error(MessageFormatUtil.format(LogMessageConstant.PROPERTY_IN_PERCENTS_NOT_SUPPORTED, Property.MARGIN_LEFT));
17001724
}
1701-
return rect.applyMargins(margins[0].getValue(), margins[1].getValue(), margins[2].getValue(), margins[3].getValue(), reverse);
1725+
return rect.applyMargins(
1726+
margins[TOP_SIDE].getValue(),
1727+
margins[RIGHT_SIDE].getValue(),
1728+
margins[BOTTOM_SIDE].getValue(),
1729+
margins[LEFT_SIDE].getValue(), reverse);
17021730
}
17031731

17041732
/**

0 commit comments

Comments
 (0)