// Copyright 2015 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_CSSOM_ROTATE_FUNCTION_H_
#define COBALT_CSSOM_ROTATE_FUNCTION_H_

#include <string>

#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
#include "base/strings/stringprintf.h"
#include "cobalt/base/polymorphic_equatable.h"
#include "cobalt/cssom/transform_function.h"

namespace cobalt {
namespace cssom {

class TransformFunctionVisitor;

// The rotate function specifies a 2D rotation operation by the the specified
// angle.
//   https://www.w3.org/TR/css-transforms-1/#funcdef-rotate
class RotateFunction : public TransformFunction {
 public:
  explicit RotateFunction(float clockwise_angle_in_radians)
      : clockwise_angle_in_radians_(clockwise_angle_in_radians) {}

  void Accept(TransformFunctionVisitor* visitor) const override;

  float clockwise_angle_in_radians() const {
    return clockwise_angle_in_radians_;
  }

  std::string ToString() const override {
    return base::StringPrintf("rotate(%.7grad)", clockwise_angle_in_radians_);
  }

  math::Matrix3F ToMatrix(const math::SizeF& used_size,
      const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus)
      const override;

  bool operator==(const RotateFunction& other) const {
    return clockwise_angle_in_radians_ == other.clockwise_angle_in_radians_;
  }

  DEFINE_POLYMORPHIC_EQUATABLE_TYPE(RotateFunction);

 private:
  const float clockwise_angle_in_radians_;
};

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_ROTATE_FUNCTION_H_
