1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/fading_control.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <math.h>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/draw_utils.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/resource_consts.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chrome_pdf {
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FadingControl::FadingControl()
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : alpha_shift_(0), timer_id_(0) {
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)FadingControl::~FadingControl() {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControl::OnTimerFired(uint32 timer_id) {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (timer_id == timer_id_) {
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int32 new_alpha = transparency() + alpha_shift_;
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (new_alpha <= kTransparentAlpha) {
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      Show(false, true);
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      OnFadeOutComplete();
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (new_alpha >= kOpaqueAlpha) {
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      AdjustTransparency(kOpaqueAlpha, true);
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      OnFadeInComplete();
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    AdjustTransparency(static_cast<uint8>(new_alpha), true);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    timer_id_ = owner()->ScheduleTimer(id(), kFadingTimeoutMs);
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Fade In/Out control depending on visible flag over the time of time_ms.
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void FadingControl::Fade(bool show, uint32 time_ms) {
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(time_ms != 0);
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Check if we already in the same state.
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!visible() && !show)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!visible() && show) {
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Show(show, false);
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    AdjustTransparency(kTransparentAlpha, false);
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    OnFadeOutComplete();
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (transparency() == kOpaqueAlpha && show) {
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    OnFadeInComplete();
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int delta = show ? kOpaqueAlpha - transparency() : transparency();
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  double shift =
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<double>(delta) * kFadingTimeoutMs / time_ms;
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (shift > delta)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    alpha_shift_ = delta;
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    alpha_shift_ = static_cast<int>(ceil(shift));
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (alpha_shift_ == 0)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    alpha_shift_ = 1;
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If disabling, make alpha shift negative.
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!show)
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    alpha_shift_ = -alpha_shift_;
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  timer_id_ = owner()->ScheduleTimer(id(), kFadingTimeoutMs);
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace chrome_pdf
76