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 23U_NAMESPACE_USE 24 25U_CAPI pl_paragraph * U_EXPORT2 26pl_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 43U_CAPI void U_EXPORT2 44pl_close(pl_paragraph *paragraph) 45{ 46 ParagraphLayout *pl = (ParagraphLayout *) paragraph; 47 48 delete pl; 49} 50 51U_CAPI le_bool U_EXPORT2 52pl_isComplex(const LEUnicode chars[], 53 le_int32 count) 54{ 55 return ParagraphLayout::isComplex(chars, count); 56} 57 58U_CAPI UBiDiLevel U_EXPORT2 59pl_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 70U_CAPI UBiDiDirection U_EXPORT2 71pl_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 82U_CAPI le_int32 U_EXPORT2 83pl_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 94U_CAPI le_int32 U_EXPORT2 95pl_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 106U_CAPI le_int32 U_EXPORT2 107pl_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 118U_CAPI void U_EXPORT2 119pl_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 130U_CAPI pl_line * U_EXPORT2 131pl_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 142U_CAPI void U_EXPORT2 143pl_closeLine(pl_line *line) 144{ 145 ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line; 146 147 delete ll; 148} 149 150U_CAPI le_int32 U_EXPORT2 151pl_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 162U_CAPI le_int32 U_EXPORT2 163pl_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 174U_CAPI le_int32 U_EXPORT2 175pl_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 186U_CAPI le_int32 U_EXPORT2 187pl_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 198U_CAPI le_int32 U_EXPORT2 199pl_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 210U_CAPI const pl_visualRun * U_EXPORT2 211pl_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 222U_CAPI const le_font * U_EXPORT2 223pl_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 234U_CAPI UBiDiDirection U_EXPORT2 235pl_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 246U_CAPI le_int32 U_EXPORT2 247pl_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 258U_CAPI const LEGlyphID * U_EXPORT2 259pl_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 270U_CAPI const float * U_EXPORT2 271pl_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 282U_CAPI const le_int32 * U_EXPORT2 283pl_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 294U_CAPI le_int32 U_EXPORT2 295pl_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 306U_CAPI le_int32 U_EXPORT2 307pl_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 318U_CAPI le_int32 U_EXPORT2 319pl_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