3 * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved
11 * ParagraphLayout doesn't make much sense without
14 #include "unicode/ubidi.h"
15 #if ! UCONFIG_NO_BREAK_ITERATION
16 #ifndef U_HIDE_INTERNAL_API
18 #include "layout/LETypes.h"
23 * \brief C API for paragraph layout.
25 * This is a technology preview. The API may
26 * change significantly.
31 * The opaque type for a paragraph layout.
35 typedef void pl_paragraph
;
38 * The opaque type for a line in a paragraph layout.
45 * The opaque type for a visual run in a line.
49 typedef void pl_visualRun
;
52 * Construct a <code>ParagraphLayout</code> object for a styled paragraph. The paragraph is specified
53 * as runs of text all in the same font. An <code>LEFontInstance</code> object and a limit offset
54 * are specified for each font run. The limit offset is the offset of the character immediately
57 * Clients can optionally specify directional runs and / or script runs. If these aren't specified
58 * they will be computed.
60 * If any errors are encountered during construction, <code>status</code> will be set, and the object
61 * will be set to be empty.
63 * @param chars is an array of the characters in the paragraph
65 * @param count is the number of characters in the paragraph.
67 * @param fontRuns a pointer to a <code>pl_fontRuns</code> object representing the font runs.
69 * @param levelRuns is a pointer to a <code>pl_valueRuns</code> object representing the directional levels.
70 * If this pointer in <code>NULL</code> the levels will be determined by running the Unicde
73 * @param scriptRuns is a pointer to a <code>pl_valueRuns</code> object representing script runs.
74 * If this pointer in <code>NULL</code> the script runs will be determined using the
75 * Unicode code points.
77 * @param localeRuns is a pointer to a <code>pl_localeRuns</code> object representing locale runs.
78 * The <code>Locale</code> objects are used to determind the language of the text. If this
79 * pointer is <code>NULL</code> the default locale will be used for all of the text.
81 * @param paragraphLevel is the directionality of the paragraph, as in the UBiDi object.
83 * @param vertical is <code>TRUE</code> if the paragraph should be set vertically.
85 * @param status will be set to any error code encountered during construction.
87 * @return a pointer to the newly created <code>pl_paragraph</code> object. The object
88 * will remain valid until <code>pl_close</code> is called.
96 U_INTERNAL pl_paragraph
* U_EXPORT2
97 pl_create(const LEUnicode chars
[],
99 const pl_fontRuns
*fontRuns
,
100 const pl_valueRuns
*levelRuns
,
101 const pl_valueRuns
*scriptRuns
,
102 const pl_localeRuns
*localeRuns
,
103 UBiDiLevel paragraphLevel
,
105 LEErrorCode
*status
);
108 * Close the given paragraph layout object.
110 * @param paragraph the <code>pl_paragraph</code> object to be
111 * closed. Once this routine returns the object
112 * can no longer be referenced
116 U_INTERNAL
void U_EXPORT2
117 pl_close(pl_paragraph
*paragraph
);
120 * Examine the given text and determine if it contains characters in any
121 * script which requires complex processing to be rendered correctly.
123 * @param chars is an array of the characters in the paragraph
125 * @param count is the number of characters in the paragraph.
127 * @return <code>TRUE</code> if any of the text requires complex processing.
132 U_INTERNAL le_bool U_EXPORT2
133 pl_isComplex(const LEUnicode chars
[],
137 * Return the resolved paragraph level. This is useful for those cases
138 * where the bidi analysis has determined the level based on the first
139 * strong character in the paragraph.
141 * @param paragraph the <code>pl_paragraph</code>
143 * @return the resolved paragraph level.
147 U_INTERNAL UBiDiLevel U_EXPORT2
148 pl_getParagraphLevel(pl_paragraph
*paragraph
);
151 * Return the directionality of the text in the paragraph.
153 * @param paragraph the <code>pl_paragraph</code>
155 * @return <code>UBIDI_LTR</code> if the text is all left to right,
156 * <code>UBIDI_RTL</code> if the text is all right to left,
157 * or <code>UBIDI_MIXED</code> if the text has mixed direction.
161 U_INTERNAL UBiDiDirection U_EXPORT2
162 pl_getTextDirection(pl_paragraph
*paragraph
);
165 * Get the max ascent value for all the fonts
168 * @param paragraph the <code>pl_paragraph</code>
170 * Return the max ascent value for all the fonts
173 * @param paragraph the <code>pl_paragraph</code>
175 * @return the ascent value.
179 U_INTERNAL le_int32 U_EXPORT2
180 pl_getAscent(const pl_paragraph
*paragraph
);
183 * Return the max descent value for all the fonts
186 * @param paragraph the <code>pl_paragraph</code>
188 * @return the decent value.
192 U_INTERNAL le_int32 U_EXPORT2
193 pl_getDescent(const pl_paragraph
*paragraph
);
196 * Return the max leading value for all the fonts
199 * @param paragraph the <code>pl_paragraph</code>
201 * @return the leading value.
205 U_INTERNAL le_int32 U_EXPORT2
206 pl_getLeading(const pl_paragraph
*paragraph
);
209 * Reset line breaking to start from the beginning of the paragraph.
211 * @param paragraph the <code>pl_paragraph</code>
215 U_INTERNAL
void U_EXPORT2
216 pl_reflow(pl_paragraph
*paragraph
);
219 * Return a <code>pl_line</code> object which represents next line
220 * in the paragraph. The width of the line is specified each time so that it can
221 * be varied to support arbitrary paragraph shapes.
223 * @param paragraph the <code>pl_paragraph</code>
224 * @param width is the width of the line. If <code>width</code> is less than or equal
225 * to zero, a <code>ParagraphLayout::Line</code> object representing the
226 * rest of the paragraph will be returned.
228 * @return a <code>ParagraphLayout::Line</code> object which represents the line. The caller
229 * is responsible for deleting the object. Returns <code>NULL</code> if there are no
230 * more lines in the paragraph.
236 U_INTERNAL pl_line
* U_EXPORT2
237 pl_nextLine(pl_paragraph
*paragraph
, float width
);
240 * Close the given line object. Line objects are created
241 * by <code>pl_nextLine</code> but it is the client's responsibility
242 * to close them by calling this routine.
244 * @param line the <code>pl_line</code> object to close.
248 U_INTERNAL
void U_EXPORT2
249 pl_closeLine(pl_line
*line
);
252 * Count the number of visual runs in the line.
254 * @param line the <code>pl_line</code> object.
256 * @return the number of visual runs.
260 U_INTERNAL le_int32 U_EXPORT2
261 pl_countLineRuns(const pl_line
*line
);
264 * Get the ascent of the line. This is the maximum ascent
265 * of all the fonts on the line.
267 * @param line the <code>pl_line</code> object.
269 * @return the ascent of the line.
273 U_INTERNAL le_int32 U_EXPORT2
274 pl_getLineAscent(const pl_line
*line
);
277 * Get the descent of the line. This is the maximum descent
278 * of all the fonts on the line.
280 * @param line the <code>pl_line</code> object.
282 * @return the descent of the line.
286 U_INTERNAL le_int32 U_EXPORT2
287 pl_getLineDescent(const pl_line
*line
);
290 * Get the leading of the line. This is the maximum leading
291 * of all the fonts on the line.
293 * @param line the <code>pl_line</code> object.
295 * @return the leading of the line.
299 U_INTERNAL le_int32 U_EXPORT2
300 pl_getLineLeading(const pl_line
*line
);
303 * Get the width of the line. This is a convenience method
304 * which returns the last X position of the last visual run
307 * @param line the <code>pl_line</code> object.
309 * @return the width of the line.
313 U_INTERNAL le_int32 U_EXPORT2
314 pl_getLineWidth(const pl_line
*line
);
317 * Get a <code>ParagraphLayout::VisualRun</code> object for a given
318 * visual run in the line.
320 * @param line the <code>pl_line</code> object.
321 * @param runIndex is the index of the run, in visual order.
323 * @return the <code>pl_visualRun</code> object representing the
324 * visual run. This object is owned by the <code>pl_line</code> object which
325 * created it, and will remain valid for as long as the <code>pl_line</code>
332 U_INTERNAL
const pl_visualRun
* U_EXPORT2
333 pl_getLineVisualRun(const pl_line
*line
, le_int32 runIndex
);
336 * Get the <code>le_font</code> object which
337 * represents the font of the visual run. This will always
338 * be a non-composite font.
340 * @param run the <code>pl_visualRun</code> object.
342 * @return the <code>le_font</code> object which represents the
343 * font of the visual run.
349 U_INTERNAL
const le_font
* U_EXPORT2
350 pl_getVisualRunFont(const pl_visualRun
*run
);
353 * Get the direction of the visual run.
355 * @param run the <code>pl_visualRun</code> object.
357 * @return the direction of the run. This will be <code>UBIDI_LTR</code> if the
358 * run is left-to-right and <code>UBIDI_RTL</code> if the line is right-to-left.
362 U_INTERNAL UBiDiDirection U_EXPORT2
363 pl_getVisualRunDirection(const pl_visualRun
*run
);
366 * Get the number of glyphs in the visual run.
368 * @param run the <code>pl_visualRun</code> object.
370 * @return the number of glyphs.
374 U_INTERNAL le_int32 U_EXPORT2
375 pl_getVisualRunGlyphCount(const pl_visualRun
*run
);
378 * Get the glyphs in the visual run. Glyphs with the values <code>0xFFFE</code> and
379 * <code>0xFFFF</code> should be ignored.
381 * @param run the <code>pl_visualRun</code> object.
383 * @return the address of the array of glyphs for this visual run. The storage
384 * is owned by the <code>pl_visualRun</code> object and must not be deleted.
385 * It will remain valid as long as the <code>pl_visualRun</code> object is valid.
389 U_INTERNAL
const LEGlyphID
* U_EXPORT2
390 pl_getVisualRunGlyphs(const pl_visualRun
*run
);
393 * Get the (x, y) positions of the glyphs in the visual run. To simplify storage
394 * management, the x and y positions are stored in a single array with the x positions
395 * at even offsets in the array and the corresponding y position in the following odd offset.
396 * There is an extra (x, y) pair at the end of the array which represents the advance of
397 * the final glyph in the run.
399 * @param run the <code>pl_visualRun</code> object.
401 * @return the address of the array of glyph positions for this visual run. The storage
402 * is owned by the <code>pl_visualRun</code> object and must not be deleted.
403 * It will remain valid as long as the <code>pl_visualRun</code> object is valid.
407 U_INTERNAL
const float * U_EXPORT2
408 pl_getVisualRunPositions(const pl_visualRun
*run
);
411 * Get the glyph-to-character map for this visual run. This maps the indices into
412 * the glyph array to indices into the character array used to create the paragraph.
414 * @param run the <code>pl_visualRun</code> object.
416 * @return the address of the character-to-glyph map for this visual run. The storage
417 * is owned by the <code>pl_visualRun</code> object and must not be deleted.
418 * It will remain valid as long as the <code>pl_visualRun</code> object is valid.
422 U_INTERNAL
const le_int32
* U_EXPORT2
423 pl_getVisualRunGlyphToCharMap(const pl_visualRun
*run
);
426 * A convenience method which returns the ascent value for the font
427 * associated with this run.
429 * @param run the <code>pl_visualRun</code> object.
431 * @return the ascent value of this run's font.
435 U_INTERNAL le_int32 U_EXPORT2
436 pl_getVisualRunAscent(const pl_visualRun
*run
);
439 * A convenience method which returns the descent value for the font
440 * associated with this run.
442 * @param run the <code>pl_visualRun</code> object.
444 * @return the descent value of this run's font.
448 U_INTERNAL le_int32 U_EXPORT2
449 pl_getVisualRunDescent(const pl_visualRun
*run
);
452 * A convenience method which returns the leading value for the font
453 * associated with this run.
455 * @param run the <code>pl_visualRun</code> object.
457 * @return the leading value of this run's font.
461 U_INTERNAL le_int32 U_EXPORT2
462 pl_getVisualRunLeading(const pl_visualRun
*run
);
464 #endif /* U_HIDE_INTERNAL_API */