blob: b5ac1a66f4b070547f04813cf42136bf01d02f10 [file] [log] [blame]
// Copyright 2015 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 "ui/app_list/views/image_shadow_animator.h"
#include <stddef.h>
#include "ui/gfx/animation/animation_delegate.h"
#include "ui/gfx/animation/slide_animation.h"
#include "ui/gfx/image/image_skia_operations.h"
using gfx::Tween;
namespace {
// Tweens between two ShadowValues.
gfx::ShadowValue LinearShadowValueBetween(double progress,
const gfx::ShadowValue& start,
const gfx::ShadowValue& end) {
gfx::Vector2d offset(
Tween::LinearIntValueBetween(progress, start.x(), end.x()),
Tween::LinearIntValueBetween(progress, start.y(), end.y()));
// The blur must be clamped to even values in order to avoid offsets being
// incorrect when there are uneven margins.
int blur =
Tween::LinearIntValueBetween(progress, start.blur() / 2, end.blur() / 2) *
2;
return gfx::ShadowValue(
offset, blur,
Tween::ColorValueBetween(progress, start.color(), end.color()));
}
} // namespace
namespace app_list {
ImageShadowAnimator::ImageShadowAnimator(Delegate* delegate)
: delegate_(delegate), animation_(this) {
}
ImageShadowAnimator::~ImageShadowAnimator() {
}
void ImageShadowAnimator::SetOriginalImage(const gfx::ImageSkia& image) {
original_image_ = image;
animation_.Reset();
UpdateShadowImageForProgress(0);
}
void ImageShadowAnimator::SetStartAndEndShadows(
const gfx::ShadowValues& start_shadow,
const gfx::ShadowValues& end_shadow) {
start_shadow_ = start_shadow;
end_shadow_ = end_shadow;
}
void ImageShadowAnimator::AnimationProgressed(const gfx::Animation* animation) {
UpdateShadowImageForProgress(animation->GetCurrentValue());
}
gfx::ShadowValues ImageShadowAnimator::GetShadowValuesForProgress(
double progress) const {
DCHECK_EQ(start_shadow_.size(), end_shadow_.size())
<< "Only equally sized ShadowValues are supported";
gfx::ShadowValues shadows;
for (size_t i = 0; i < start_shadow_.size(); ++i) {
shadows.push_back(
LinearShadowValueBetween(progress, start_shadow_[i], end_shadow_[i]));
}
return shadows;
}
void ImageShadowAnimator::UpdateShadowImageForProgress(double progress) {
shadow_image_ = gfx::ImageSkiaOperations::CreateImageWithDropShadow(
original_image_, GetShadowValuesForProgress(progress));
if (delegate_)
delegate_->ImageShadowAnimationProgressed(this);
}
} // namespace app_list