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