| // 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/page_indicator.h" |
| |
| #include "base/logging.h" |
| #include "base/strings/string_util.h" |
| #include "pdf/draw_utils.h" |
| #include "pdf/number_image_generator.h" |
| #include "pdf/resource_consts.h" |
| |
| namespace chrome_pdf { |
| |
| |
| PageIndicator::PageIndicator() |
| : current_page_(0), |
| splash_timeout_(kPageIndicatorSplashTimeoutMs), |
| fade_timeout_(kPageIndicatorScrollFadeTimeoutMs), |
| always_visible_(false) { |
| } |
| |
| PageIndicator::~PageIndicator() { |
| } |
| |
| bool PageIndicator::CreatePageIndicator( |
| uint32 id, |
| bool visible, |
| Control::Owner* delegate, |
| NumberImageGenerator* number_image_generator, |
| bool always_visible) { |
| number_image_generator_ = number_image_generator; |
| always_visible_ = always_visible; |
| |
| pp::Rect rc; |
| bool res = Control::Create(id, rc, visible, delegate); |
| return res; |
| } |
| |
| void PageIndicator::Configure(const pp::Point& origin, |
| const pp::ImageData& background) { |
| background_ = background; |
| pp::Rect rc(origin, background_.size()); |
| Control::SetRect(rc, false); |
| } |
| |
| void PageIndicator::set_current_page(int current_page) { |
| if (current_page_ < 0) |
| return; |
| |
| current_page_ = current_page; |
| } |
| |
| void PageIndicator::Paint(pp::ImageData* image_data, const pp::Rect& rc) { |
| if (!visible()) |
| return; |
| |
| pp::Rect draw_rc = rc.Intersect(rect()); |
| if (draw_rc.IsEmpty()) |
| return; |
| |
| // Copying the background image to a temporary buffer. |
| pp::ImageData buffer(owner()->GetInstance(), background_.format(), |
| background_.size(), false); |
| CopyImage(background_, pp::Rect(background_.size()), |
| &buffer, pp::Rect(background_.size()), false); |
| |
| // Creating the page number image. |
| pp::ImageData page_number_image; |
| number_image_generator_->GenerateImage(current_page_, &page_number_image); |
| |
| pp::Point origin2( |
| (buffer.size().width() - page_number_image.size().width()) / 2.5, |
| (buffer.size().height() - page_number_image.size().height()) / 2); |
| |
| // Drawing page number image on the buffer. |
| if (origin2.x() > 0 && origin2.y() > 0) { |
| CopyImage(page_number_image, |
| pp::Rect(pp::Point(), page_number_image.size()), |
| &buffer, |
| pp::Rect(origin2, page_number_image.size()), |
| false); |
| } |
| |
| // Drawing the buffer. |
| pp::Point origin = draw_rc.point(); |
| draw_rc.Offset(-rect().x(), -rect().y()); |
| AlphaBlend(buffer, draw_rc, image_data, origin, transparency()); |
| } |
| |
| void PageIndicator::OnTimerFired(uint32 timer_id) { |
| FadingControl::OnTimerFired(timer_id); |
| if (timer_id == fade_out_timer_id_) { |
| Fade(false, fade_timeout_); |
| } |
| } |
| |
| void PageIndicator::ResetFadeOutTimer() { |
| fade_out_timer_id_ = |
| owner()->ScheduleTimer(id(), splash_timeout_); |
| } |
| |
| void PageIndicator::OnFadeInComplete() { |
| if (!always_visible_) |
| ResetFadeOutTimer(); |
| } |
| |
| void PageIndicator::Splash() { |
| Splash(kPageIndicatorSplashTimeoutMs, kPageIndicatorScrollFadeTimeoutMs); |
| } |
| |
| void PageIndicator::Splash(uint32 splash_timeout, uint32 fade_timeout) { |
| splash_timeout_ = splash_timeout; |
| fade_timeout_ = fade_timeout; |
| if (!always_visible_) |
| fade_out_timer_id_ = 0; |
| Fade(true, fade_timeout_); |
| } |
| |
| int PageIndicator::GetYPosition( |
| int vertical_scrollbar_y, int document_height, int plugin_height) { |
| double percent = static_cast<double>(vertical_scrollbar_y) / document_height; |
| return (plugin_height - rect().height()) * percent; |
| } |
| |
| } // namespace chrome_pdf |