Index: pdf/thumbnail_control.cc |
diff --git a/pdf/thumbnail_control.cc b/pdf/thumbnail_control.cc |
deleted file mode 100644 |
index 9a779b29123f05594112d7beadea31139b54d5d0..0000000000000000000000000000000000000000 |
--- a/pdf/thumbnail_control.cc |
+++ /dev/null |
@@ -1,301 +0,0 @@ |
-// 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/thumbnail_control.h" |
- |
-#include <algorithm> |
- |
-#include "base/logging.h" |
-#include "base/strings/string_util.h" |
-#include "pdf/draw_utils.h" |
-#include "pdf/number_image_generator.h" |
- |
-namespace chrome_pdf { |
- |
-const int kLeftBorderSize = 52; |
-const int kBorderSize = 12; |
-const int kHighlightBorderSize = 2; |
- |
-const uint32 kLeftColor = 0x003F537B; |
-const uint32 kRightColor = 0x990D1626; |
- |
-const uint32 kTopHighlightColor = 0xFF426DC9; |
-const uint32 kBottomHighlightColor = 0xFF6391DE; |
-const uint32 kThumbnailBackgroundColor = 0xFF000000; |
- |
-const uint32 kSlidingTimeoutMs = 50; |
-const int32 kSlidingShift = 50; |
- |
-const double kNonSelectedThumbnailAlpha = 0.91; |
- |
-ThumbnailControl::ThumbnailControl() |
- : engine_(NULL), sliding_width_(0), sliding_shift_(kSlidingShift), |
- sliding_timeout_(kSlidingTimeoutMs), sliding_timer_id_(0) { |
-} |
- |
-ThumbnailControl::~ThumbnailControl() { |
- ClearCache(); |
-} |
- |
-bool ThumbnailControl::CreateThumbnailControl( |
- uint32 id, const pp::Rect& rc, |
- bool visible, Owner* owner, PDFEngine* engine, |
- NumberImageGenerator* number_image_generator) { |
- engine_ = engine; |
- number_image_generator_ = number_image_generator; |
- sliding_width_ = rc.width(); |
- |
- return Control::Create(id, rc, visible, owner); |
-} |
- |
-void ThumbnailControl::SetPosition(int position, int total, bool invalidate) { |
- visible_rect_ = pp::Rect(); |
- visible_pages_.clear(); |
- |
- if (rect().width() < kLeftBorderSize + kBorderSize) { |
- return; // control is too narrow to show thumbnails. |
- } |
- |
- int num_pages = engine_->GetNumberOfPages(); |
- |
- int max_doc_width = 0, total_doc_height = 0; |
- std::vector<pp::Rect> page_sizes(num_pages); |
- for (int i = 0; i < num_pages; ++i) { |
- page_sizes[i] = engine_->GetPageRect(i); |
- max_doc_width = std::max(max_doc_width, page_sizes[i].width()); |
- total_doc_height += page_sizes[i].height(); |
- } |
- |
- if (!max_doc_width) |
- return; |
- |
- int max_thumbnail_width = rect().width() - kLeftBorderSize - kBorderSize; |
- double thumbnail_ratio = |
- max_thumbnail_width / static_cast<double>(max_doc_width); |
- |
- int total_thumbnail_height = 0; |
- for (int i = 0; i < num_pages; ++i) { |
- total_thumbnail_height += kBorderSize; |
- int thumbnail_width = |
- static_cast<int>(page_sizes[i].width() * thumbnail_ratio); |
- int thumbnail_height = |
- static_cast<int>(page_sizes[i].height() * thumbnail_ratio); |
- int x = (max_thumbnail_width - thumbnail_width) / 2; |
- page_sizes[i] = |
- pp::Rect(x, total_thumbnail_height, thumbnail_width, thumbnail_height); |
- total_thumbnail_height += thumbnail_height; |
- } |
- total_thumbnail_height += kBorderSize; |
- |
- int visible_y = 0; |
- if (total > 0) { |
- double range = total_thumbnail_height - rect().height(); |
- if (range < 0) |
- range = 0; |
- visible_y = static_cast<int>(range * position / total); |
- } |
- visible_rect_ = pp::Rect(0, visible_y, max_thumbnail_width, rect().height()); |
- |
- for (int i = 0; i < num_pages; ++i) { |
- if (page_sizes[i].Intersects(visible_rect_)) { |
- PageInfo page_info; |
- page_info.index = i; |
- page_info.rect = page_sizes[i]; |
- page_info.rect.Offset(kLeftBorderSize, -visible_rect_.y()); |
- visible_pages_.push_back(page_info); |
- } |
- } |
- |
- if (invalidate) |
- owner()->Invalidate(id(), rect()); |
-} |
- |
-void ThumbnailControl::Show(bool visible, bool invalidate) { |
- if (!visible || invalidate) |
- ClearCache(); |
- sliding_width_ = rect().width(); |
- Control::Show(visible, invalidate); |
-} |
- |
-void ThumbnailControl::SlideIn() { |
- if (visible()) |
- return; |
- |
- Show(true, false); |
- sliding_width_ = 0; |
- sliding_shift_ = kSlidingShift; |
- |
- sliding_timer_id_ = owner()->ScheduleTimer(id(), sliding_timeout_); |
- owner()->Invalidate(id(), rect()); |
-} |
- |
-void ThumbnailControl::SlideOut() { |
- if (!visible()) |
- return; |
- sliding_shift_ = -kSlidingShift; |
- sliding_timer_id_ = owner()->ScheduleTimer(id(), sliding_timeout_); |
-} |
- |
-void ThumbnailControl::Paint(pp::ImageData* image_data, const pp::Rect& rc) { |
- if (!visible()) |
- return; |
- |
- pp::Rect control_rc(rect()); |
- control_rc.Offset(control_rc.width() - sliding_width_, 0); |
- control_rc.set_width(sliding_width_); |
- |
- pp::Rect draw_rc = rc.Intersect(control_rc); |
- if (draw_rc.IsEmpty()) |
- return; |
- |
- pp::Rect gradient_rc(control_rc.x(), draw_rc.y(), |
- control_rc.width(), draw_rc.height()); |
- GradientFill(owner()->GetInstance(), |
- image_data, |
- draw_rc, |
- gradient_rc, |
- kLeftColor, |
- kRightColor, |
- true, |
- transparency()); |
- |
- int selected_page = engine_->GetMostVisiblePage(); |
- for (size_t i = 0; i < visible_pages_.size(); ++i) { |
- pp::Rect page_rc = visible_pages_[i].rect; |
- page_rc.Offset(control_rc.point()); |
- |
- if (visible_pages_[i].index == selected_page) { |
- pp::Rect highlight_rc = page_rc; |
- highlight_rc.Inset(-kHighlightBorderSize, -kHighlightBorderSize); |
- GradientFill(owner()->GetInstance(), |
- image_data, |
- draw_rc, |
- highlight_rc, |
- kTopHighlightColor, |
- kBottomHighlightColor, |
- false, |
- transparency()); |
- } |
- |
- pp::Rect draw_page_rc = page_rc.Intersect(draw_rc); |
- if (draw_page_rc.IsEmpty()) |
- continue; |
- |
- // First search page image in the cache. |
- pp::ImageData* thumbnail = NULL; |
- std::map<int, pp::ImageData*>::iterator it = |
- image_cache_.find(visible_pages_[i].index); |
- if (it != image_cache_.end()) { |
- if (it->second->size() == page_rc.size()) |
- thumbnail = image_cache_[visible_pages_[i].index]; |
- else |
- image_cache_.erase(it); |
- } |
- |
- // If page is not found in the cache, create new one. |
- if (thumbnail == NULL) { |
- thumbnail = new pp::ImageData(owner()->GetInstance(), |
- PP_IMAGEDATAFORMAT_BGRA_PREMUL, |
- page_rc.size(), |
- false); |
- engine_->PaintThumbnail(thumbnail, visible_pages_[i].index); |
- |
- pp::ImageData page_number; |
- number_image_generator_->GenerateImage( |
- visible_pages_[i].index + 1, &page_number); |
- pp::Point origin( |
- (thumbnail->size().width() - page_number.size().width()) / 2, |
- (thumbnail->size().height() - page_number.size().height()) / 2); |
- |
- if (origin.x() > 0 && origin.y() > 0) { |
- AlphaBlend(page_number, pp::Rect(pp::Point(), page_number.size()), |
- thumbnail, origin, kOpaqueAlpha); |
- } |
- |
- image_cache_[visible_pages_[i].index] = thumbnail; |
- } |
- |
- uint8 alpha = transparency(); |
- if (visible_pages_[i].index != selected_page) |
- alpha = static_cast<uint8>(alpha * kNonSelectedThumbnailAlpha); |
- FillRect(image_data, draw_page_rc, kThumbnailBackgroundColor); |
- draw_page_rc.Offset(-page_rc.x(), -page_rc.y()); |
- AlphaBlend(*thumbnail, draw_page_rc, image_data, |
- draw_page_rc.point() + page_rc.point(), alpha); |
- } |
-} |
- |
-bool ThumbnailControl::HandleEvent(const pp::InputEvent& event) { |
- if (!visible()) |
- return false; |
- |
- pp::MouseInputEvent mouse_event(event); |
- if (mouse_event.is_null()) |
- return false; |
- pp::Point pt = mouse_event.GetPosition(); |
- if (!rect().Contains(pt)) |
- return false; |
- |
- int over_page = -1; |
- for (size_t i = 0; i < visible_pages_.size(); ++i) { |
- pp::Rect page_rc = visible_pages_[i].rect; |
- page_rc.Offset(rect().point()); |
- if (page_rc.Contains(pt)) { |
- over_page = i; |
- break; |
- } |
- } |
- |
- bool handled = false; |
- switch (event.GetType()) { |
- case PP_INPUTEVENT_TYPE_MOUSEMOVE: |
- owner()->SetCursor(id(), |
- over_page == -1 ? PP_CURSORTYPE_POINTER : PP_CURSORTYPE_HAND); |
- break; |
- case PP_INPUTEVENT_TYPE_MOUSEDOWN: |
- if (over_page != -1) { |
- owner()->Invalidate(id(), rect()); |
- owner()->OnEvent(id(), EVENT_ID_THUMBNAIL_SELECTED, |
- &visible_pages_[over_page].index); |
- } |
- handled = true; |
- break; |
- default: |
- break; |
- } |
- |
- return handled; |
-} |
- |
-void ThumbnailControl::OnTimerFired(uint32 timer_id) { |
- if (timer_id == sliding_timer_id_) { |
- sliding_width_ += sliding_shift_; |
- if (sliding_width_ <= 0) { |
- // We completely slided out. Make control invisible now. |
- Show(false, false); |
- } else if (sliding_width_ >= rect().width()) { |
- // We completely slided in. Make sliding width to full control width. |
- sliding_width_ = rect().width(); |
- } else { |
- // We have not completed sliding yet. Keep sliding. |
- sliding_timer_id_ = owner()->ScheduleTimer(id(), sliding_timeout_); |
- } |
- owner()->Invalidate(id(), rect()); |
- } |
-} |
- |
-void ThumbnailControl::ResetEngine(PDFEngine* engine) { |
- engine_ = engine; |
- ClearCache(); |
-} |
- |
-void ThumbnailControl::ClearCache() { |
- std::map<int, pp::ImageData*>::iterator it; |
- for (it = image_cache_.begin(); it != image_cache_.end(); ++it) { |
- delete it->second; |
- } |
- image_cache_.clear(); |
-} |
- |
-} // namespace chrome_pdf |