• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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