Package com.openhtmltopdf.layout
Class InlineBoxing
- java.lang.Object
-
- com.openhtmltopdf.layout.InlineBoxing
-
public class InlineBoxing extends java.lang.Object
This class is responsible for flowing inline content into lines. Block content which participates in an inline formatting context is also handled here as well as floating and absolutely positioned content.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static class
InlineBoxing.SpaceVariables
private static class
InlineBoxing.StartInlineTextResult
(package private) static class
InlineBoxing.StateVariables
-
Constructor Summary
Constructors Modifier Constructor Description private
InlineBoxing()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description private static void
addBoxId(LayoutContext c, InlineBoxing.StateVariables current)
private static InlineLayoutBox
addFirstLetterBox(LayoutContext c, LineBox current, InlineLayoutBox currentIB, LineBreakContext lbContext, int maxAvailableWidth, int remainingWidth, byte textDirection)
private static InlineLayoutBox
addOpenInlineBoxes(LayoutContext c, LineBox line, java.util.List<InlineBox> openParents, int cbWidth, java.util.Map<InlineBox,InlineLayoutBox> iBMap)
We have to convert this HTML (angle brackets replaced with square brackets):private static void
alignInlineContent(LayoutContext c, Box box, float ascent, float descent, VerticalAlignContext vaContext)
private static void
alignLine(LayoutContext c, LineBox current, int maxAvailableWidth)
private static InlineBoxMeasurements
calculateInlineMeasurements(LayoutContext c, InlineLayoutBox iB, VerticalAlignContext vaContext)
static java.util.List<TextDecoration>
calculateTextDecorations(Box box, int baseline, FSFontMetrics fm)
static StrutMetrics
createDefaultStrutMetrics(LayoutContext c, Box container)
private static void
endInlineBox(LayoutContext c, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBoxing.StateVariables previous, java.util.List<InlineBox> openInlineBoxes, java.util.List<Layer> pendingInlineLayers, InlineBox inlineBox, CalculatedStyle style)
private static void
finishPendingInlineLayers(LayoutContext c, java.util.List<Layer> layers)
private static InlineBoxMeasurements
getInitialMeasurements(LayoutContext c, Box container, FSFontMetrics strutM)
private static boolean
hasTrimmableLeadingSpace(LineBox line, CalculatedStyle style, LineBreakContext lbContext, boolean zeroWidthInlineBlock)
private static boolean
isAlwaysBreak(LayoutContext c, BlockBox parent, int breakAtLine, int lineOffset)
static void
layoutContent(LayoutContext c, BlockBox box, int initialY, int breakAtLine)
private static void
layoutInlineBlockContent(LayoutContext c, BlockBox containingBlock, BlockBox inlineBlock, int initialY)
private static InlineText
layoutText(LayoutContext c, CalculatedStyle style, int remainingWidth, LineBreakContext lbContext, boolean needFirstLetter, byte textDirection, boolean tryToBreakAnywhere, int lineWidth, boolean forceOutput)
private static void
moveInlineContents(InlineLayoutBox box, int ty)
private static void
moveLineContents(LineBox current, int ty)
private static LineBox
newLine(LayoutContext c, int y, Box box)
private static LineBox
newLine(LayoutContext c, LineBox previousLine, Box box)
static int
positionHorizontally(CssContext c, Box current, int start)
private static int
positionHorizontally(CssContext c, InlineLayoutBox current, int start)
private static int
positionHorizontallyILBRTL(CssContext c, InlineLayoutBox current, int start, int width)
static int
positionHorizontallyRTL(CssContext c, Box current, int start, int width)
Attempts to layout inline boxes from right to left.private static void
positionInlineBlockVertically(LayoutContext c, VerticalAlignContext vaContext, BlockBox inlineBlock)
private static void
positionInlineChildrenVertically(LayoutContext c, InlineLayoutBox current, VerticalAlignContext vaContext)
private static void
positionInlineContentVertically(LayoutContext c, VerticalAlignContext vaContext, Box child)
private static void
positionInlineVertically(LayoutContext c, VerticalAlignContext vaContext, InlineLayoutBox iB)
private static void
positionVertically(LayoutContext c, Box container, LineBox current, MarkerData markerData)
private static int
processOutOfFlowContent(LayoutContext c, LineBox current, BlockBox block, int available, java.util.List<FloatLayoutResult> pendingFloats)
private static void
saveLine(LineBox current, LayoutContext c, BlockBox block, int minHeight, int maxAvailableWidth, java.util.List<FloatLayoutResult> pendingFloats, boolean hasFirstLinePCs, java.util.List<Layer> pendingInlineLayers, MarkerData markerData, int contentStart, boolean alwaysBreak)
private static void
startFirstLetterInlineLayoutBox(LayoutContext c, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBox inlineBox, LineBreakContext lbContext)
private static void
startInlineBlock(LayoutContext c, BlockBox box, int initialY, int breakAtLine, byte blockLayoutDirection, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBoxing.StateVariables previous, int contentStart, java.util.List<InlineBox> openInlineBoxes, java.util.Map<InlineBox,InlineLayoutBox> iBMap, int minimumLineHeight, MarkerData markerData, java.util.List<FloatLayoutResult> pendingFloats, boolean hasFirstLinePEs, java.util.List<Layer> pendingInlineLayers, int lineOffset, BlockBox child)
private static void
startInlineBox(LayoutContext c, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBoxing.StateVariables previous, java.util.List<InlineBox> openInlineBoxes, java.util.Map<InlineBox,InlineLayoutBox> iBMap, InlineBox inlineBox, CalculatedStyle style)
private static InlineBoxing.StartInlineTextResult
startInlineText(LayoutContext c, LineBreakContext lbContext, InlineBox inlineBox, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, int fit, boolean trimmedLeadingSpace, boolean tryToBreakAnywhere, boolean forceOutput)
Trys to consume the text in lbContext.private static void
startNewInlineLine(LayoutContext c, BlockBox box, int breakAtLine, byte blockLayoutDirection, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBoxing.StateVariables previous, int contentStart, java.util.List<InlineBox> openInlineBoxes, java.util.Map<InlineBox,InlineLayoutBox> iBMap, int minimumLineHeight, MarkerData markerData, java.util.List<FloatLayoutResult> pendingFloats, boolean hasFirstLinePEs, java.util.List<Layer> pendingInlineLayers, int lineOffset, InlineBox inlineBox, LineBreakContext lbContext)
private static void
trimLeadingSpace(LineBreakContext lbContext)
-
-
-
Method Detail
-
layoutContent
public static void layoutContent(LayoutContext c, BlockBox box, int initialY, int breakAtLine)
-
startInlineBlock
private static void startInlineBlock(LayoutContext c, BlockBox box, int initialY, int breakAtLine, byte blockLayoutDirection, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBoxing.StateVariables previous, int contentStart, java.util.List<InlineBox> openInlineBoxes, java.util.Map<InlineBox,InlineLayoutBox> iBMap, int minimumLineHeight, MarkerData markerData, java.util.List<FloatLayoutResult> pendingFloats, boolean hasFirstLinePEs, java.util.List<Layer> pendingInlineLayers, int lineOffset, BlockBox child)
-
endInlineBox
private static void endInlineBox(LayoutContext c, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBoxing.StateVariables previous, java.util.List<InlineBox> openInlineBoxes, java.util.List<Layer> pendingInlineLayers, InlineBox inlineBox, CalculatedStyle style)
-
startNewInlineLine
private static void startNewInlineLine(LayoutContext c, BlockBox box, int breakAtLine, byte blockLayoutDirection, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBoxing.StateVariables previous, int contentStart, java.util.List<InlineBox> openInlineBoxes, java.util.Map<InlineBox,InlineLayoutBox> iBMap, int minimumLineHeight, MarkerData markerData, java.util.List<FloatLayoutResult> pendingFloats, boolean hasFirstLinePEs, java.util.List<Layer> pendingInlineLayers, int lineOffset, InlineBox inlineBox, LineBreakContext lbContext)
-
startInlineText
private static InlineBoxing.StartInlineTextResult startInlineText(LayoutContext c, LineBreakContext lbContext, InlineBox inlineBox, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, int fit, boolean trimmedLeadingSpace, boolean tryToBreakAnywhere, boolean forceOutput)
Trys to consume the text in lbContext. If successful it creates an InlineText and adds it to the current inline layout box. Otherwise, if there are floats and the current line is otherwise empty, moves below float and trys again. Otherwise, trys again on a new line.
-
startFirstLetterInlineLayoutBox
private static void startFirstLetterInlineLayoutBox(LayoutContext c, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBox inlineBox, LineBreakContext lbContext)
-
startInlineBox
private static void startInlineBox(LayoutContext c, InlineBoxing.SpaceVariables space, InlineBoxing.StateVariables current, InlineBoxing.StateVariables previous, java.util.List<InlineBox> openInlineBoxes, java.util.Map<InlineBox,InlineLayoutBox> iBMap, InlineBox inlineBox, CalculatedStyle style)
-
addBoxId
private static void addBoxId(LayoutContext c, InlineBoxing.StateVariables current)
-
isAlwaysBreak
private static boolean isAlwaysBreak(LayoutContext c, BlockBox parent, int breakAtLine, int lineOffset)
-
addFirstLetterBox
private static InlineLayoutBox addFirstLetterBox(LayoutContext c, LineBox current, InlineLayoutBox currentIB, LineBreakContext lbContext, int maxAvailableWidth, int remainingWidth, byte textDirection)
-
layoutInlineBlockContent
private static void layoutInlineBlockContent(LayoutContext c, BlockBox containingBlock, BlockBox inlineBlock, int initialY)
-
positionHorizontallyRTL
public static int positionHorizontallyRTL(CssContext c, Box current, int start, int width)
Attempts to layout inline boxes from right to left.- Parameters:
start
- should be the right edge of the linecurrent
- should be the line box.- Returns:
- width of line.
-
positionHorizontallyILBRTL
private static int positionHorizontallyILBRTL(CssContext c, InlineLayoutBox current, int start, int width)
-
positionHorizontally
public static int positionHorizontally(CssContext c, Box current, int start)
-
positionHorizontally
private static int positionHorizontally(CssContext c, InlineLayoutBox current, int start)
-
createDefaultStrutMetrics
public static StrutMetrics createDefaultStrutMetrics(LayoutContext c, Box container)
-
positionVertically
private static void positionVertically(LayoutContext c, Box container, LineBox current, MarkerData markerData)
-
positionInlineVertically
private static void positionInlineVertically(LayoutContext c, VerticalAlignContext vaContext, InlineLayoutBox iB)
-
positionInlineBlockVertically
private static void positionInlineBlockVertically(LayoutContext c, VerticalAlignContext vaContext, BlockBox inlineBlock)
-
moveLineContents
private static void moveLineContents(LineBox current, int ty)
-
moveInlineContents
private static void moveInlineContents(InlineLayoutBox box, int ty)
-
calculateInlineMeasurements
private static InlineBoxMeasurements calculateInlineMeasurements(LayoutContext c, InlineLayoutBox iB, VerticalAlignContext vaContext)
-
calculateTextDecorations
public static java.util.List<TextDecoration> calculateTextDecorations(Box box, int baseline, FSFontMetrics fm)
-
alignInlineContent
private static void alignInlineContent(LayoutContext c, Box box, float ascent, float descent, VerticalAlignContext vaContext)
-
getInitialMeasurements
private static InlineBoxMeasurements getInitialMeasurements(LayoutContext c, Box container, FSFontMetrics strutM)
-
positionInlineChildrenVertically
private static void positionInlineChildrenVertically(LayoutContext c, InlineLayoutBox current, VerticalAlignContext vaContext)
-
positionInlineContentVertically
private static void positionInlineContentVertically(LayoutContext c, VerticalAlignContext vaContext, Box child)
-
saveLine
private static void saveLine(LineBox current, LayoutContext c, BlockBox block, int minHeight, int maxAvailableWidth, java.util.List<FloatLayoutResult> pendingFloats, boolean hasFirstLinePCs, java.util.List<Layer> pendingInlineLayers, MarkerData markerData, int contentStart, boolean alwaysBreak)
-
alignLine
private static void alignLine(LayoutContext c, LineBox current, int maxAvailableWidth)
-
finishPendingInlineLayers
private static void finishPendingInlineLayers(LayoutContext c, java.util.List<Layer> layers)
-
layoutText
private static InlineText layoutText(LayoutContext c, CalculatedStyle style, int remainingWidth, LineBreakContext lbContext, boolean needFirstLetter, byte textDirection, boolean tryToBreakAnywhere, int lineWidth, boolean forceOutput)
-
processOutOfFlowContent
private static int processOutOfFlowContent(LayoutContext c, LineBox current, BlockBox block, int available, java.util.List<FloatLayoutResult> pendingFloats)
-
hasTrimmableLeadingSpace
private static boolean hasTrimmableLeadingSpace(LineBox line, CalculatedStyle style, LineBreakContext lbContext, boolean zeroWidthInlineBlock)
-
trimLeadingSpace
private static void trimLeadingSpace(LineBreakContext lbContext)
-
newLine
private static LineBox newLine(LayoutContext c, LineBox previousLine, Box box)
-
newLine
private static LineBox newLine(LayoutContext c, int y, Box box)
-
addOpenInlineBoxes
private static InlineLayoutBox addOpenInlineBoxes(LayoutContext c, LineBox line, java.util.List<InlineBox> openParents, int cbWidth, java.util.Map<InlineBox,InlineLayoutBox> iBMap)
We have to convert this HTML (angle brackets replaced with square brackets):[one][two]Two lines[/two][/one]
to (with parent child relationship specified by indentation):[line-box] (LineBox) [one] (InlineLayoutBox) [two] (InlineLayoutBox) Two (InlineText) [/two] [/one] [/line-box] [line-box] (LineBox) [one] (InlineLayoutBox) [two] (InlineLayoutBox) lines (InlineText) [/two] [/one] [/line-box]
In this case the openParents param would be a flat list of[one][two]
as InlineBox objects at the start of the second line.- Returns:
- the deepest box (so that the rest of the line's content can be added to it) or null if openParents is empty.
-
-