// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/blink/web_transform_operations_impl.h"

#include <algorithm>

#include "ui/gfx/transform.h"

namespace cc_blink {

WebTransformOperationsImpl::WebTransformOperationsImpl() {
}

const cc::TransformOperations&
WebTransformOperationsImpl::AsTransformOperations() const {
  return transform_operations_;
}

bool WebTransformOperationsImpl::canBlendWith(
    const blink::WebTransformOperations& other) const {
  const WebTransformOperationsImpl& other_impl =
      static_cast<const WebTransformOperationsImpl&>(other);
  return transform_operations_.CanBlendWith(other_impl.transform_operations_);
}

void WebTransformOperationsImpl::appendTranslate(double x, double y, double z) {
  transform_operations_.AppendTranslate(x, y, z);
}

void WebTransformOperationsImpl::appendRotate(double x,
                                              double y,
                                              double z,
                                              double degrees) {
  transform_operations_.AppendRotate(x, y, z, degrees);
}

void WebTransformOperationsImpl::appendScale(double x, double y, double z) {
  transform_operations_.AppendScale(x, y, z);
}

void WebTransformOperationsImpl::appendSkew(double x, double y) {
  transform_operations_.AppendSkew(x, y);
}

void WebTransformOperationsImpl::appendPerspective(double depth) {
  transform_operations_.AppendPerspective(depth);
}

void WebTransformOperationsImpl::appendMatrix(const SkMatrix44& matrix) {
  gfx::Transform transform(gfx::Transform::kSkipInitialization);
  transform.matrix() = matrix;
  transform_operations_.AppendMatrix(transform);
}

void WebTransformOperationsImpl::appendIdentity() {
  transform_operations_.AppendIdentity();
}

bool WebTransformOperationsImpl::isIdentity() const {
  return transform_operations_.IsIdentity();
}

WebTransformOperationsImpl::~WebTransformOperationsImpl() {
}

}  // namespace cc_blink
