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