// 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