// Copyright (C) 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 *
 * (C) Copyright IBM Corp. 1998-2007 - All Rights Reserved
 *
 */

/*
 * paragraphLayout doesn't make much sense without
 * BreakIterator...
 */
#include "layout/LETypes.h"
#include "layout/loengine.h"
#include "layout/plruns.h"
#include "layout/playout.h"

#include "unicode/locid.h"

#include "layout/LayoutEngine.h"
#include "layout/ParagraphLayout.h"

#if ! UCONFIG_NO_BREAK_ITERATION

U_NAMESPACE_USE

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)
{
    ParagraphLayout *pl = new ParagraphLayout(chars, count, (const FontRuns *) fontRuns,
        (const ValueRuns *) levelRuns, (const ValueRuns *) scriptRuns, (const LocaleRuns *) localeRuns,
        paragraphLevel, vertical, *status);

    return (pl_paragraph *) pl;
}

U_CAPI void U_EXPORT2
pl_close(pl_paragraph *paragraph)
{
    ParagraphLayout *pl = (ParagraphLayout *) paragraph;

    delete pl;
}

U_CAPI le_bool U_EXPORT2
pl_isComplex(const LEUnicode chars[],
             le_int32 count)
{
    return ParagraphLayout::isComplex(chars, count);
}

U_CAPI UBiDiLevel U_EXPORT2
pl_getParagraphLevel(pl_paragraph *paragraph)
{
    ParagraphLayout *pl = (ParagraphLayout *) paragraph;

    if (pl == NULL) {
        return 0;
    }

    return pl->getParagraphLevel();
}

U_CAPI UBiDiDirection U_EXPORT2
pl_getTextDirection(pl_paragraph *paragraph)
{
    ParagraphLayout *pl = (ParagraphLayout *) paragraph;

    if (pl == NULL) {
        return UBIDI_LTR;
    }

    return pl->getTextDirection();
}

U_CAPI le_int32 U_EXPORT2
pl_getAscent(const pl_paragraph *paragraph)
{
    ParagraphLayout *pl = (ParagraphLayout *) paragraph;

    if (pl == NULL) {
        return 0;
    }

    return pl->getAscent();
}

U_CAPI le_int32 U_EXPORT2
pl_getDescent(const pl_paragraph *paragraph)
{
    ParagraphLayout *pl = (ParagraphLayout *) paragraph;

    if (pl == NULL) {
        return 0;
    }

    return pl->getDescent();
}

U_CAPI le_int32 U_EXPORT2
pl_getLeading(const pl_paragraph *paragraph)
{
    ParagraphLayout *pl = (ParagraphLayout *) paragraph;

    if (pl == NULL) {
        return 0;
    }

    return pl->getLeading();
}

U_CAPI void U_EXPORT2
pl_reflow(pl_paragraph *paragraph)
{
    ParagraphLayout *pl = (ParagraphLayout *) paragraph;

    if (pl == NULL) {
        return;
    }

    return pl->reflow();
}

U_CAPI pl_line * U_EXPORT2
pl_nextLine(pl_paragraph *paragraph, float width)
{
    ParagraphLayout *pl = (ParagraphLayout *) paragraph;

    if (pl == NULL) {
        return NULL;
    }

    return (pl_line *) pl->nextLine(width);
}

U_CAPI void U_EXPORT2
pl_closeLine(pl_line *line)
{
    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;

    delete ll;
}

U_CAPI le_int32 U_EXPORT2
pl_countLineRuns(const pl_line *line)
{
    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;

    if (ll == NULL) {
        return 0;
    }

    return ll->countRuns();
}

U_CAPI le_int32 U_EXPORT2
pl_getLineAscent(const pl_line *line)
{
    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;

    if (ll == NULL) {
        return 0;
    }

    return ll->getAscent();
}

U_CAPI le_int32 U_EXPORT2
pl_getLineDescent(const pl_line *line)
{
    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;

    if (ll == NULL) {
        return 0;
    }

    return ll->getDescent();
}

U_CAPI le_int32 U_EXPORT2
pl_getLineLeading(const pl_line *line)
{
    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;

    if (ll == NULL) {
        return 0;
    }

    return ll->getLeading();
}

U_CAPI le_int32 U_EXPORT2
pl_getLineWidth(const pl_line *line)
{
    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;

    if (ll == NULL) {
        return 0;
    }

    return ll->getWidth();
}

U_CAPI const pl_visualRun * U_EXPORT2
pl_getLineVisualRun(const pl_line *line, le_int32 runIndex)
{
    ParagraphLayout::Line *ll = (ParagraphLayout::Line *) line;

    if (ll == NULL) {
        return 0;
    }

    return (pl_visualRun *) ll->getVisualRun(runIndex);
}

U_CAPI const le_font * U_EXPORT2
pl_getVisualRunFont(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return NULL;
    }

    return (const le_font *) vr->getFont();
}

U_CAPI UBiDiDirection U_EXPORT2
pl_getVisualRunDirection(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return UBIDI_LTR;
    }

    return vr->getDirection();
}

U_CAPI le_int32 U_EXPORT2
pl_getVisualRunGlyphCount(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return -1;
    }

    return vr->getGlyphCount();
}

U_CAPI const LEGlyphID * U_EXPORT2
pl_getVisualRunGlyphs(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return NULL;
    }

    return vr->getGlyphs();
}

U_CAPI const float * U_EXPORT2
pl_getVisualRunPositions(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return NULL;
    }

    return vr->getPositions();
}

U_CAPI const le_int32 * U_EXPORT2
pl_getVisualRunGlyphToCharMap(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return NULL;
    }

    return vr->getGlyphToCharMap();
}

U_CAPI le_int32 U_EXPORT2
pl_getVisualRunAscent(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return 0;
    }

    return vr->getAscent();
}

U_CAPI le_int32 U_EXPORT2
pl_getVisualRunDescent(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return 0;
    }

    return vr->getDescent();
}

U_CAPI le_int32 U_EXPORT2
pl_getVisualRunLeading(const pl_visualRun *run)
{
    ParagraphLayout::VisualRun *vr = (ParagraphLayout::VisualRun *) run;

    if (vr == NULL) {
        return 0;
    }

    return vr->getLeading();
}

#endif
