// Copyright 2014 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_RENDER_TREE_TEXT_NODE_H_
#define COBALT_RENDER_TREE_TEXT_NODE_H_

#include <string>
#include <utility>
#include <vector>

#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "base/strings/string_piece.h"
#include "cobalt/base/type_id.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/math/vector2d_f.h"
#include "cobalt/render_tree/color_rgba.h"
#include "cobalt/render_tree/glyph_buffer.h"
#include "cobalt/render_tree/node.h"
#include "cobalt/render_tree/shadow.h"

namespace cobalt {
namespace render_tree {

// A single line of text or a directional run as specified by Unicode
// Bidirectional Algorithm (http://www.unicode.org/reports/tr9/).
// When rendering the text node, the origin will horizontally be on the far left
// of the text, and vertically it will be on the text's baseline.  This means
// that the text bounding box may cover area above and below the TextNode's
// origin.
class TextNode : public Node {
 public:
  struct Builder {
    Builder(const Builder&) = default;
    Builder(const math::Vector2dF& offset,
            const scoped_refptr<GlyphBuffer>& glyph_buffer,
            const ColorRGBA& color);

    bool operator==(const Builder& other) const {
      return offset == other.offset && glyph_buffer == other.glyph_buffer &&
             color == other.color && shadows == other.shadows;
    }

    math::Vector2dF offset;

    // All of the glyph data needed to render the text.
    scoped_refptr<GlyphBuffer> glyph_buffer;

    // The foreground color of the text.
    ColorRGBA color;

    // Shadows to be applied under the text.  These will be drawn in
    // back-to-front order, so the last shadow will be on the bottom.
    base::Optional<std::vector<Shadow> > shadows;
  };

  // Forwarding constructor to the set of Builder constructors.
  template <typename... Args>
  TextNode(Args&&... args)  // NOLINT(runtime/explicit)
      : data_(std::forward<Args>(args)...) {}

  void Accept(NodeVisitor* visitor) override;
  math::RectF GetBounds() const override;

  base::TypeId GetTypeId() const override {
    return base::GetTypeId<TextNode>();
  }

  const Builder& data() const { return data_; }

 private:
  const Builder data_;
};

}  // namespace render_tree
}  // namespace cobalt

#endif  // COBALT_RENDER_TREE_TEXT_NODE_H_
