Class TextRenderer

    • Field Detail

      • TYPO_ASCENDER_SCALE_COEFF

        static final float TYPO_ASCENDER_SCALE_COEFF
        See Also:
        Constant Field Values
      • UNDEFINED_FIRST_CHAR_TO_FORCE_OVERFLOW

        static final int UNDEFINED_FIRST_CHAR_TO_FORCE_OVERFLOW
        See Also:
        Constant Field Values
      • BOLD_SIMULATION_STROKE_COEFF

        private static final float BOLD_SIMULATION_STROKE_COEFF
        See Also:
        Constant Field Values
      • yLineOffset

        protected float yLineOffset
      • strToBeConverted

        protected java.lang.String strToBeConverted
      • otfFeaturesApplied

        protected boolean otfFeaturesApplied
      • tabAnchorCharacterPosition

        protected float tabAnchorCharacterPosition
      • reversedRanges

        protected java.util.List<int[]> reversedRanges
      • savedWordBreakAtLineEnding

        protected GlyphLine savedWordBreakAtLineEnding
      • specialScriptsWordBreakPoints

        private java.util.List<java.lang.Integer> specialScriptsWordBreakPoints
      • specialScriptFirstNotFittingIndex

        private int specialScriptFirstNotFittingIndex
      • indexOfFirstCharacterToBeForcedToOverflow

        private int indexOfFirstCharacterToBeForcedToOverflow
    • Constructor Detail

      • TextRenderer

        public TextRenderer​(Text textElement)
        Creates a TextRenderer from its corresponding layout object.
        Parameters:
        textElement - the Text which this object should manage
      • TextRenderer

        public TextRenderer​(Text textElement,
                            java.lang.String text)
        Creates a TextRenderer from its corresponding layout object, with a custom text to replace the contents of the Text.
        Parameters:
        textElement - the Text which this object should manage
        text - the replacement text
      • TextRenderer

        protected TextRenderer​(TextRenderer other)
    • 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 the LayoutResult, 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 uses TextLayoutResult as its result. This method can be called standalone to learn how much area the renderer subtree needs, or can be called before IRenderer.draw(DrawContext), to prepare the renderer to be flushed to the output stream.
        Specified by:
        layout in interface IRenderer
        Parameters:
        layoutContext - the description of layout area and any other additional information
        Returns:
        result of the layout process
      • increaseYLineOffset

        private void increaseYLineOffset​(UnitValue[] paddings,
                                         Border[] borders,
                                         UnitValue[] margins)
      • applyOtf

        public void applyOtf()
      • draw

        public void draw​(DrawContext drawContext)
        Description copied from class: AbstractRenderer
        Flushes the renderer subtree contents, i.e. draws itself on canvas, adds necessary objects to the PdfDocument etc.
        Specified by:
        draw in interface IRenderer
        Overrides:
        draw in class AbstractRenderer
        Parameters:
        drawContext - contains the PdfDocument to which the renderer subtree if flushed, the PdfCanvas on which the renderer subtree is drawn and other additional parameters needed to perform drawing
      • trimFirst

        public void trimFirst()
        Trims any whitespace characters from the start of the GlyphLine to be rendered.
      • trimLast

        float trimLast()
      • getAscent

        public float getAscent()
        Gets the maximum offset above the base line that this Text extends to.
        Specified by:
        getAscent in interface ILeafElementRenderer
        Returns:
        the upwards vertical offset of this Text
      • getDescent

        public float getDescent()
        Gets the maximum offset below the base line that this Text extends to.
        Specified by:
        getDescent in interface ILeafElementRenderer
        Returns:
        the downwards vertical offset of this Text
      • getYLine

        public float getYLine()
        Gets the position on the canvas of the imaginary horizontal line upon which the Text's contents will be written.
        Returns:
        the y position of this text on the DrawContext
      • moveYLineTo

        public void moveYLineTo​(float y)
        Moves the vertical position to the parameter's value.
        Parameters:
        y - the new vertical position of the Text
      • setText

        public void setText​(java.lang.String text)
        Manually sets the contents of the Text's representation on the canvas, regardless of the Text's own contents.
        Parameters:
        text - the replacement text
      • setText

        public void setText​(GlyphLine text,
                            PdfFont font)
        Manually set a GlyphLine and PdfFont for rendering.
        Parameters:
        text - the GlyphLine
        font - the font
      • length

        public int length()
        The length of the whole text assigned to this renderer.
        Returns:
        the text length
      • toString

        public java.lang.String toString()
        Description copied from class: AbstractRenderer
        Returns a string representation of the renderer.
        Overrides:
        toString in class AbstractRenderer
        Returns:
        a String
        See Also:
        Object.toString()
      • charAt

        public int charAt​(int pos)
        Gets char code at given position for the text belonging to this renderer.
        Parameters:
        pos - the position in range [0; length())
        Returns:
        Unicode char code
      • getTabAnchorCharacterPosition

        public float getTabAnchorCharacterPosition()
      • getNextRenderer

        public IRenderer getNextRenderer()
        Gets a new instance of this class to be used as a next renderer, after this renderer is used, if layout(LayoutContext) is called more than once.

        If TextRenderer overflows to the next line, iText uses this method to create a renderer for the overflow part. So if one wants to extend TextRenderer, one should override this method: otherwise the default method will be used and thus the default rather than the custom renderer will be created. Another method that should be overridden in case of TextRenderer's extension is createCopy(GlyphLine, PdfFont). This method is responsible for creation of TextRenderer's copies, which represent its parts of specific font.

        Specified by:
        getNextRenderer in interface IRenderer
        Returns:
        new renderer instance
      • calculateAscenderDescender

        public static float[] calculateAscenderDescender​(PdfFont font)
        Get ascender and descender from font metrics. If these values are obtained from typo metrics they are normalized with a scale coefficient.
        Parameters:
        font - from which metrics will be extracted
        Returns:
        array in which the first element is an ascender and the second is a descender
      • calculateAscenderDescender

        public static float[] calculateAscenderDescender​(PdfFont font,
                                                         RenderingMode mode)
        Get ascender and descender from font metrics. In RenderingMode.DEFAULT_LAYOUT_MODE if these values are obtained from typo metrics they are normalized with a scale coefficient.
        Parameters:
        font - from which metrics will be extracted
        mode - mode in which metrics will be obtained. Impact on the use of scale coefficient
        Returns:
        array in which the first element is an ascender and the second is a descender
      • getReversedRanges

        java.util.List<int[]> getReversedRanges()
      • initReversedRanges

        java.util.List<int[]> initReversedRanges()
      • splitIgnoreFirstNewLine

        private TextRenderer[] splitIgnoreFirstNewLine​(int currentTextPos)
      • convertToGlyphLine

        private GlyphLine convertToGlyphLine​(java.lang.String text)
      • hasOtfFont

        private boolean hasOtfFont()
      • textContainsSpecialScriptGlyphs

        boolean textContainsSpecialScriptGlyphs​(boolean analyzeSpecialScriptsWordBreakPointsOnly)
        Analyzes/checks whether text, bounded by start and end, contains glyphs belonging to special script. Mind that the behavior of this method depends on the analyzeSpecialScriptsWordBreakPointsOnly parameter: - pass false if you need to analyze the text by checking each of its glyphs AND to fill specialScriptsWordBreakPoints list afterwards, i.e. when analyzing a sequence of TextRenderers prior to layouting; - pass true if you want to check if text contains glyphs belonging to special scripts, according to the already filled specialScriptsWordBreakPoints list.
        Parameters:
        analyzeSpecialScriptsWordBreakPointsOnly - false if analysis of each glyph is required, true if analysis has already been performed earlier and the results are stored in specialScriptsWordBreakPoints
        Returns:
        true if text, bounded by start and end, contains glyphs belonging to special script, otherwise false
        See Also:
        specialScriptsWordBreakPoints
      • setSpecialScriptsWordBreakPoints

        void setSpecialScriptsWordBreakPoints​(java.util.List<java.lang.Integer> specialScriptsWordBreakPoints)
      • getSpecialScriptsWordBreakPoints

        java.util.List<java.lang.Integer> getSpecialScriptsWordBreakPoints()
      • setSpecialScriptFirstNotFittingIndex

        void setSpecialScriptFirstNotFittingIndex​(int lastFittingIndex)
      • getSpecialScriptFirstNotFittingIndex

        int getSpecialScriptFirstNotFittingIndex()
      • setIndexOfFirstCharacterToBeForcedToOverflow

        void setIndexOfFirstCharacterToBeForcedToOverflow​(int indexOfFirstCharacterToBeForcedToOverflow)
      • getBackgroundArea

        protected Rectangle getBackgroundArea​(Rectangle occupiedAreaWithMargins)
        Description copied from class: AbstractRenderer
        Evaluate the actual background
        Overrides:
        getBackgroundArea in class AbstractRenderer
        Parameters:
        occupiedAreaWithMargins - the current occupied area with applied margins
        Returns:
        the actual background area
      • 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 class AbstractRenderer
        Returns:
        the first yline of the nested children, null if there is no text found
      • lineLength

        protected int lineLength()
        Returns the length of the line which is the result of the layout call.
        Returns:
        the length of the line
      • baseCharactersCount

        protected int baseCharactersCount()
      • getNumberOfSpaces

        protected int getNumberOfSpaces()
      • createSplitRenderer

        protected TextRenderer createSplitRenderer()
      • createOverflowRenderer

        protected TextRenderer createOverflowRenderer()
      • split

        protected TextRenderer[] split​(int initialOverflowTextPos)
      • drawSingleUnderline

        protected void drawSingleUnderline​(Underline underline,
                                           TransparentColor fontStrokeColor,
                                           PdfCanvas canvas,
                                           float fontSize,
                                           float italicAngleTan)
      • calculateLineWidth

        protected float calculateLineWidth()
      • resolveFonts

        protected boolean resolveFonts​(java.util.List<IRenderer> addTo)
        Resolve Property.FONT String[] value.
        Parameters:
        addTo - add all processed renderers to.
        Returns:
        true, if new TextRenderer has been created.
      • setProcessedGlyphLineAndFont

        protected void setProcessedGlyphLineAndFont​(GlyphLine gl,
                                                    PdfFont font)
      • updateRangeBasedOnRemovedCharacters

        static void updateRangeBasedOnRemovedCharacters​(java.util.ArrayList<java.lang.Integer> removedIds,
                                                        int[] range)
      • findPossibleBreaksSplitPosition

        static int findPossibleBreaksSplitPosition​(java.util.List<java.lang.Integer> list,
                                                   int textStartBasedInitialOverflowTextPos,
                                                   boolean amongPresentOnly)
      • codePointIsOfSpecialScript

        static boolean codePointIsOfSpecialScript​(int codePoint)
      • resolveFirstPdfFont

        PdfFont resolveFirstPdfFont​(java.lang.String[] font,
                                    FontProvider provider,
                                    FontCharacteristics fc,
                                    FontSet additionalFonts)
        Description copied from class: AbstractRenderer
        Get first valid PdfFont for this renderer, based on given font-families, font provider and font characteristics. This method will not change font property of renderer. Also it is not guarantied that returned font will contain all glyphs used in renderer or its children.

        This method is usually needed for evaluating some layout characteristics like ascender or descender.

        Overrides:
        resolveFirstPdfFont in class AbstractRenderer
        Returns:
        a valid PdfFont instance based on renderer Property.FONT property.
      • isStartsWithSplitCharWhiteSpaceAndEndsWithSplitChar

        boolean[] isStartsWithSplitCharWhiteSpaceAndEndsWithSplitChar​(ISplitCharacters splitCharacters)
        Identifies two properties for the layouted text renderer text: start and end break possibilities. First - if it ends with split character, second - if it starts with the split character which is at the same time is a whitespace character. These properties will later be used for identifying if we can consider this and previous/next text renderers chunks to be a part of a single word spanning across the text renderers boundaries. In the start of the text renderer we only care about split characters, which are white spaces, because only such will allow soft-breaks before them: normally split characters allow breaks only after them.
        Parameters:
        splitCharacters - current renderer ISplitCharacters property value
        Returns:
        a boolean array of two elements, where first element identifies start break possibility, and second - end break possibility.
      • drawAndTagSingleUnderline

        private void drawAndTagSingleUnderline​(boolean isTagged,
                                               Underline underline,
                                               TransparentColor fontStrokeColor,
                                               PdfCanvas canvas,
                                               float fontSize,
                                               float italicAngleTan)
      • getCharWidth

        private float getCharWidth​(Glyph g,
                                   float fontSize,
                                   java.lang.Float hScale,
                                   java.lang.Float characterSpacing,
                                   java.lang.Float wordSpacing)
      • scaleXAdvance

        private float scaleXAdvance​(float xAdvance,
                                    float fontSize,
                                    java.lang.Float hScale)
      • getGlyphLineWidth

        private float getGlyphLineWidth​(GlyphLine glyphLine,
                                        float fontSize,
                                        float hScale,
                                        java.lang.Float characterSpacing,
                                        java.lang.Float wordSpacing)
      • getWordBoundsForHyphenation

        private int[] getWordBoundsForHyphenation​(GlyphLine text,
                                                  int leftTextPos,
                                                  int rightTextPos,
                                                  int wordMiddleCharPos)
      • isGlyphPartOfWordForHyphenation

        private boolean isGlyphPartOfWordForHyphenation​(Glyph g)
      • updateFontAndText

        private void updateFontAndText()
      • saveWordBreakIfNotYetSaved

        private void saveWordBreakIfNotYetSaved​(Glyph wordBreak)
      • numberOfElementsLessThan

        private static int numberOfElementsLessThan​(java.util.ArrayList<java.lang.Integer> numbers,
                                                    int n)
      • numberOfElementsLessThanOrEqual

        private static int numberOfElementsLessThanOrEqual​(java.util.ArrayList<java.lang.Integer> numbers,
                                                           int n)
      • noPrint

        private static boolean noPrint​(Glyph g)
      • glyphBelongsToNonBreakingHyphenRelatedChunk

        private static boolean glyphBelongsToNonBreakingHyphenRelatedChunk​(GlyphLine text,
                                                                           int ind)