summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pdf/pdf_engine.h5
-rw-r--r--pdf/pdfium/pdfium_engine.cc41
-rw-r--r--pdf/pdfium/pdfium_engine.h7
3 files changed, 50 insertions, 3 deletions
diff --git a/pdf/pdf_engine.h b/pdf/pdf_engine.h
index c5d33c8..7df4bff2 100644
--- a/pdf/pdf_engine.h
+++ b/pdf/pdf_engine.h
@@ -222,6 +222,7 @@ class PDFEngine {
virtual void RotateCounterclockwise() = 0;
virtual std::string GetSelectedText() = 0;
virtual std::string GetLinkAtPosition(const pp::Point& point) = 0;
+ virtual bool IsSelecting() = 0;
// Checks the permissions associated with this document.
virtual bool HasPermission(DocumentPermission permission) const = 0;
virtual void SelectAll() = 0;
@@ -229,6 +230,8 @@ class PDFEngine {
virtual int GetNumberOfPages() = 0;
// Gets the 0-based page number of |destination|, or -1 if it does not exist.
virtual int GetNamedDestinationPage(const std::string& destination) = 0;
+ // Gets the index of the first visible page, or -1 if none are visible.
+ virtual int GetFirstVisiblePage() = 0;
// Gets the index of the most visible page, or -1 if none are visible.
virtual int GetMostVisiblePage() = 0;
// Gets the rectangle of the page including shadow.
@@ -241,6 +244,8 @@ class PDFEngine {
// Gets the offset of the vertical scrollbar from the top in document
// coordinates.
virtual int GetVerticalScrollbarYPosition() = 0;
+ // Paints page thumbnail to the ImageData.
+ virtual void PaintThumbnail(pp::ImageData* image_data, int index) = 0;
// Set color / grayscale rendering modes.
virtual void SetGrayscale(bool grayscale) = 0;
// Callback for timer that's set with ScheduleCallback().
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 87c7dcc..83291bc 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -534,6 +534,7 @@ PDFiumEngine::PDFiumEngine(PDFEngine::Client* client)
fpdf_availability_(NULL),
next_timer_id_(0),
last_page_mouse_down_(-1),
+ first_visible_page_(-1),
most_visible_page_(-1),
called_do_document_action_(false),
render_grayscale_(false),
@@ -2266,6 +2267,10 @@ std::string PDFiumEngine::GetLinkAtPosition(const pp::Point& point) {
return url;
}
+bool PDFiumEngine::IsSelecting() {
+ return selecting_;
+}
+
bool PDFiumEngine::HasPermission(DocumentPermission permission) const {
// PDF 1.7 spec, section 3.5.2 says: "If the revision number is 2 or greater,
// the operations to which user access can be controlled are as follows: ..."
@@ -2334,6 +2339,11 @@ int PDFiumEngine::GetNamedDestinationPage(const std::string& destination) {
return dest ? FPDFDest_GetPageIndex(doc_, dest) : -1;
}
+int PDFiumEngine::GetFirstVisiblePage() {
+ CalculateVisiblePages();
+ return first_visible_page_;
+}
+
int PDFiumEngine::GetMostVisiblePage() {
CalculateVisiblePages();
return most_visible_page_;
@@ -2350,6 +2360,26 @@ pp::Rect PDFiumEngine::GetPageContentsRect(int index) {
return GetScreenRect(pages_[index]->rect());
}
+void PDFiumEngine::PaintThumbnail(pp::ImageData* image_data, int index) {
+ FPDF_BITMAP bitmap = FPDFBitmap_CreateEx(
+ image_data->size().width(), image_data->size().height(),
+ FPDFBitmap_BGRx, image_data->data(), image_data->stride());
+
+ if (pages_[index]->available()) {
+ FPDFBitmap_FillRect(bitmap, 0, 0, image_data->size().width(),
+ image_data->size().height(), 0xFFFFFFFF);
+
+ FPDF_RenderPageBitmap(
+ bitmap, pages_[index]->GetPage(), 0, 0, image_data->size().width(),
+ image_data->size().height(), 0, GetRenderingFlags());
+ } else {
+ FPDFBitmap_FillRect(bitmap, 0, 0, image_data->size().width(),
+ image_data->size().height(), kPendingPageColor);
+ }
+
+ FPDFBitmap_Destroy(bitmap);
+}
+
void PDFiumEngine::SetGrayscale(bool grayscale) {
render_grayscale_ = grayscale;
}
@@ -2678,10 +2708,15 @@ void PDFiumEngine::CalculateVisiblePages() {
// screen coordinates.
form_highlights_.clear();
- int most_visible_page = visible_pages_.empty() ? 0 : visible_pages_.front();
- DCHECK_GE(most_visible_page, 0);
+ if (visible_pages_.size() == 0)
+ first_visible_page_ = -1;
+ else
+ first_visible_page_ = visible_pages_.front();
+
+ int most_visible_page = first_visible_page_;
// Check if the next page is more visible than the first one.
- if (!pages_.empty() &&
+ if (most_visible_page != -1 &&
+ pages_.size() > 0 &&
most_visible_page < static_cast<int>(pages_.size()) - 1) {
pp::Rect rc_first =
visible_rect.Intersect(GetPageScreenRect(most_visible_page));
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h
index e0b8af5..88a2575 100644
--- a/pdf/pdfium/pdfium_engine.h
+++ b/pdf/pdfium/pdfium_engine.h
@@ -77,16 +77,19 @@ class PDFiumEngine : public PDFEngine,
void RotateCounterclockwise() override;
std::string GetSelectedText() override;
std::string GetLinkAtPosition(const pp::Point& point) override;
+ bool IsSelecting() override;
bool HasPermission(DocumentPermission permission) const override;
void SelectAll() override;
int GetNumberOfPages() override;
pp::VarArray GetBookmarks() override;
int GetNamedDestinationPage(const std::string& destination) override;
+ int GetFirstVisiblePage() override;
int GetMostVisiblePage() override;
pp::Rect GetPageRect(int index) override;
pp::Rect GetPageContentsRect(int index) override;
pp::Rect GetPageScreenRect(int page_index) const override;
int GetVerticalScrollbarYPosition() override { return position_.y(); }
+ void PaintThumbnail(pp::ImageData* image_data, int index) override;
void SetGrayscale(bool grayscale) override;
void OnCallback(int id) override;
std::string GetPageAsJSON(int index) override;
@@ -667,6 +670,10 @@ class PDFiumEngine : public PDFEngine,
// Holds the page index of the last page that the mouse clicked on.
int last_page_mouse_down_;
+ // Holds the page index of the first visible page; refreshed by calling
+ // CalculateVisiblePages()
+ int first_visible_page_;
+
// Holds the page index of the most visible page; refreshed by calling
// CalculateVisiblePages()
int most_visible_page_;