/*
 * Copyright 2018 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkSGText_DEFINED
#define SkSGText_DEFINED

#include "SkSGGeometryNode.h"

#include "SkFont.h"
#include "SkPoint.h"
#include "SkString.h"
#include "SkTextBlob.h"
#include "SkTextUtils.h"

class SkCanvas;
class SkPaint;
class SkTypeface;

namespace sksg {

/**
 * Concrete Geometry node, wrapping a (shaped) SkTextBlob.
 */
class Text final : public GeometryNode {
public:
    static sk_sp<Text> Make(sk_sp<SkTypeface> tf, const SkString& text);
    ~Text() override;

    SG_ATTRIBUTE(Typeface, sk_sp<SkTypeface> , fTypeface)
    SG_ATTRIBUTE(Text    , SkString          , fText    )
    SG_ATTRIBUTE(Position, SkPoint           , fPosition)
    SG_ATTRIBUTE(Size    , SkScalar          , fSize    )
    SG_ATTRIBUTE(ScaleX  , SkScalar          , fScaleX  )
    SG_ATTRIBUTE(SkewX   , SkScalar          , fSkewX   )
    SG_ATTRIBUTE(Align   , SkTextUtils::Align, fAlign   )
    SG_ATTRIBUTE(Edging  , SkFont::Edging    , fEdging  )
    SG_ATTRIBUTE(Hinting , SkFontHinting     , fHinting )

    // TODO: add shaping functionality.

protected:
    void onClip(SkCanvas*, bool antiAlias) const override;
    void onDraw(SkCanvas*, const SkPaint&) const override;

    SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
    SkPath onAsPath() const override;

private:
    Text(sk_sp<SkTypeface>, const SkString&);

    SkPoint alignedPosition(SkScalar advance) const;

    sk_sp<SkTypeface> fTypeface;
    SkString                fText;
    SkPoint                 fPosition = SkPoint::Make(0, 0);
    SkScalar                fSize     = 12;
    SkScalar                fScaleX   = 1;
    SkScalar                fSkewX    = 0;
    SkTextUtils::Align      fAlign    = SkTextUtils::kLeft_Align;
    SkFont::Edging          fEdging   = SkFont::Edging::kAntiAlias;
    SkFontHinting           fHinting  = kNormal_SkFontHinting;

    sk_sp<SkTextBlob> fBlob; // cached text blob

    using INHERITED = GeometryNode;
};

/**
 * Concrete Geometry node, wrapping an external SkTextBlob.
 */
class TextBlob final : public GeometryNode {
public:
    static sk_sp<TextBlob> Make(sk_sp<SkTextBlob> = nullptr);
    ~TextBlob() override;

    SG_ATTRIBUTE(Blob    , sk_sp<SkTextBlob>, fBlob    )
    SG_ATTRIBUTE(Position, SkPoint          , fPosition)

protected:
    void onClip(SkCanvas*, bool antiAlias) const override;
    void onDraw(SkCanvas*, const SkPaint&) const override;

    SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
    SkPath onAsPath() const override;

private:
    explicit TextBlob(sk_sp<SkTextBlob>);

    sk_sp<SkTextBlob> fBlob;
    SkPoint           fPosition = SkPoint::Make(0, 0);

    using INHERITED = GeometryNode;
};
} // namespace sksg

#endif // SkSGText_DEFINED
