Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa_test / pdf / page_indicator.cc
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "pdf/page_indicator.h"
6
7 #include "base/logging.h"
8 #include "base/strings/string_util.h"
9 #include "pdf/draw_utils.h"
10 #include "pdf/number_image_generator.h"
11 #include "pdf/resource_consts.h"
12
13 namespace chrome_pdf {
14
15
16 PageIndicator::PageIndicator()
17     : current_page_(0),
18       fade_out_timer_id_(0),
19       splash_timeout_(kPageIndicatorSplashTimeoutMs),
20       fade_timeout_(kPageIndicatorScrollFadeTimeoutMs),
21       always_visible_(false) {
22 }
23
24 PageIndicator::~PageIndicator() {
25 }
26
27 bool PageIndicator::CreatePageIndicator(
28     uint32 id,
29     bool visible,
30     Control::Owner* delegate,
31     NumberImageGenerator* number_image_generator,
32     bool always_visible) {
33   number_image_generator_ = number_image_generator;
34   always_visible_ = always_visible;
35
36   pp::Rect rc;
37   bool res = Control::Create(id, rc, visible, delegate);
38   return res;
39 }
40
41 void PageIndicator::Configure(const pp::Point& origin,
42                               const pp::ImageData& background) {
43   background_ = background;
44   pp::Rect rc(origin, background_.size());
45   Control::SetRect(rc, false);
46 }
47
48 void PageIndicator::set_current_page(int current_page) {
49   if (current_page_ < 0)
50     return;
51
52   current_page_ = current_page;
53 }
54
55 void PageIndicator::Paint(pp::ImageData* image_data, const pp::Rect& rc) {
56   if (!visible())
57     return;
58
59   pp::Rect draw_rc = rc.Intersect(rect());
60   if (draw_rc.IsEmpty())
61     return;
62
63   // Copying the background image to a temporary buffer.
64   pp::ImageData buffer(owner()->GetInstance(), background_.format(),
65                        background_.size(), false);
66   CopyImage(background_, pp::Rect(background_.size()),
67             &buffer, pp::Rect(background_.size()), false);
68
69   // Creating the page number image.
70   pp::ImageData page_number_image;
71   number_image_generator_->GenerateImage(current_page_, &page_number_image);
72
73   pp::Point origin2(
74       (buffer.size().width() - page_number_image.size().width()) / 2.5,
75       (buffer.size().height() - page_number_image.size().height()) / 2);
76
77   // Drawing page number image on the buffer.
78   if (origin2.x() > 0 && origin2.y() > 0) {
79     CopyImage(page_number_image,
80               pp::Rect(pp::Point(), page_number_image.size()),
81               &buffer,
82               pp::Rect(origin2, page_number_image.size()),
83               false);
84   }
85
86   // Drawing the buffer.
87   pp::Point origin = draw_rc.point();
88   draw_rc.Offset(-rect().x(), -rect().y());
89   AlphaBlend(buffer, draw_rc, image_data, origin, transparency());
90 }
91
92 void PageIndicator::OnTimerFired(uint32 timer_id) {
93   FadingControl::OnTimerFired(timer_id);
94   if (timer_id == fade_out_timer_id_) {
95     Fade(false, fade_timeout_);
96   }
97 }
98
99 void PageIndicator::ResetFadeOutTimer() {
100   fade_out_timer_id_ =
101       owner()->ScheduleTimer(id(), splash_timeout_);
102 }
103
104 void PageIndicator::OnFadeInComplete() {
105   if (!always_visible_)
106     ResetFadeOutTimer();
107 }
108
109 void PageIndicator::Splash() {
110   Splash(kPageIndicatorSplashTimeoutMs, kPageIndicatorScrollFadeTimeoutMs);
111 }
112
113 void PageIndicator::Splash(uint32 splash_timeout, uint32 fade_timeout) {
114   splash_timeout_ = splash_timeout;
115   fade_timeout_ = fade_timeout;
116   if (!always_visible_)
117     fade_out_timer_id_ = 0;
118   Fade(true, fade_timeout_);
119 }
120
121 int PageIndicator::GetYPosition(
122     int vertical_scrollbar_y, int document_height, int plugin_height) {
123   double percent = static_cast<double>(vertical_scrollbar_y) / document_height;
124   return (plugin_height - rect().height()) * percent;
125 }
126
127 }  // namespace chrome_pdf