Package com.itextpdf.layout.renderer
Class LineRenderer
- java.lang.Object
-
- com.itextpdf.layout.renderer.AbstractRenderer
-
- com.itextpdf.layout.renderer.LineRenderer
-
- All Implemented Interfaces:
IPropertyContainer
,IRenderer
public class LineRenderer extends AbstractRenderer
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static class
LineRenderer.LineAscentDescentState
(package private) static class
LineRenderer.LineSplitIntoGlyphsData
static class
LineRenderer.RendererGlyph
-
Field Summary
Fields Modifier and Type Field Description protected byte[]
levels
private static org.slf4j.Logger
logger
protected float
maxAscent
private float
maxBlockAscent
private float
maxBlockDescent
protected float
maxDescent
(package private) float
maxTextAscent
(package private) float
maxTextDescent
private static float
MIN_MAX_WIDTH_CORRECTION_EPS
-
Fields inherited from class com.itextpdf.layout.renderer.AbstractRenderer
BOTTOM_SIDE, childRenderers, EPS, flushed, INF, isLastRendererForModelElement, LEFT_SIDE, modelElement, occupiedArea, OVERLAP_EPSILON, parent, positionedRenderers, properties, RIGHT_SIDE, TOP_SIDE
-
-
Constructor Summary
Constructors Constructor Description LineRenderer()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) static void
adjustChildPositionsAfterReordering(java.util.List<IRenderer> children, float initialXPos)
private void
adjustChildrenXLine()
protected LineRenderer
adjustChildrenYLine()
private void
adjustChildrenYLineDefaultMode()
private void
adjustLineOnFloatPlaced(Rectangle layoutBox, int childPos, FloatPropertyValue kidFloatPropertyVal, Rectangle justPlacedFloatBox)
protected void
applyLeading(float deltaY)
private BaseDirection
applyOtf()
Apply OTF features and return the last(!) base direction of child rendererprivate float
applyTextAnchor(float textWidth)
protected int
baseCharactersCount()
Returns the number of base characters, i.e.private float
calculateTab(Rectangle layoutBox, float curWidth, TabStop tabStop, java.util.List<IRenderer> affectedRenderers, IRenderer tabRenderer)
Calculates and sets tab size with the account of the element that is next in the line after the tab.private TabStop
calculateTab(IRenderer childRenderer, float curWidth, float lineWidth)
Calculates and sets encountered tab size.boolean
containsImage()
protected LineRenderer
createOverflowRenderer()
protected LineRenderer
createSplitRenderer()
private float
decreaseRelativeWidthByChildAdditionalWidth(IRenderer childRenderer, float normalizedChildWidth)
void
drawChildren(DrawContext drawContext)
Performs the drawing operation for allchildren
of this renderer.(package private) float[]
getAscentDescentOfLayoutedChildRenderer(IRenderer childRenderer, LayoutResult childResult, RenderingMode childRenderingMode, boolean isInlineBlockChild)
Extracts ascender and descender of an already layoutedchildRenderer
.(package private) float
getBottomLeadingIndent(Leading leading)
protected java.lang.Float
getFirstYLineRecursively()
Gets the first yLine of the nested children recursively.private IRenderer
getLastNonFloatChildRenderer()
protected java.lang.Float
getLastYLineRecursively()
float
getLeadingValue(Leading leading)
float
getMaxAscent()
float
getMaxDescent()
MinMaxWidth
getMinMaxWidth()
Calculates min and max width values for current renderer.private float[]
getMinMaxX()
IRenderer
getNextRenderer()
Gets a new instance of this class to be used as a next renderer, after this renderer is used, ifIRenderer.layout(LayoutContext)
is called more than once.private TabStop
getNextTabStop(float curWidth)
protected int
getNumberOfSpaces()
(package private) float
getTopLeadingIndent(Leading leading)
float
getYLine()
(package private) boolean
hasChildRendererInHtmlMode()
private boolean
hasInlineBlocksWithVerticalAlignment()
(package private) static boolean
isChildFloating(IRenderer childRenderer)
(package private) boolean
isForceOverflowForTextRendererPartialResult(IRenderer childRenderer, boolean wasXOverflowChanged, OverflowPropertyValue oldXOverflow, LayoutContext layoutContext, Rectangle layoutBox, boolean wasParentsHeightClipped)
Checks if the word that's been split when has been layouted on this line can fit the next line without splitting.(package private) static boolean
isInlineBlockChild(IRenderer child)
void
justify(float width)
LayoutResult
layout(LayoutContext layoutContext)
This method simulates positioning of the renderer, including all of its children, and returns theLayoutResult
, representing the layout result, including occupied area, status, i.e.protected int
length()
Gets the total lengths of characters in this line.private void
processDefaultTab(IRenderer tabRenderer, float curWidth, float lineWidth)
(package private) static void
reorder(LineRenderer toProcess, LineRenderer.LineSplitIntoGlyphsData splitLineIntoGlyphsResult, int[] newOrder)
private void
replaceSplitRendererKidFloats(java.util.Map<java.lang.Integer,IRenderer> floatsToNextPageSplitRenderers, LineRenderer splitRenderer)
private void
resolveChildrenFonts()
While resolving TextRenderer may split into several ones with different fonts.protected java.lang.Float
retrieveResolvedDeclaredHeight()
Retrieve the resolved height declaration.protected LineRenderer[]
split()
(package private) static LineRenderer.LineSplitIntoGlyphsData
splitLineIntoGlyphs(LineRenderer toSplit)
private LineRenderer[]
splitNotFittingFloat(int childPos, LayoutResult childResult)
java.lang.String
toString()
Returns a string representation of the renderer.(package private) int
trimFirst()
Trim first child text renderers.protected LineRenderer
trimLast()
(package private) void
updateAscentDescentAfterChildLayout(float[] childAscentDescent, IRenderer childRenderer, boolean isChildFloating)
UpdatemaxAscent
,maxDescent
,maxTextAscent
,maxTextDescent
,maxBlockAscent
andmaxBlockDescent
after child's layout.(package private) float[]
updateAscentDescentAfterTextRendererSequenceProcessing(int newChildPos, LineRenderer.LineAscentDescentState lineAscentDescentStateBeforeTextRendererSequence, java.util.Map<java.lang.Integer,float[]> textRendererSequenceAscentDescent)
UpdatesmaxAscent
,maxDescent
,maxTextAscent
andmaxTextDescent
after aTextRenderer
sequence has been fully processed.private void
updateBidiLevels(int totalNumberOfTrimmedGlyphs, BaseDirection baseDirection)
private void
updateChildrenParent()
-
Methods inherited from class com.itextpdf.layout.renderer.AbstractRenderer
addAllChildRenderers, addAllChildRenderers, addAllProperties, addChild, addChildRenderer, alignChildHorizontally, allowLastYLineRecursiveExtraction, applyAbsolutePosition, applyAbsolutePositionIfNeeded, applyAction, applyBorderBox, applyBorderBox, applyDestination, applyDestinationsAndAnnotation, applyLinkAnnotation, applyMargins, applyMargins, applyMarginsBordersPaddings, applyPaddings, applyPaddings, applyRelativePositioningTranslation, beginElementOpacityApplying, beginTransformationIfApplied, calculateAbsolutePdfBBox, calculateAdditionalWidth, calculateBBox, calculatePaddingBorderHeight, calculatePaddingBorderWidth, calculateShiftToPositionBBoxOfPointsAt, clipBackgroundArea, clipBackgroundArea, clipBorderArea, createFontCharacteristics, createXObject, deleteOwnProperty, deleteProperty, draw, drawBackground, drawBorder, drawPositionedChildren, endElementOpacityApplying, endTransformationIfApplied, getAspectRatio, getBackgroundArea, getBorderAreaBBox, getBorderRadii, getBorders, getBorders, getChildRenderers, getDefaultProperty, getInnerAreaBBox, getMargins, getMinMaxWidth, getModelElement, getOccupiedArea, getOccupiedAreaBBox, getOwnProperties, getOwnProperty, getPaddings, getParent, getPdfDocument, getProperty, getProperty, getPropertyAsBoolean, getPropertyAsColor, getPropertyAsFloat, getPropertyAsFloat, getPropertyAsFloat, getPropertyAsFont, getPropertyAsInteger, getPropertyAsTransparentColor, getPropertyAsUnitValue, getPropertyAsUnitValue, getRootRenderer, hasAbsoluteUnitValue, hasAspectRatio, hasOwnOrModelProperty, hasOwnProperty, hasProperty, hasRelativeUnitValue, initElementAreas, isAbsolutePosition, isBorderBoxSizing, isFirstOnRootArea, isFirstOnRootArea, isFixedLayout, isFlushed, isKeepTogether, isKeepTogether, isNotFittingHeight, isNotFittingLayoutArea, isNotFittingWidth, isOverflowFit, isOverflowProperty, isOverflowProperty, isOverflowProperty, isPositioned, isRelativePosition, isStaticLayout, logWarningIfGetNextRendererNotOverridden, move, noAbsolutePositionInfo, preparePositionedRendererAndAreaForLayout, processWaitingDrawing, rectangleToPointsList, removeAllChildRenderers, removeChildRenderer, replaceOwnProperty, resolveFirstPdfFont, resolveFirstPdfFont, retrieveHeight, retrieveMaxHeight, retrieveMaxWidth, retrieveMinHeight, retrieveMinWidth, retrieveUnitValue, retrieveUnitValue, retrieveWidth, returnBackOwnProperty, setBorders, setChildRenderer, setChildRenderers, setMinMaxWidthBasedOnFixedWidth, setParent, setProperty, setThisAsParent, shrinkOccupiedAreaForAbsolutePosition, transformPoints, updateHeight, updateHeightsOnSplit, updateHeightsOnSplit, updateMaxHeight, updateMinHeight, updateWidth
-
-
-
-
Field Detail
-
MIN_MAX_WIDTH_CORRECTION_EPS
private static final float MIN_MAX_WIDTH_CORRECTION_EPS
- See Also:
- Constant Field Values
-
logger
private static final org.slf4j.Logger logger
-
maxAscent
protected float maxAscent
-
maxDescent
protected float maxDescent
-
levels
protected byte[] levels
-
maxTextAscent
float maxTextAscent
-
maxTextDescent
float maxTextDescent
-
maxBlockAscent
private float maxBlockAscent
-
maxBlockDescent
private float maxBlockDescent
-
-
Method Detail
-
layout
public LayoutResult layout(LayoutContext layoutContext)
Description copied from interface:IRenderer
This method simulates positioning of the renderer, including all of its children, and returns theLayoutResult
, representing the layout result, including occupied area, status, i.e. if there was enough place to fit the renderer subtree, etc.LayoutResult
can be extended to return custom layout results for custom elements, e.g.TextRenderer
usesTextLayoutResult
as its result. This method can be called standalone to learn how much area the renderer subtree needs, or can be called beforeIRenderer.draw(DrawContext)
, to prepare the renderer to be flushed to the output stream.- Parameters:
layoutContext
- the description of layout area and any other additional information- Returns:
- result of the layout process
-
getMaxAscent
public float getMaxAscent()
-
getMaxDescent
public float getMaxDescent()
-
getYLine
public float getYLine()
-
getLeadingValue
public float getLeadingValue(Leading leading)
-
drawChildren
public void drawChildren(DrawContext drawContext)
Description copied from class:AbstractRenderer
Performs the drawing operation for allchildren
of this renderer.- Overrides:
drawChildren
in classAbstractRenderer
- Parameters:
drawContext
- the context (canvas, document, etc) of this drawing operation.
-
getNextRenderer
public IRenderer getNextRenderer()
Description copied from interface:IRenderer
Gets a new instance of this class to be used as a next renderer, after this renderer is used, ifIRenderer.layout(LayoutContext)
is called more than once.- Returns:
- new renderer instance
-
getFirstYLineRecursively
protected java.lang.Float getFirstYLineRecursively()
Description copied from class:AbstractRenderer
Gets the first yLine of the nested children recursively. E.g. for a list, this will be the yLine of the first item (if the first item is indeed a paragraph). NOTE: this method will no go further than the first child.- Overrides:
getFirstYLineRecursively
in classAbstractRenderer
- Returns:
- the first yline of the nested children, null if there is no text found
-
getLastYLineRecursively
protected java.lang.Float getLastYLineRecursively()
- Overrides:
getLastYLineRecursively
in classAbstractRenderer
-
justify
public void justify(float width)
-
getNumberOfSpaces
protected int getNumberOfSpaces()
-
length
protected int length()
Gets the total lengths of characters in this line. Other elements (images, tables) are not taken into account.- Returns:
- the total lengths of characters in this line.
-
baseCharactersCount
protected int baseCharactersCount()
Returns the number of base characters, i.e. non-mark characters- Returns:
- the number of base non-mark characters
-
toString
public java.lang.String toString()
Description copied from class:AbstractRenderer
Returns a string representation of the renderer.- Overrides:
toString
in classAbstractRenderer
- Returns:
- a
String
- See Also:
Object.toString()
-
createSplitRenderer
protected LineRenderer createSplitRenderer()
-
createOverflowRenderer
protected LineRenderer createOverflowRenderer()
-
split
protected LineRenderer[] split()
-
adjustChildrenYLine
protected LineRenderer adjustChildrenYLine()
-
applyLeading
protected void applyLeading(float deltaY)
-
trimLast
protected LineRenderer trimLast()
-
containsImage
public boolean containsImage()
-
getMinMaxWidth
public MinMaxWidth getMinMaxWidth()
Description copied from class:AbstractRenderer
Calculates min and max width values for current renderer.- Overrides:
getMinMaxWidth
in classAbstractRenderer
- Returns:
- instance of
MinMaxWidth
-
retrieveResolvedDeclaredHeight
protected java.lang.Float retrieveResolvedDeclaredHeight()
Retrieve the resolved height declaration. If it has a relative height declaration,AbstractRenderer.retrieveHeight()
is called.- Overrides:
retrieveResolvedDeclaredHeight
in classAbstractRenderer
- Returns:
null
if no height declaration is set on the parent, or if its own height declaration cannot be resolved. The float value of the resolved height otherwise
-
hasChildRendererInHtmlMode
boolean hasChildRendererInHtmlMode()
-
getTopLeadingIndent
float getTopLeadingIndent(Leading leading)
-
getBottomLeadingIndent
float getBottomLeadingIndent(Leading leading)
-
splitLineIntoGlyphs
static LineRenderer.LineSplitIntoGlyphsData splitLineIntoGlyphs(LineRenderer toSplit)
-
reorder
static void reorder(LineRenderer toProcess, LineRenderer.LineSplitIntoGlyphsData splitLineIntoGlyphsResult, int[] newOrder)
-
adjustChildPositionsAfterReordering
static void adjustChildPositionsAfterReordering(java.util.List<IRenderer> children, float initialXPos)
-
splitNotFittingFloat
private LineRenderer[] splitNotFittingFloat(int childPos, LayoutResult childResult)
-
adjustLineOnFloatPlaced
private void adjustLineOnFloatPlaced(Rectangle layoutBox, int childPos, FloatPropertyValue kidFloatPropertyVal, Rectangle justPlacedFloatBox)
-
replaceSplitRendererKidFloats
private void replaceSplitRendererKidFloats(java.util.Map<java.lang.Integer,IRenderer> floatsToNextPageSplitRenderers, LineRenderer splitRenderer)
-
getLastNonFloatChildRenderer
private IRenderer getLastNonFloatChildRenderer()
-
getNextTabStop
private TabStop getNextTabStop(float curWidth)
-
calculateTab
private TabStop calculateTab(IRenderer childRenderer, float curWidth, float lineWidth)
Calculates and sets encountered tab size. Returns null, if processing is finished and layout can be performed for the tab renderer; otherwise, in case when the tab should be processed after the next element in the line, this method returns corresponding tab stop.
-
calculateTab
private float calculateTab(Rectangle layoutBox, float curWidth, TabStop tabStop, java.util.List<IRenderer> affectedRenderers, IRenderer tabRenderer)
Calculates and sets tab size with the account of the element that is next in the line after the tab. Returns resulting width of the tab.
-
processDefaultTab
private void processDefaultTab(IRenderer tabRenderer, float curWidth, float lineWidth)
-
updateChildrenParent
private void updateChildrenParent()
-
trimFirst
int trimFirst()
Trim first child text renderers.- Returns:
- total number of trimmed glyphs.
-
applyOtf
private BaseDirection applyOtf()
Apply OTF features and return the last(!) base direction of child renderer- Returns:
- the last(!) base direction of child renderer.
-
isChildFloating
static boolean isChildFloating(IRenderer childRenderer)
-
isInlineBlockChild
static boolean isInlineBlockChild(IRenderer child)
-
isForceOverflowForTextRendererPartialResult
boolean isForceOverflowForTextRendererPartialResult(IRenderer childRenderer, boolean wasXOverflowChanged, OverflowPropertyValue oldXOverflow, LayoutContext layoutContext, Rectangle layoutBox, boolean wasParentsHeightClipped)
Checks if the word that's been split when has been layouted on this line can fit the next line without splitting.- Parameters:
childRenderer
- the childRenderer containing the split wordwasXOverflowChanged
- true ifProperty.OVERFLOW_X
has been changed during layouting ofLineRenderer
oldXOverflow
- the value ofProperty.OVERFLOW_X
before it's been changed during layouting ofLineRenderer
or null ifProperty.OVERFLOW_X
hasn't been changedlayoutContext
-LayoutContext
layoutBox
- current layoutBoxwasParentsHeightClipped
- true if layoutBox's height has been clipped- Returns:
- true if the split word can fit the next line without splitting
-
getAscentDescentOfLayoutedChildRenderer
float[] getAscentDescentOfLayoutedChildRenderer(IRenderer childRenderer, LayoutResult childResult, RenderingMode childRenderingMode, boolean isInlineBlockChild)
Extracts ascender and descender of an already layoutedchildRenderer
.- Parameters:
childRenderer
- an already layouted child who's ascender and descender are to be extractedchildResult
-LayoutResult
of the childRenderer based on which ascender and descender are definedchildRenderingMode
-rendering mode
isInlineBlockChild
- true if childRendererisInlineBlockChild(IRenderer)
- Returns:
- a two-element float array where first element is ascender value and second element is descender value
-
updateAscentDescentAfterTextRendererSequenceProcessing
float[] updateAscentDescentAfterTextRendererSequenceProcessing(int newChildPos, LineRenderer.LineAscentDescentState lineAscentDescentStateBeforeTextRendererSequence, java.util.Map<java.lang.Integer,float[]> textRendererSequenceAscentDescent)
UpdatesmaxAscent
,maxDescent
,maxTextAscent
andmaxTextDescent
after aTextRenderer
sequence has been fully processed.- Parameters:
newChildPos
- position of the lastTextRenderer
child of the sequence to remain on the linelineAscentDescentStateBeforeTextRendererSequence
- aLineRenderer.LineAscentDescentState
containingLineRenderer
's maxAscent, maxDescent, maxTextAscent, maxTextDescent beforeTextRenderer
sequence starttextRendererSequenceAscentDescent
- aMap
withTextRenderer
children's positions as keys and float arrays consisting of maxAscent, maxDescent, maxTextAscent, maxTextDescent of the correspondingTextRenderer
children.- Returns:
- a two-element float array where first element is a new
LineRenderer
's ascender and second element is a newLineRenderer
's descender
-
updateAscentDescentAfterChildLayout
void updateAscentDescentAfterChildLayout(float[] childAscentDescent, IRenderer childRenderer, boolean isChildFloating)
UpdatemaxAscent
,maxDescent
,maxTextAscent
,maxTextDescent
,maxBlockAscent
andmaxBlockDescent
after child's layout.- Parameters:
childAscentDescent
- a two-element float array where first element is ascender of a layouted child and second element is descender of a layouted childchildRenderer
- the layoutedchildRenderer
of currentLineRenderer
isChildFloating
- true ifisChildFloating(IRenderer)
-
updateBidiLevels
private void updateBidiLevels(int totalNumberOfTrimmedGlyphs, BaseDirection baseDirection)
-
resolveChildrenFonts
private void resolveChildrenFonts()
While resolving TextRenderer may split into several ones with different fonts.
-
decreaseRelativeWidthByChildAdditionalWidth
private float decreaseRelativeWidthByChildAdditionalWidth(IRenderer childRenderer, float normalizedChildWidth)
-
adjustChildrenYLineDefaultMode
private void adjustChildrenYLineDefaultMode()
-
hasInlineBlocksWithVerticalAlignment
private boolean hasInlineBlocksWithVerticalAlignment()
-
adjustChildrenXLine
private void adjustChildrenXLine()
-
getMinMaxX
private float[] getMinMaxX()
-
applyTextAnchor
private float applyTextAnchor(float textWidth)
-
-