Imported Upstream version 58.1
[platform/upstream/icu.git] / source / layoutex / layout / playout.h
1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4  *
5  * (C) Copyright IBM Corp. 1998-2011 - All Rights Reserved
6  *
7  */
8
9 #ifndef __PLAYOUT_H
10 #define __PLAYOUT_H
11
12 /*
13  * ParagraphLayout doesn't make much sense without
14  * BreakIterator...
15  */
16 #include "unicode/ubidi.h"
17 #if ! UCONFIG_NO_BREAK_ITERATION
18 #ifndef U_HIDE_INTERNAL_API
19
20 #include "layout/LETypes.h"
21 #include "plruns.h"
22
23 /**
24  * \file 
25  * \brief C API for paragraph layout.
26  *
27  * This is a technology preview. The API may
28  * change significantly.
29  *
30  */
31
32 /**
33  * The opaque type for a paragraph layout.
34  *
35  * @internal
36  */
37 typedef void pl_paragraph;
38
39 /**
40  * The opaque type for a line in a paragraph layout.
41  *
42  * @internal
43  */
44 typedef void pl_line;
45
46 /**
47  * The opaque type for a visual run in a line.
48  *
49  * @internal
50  */
51 typedef void pl_visualRun;
52
53 /**
54  * Construct a <code>ParagraphLayout</code> object for a styled paragraph. The paragraph is specified
55  * as runs of text all in the same font. An <code>LEFontInstance</code> object and a limit offset
56  * are specified for each font run. The limit offset is the offset of the character immediately
57  * after the font run.
58  *
59  * Clients can optionally specify directional runs and / or script runs. If these aren't specified
60  * they will be computed.
61  *
62  * If any errors are encountered during construction, <code>status</code> will be set, and the object
63  * will be set to be empty.
64  *
65  * @param chars is an array of the characters in the paragraph
66  *
67  * @param count is the number of characters in the paragraph.
68  *
69  * @param fontRuns a pointer to a <code>pl_fontRuns</code> object representing the font runs.
70  *
71  * @param levelRuns is a pointer to a <code>pl_valueRuns</code> object representing the directional levels.
72  *        If this pointer in <code>NULL</code> the levels will be determined by running the Unicde
73  *        Bidi algorithm.
74  *
75  * @param scriptRuns is a pointer to a <code>pl_valueRuns</code> object representing script runs.
76  *        If this pointer in <code>NULL</code> the script runs will be determined using the
77  *        Unicode code points.
78  *
79  * @param localeRuns is a pointer to a <code>pl_localeRuns</code> object representing locale runs.
80  *        The <code>Locale</code> objects are used to determind the language of the text. If this
81  *        pointer is <code>NULL</code> the default locale will be used for all of the text. 
82  *
83  * @param paragraphLevel is the directionality of the paragraph, as in the UBiDi object.
84  *
85  * @param vertical is <code>TRUE</code> if the paragraph should be set vertically.
86  *
87  * @param status will be set to any error code encountered during construction.
88  *
89  * @return a pointer to the newly created <code>pl_paragraph</code> object. The object
90  *         will remain valid until <code>pl_close</code> is called.
91  *
92  * @see ubidi.h
93  * @see longine.h
94  * @see plruns.h
95  *
96  * @internal
97  */
98 U_INTERNAL pl_paragraph * U_EXPORT2
99 pl_create(const LEUnicode chars[],
100           le_int32 count,
101           const pl_fontRuns *fontRuns,
102           const pl_valueRuns *levelRuns,
103           const pl_valueRuns *scriptRuns,
104           const pl_localeRuns *localeRuns,
105           UBiDiLevel paragraphLevel,
106           le_bool vertical,
107           LEErrorCode *status);
108
109 /**
110  * Close the given paragraph layout object.
111  *
112  * @param paragraph the <code>pl_paragraph</code> object to be
113  *                  closed. Once this routine returns the object
114  *                  can no longer be referenced
115  *
116  * @internal
117  */
118 U_INTERNAL void U_EXPORT2
119 pl_close(pl_paragraph *paragraph);
120
121 /**
122  * Examine the given text and determine if it contains characters in any
123  * script which requires complex processing to be rendered correctly.
124  *
125  * @param chars is an array of the characters in the paragraph
126  *
127  * @param count is the number of characters in the paragraph.
128  *
129  * @return <code>TRUE</code> if any of the text requires complex processing.
130  *
131  * @internal
132  */
133
134 U_INTERNAL le_bool U_EXPORT2
135 pl_isComplex(const LEUnicode chars[],
136           le_int32 count);
137
138 /**
139  * Return the resolved paragraph level. This is useful for those cases
140  * where the bidi analysis has determined the level based on the first
141  * strong character in the paragraph.
142  *
143  * @param paragraph the <code>pl_paragraph</code>
144  *
145  * @return the resolved paragraph level.
146  *
147  * @internal
148  */
149 U_INTERNAL UBiDiLevel U_EXPORT2
150 pl_getParagraphLevel(pl_paragraph *paragraph);
151
152 /**
153  * Return the directionality of the text in the paragraph.
154  *
155  * @param paragraph the <code>pl_paragraph</code>
156  *
157  * @return <code>UBIDI_LTR</code> if the text is all left to right,
158  *         <code>UBIDI_RTL</code> if the text is all right to left,
159  *         or <code>UBIDI_MIXED</code> if the text has mixed direction.
160  *
161  * @internal
162  */
163 U_INTERNAL UBiDiDirection U_EXPORT2
164 pl_getTextDirection(pl_paragraph *paragraph);
165
166 /**
167  * Get the max ascent value for all the fonts
168  * in the paragraph.
169  *
170  * @param paragraph the <code>pl_paragraph</code>
171  *
172  * Return the max ascent value for all the fonts
173  * in the paragraph.
174  *
175  * @param paragraph the <code>pl_paragraph</code>
176  *
177  * @return the ascent value.
178  *
179  * @internal
180  */
181 U_INTERNAL le_int32 U_EXPORT2
182 pl_getAscent(const pl_paragraph *paragraph);
183
184 /**
185  * Return the max descent value for all the fonts
186  * in the paragraph.
187  *
188  * @param paragraph the <code>pl_paragraph</code>
189  *
190  * @return the decent value.
191  *
192  * @internal
193  */
194 U_INTERNAL le_int32 U_EXPORT2
195 pl_getDescent(const pl_paragraph *paragraph);
196
197 /**
198  * Return the max leading value for all the fonts
199  * in the paragraph.
200  *
201  * @param paragraph the <code>pl_paragraph</code>
202  *
203  * @return the leading value.
204  *
205  * @internal
206  */
207 U_INTERNAL le_int32 U_EXPORT2
208 pl_getLeading(const pl_paragraph *paragraph);
209
210 /**
211  * Reset line breaking to start from the beginning of the paragraph.
212  *
213  * @param paragraph the <code>pl_paragraph</code>
214  *
215  * @internal
216  */
217 U_INTERNAL void U_EXPORT2
218 pl_reflow(pl_paragraph *paragraph);
219
220 /**
221  * Return a <code>pl_line</code> object which represents next line
222  * in the paragraph. The width of the line is specified each time so that it can
223  * be varied to support arbitrary paragraph shapes.
224  *
225  * @param paragraph the <code>pl_paragraph</code>
226  * @param width is the width of the line. If <code>width</code> is less than or equal
227  *              to zero, a <code>ParagraphLayout::Line</code> object representing the
228  *              rest of the paragraph will be returned.
229  *
230  * @return a <code>ParagraphLayout::Line</code> object which represents the line. The caller
231  *         is responsible for deleting the object. Returns <code>NULL</code> if there are no
232  *         more lines in the paragraph.
233  *
234  * @see pl_line
235  *
236  * @internal
237  */
238 U_INTERNAL pl_line * U_EXPORT2
239 pl_nextLine(pl_paragraph *paragraph, float width);
240
241 /**
242  * Close the given line object. Line objects are created
243  * by <code>pl_nextLine</code> but it is the client's responsibility
244  * to close them by calling this routine.
245  *
246  * @param line the <code>pl_line</code> object to close.
247  *
248  * @internal
249  */
250 U_INTERNAL void U_EXPORT2
251 pl_closeLine(pl_line *line);
252
253 /**
254  * Count the number of visual runs in the line.
255  *
256  * @param line the <code>pl_line</code> object.
257  *
258  * @return the number of visual runs.
259  *
260  * @internal
261  */
262 U_INTERNAL le_int32 U_EXPORT2
263 pl_countLineRuns(const pl_line *line);
264
265 /**
266  * Get the ascent of the line. This is the maximum ascent
267  * of all the fonts on the line.
268  *
269  * @param line the <code>pl_line</code> object.
270  *
271  * @return the ascent of the line.
272  *
273  * @internal
274  */
275 U_INTERNAL le_int32 U_EXPORT2
276 pl_getLineAscent(const pl_line *line);
277
278 /**
279  * Get the descent of the line. This is the maximum descent
280  * of all the fonts on the line.
281  *
282  * @param line the <code>pl_line</code> object.
283  *
284  * @return the descent of the line.
285  *
286  * @internal
287  */
288 U_INTERNAL le_int32 U_EXPORT2
289 pl_getLineDescent(const pl_line *line);
290
291 /**
292  * Get the leading of the line. This is the maximum leading
293  * of all the fonts on the line.
294  *
295  * @param line the <code>pl_line</code> object.
296  *
297  * @return the leading of the line.
298  *
299  * @internal
300  */
301 U_INTERNAL le_int32 U_EXPORT2
302 pl_getLineLeading(const pl_line *line);
303
304 /**
305  * Get the width of the line. This is a convenience method
306  * which returns the last X position of the last visual run
307  * in the line.
308  *
309  * @param line the <code>pl_line</code> object.
310  *
311  * @return the width of the line.
312  *
313  * @internal
314  */
315 U_INTERNAL le_int32 U_EXPORT2
316 pl_getLineWidth(const pl_line *line);
317
318 /**
319  * Get a <code>ParagraphLayout::VisualRun</code> object for a given
320  * visual run in the line.
321  *
322  * @param line the <code>pl_line</code> object.
323  * @param runIndex is the index of the run, in visual order.
324  *
325  * @return the <code>pl_visualRun</code> object representing the
326  *         visual run. This object is owned by the <code>pl_line</code> object which
327  *         created it, and will remain valid for as long as the <code>pl_line</code>
328  *         object is valid.
329  *
330  * @see pl_visualRun
331  *
332  * @internal
333  */
334 U_INTERNAL const pl_visualRun * U_EXPORT2
335 pl_getLineVisualRun(const pl_line *line, le_int32 runIndex);
336
337 /**
338  * Get the <code>le_font</code> object which
339  * represents the font of the visual run. This will always
340  * be a non-composite font.
341  *
342  * @param run the <code>pl_visualRun</code> object.
343  *
344  * @return the <code>le_font</code> object which represents the
345  *         font of the visual run.
346  *
347  * @see le_font
348  *
349  * @internal
350  */
351 U_INTERNAL const le_font * U_EXPORT2
352 pl_getVisualRunFont(const pl_visualRun *run);
353
354 /**
355  * Get the direction of the visual run.
356  *
357  * @param run the <code>pl_visualRun</code> object.
358  *
359  * @return the direction of the run. This will be <code>UBIDI_LTR</code> if the
360  *         run is left-to-right and <code>UBIDI_RTL</code> if the line is right-to-left.
361  *
362  * @internal
363  */
364 U_INTERNAL UBiDiDirection U_EXPORT2
365 pl_getVisualRunDirection(const pl_visualRun *run);
366
367 /**
368  * Get the number of glyphs in the visual run.
369  *
370  * @param run the <code>pl_visualRun</code> object.
371  *
372  * @return the number of glyphs.
373  *
374  * @internal
375  */
376 U_INTERNAL le_int32 U_EXPORT2
377 pl_getVisualRunGlyphCount(const pl_visualRun *run);
378
379 /**
380  * Get the glyphs in the visual run. Glyphs with the values <code>0xFFFE</code> and
381  * <code>0xFFFF</code> should be ignored.
382  *
383  * @param run the <code>pl_visualRun</code> object.
384  *
385  * @return the address of the array of glyphs for this visual run. The storage
386  *         is owned by the <code>pl_visualRun</code> object and must not be deleted.
387  *         It will remain valid as long as the <code>pl_visualRun</code> object is valid.
388  *
389  * @internal
390  */
391 U_INTERNAL const LEGlyphID * U_EXPORT2
392 pl_getVisualRunGlyphs(const pl_visualRun *run);
393
394 /**
395  * Get the (x, y) positions of the glyphs in the visual run. To simplify storage
396  * management, the x and y positions are stored in a single array with the x positions
397  * at even offsets in the array and the corresponding y position in the following odd offset.
398  * There is an extra (x, y) pair at the end of the array which represents the advance of
399  * the final glyph in the run.
400  *
401  * @param run the <code>pl_visualRun</code> object.
402  *
403  * @return the address of the array of glyph positions for this visual run. The storage
404  *         is owned by the <code>pl_visualRun</code> object and must not be deleted.
405  *         It will remain valid as long as the <code>pl_visualRun</code> object is valid.
406  *
407  * @internal
408  */
409 U_INTERNAL const float * U_EXPORT2
410 pl_getVisualRunPositions(const pl_visualRun *run);
411
412 /**
413  * Get the glyph-to-character map for this visual run. This maps the indices into
414  * the glyph array to indices into the character array used to create the paragraph.
415  *
416  * @param run the <code>pl_visualRun</code> object.
417  *
418  * @return the address of the character-to-glyph map for this visual run. The storage
419  *         is owned by the <code>pl_visualRun</code> object and must not be deleted.
420  *         It will remain valid as long as the <code>pl_visualRun</code> object is valid.
421  *
422  * @internal
423  */
424 U_INTERNAL const le_int32 * U_EXPORT2
425 pl_getVisualRunGlyphToCharMap(const pl_visualRun *run);
426
427 /**
428  * A convenience method which returns the ascent value for the font
429  * associated with this run.
430  *
431  * @param run the <code>pl_visualRun</code> object.
432  *
433  * @return the ascent value of this run's font.
434  *
435  * @internal
436  */
437 U_INTERNAL le_int32 U_EXPORT2
438 pl_getVisualRunAscent(const pl_visualRun *run);
439
440 /**
441  * A convenience method which returns the descent value for the font
442  * associated with this run.
443  *
444  * @param run the <code>pl_visualRun</code> object.
445  *
446  * @return the descent value of this run's font.
447  *
448  * @internal
449  */
450 U_INTERNAL le_int32 U_EXPORT2
451 pl_getVisualRunDescent(const pl_visualRun *run);
452
453 /**
454  * A convenience method which returns the leading value for the font
455  * associated with this run.
456  *
457  * @param run the <code>pl_visualRun</code> object.
458  *
459  * @return the leading value of this run's font.
460  *
461  * @internal
462  */
463 U_INTERNAL le_int32 U_EXPORT2
464 pl_getVisualRunLeading(const pl_visualRun *run);
465
466 #endif  /* U_HIDE_INTERNAL_API */
467 #endif
468 #endif