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 128