// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef LineLayoutText_h
#define LineLayoutText_h

#include "core/layout/LayoutText.h"
#include "core/layout/api/LineLayoutItem.h"
#include "platform/LayoutUnit.h"
#include "platform/text/TextPath.h"
#include "wtf/Forward.h"

namespace blink {

class LayoutText;

class LineLayoutText : public LineLayoutItem {
public:
    explicit LineLayoutText(LayoutText* layoutObject) : LineLayoutItem(layoutObject) { }

    explicit LineLayoutText(const LineLayoutItem& item)
        : LineLayoutItem(item)
    {
        ASSERT_WITH_SECURITY_IMPLICATION(!item || item.isText());
    }

    explicit LineLayoutText(std::nullptr_t) : LineLayoutItem(nullptr) { }

    LineLayoutText() { }

    InlineTextBox* firstTextBox() const
    {
        return toText()->firstTextBox();
    }

    InlineTextBox* lastTextBox() const
    {
        return toText()->lastTextBox();
    }

    InlineTextBox* createInlineTextBox(int start, unsigned short length)
    {
        return toText()->createInlineTextBox(start, length);
    }

    void extractTextBox(InlineTextBox* inlineTextBox)
    {
        toText()->extractTextBox(inlineTextBox);
    }

    void attachTextBox(InlineTextBox* inlineTextBox)
    {
        toText()->attachTextBox(inlineTextBox);
    }

    void removeTextBox(InlineTextBox* inlineTextBox)
    {
        toText()->removeTextBox(inlineTextBox);
    }

    bool isWordBreak() const
    {
        return toText()->isWordBreak();
    }

    bool isAllCollapsibleWhitespace() const
    {
        return toText()->isAllCollapsibleWhitespace();
    }

    UChar characterAt(unsigned offset) const
    {
        return toText()->characterAt(offset);
    }

    UChar uncheckedCharacterAt(unsigned offset) const
    {
        return toText()->uncheckedCharacterAt(offset);
    }

    UChar32 codepointAt(unsigned offset) const
    {
        return toText()->codepointAt(offset);
    }

    bool is8Bit() const
    {
        return toText()->is8Bit();
    }

    const LChar* characters8() const
    {
        return toText()->characters8();
    }

    const UChar* characters16() const
    {
        return toText()->characters16();
    }

    bool hasEmptyText() const
    {
        return toText()->hasEmptyText();
    }

    unsigned textLength() const
    {
        return toText()->textLength();
    }

    unsigned resolvedTextLength() const
    {
        return toText()->resolvedTextLength();
    }

    const String& text() const
    {
        return toText()->text();
    }

    bool canUseSimpleFontCodePath() const
    {
        return toText()->canUseSimpleFontCodePath();
    }

    float width(unsigned from, unsigned len, const Font& font, LayoutUnit xPos, TextDirection textDirection, HashSet<const SimpleFontData*>* fallbackFonts, FloatRect* glyphBounds) const
    {
        return toText()->width(from, len, font, xPos, textDirection, fallbackFonts, glyphBounds);
    }

    float width(unsigned from, unsigned len, LayoutUnit xPos, TextDirection textDirection, bool firstLine, HashSet<const SimpleFontData*>* fallbackFonts = nullptr, FloatRect* glyphBounds = nullptr) const
    {
        return toText()->width(from, len, xPos, textDirection, firstLine, fallbackFonts, glyphBounds);
    }

    float hyphenWidth(const Font& font, TextDirection textDirection)
    {
        return toText()->hyphenWidth(font, textDirection);
    }

    void selectionStartEnd(int& spos, int& epos) const
    {
        return toText()->selectionStartEnd(spos, epos);
    }

    unsigned textStartOffset() const
    {
        return toText()->textStartOffset();
    }

    float minLogicalWidth() const
    {
        return toText()->minLogicalWidth();
    }

    void applyTextTransformFromTo(int from, int len, const ComputedStyle* style)
    {
        toText()->applyTextTransformFromTo(from, len, style);
    }

private:
    LayoutText* toText() { return toLayoutText(layoutObject()); }
    const LayoutText* toText() const { return toLayoutText(layoutObject()); }
};

} // namespace blink

#endif // LineLayoutText_h
