diff options
Diffstat (limited to 'xfa_test/pdf/fading_control.cc')
-rw-r--r-- | xfa_test/pdf/fading_control.cc | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/xfa_test/pdf/fading_control.cc b/xfa_test/pdf/fading_control.cc new file mode 100644 index 0000000000..7e4d8ef63e --- /dev/null +++ b/xfa_test/pdf/fading_control.cc @@ -0,0 +1,75 @@ +// 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 |