// 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