chromium/chromecast/ui/display_settings/brightness_animation.cc

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

#include "chromecast/ui/display_settings/brightness_animation.h"

#include <algorithm>
#include <limits>

#include "base/logging.h"
#include "base/time/time.h"

namespace chromecast {

namespace {

constexpr base::TimeDelta kManualAnimationDuration = base::Seconds(0);

// Brightness changes are smoothed linearly over a 50 ms interval by the
// backlight controller IC.
const int kAnimationFrameRate = 20;

}  // namespace

BrightnessAnimation::BrightnessAnimation(
    DisplaySettingsManager::Delegate* controller)
    : gfx::LinearAnimation(kManualAnimationDuration,
                           kAnimationFrameRate,
                           nullptr),
      controller_(controller) {
  DCHECK(controller_);

  start_brightness_ = controller_->GetDisplayBrightness();
  current_brightness_ = start_brightness_;
  target_brightness_ = start_brightness_;
}

BrightnessAnimation::~BrightnessAnimation() {
  End();
}

void BrightnessAnimation::AnimateToNewValue(float new_target_brightness,
                                            base::TimeDelta duration) {
  start_brightness_ = controller_->GetDisplayBrightness();
  target_brightness_ = std::clamp(new_target_brightness, 0.0f, 1.0f);
  DVLOG(4) << "Animating to new_target_brightness " << new_target_brightness
           << " from current_brightness_=" << current_brightness_;

  if (start_brightness_ < 0.0f) {
    LOG(WARNING)
        << "Brightness animation started from invalid start_brightness_="
        << start_brightness_;
    start_brightness_ = target_brightness_;
    SetDuration(base::Seconds(0));
  } else {
    // This will reset the animation timer to the beginning.
    SetDuration(duration);
  }
  Start();
}

void BrightnessAnimation::AnimateToState(double state) {
  state = std::clamp(state, 0.0, 1.0);
  current_brightness_ =
      start_brightness_ + (target_brightness_ - start_brightness_) * state;
  ApplyValuesToDisplay();
}

void BrightnessAnimation::ApplyValuesToDisplay() {
  controller_->SetDisplayBrightness(current_brightness_, false);
}

}  // namespace chromecast