• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
PageIndicator()16 PageIndicator::PageIndicator()
17     : current_page_(0),
18       splash_timeout_(kPageIndicatorSplashTimeoutMs),
19       fade_timeout_(kPageIndicatorScrollFadeTimeoutMs),
20       always_visible_(false) {
21 }
22 
~PageIndicator()23 PageIndicator::~PageIndicator() {
24 }
25 
CreatePageIndicator(uint32 id,bool visible,Control::Owner * delegate,NumberImageGenerator * number_image_generator,bool always_visible)26 bool PageIndicator::CreatePageIndicator(
27     uint32 id,
28     bool visible,
29     Control::Owner* delegate,
30     NumberImageGenerator* number_image_generator,
31     bool always_visible) {
32   number_image_generator_ = number_image_generator;
33   always_visible_ = always_visible;
34 
35   pp::Rect rc;
36   bool res = Control::Create(id, rc, visible, delegate);
37   return res;
38 }
39 
Configure(const pp::Point & origin,const pp::ImageData & background)40 void PageIndicator::Configure(const pp::Point& origin,
41                               const pp::ImageData& background) {
42   background_ = background;
43   pp::Rect rc(origin, background_.size());
44   Control::SetRect(rc, false);
45 }
46 
set_current_page(int current_page)47 void PageIndicator::set_current_page(int current_page) {
48   if (current_page_ < 0)
49     return;
50 
51   current_page_ = current_page;
52 }
53 
Paint(pp::ImageData * image_data,const pp::Rect & rc)54 void PageIndicator::Paint(pp::ImageData* image_data, const pp::Rect& rc) {
55   if (!visible())
56     return;
57 
58   pp::Rect draw_rc = rc.Intersect(rect());
59   if (draw_rc.IsEmpty())
60     return;
61 
62   // Copying the background image to a temporary buffer.
63   pp::ImageData buffer(owner()->GetInstance(), background_.format(),
64                        background_.size(), false);
65   CopyImage(background_, pp::Rect(background_.size()),
66             &buffer, pp::Rect(background_.size()), false);
67 
68   // Creating the page number image.
69   pp::ImageData page_number_image;
70   number_image_generator_->GenerateImage(current_page_, &page_number_image);
71 
72   pp::Point origin2(
73       (buffer.size().width() - page_number_image.size().width()) / 2.5,
74       (buffer.size().height() - page_number_image.size().height()) / 2);
75 
76   // Drawing page number image on the buffer.
77   if (origin2.x() > 0 && origin2.y() > 0) {
78     CopyImage(page_number_image,
79               pp::Rect(pp::Point(), page_number_image.size()),
80               &buffer,
81               pp::Rect(origin2, page_number_image.size()),
82               false);
83   }
84 
85   // Drawing the buffer.
86   pp::Point origin = draw_rc.point();
87   draw_rc.Offset(-rect().x(), -rect().y());
88   AlphaBlend(buffer, draw_rc, image_data, origin, transparency());
89 }
90 
OnTimerFired(uint32 timer_id)91 void PageIndicator::OnTimerFired(uint32 timer_id) {
92   FadingControl::OnTimerFired(timer_id);
93   if (timer_id == fade_out_timer_id_) {
94     Fade(false, fade_timeout_);
95   }
96 }
97 
ResetFadeOutTimer()98 void PageIndicator::ResetFadeOutTimer() {
99   fade_out_timer_id_ =
100       owner()->ScheduleTimer(id(), splash_timeout_);
101 }
102 
OnFadeInComplete()103 void PageIndicator::OnFadeInComplete() {
104   if (!always_visible_)
105     ResetFadeOutTimer();
106 }
107 
Splash()108 void PageIndicator::Splash() {
109   Splash(kPageIndicatorSplashTimeoutMs, kPageIndicatorScrollFadeTimeoutMs);
110 }
111 
Splash(uint32 splash_timeout,uint32 fade_timeout)112 void PageIndicator::Splash(uint32 splash_timeout, uint32 fade_timeout) {
113   splash_timeout_ = splash_timeout;
114   fade_timeout_ = fade_timeout;
115   if (!always_visible_)
116     fade_out_timer_id_ = 0;
117   Fade(true, fade_timeout_);
118 }
119 
GetYPosition(int vertical_scrollbar_y,int document_height,int plugin_height)120 int PageIndicator::GetYPosition(
121     int vertical_scrollbar_y, int document_height, int plugin_height) {
122   double percent = static_cast<double>(vertical_scrollbar_y) / document_height;
123   return (plugin_height - rect().height()) * percent;
124 }
125 
126 }  // namespace chrome_pdf
127