// Copyright 2018 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 "ash/accessibility/layer_animation_info.h"

#include "base/numerics/ranges.h"

namespace ash {

void ComputeOpacity(LayerAnimationInfo* animation_info,
                    base::TimeTicks timestamp) {
  // It's quite possible for the first 1 or 2 animation frames to be
  // for a timestamp that's earlier than the time we received the
  // mouse movement, so we just treat those as a delta of zero.
  if (timestamp < animation_info->start_time)
    timestamp = animation_info->start_time;

  base::TimeDelta start_delta = timestamp - animation_info->start_time;
  base::TimeDelta change_delta = timestamp - animation_info->change_time;
  base::TimeDelta fade_in_time = animation_info->fade_in_time;
  base::TimeDelta fade_out_time = animation_info->fade_out_time;

  if (change_delta > fade_in_time + fade_out_time) {
    animation_info->opacity = 0.0;
    return;
  }

  float opacity;
  if (start_delta < fade_in_time)
    opacity = start_delta / fade_in_time;
  else
    opacity = 1.0 - (change_delta / (fade_in_time + fade_out_time));

  // Layer::SetOpacity will throw an error if we're not within 0...1.
  animation_info->opacity = base::ClampToRange(opacity, 0.0f, 1.0f);
}

}  // namespace ash