// Copyright 2015 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_VIEWPORT_FILTER_H_
#define COBALT_RENDER_TREE_VIEWPORT_FILTER_H_

#include "base/optional.h"
#include "cobalt/math/matrix3_f.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/render_tree/rounded_corners.h"

namespace cobalt {
namespace render_tree {

// An ViewportFilter can be used to specify the viewport of source content.
// Only the contents of the source render tree that lie within the specified
// rectangle will be rendered.
class ViewportFilter {
 public:
  explicit ViewportFilter(const math::RectF& viewport) : viewport_(viewport) {}
  explicit ViewportFilter(const math::RectF& viewport,
                          const RoundedCorners& rounded_corners)
      : viewport_(viewport), rounded_corners_(rounded_corners) {}

  const math::RectF& viewport() const { return viewport_; }

  bool has_rounded_corners() const { return !!rounded_corners_; }
  const RoundedCorners& rounded_corners() const { return *rounded_corners_; }
  void set_rounded_corners(const RoundedCorners& rounded_corners) {
    rounded_corners_ = rounded_corners;
  }

 private:
  math::RectF viewport_;
  base::optional<RoundedCorners> rounded_corners_;
};

}  // namespace render_tree
}  // namespace cobalt

#endif  // COBALT_RENDER_TREE_VIEWPORT_FILTER_H_
