// © 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 <code>ParagraphLayout</code> object for a styled paragraph. The paragraph is specified
 * as runs of text all in the same font. An <code>LEFontInstance</code> 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, <code>status</code> 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 <code>pl_fontRuns</code> object representing the font runs.
 *
 * @param levelRuns is a pointer to a <code>pl_valueRuns</code> object representing the directional levels.
 *        If this pointer in <code>NULL</code> the levels will be determined by running the Unicde
 *        Bidi algorithm.
 *
 * @param scriptRuns is a pointer to a <code>pl_valueRuns</code> object representing script runs.
 *        If this pointer in <code>NULL</code> the script runs will be determined using the
 *        Unicode code points.
 *
 * @param localeRuns is a pointer to a <code>pl_localeRuns</code> object representing locale runs.
 *        The <code>Locale</code> objects are used to determind the language of the text. If this
 *        pointer is <code>NULL</code> 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 <code>true</code> 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 <code>pl_paragraph</code> object. The object
 *         will remain valid until <code>pl_close</code> 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 <code>pl_paragraph</code> 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 <code>true</code> 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 <code>pl_paragraph</code>
 *
 * @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 <code>pl_paragraph</code>
 *
 * @return <code>UBIDI_LTR</code> if the text is all left to right,
 *         <code>UBIDI_RTL</code> if the text is all right to left,
 *         or <code>UBIDI_MIXED</code> if the text has mixed direction.
 *
 * @internal
 */
U_CAPI UBiDiDirection U_EXPORT2
pl_getTextDirection(pl_paragraph *paragraph);

/**
 * Return the max ascent value for all the fonts
 * in the paragraph.
 *
 * @param paragraph the <code>pl_paragraph</code>
 *
 * @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 <code>pl_paragraph</code>
 *
 * @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 <code>pl_paragraph</code>
 *
 * @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 <code>pl_paragraph</code>
 *
 * @internal
 */
U_CAPI void U_EXPORT2
pl_reflow(pl_paragraph *paragraph);

/**
 * Return a <code>pl_line</code> 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 <code>pl_paragraph</code>
 * @param width is the width of the line. If <code>width</code> is less than or equal
 *              to zero, a <code>ParagraphLayout::Line</code> object representing the
 *              rest of the paragraph will be returned.
 *
 * @return a <code>ParagraphLayout::Line</code> object which represents the line. The caller
 *         is responsible for deleting the object. Returns <code>NULL</code> 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 <code>pl_nextLine</code> but it is the client's responsibility
 * to close them by calling this routine.
 *
 * @param line the <code>pl_line</code> 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 <code>pl_line</code> 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 <code>pl_line</code> 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 <code>pl_line</code> 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 <code>pl_line</code> 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 <code>pl_line</code> object.
 *
 * @return the width of the line.
 *
 * @internal
 */
U_CAPI le_int32 U_EXPORT2
pl_getLineWidth(const pl_line *line);

/**
 * Get a <code>ParagraphLayout::VisualRun</code> object for a given
 * visual run in the line.
 *
 * @param line the <code>pl_line</code> object.
 * @param runIndex is the index of the run, in visual order.
 *
 * @return the <code>pl_visualRun</code> object representing the
 *         visual run. This object is owned by the <code>pl_line</code> object which
 *         created it, and will remain valid for as long as the <code>pl_line</code>
 *         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 <code>le_font</code> object which
 * represents the font of the visual run. This will always
 * be a non-composite font.
 *
 * @param run the <code>pl_visualRun</code> object.
 *
 * @return the <code>le_font</code> 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 <code>pl_visualRun</code> object.
 *
 * @return the direction of the run. This will be <code>UBIDI_LTR</code> if the
 *         run is left-to-right and <code>UBIDI_RTL</code> 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 <code>pl_visualRun</code> 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 <code>0xFFFE</code> and
 * <code>0xFFFF</code> should be ignored.
 *
 * @param run the <code>pl_visualRun</code> object.
 *
 * @return the address of the array of glyphs for this visual run. The storage
 *         is owned by the <code>pl_visualRun</code> object and must not be deleted.
 *         It will remain valid as long as the <code>pl_visualRun</code> 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 <code>pl_visualRun</code> object.
 *
 * @return the address of the array of glyph positions for this visual run. The storage
 *         is owned by the <code>pl_visualRun</code> object and must not be deleted.
 *         It will remain valid as long as the <code>pl_visualRun</code> 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 <code>pl_visualRun</code> object.
 *
 * @return the address of the character-to-glyph map for this visual run. The storage
 *         is owned by the <code>pl_visualRun</code> object and must not be deleted.
 *         It will remain valid as long as the <code>pl_visualRun</code> 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 <code>pl_visualRun</code> 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 <code>pl_visualRun</code> 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 <code>pl_visualRun</code> 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
