| // Copyright (c) 2012 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 "pdf/fading_control.h" |
| |
| #include <math.h> |
| |
| #include "base/logging.h" |
| #include "pdf/draw_utils.h" |
| #include "pdf/resource_consts.h" |
| |
| namespace chrome_pdf { |
| |
| FadingControl::FadingControl() |
| : alpha_shift_(0), timer_id_(0) { |
| } |
| |
| FadingControl::~FadingControl() { |
| } |
| |
| void FadingControl::OnTimerFired(uint32 timer_id) { |
| if (timer_id == timer_id_) { |
| int32 new_alpha = transparency() + alpha_shift_; |
| if (new_alpha <= kTransparentAlpha) { |
| Show(false, true); |
| OnFadeOutComplete(); |
| return; |
| } |
| if (new_alpha >= kOpaqueAlpha) { |
| AdjustTransparency(kOpaqueAlpha, true); |
| OnFadeInComplete(); |
| return; |
| } |
| |
| AdjustTransparency(static_cast<uint8>(new_alpha), true); |
| timer_id_ = owner()->ScheduleTimer(id(), kFadingTimeoutMs); |
| } |
| } |
| |
| // Fade In/Out control depending on visible flag over the time of time_ms. |
| void FadingControl::Fade(bool show, uint32 time_ms) { |
| DCHECK(time_ms != 0); |
| // Check if we already in the same state. |
| if (!visible() && !show) |
| return; |
| if (!visible() && show) { |
| Show(show, false); |
| AdjustTransparency(kTransparentAlpha, false); |
| OnFadeOutComplete(); |
| } |
| if (transparency() == kOpaqueAlpha && show) { |
| OnFadeInComplete(); |
| return; |
| } |
| |
| int delta = show ? kOpaqueAlpha - transparency() : transparency(); |
| double shift = |
| static_cast<double>(delta) * kFadingTimeoutMs / time_ms; |
| if (shift > delta) |
| alpha_shift_ = delta; |
| else |
| alpha_shift_ = static_cast<int>(ceil(shift)); |
| |
| if (alpha_shift_ == 0) |
| alpha_shift_ = 1; |
| |
| // If disabling, make alpha shift negative. |
| if (!show) |
| alpha_shift_ = -alpha_shift_; |
| |
| timer_id_ = owner()->ScheduleTimer(id(), kFadingTimeoutMs); |
| } |
| |
| } // namespace chrome_pdf |