// Copyright 2014 Google Inc. 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.

#include "cobalt/render_tree/text_node.h"

#include "cobalt/render_tree/node_visitor.h"

namespace cobalt {
namespace render_tree {

TextNode::Builder::Builder(
    const math::Vector2dF& offset,
    const scoped_refptr<render_tree::GlyphBuffer>& glyph_buffer,
    const ColorRGBA& color)
    : offset(offset), glyph_buffer(glyph_buffer), color(color) {}

void TextNode::Accept(NodeVisitor* visitor) { visitor->Visit(this); }

math::RectF TextNode::GetBounds() const {
  math::RectF bounds = data_.glyph_buffer->GetBounds();
  if (data_.shadows) {
    for (size_t i = 0; i < data_.shadows->size(); ++i) {
      bounds.Union(
          (*data_.shadows)[i].ToShadowBounds(data_.glyph_buffer->GetBounds()));
    }
  }
  bounds.Offset(data_.offset);
  return bounds;
}

}  // namespace render_tree
}  // namespace cobalt
