// 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.

#ifndef COBALT_RENDER_TREE_BORDER_H_
#define COBALT_RENDER_TREE_BORDER_H_

#include "base/memory/scoped_ptr.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/render_tree/brush.h"

namespace cobalt {
namespace render_tree {

// A style of a border segment.
enum BorderStyle {
  // A border segment along the given side should not be drawn.
  kBorderStyleNone,
  // A border segment along the given side should be drawn.
  kBorderStyleSolid
};

// Style properties for one of four sides of a border around a rectangle.
struct BorderSide {
  explicit BorderSide(const BorderSide& that);
  BorderSide(float width, BorderStyle style, const ColorRGBA& color);

  bool operator==(const BorderSide& rhs) const {
    return style == rhs.style && color == rhs.color && width == rhs.width;
  }
  bool operator!=(const BorderSide& rhs) const {
    return !(*this == rhs);
  }

  float width;
  BorderStyle style;
  ColorRGBA color;
};

// A border around a rectangle.
struct Border {
  explicit Border(const BorderSide& border_side);
  Border(const BorderSide& left, const BorderSide& right, const BorderSide& top,
         const BorderSide& bottom);

  BorderSide left;
  BorderSide right;
  BorderSide top;
  BorderSide bottom;
};

std::ostream& operator<<(std::ostream& out, const BorderSide& border_side);
std::ostream& operator<<(std::ostream& out, const Border& border);

}  // namespace render_tree
}  // namespace cobalt

#endif  // COBALT_RENDER_TREE_BORDER_H_
