1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * paragraphLayout doesn't make much sense without
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * BreakIterator...
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/LETypes.h"
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/loengine.h"
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/plruns.h"
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/playout.h"
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/locid.h"
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/LayoutEngine.h"
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/ParagraphLayout.h"
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if ! UCONFIG_NO_BREAK_ITERATION
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_USE
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI pl_paragraph * U_EXPORT2
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_create(const LEUnicode chars[],
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          le_int32 count,
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          const pl_fontRuns *fontRuns,
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          const pl_valueRuns *levelRuns,
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          const pl_valueRuns *scriptRuns,
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          const pl_localeRuns *localeRuns,
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UBiDiLevel paragraphLevel,
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          le_bool vertical,
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          LEErrorCode *status)
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = new ParagraphLayout(chars, count, (const FontRuns *) fontRuns,
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        (const ValueRuns *) levelRuns, (const ValueRuns *) scriptRuns, (const LocaleRuns *) localeRuns,
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        paragraphLevel, vertical, *status);
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (pl_paragraph *) pl;
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_close(pl_paragraph *paragraph)
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = (ParagraphLayout *) paragraph;
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete pl;
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_bool U_EXPORT2
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_isComplex(const LEUnicode chars[],
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             le_int32 count)
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ParagraphLayout::isComplex(chars, count);
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBiDiLevel U_EXPORT2
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getParagraphLevel(pl_paragraph *paragraph)
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = (ParagraphLayout *) paragraph;
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pl == NULL) {
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return pl->getParagraphLevel();
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBiDiDirection U_EXPORT2
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getTextDirection(pl_paragraph *paragraph)
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = (ParagraphLayout *) paragraph;
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pl == NULL) {
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return UBIDI_LTR;
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return pl->getTextDirection();
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getAscent(const pl_paragraph *paragraph)
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = (ParagraphLayout *) paragraph;
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pl == NULL) {
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return pl->getAscent();
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getDescent(const pl_paragraph *paragraph)
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = (ParagraphLayout *) paragraph;
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pl == NULL) {
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return pl->getDescent();
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getLeading(const pl_paragraph *paragraph)
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = (ParagraphLayout *) paragraph;
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pl == NULL) {
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return pl->getLeading();
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_reflow(pl_paragraph *paragraph)
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = (ParagraphLayout *) paragraph;
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pl == NULL) {
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return pl->reflow();
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI pl_line * U_EXPORT2
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_nextLine(pl_paragraph *paragraph, float width)
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout *pl = (ParagraphLayout *) paragraph;
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pl == NULL) {
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (pl_line *) pl->nextLine(width);
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_closeLine(pl_line *line)
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    delete ll;
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_countLineRuns(const pl_line *line)
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ll == NULL) {
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ll->countRuns();
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getLineAscent(const pl_line *line)
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ll == NULL) {
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ll->getAscent();
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getLineDescent(const pl_line *line)
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ll == NULL) {
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ll->getDescent();
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getLineLeading(const pl_line *line)
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ll == NULL) {
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ll->getLeading();
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getLineWidth(const pl_line *line)
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ll == NULL) {
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ll->getWidth();
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI const pl_visualRun * U_EXPORT2
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getLineVisualRun(const pl_line *line, le_int32 runIndex)
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (ll == NULL) {
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (pl_visualRun *) ll->getVisualRun(runIndex);
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI const le_font * U_EXPORT2
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunFont(const pl_visualRun *run)
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (const le_font *) vr->getFont();
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBiDiDirection U_EXPORT2
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunDirection(const pl_visualRun *run)
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return UBIDI_LTR;
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return vr->getDirection();
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunGlyphCount(const pl_visualRun *run)
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return -1;
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return vr->getGlyphCount();
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI const LEGlyphID * U_EXPORT2
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunGlyphs(const pl_visualRun *run)
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return vr->getGlyphs();
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI const float * U_EXPORT2
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunPositions(const pl_visualRun *run)
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return vr->getPositions();
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI const le_int32 * U_EXPORT2
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunGlyphToCharMap(const pl_visualRun *run)
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return NULL;
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return vr->getGlyphToCharMap();
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunAscent(const pl_visualRun *run)
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return vr->getAscent();
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunDescent(const pl_visualRun *run)
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return vr->getDescent();
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI le_int32 U_EXPORT2
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupl_getVisualRunLeading(const pl_visualRun *run)
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (vr == NULL) {
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return vr->getLeading();
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
331