Home | History | Annotate | Download | only in layoutex
      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
     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
     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
     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
     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
     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
     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
     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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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