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