diff options
Diffstat (limited to 'xfa_test/pdf/page_indicator.cc')
-rw-r--r-- | xfa_test/pdf/page_indicator.cc | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/xfa_test/pdf/page_indicator.cc b/xfa_test/pdf/page_indicator.cc new file mode 100644 index 0000000000..c4af1e07b7 --- /dev/null +++ b/xfa_test/pdf/page_indicator.cc @@ -0,0 +1,127 @@ +// 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), + fade_out_timer_id_(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 |