// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
*
* (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved
*
*/
#ifndef __PLAYOUT_H
#define __PLAYOUT_H
/*
* ParagraphLayout doesn't make much sense without
* BreakIterator...
*/
#include "unicode/ubidi.h"
#if ! UCONFIG_NO_BREAK_ITERATION
#ifndef U_HIDE_INTERNAL_API
#include "layout/LETypes.h"
#include "plruns.h"
/**
* \file
* \brief C API for paragraph layout.
*
* This is a technology preview. The API may
* change significantly.
*
*/
/**
* The opaque type for a paragraph layout.
*
* @internal
*/
typedef void pl_paragraph;
/**
* The opaque type for a line in a paragraph layout.
*
* @internal
*/
typedef void pl_line;
/**
* The opaque type for a visual run in a line.
*
* @internal
*/
typedef void pl_visualRun;
/**
* Construct a ParagraphLayout
object for a styled paragraph. The paragraph is specified
* as runs of text all in the same font. An LEFontInstance
object and a limit offset
* are specified for each font run. The limit offset is the offset of the character immediately
* after the font run.
*
* Clients can optionally specify directional runs and / or script runs. If these aren't specified
* they will be computed.
*
* If any errors are encountered during construction, status
will be set, and the object
* will be set to be empty.
*
* @param chars is an array of the characters in the paragraph
*
* @param count is the number of characters in the paragraph.
*
* @param fontRuns a pointer to a pl_fontRuns
object representing the font runs.
*
* @param levelRuns is a pointer to a pl_valueRuns
object representing the directional levels.
* If this pointer in NULL
the levels will be determined by running the Unicde
* Bidi algorithm.
*
* @param scriptRuns is a pointer to a pl_valueRuns
object representing script runs.
* If this pointer in NULL
the script runs will be determined using the
* Unicode code points.
*
* @param localeRuns is a pointer to a pl_localeRuns
object representing locale runs.
* The Locale
objects are used to determind the language of the text. If this
* pointer is NULL
the default locale will be used for all of the text.
*
* @param paragraphLevel is the directionality of the paragraph, as in the UBiDi object.
*
* @param vertical is true
if the paragraph should be set vertically.
*
* @param status will be set to any error code encountered during construction.
*
* @return a pointer to the newly created pl_paragraph
object. The object
* will remain valid until pl_close
is called.
*
* @see ubidi.h
* @see longine.h
* @see plruns.h
*
* @internal
*/
U_CAPI pl_paragraph * U_EXPORT2
pl_create(const LEUnicode chars[],
le_int32 count,
const pl_fontRuns *fontRuns,
const pl_valueRuns *levelRuns,
const pl_valueRuns *scriptRuns,
const pl_localeRuns *localeRuns,
UBiDiLevel paragraphLevel,
le_bool vertical,
LEErrorCode *status);
/**
* Close the given paragraph layout object.
*
* @param paragraph the pl_paragraph
object to be
* closed. Once this routine returns the object
* can no longer be referenced
*
* @internal
*/
U_CAPI void U_EXPORT2
pl_close(pl_paragraph *paragraph);
/**
* Examine the given text and determine if it contains characters in any
* script which requires complex processing to be rendered correctly.
*
* @param chars is an array of the characters in the paragraph
*
* @param count is the number of characters in the paragraph.
*
* @return true
if any of the text requires complex processing.
*
* @internal
*/
U_CAPI le_bool U_EXPORT2
pl_isComplex(const LEUnicode chars[],
le_int32 count);
/**
* Return the resolved paragraph level. This is useful for those cases
* where the bidi analysis has determined the level based on the first
* strong character in the paragraph.
*
* @param paragraph the pl_paragraph
*
* @return the resolved paragraph level.
*
* @internal
*/
U_CAPI UBiDiLevel U_EXPORT2
pl_getParagraphLevel(pl_paragraph *paragraph);
/**
* Return the directionality of the text in the paragraph.
*
* @param paragraph the pl_paragraph
*
* @return UBIDI_LTR
if the text is all left to right,
* UBIDI_RTL
if the text is all right to left,
* or UBIDI_MIXED
if the text has mixed direction.
*
* @internal
*/
U_CAPI UBiDiDirection U_EXPORT2
pl_getTextDirection(pl_paragraph *paragraph);
/**
* Get the max ascent value for all the fonts
* in the paragraph.
*
* @param paragraph the pl_paragraph
*
* Return the max ascent value for all the fonts
* in the paragraph.
*
* @param paragraph the pl_paragraph
*
* @return the ascent value.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getAscent(const pl_paragraph *paragraph);
/**
* Return the max descent value for all the fonts
* in the paragraph.
*
* @param paragraph the pl_paragraph
*
* @return the decent value.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getDescent(const pl_paragraph *paragraph);
/**
* Return the max leading value for all the fonts
* in the paragraph.
*
* @param paragraph the pl_paragraph
*
* @return the leading value.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getLeading(const pl_paragraph *paragraph);
/**
* Reset line breaking to start from the beginning of the paragraph.
*
* @param paragraph the pl_paragraph
*
* @internal
*/
U_CAPI void U_EXPORT2
pl_reflow(pl_paragraph *paragraph);
/**
* Return a pl_line
object which represents next line
* in the paragraph. The width of the line is specified each time so that it can
* be varied to support arbitrary paragraph shapes.
*
* @param paragraph the pl_paragraph
* @param width is the width of the line. If width
is less than or equal
* to zero, a ParagraphLayout::Line
object representing the
* rest of the paragraph will be returned.
*
* @return a ParagraphLayout::Line
object which represents the line. The caller
* is responsible for deleting the object. Returns NULL
if there are no
* more lines in the paragraph.
*
* @see pl_line
*
* @internal
*/
U_CAPI pl_line * U_EXPORT2
pl_nextLine(pl_paragraph *paragraph, float width);
/**
* Close the given line object. Line objects are created
* by pl_nextLine
but it is the client's responsibility
* to close them by calling this routine.
*
* @param line the pl_line
object to close.
*
* @internal
*/
U_CAPI void U_EXPORT2
pl_closeLine(pl_line *line);
/**
* Count the number of visual runs in the line.
*
* @param line the pl_line
object.
*
* @return the number of visual runs.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_countLineRuns(const pl_line *line);
/**
* Get the ascent of the line. This is the maximum ascent
* of all the fonts on the line.
*
* @param line the pl_line
object.
*
* @return the ascent of the line.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getLineAscent(const pl_line *line);
/**
* Get the descent of the line. This is the maximum descent
* of all the fonts on the line.
*
* @param line the pl_line
object.
*
* @return the descent of the line.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getLineDescent(const pl_line *line);
/**
* Get the leading of the line. This is the maximum leading
* of all the fonts on the line.
*
* @param line the pl_line
object.
*
* @return the leading of the line.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getLineLeading(const pl_line *line);
/**
* Get the width of the line. This is a convenience method
* which returns the last X position of the last visual run
* in the line.
*
* @param line the pl_line
object.
*
* @return the width of the line.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getLineWidth(const pl_line *line);
/**
* Get a ParagraphLayout::VisualRun
object for a given
* visual run in the line.
*
* @param line the pl_line
object.
* @param runIndex is the index of the run, in visual order.
*
* @return the pl_visualRun
object representing the
* visual run. This object is owned by the pl_line
object which
* created it, and will remain valid for as long as the pl_line
* object is valid.
*
* @see pl_visualRun
*
* @internal
*/
U_CAPI const pl_visualRun * U_EXPORT2
pl_getLineVisualRun(const pl_line *line, le_int32 runIndex);
/**
* Get the le_font
object which
* represents the font of the visual run. This will always
* be a non-composite font.
*
* @param run the pl_visualRun
object.
*
* @return the le_font
object which represents the
* font of the visual run.
*
* @see le_font
*
* @internal
*/
U_CAPI const le_font * U_EXPORT2
pl_getVisualRunFont(const pl_visualRun *run);
/**
* Get the direction of the visual run.
*
* @param run the pl_visualRun
object.
*
* @return the direction of the run. This will be UBIDI_LTR
if the
* run is left-to-right and UBIDI_RTL
if the line is right-to-left.
*
* @internal
*/
U_CAPI UBiDiDirection U_EXPORT2
pl_getVisualRunDirection(const pl_visualRun *run);
/**
* Get the number of glyphs in the visual run.
*
* @param run the pl_visualRun
object.
*
* @return the number of glyphs.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getVisualRunGlyphCount(const pl_visualRun *run);
/**
* Get the glyphs in the visual run. Glyphs with the values 0xFFFE
and
* 0xFFFF
should be ignored.
*
* @param run the pl_visualRun
object.
*
* @return the address of the array of glyphs for this visual run. The storage
* is owned by the pl_visualRun
object and must not be deleted.
* It will remain valid as long as the pl_visualRun
object is valid.
*
* @internal
*/
U_CAPI const LEGlyphID * U_EXPORT2
pl_getVisualRunGlyphs(const pl_visualRun *run);
/**
* Get the (x, y) positions of the glyphs in the visual run. To simplify storage
* management, the x and y positions are stored in a single array with the x positions
* at even offsets in the array and the corresponding y position in the following odd offset.
* There is an extra (x, y) pair at the end of the array which represents the advance of
* the final glyph in the run.
*
* @param run the pl_visualRun
object.
*
* @return the address of the array of glyph positions for this visual run. The storage
* is owned by the pl_visualRun
object and must not be deleted.
* It will remain valid as long as the pl_visualRun
object is valid.
*
* @internal
*/
U_CAPI const float * U_EXPORT2
pl_getVisualRunPositions(const pl_visualRun *run);
/**
* Get the glyph-to-character map for this visual run. This maps the indices into
* the glyph array to indices into the character array used to create the paragraph.
*
* @param run the pl_visualRun
object.
*
* @return the address of the character-to-glyph map for this visual run. The storage
* is owned by the pl_visualRun
object and must not be deleted.
* It will remain valid as long as the pl_visualRun
object is valid.
*
* @internal
*/
U_CAPI const le_int32 * U_EXPORT2
pl_getVisualRunGlyphToCharMap(const pl_visualRun *run);
/**
* A convenience method which returns the ascent value for the font
* associated with this run.
*
* @param run the pl_visualRun
object.
*
* @return the ascent value of this run's font.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getVisualRunAscent(const pl_visualRun *run);
/**
* A convenience method which returns the descent value for the font
* associated with this run.
*
* @param run the pl_visualRun
object.
*
* @return the descent value of this run's font.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getVisualRunDescent(const pl_visualRun *run);
/**
* A convenience method which returns the leading value for the font
* associated with this run.
*
* @param run the pl_visualRun
object.
*
* @return the leading value of this run's font.
*
* @internal
*/
U_CAPI le_int32 U_EXPORT2
pl_getVisualRunLeading(const pl_visualRun *run);
#endif /* U_HIDE_INTERNAL_API */
#endif
#endif