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

#include "cobalt/cssom/cobalt_ui_nav_focus_transform_function.h"

#include "cobalt/cssom/transform_function_visitor.h"
#include "cobalt/math/matrix_interpolation.h"

namespace cobalt {
namespace cssom {

CobaltUiNavFocusTransformFunction::CobaltUiNavFocusTransformFunction(
    float progress_to_identity)
    : progress_to_identity_(progress_to_identity) {
  traits_ = kTraitIsDynamic | kTraitUsesUiNavFocus;
}

void CobaltUiNavFocusTransformFunction::Accept(
    TransformFunctionVisitor* visitor) const {
  visitor->VisitCobaltUiNavFocusTransform(this);
}

std::string CobaltUiNavFocusTransformFunction::ToString() const {
  return "-cobalt-ui-nav-focus-transform()";
}

math::Matrix3F CobaltUiNavFocusTransformFunction::ToMatrix(
    const math::SizeF& /* used_size */,
    const scoped_refptr<ui_navigation::NavItem>& used_ui_nav_focus) const {
  ui_navigation::NativeTransform matrix;
  if (used_ui_nav_focus &&
      used_ui_nav_focus->GetLocalTransform(&matrix)) {
    return math::InterpolateMatrices(
        math::Matrix3F::FromValues(
            matrix.m[ 0], matrix.m[ 1], matrix.m[ 3],
            matrix.m[ 4], matrix.m[ 5], matrix.m[ 7],
            matrix.m[12], matrix.m[13], matrix.m[15]),
        math::Matrix3F::Identity(),
        progress_to_identity_);
  }
  return math::Matrix3F::Identity();
}

}  // namespace cssom
}  // namespace cobalt
