1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef PDF_PDFIUM_PDFIUM_ENGINE_H_
6 #define PDF_PDFIUM_PDFIUM_ENGINE_H_
13 #include "base/memory/scoped_ptr.h"
14 #include "base/time/time.h"
15 #include "pdf/document_loader.h"
16 #include "pdf/pdf_engine.h"
17 #include "pdf/pdfium/pdfium_page.h"
18 #include "pdf/pdfium/pdfium_range.h"
19 #include "ppapi/cpp/completion_callback.h"
20 #include "ppapi/cpp/dev/buffer_dev.h"
21 #include "ppapi/cpp/image_data.h"
22 #include "ppapi/cpp/point.h"
23 #include "ppapi/cpp/var_array.h"
24 #include "third_party/pdfium/public/fpdf_dataavail.h"
25 #include "third_party/pdfium/public/fpdf_formfill.h"
26 #include "third_party/pdfium/public/fpdf_progressive.h"
27 #include "third_party/pdfium/public/fpdfview.h"
30 class KeyboardInputEvent
;
31 class MouseInputEvent
;
35 namespace chrome_pdf
{
39 class PDFiumEngine
: public PDFEngine
,
40 public DocumentLoader::Client
,
41 public FPDF_FORMFILLINFO
,
42 public IPDF_JSPLATFORM
,
45 explicit PDFiumEngine(PDFEngine::Client
* client
);
46 virtual ~PDFiumEngine();
48 // PDFEngine implementation.
49 virtual bool New(const char* url
, const char* headers
);
50 virtual void PageOffsetUpdated(const pp::Point
& page_offset
);
51 virtual void PluginSizeUpdated(const pp::Size
& size
);
52 virtual void ScrolledToXPosition(int position
);
53 virtual void ScrolledToYPosition(int position
);
54 virtual void PrePaint();
55 virtual void Paint(const pp::Rect
& rect
,
56 pp::ImageData
* image_data
,
57 std::vector
<pp::Rect
>* ready
,
58 std::vector
<pp::Rect
>* pending
);
59 virtual void PostPaint();
60 virtual bool HandleDocumentLoad(const pp::URLLoader
& loader
);
61 virtual bool HandleEvent(const pp::InputEvent
& event
);
62 virtual uint32_t QuerySupportedPrintOutputFormats();
63 virtual void PrintBegin();
64 virtual pp::Resource
PrintPages(
65 const PP_PrintPageNumberRange_Dev
* page_ranges
,
66 uint32_t page_range_count
,
67 const PP_PrintSettings_Dev
& print_settings
);
68 virtual void PrintEnd();
69 virtual void StartFind(const char* text
, bool case_sensitive
);
70 virtual bool SelectFindResult(bool forward
);
71 virtual void StopFind();
72 virtual void ZoomUpdated(double new_zoom_level
);
73 virtual void RotateClockwise();
74 virtual void RotateCounterclockwise();
75 virtual std::string
GetSelectedText();
76 virtual std::string
GetLinkAtPosition(const pp::Point
& point
);
77 virtual bool IsSelecting();
78 virtual bool HasPermission(DocumentPermission permission
) const;
79 virtual void SelectAll();
80 virtual int GetNumberOfPages();
81 virtual pp::VarArray
GetBookmarks();
82 virtual int GetNamedDestinationPage(const std::string
& destination
);
83 virtual int GetFirstVisiblePage();
84 virtual int GetMostVisiblePage();
85 virtual pp::Rect
GetPageRect(int index
);
86 virtual pp::Rect
GetPageContentsRect(int index
);
87 virtual int GetVerticalScrollbarYPosition() { return position_
.y(); }
88 virtual void PaintThumbnail(pp::ImageData
* image_data
, int index
);
89 virtual void SetGrayscale(bool grayscale
);
90 virtual void OnCallback(int id
);
91 virtual std::string
GetPageAsJSON(int index
);
92 virtual bool GetPrintScaling();
93 virtual int GetCopiesToPrint();
94 virtual int GetDuplexType();
95 virtual bool GetPageSizeAndUniformity(pp::Size
* size
);
96 virtual void AppendBlankPages(int num_pages
);
97 virtual void AppendPage(PDFEngine
* engine
, int index
);
98 virtual pp::Point
GetScrollPosition();
99 virtual void SetScrollPosition(const pp::Point
& position
);
100 virtual bool IsProgressiveLoad();
102 // DocumentLoader::Client implementation.
103 virtual pp::Instance
* GetPluginInstance();
104 virtual pp::URLLoader
CreateURLLoader();
105 virtual void OnPartialDocumentLoaded();
106 virtual void OnPendingRequestComplete();
107 virtual void OnNewDataAvailable();
108 virtual void OnDocumentComplete();
110 void UnsupportedFeature(int type
);
112 std::string
current_find_text() const { return current_find_text_
; }
114 FPDF_DOCUMENT
doc() { return doc_
; }
115 FPDF_FORMHANDLE
form() { return form_
; }
118 // This helper class is used to detect the difference in selection between
119 // construction and destruction. At destruction, it invalidates all the
120 // parts that are newly selected, along with all the parts that used to be
121 // selected but are not anymore.
122 class SelectionChangeInvalidator
{
124 explicit SelectionChangeInvalidator(PDFiumEngine
* engine
);
125 ~SelectionChangeInvalidator();
127 // Sets the given container to the all the currently visible selection
128 // rectangles, in screen coordinates.
129 void GetVisibleSelectionsScreenRects(std::vector
<pp::Rect
>* rects
);
131 PDFiumEngine
* engine_
;
132 // Screen rectangles that were selected on construction.
133 std::vector
<pp::Rect
> old_selections_
;
134 // The origin at the time this object was constructed.
135 pp::Point previous_origin_
;
138 // Used to store mouse down state to handle it in other mouse event handlers.
139 class MouseDownState
{
141 MouseDownState(const PDFiumPage::Area
& area
,
142 const PDFiumPage::LinkTarget
& target
);
145 void Set(const PDFiumPage::Area
& area
,
146 const PDFiumPage::LinkTarget
& target
);
148 bool Matches(const PDFiumPage::Area
& area
,
149 const PDFiumPage::LinkTarget
& target
) const;
152 PDFiumPage::Area area_
;
153 PDFiumPage::LinkTarget target_
;
155 DISALLOW_COPY_AND_ASSIGN(MouseDownState
);
158 // Used to store the state of a text search.
159 class FindTextIndex
{
164 bool valid() const { return valid_
; }
167 size_t GetIndex() const;
168 void SetIndex(size_t index
);
169 size_t IncrementIndex();
172 bool valid_
; // Whether |index_| is valid or not.
173 size_t index_
; // The current search result, 0-based.
175 DISALLOW_COPY_AND_ASSIGN(FindTextIndex
);
178 friend class SelectionChangeInvalidator
;
180 struct FileAvail
: public FX_FILEAVAIL
{
181 DocumentLoader
* loader
;
184 struct DownloadHints
: public FX_DOWNLOADHINTS
{
185 DocumentLoader
* loader
;
188 // PDFium interface to get block of data.
189 static int GetBlock(void* param
, unsigned long position
,
190 unsigned char* buffer
, unsigned long size
);
192 // PDFium interface to check is block of data is available.
193 static FPDF_BOOL
IsDataAvail(FX_FILEAVAIL
* param
,
194 size_t offset
, size_t size
);
196 // PDFium interface to request download of the block of data.
197 static void AddSegment(FX_DOWNLOADHINTS
* param
,
198 size_t offset
, size_t size
);
200 // We finished getting the pdf file, so load it. This will complete
201 // asynchronously (due to password fetching) and may be run multiple times.
204 // Try loading the document. Returns true if the document is successfully
205 // loaded or is already loaded otherwise it will return false. If
206 // |with_password| is set to true, the document will be loaded with
207 // |password|. If the document could not be loaded and needs a password,
208 // |needs_password| will be set to true.
209 bool TryLoadingDoc(bool with_password
,
210 const std::string
& password
,
211 bool* needs_password
);
213 // Ask the user for the document password and then continue loading the
215 void GetPasswordAndLoad();
217 // Called when the password has been retrieved.
218 void OnGetPasswordComplete(int32_t result
,
219 const pp::Var
& password
);
221 // Continues loading the document when the password has been retrieved, or if
222 // there is no password.
223 void ContinueLoadingDocument(bool has_password
,
224 const std::string
& password
);
226 // Finish loading the document and notify the client that the document has
227 // been loaded. This should only be run after |doc_| has been loaded and the
228 // document is fully downloaded. If this has been run once, it will result in
230 void FinishLoadingDocument();
232 // Loads information about the pages in the document and calculate the
234 void LoadPageInfo(bool reload
);
236 // Calculate which pages should be displayed right now.
237 void CalculateVisiblePages();
239 // Returns true iff the given page index is visible. CalculateVisiblePages
240 // must have been called first.
241 bool IsPageVisible(int index
) const;
243 // Checks if a page is now available, and if so marks it as such and returns
244 // true. Otherwise, it will return false and will add the index to the given
245 // array if it's not already there.
246 bool CheckPageAvailable(int index
, std::vector
<int>* pending
);
248 // Helper function to get a given page's size in pixels. This is not part of
249 // PDFiumPage because we might not have that structure when we need this.
250 pp::Size
GetPageSize(int index
);
252 void GetAllScreenRectsUnion(std::vector
<PDFiumRange
>* rect_range
,
253 const pp::Point
& offset_point
,
254 std::vector
<pp::Rect
>* rect_vector
);
256 void UpdateTickMarks();
258 // Called to continue searching so we don't block the main thread.
259 void ContinueFind(int32_t result
);
261 // Inserts a find result into find_results_, which is sorted.
262 void AddFindResult(const PDFiumRange
& result
);
264 // Search a page using PDFium's methods. Doesn't work with unicode. This
265 // function is just kept arount in case PDFium code is fixed.
266 void SearchUsingPDFium(const base::string16
& term
,
269 int character_to_start_searching_from
,
272 // Search a page ourself using ICU.
273 void SearchUsingICU(const base::string16
& term
,
276 int character_to_start_searching_from
,
279 // Input event handlers.
280 bool OnMouseDown(const pp::MouseInputEvent
& event
);
281 bool OnMouseUp(const pp::MouseInputEvent
& event
);
282 bool OnMouseMove(const pp::MouseInputEvent
& event
);
283 bool OnKeyDown(const pp::KeyboardInputEvent
& event
);
284 bool OnKeyUp(const pp::KeyboardInputEvent
& event
);
285 bool OnChar(const pp::KeyboardInputEvent
& event
);
287 FPDF_DOCUMENT
CreateSinglePageRasterPdf(
288 double source_page_width
,
289 double source_page_height
,
290 const PP_PrintSettings_Dev
& print_settings
,
291 PDFiumPage
* page_to_print
);
293 pp::Buffer_Dev
PrintPagesAsRasterPDF(
294 const PP_PrintPageNumberRange_Dev
* page_ranges
,
295 uint32_t page_range_count
,
296 const PP_PrintSettings_Dev
& print_settings
);
298 pp::Buffer_Dev
PrintPagesAsPDF(const PP_PrintPageNumberRange_Dev
* page_ranges
,
299 uint32_t page_range_count
,
300 const PP_PrintSettings_Dev
& print_settings
);
302 pp::Buffer_Dev
GetFlattenedPrintData(const FPDF_DOCUMENT
& doc
);
303 void FitContentsToPrintableAreaIfRequired(
304 const FPDF_DOCUMENT
& doc
,
305 const PP_PrintSettings_Dev
& print_settings
);
306 void SaveSelectedFormForPrint();
308 // Given a mouse event, returns which page and character location it's closest
310 PDFiumPage::Area
GetCharIndex(const pp::MouseInputEvent
& event
,
314 PDFiumPage::LinkTarget
* target
);
315 PDFiumPage::Area
GetCharIndex(const pp::Point
& point
,
319 PDFiumPage::LinkTarget
* target
);
321 void OnSingleClick(int page_index
, int char_index
);
322 void OnMultipleClick(int click_count
, int page_index
, int char_index
);
324 // Starts a progressive paint operation given a rectangle in screen
325 // coordinates. Returns the index in progressive_rects_.
326 int StartPaint(int page_index
, const pp::Rect
& dirty
);
328 // Continues a paint operation that was started earlier. Returns true if the
329 // paint is done, or false if it needs to be continued.
330 bool ContinuePaint(int progressive_index
, pp::ImageData
* image_data
);
332 // Called once PDFium is finished rendering a page so that we draw our
333 // borders, highlighting etc.
334 void FinishPaint(int progressive_index
, pp::ImageData
* image_data
);
336 // Stops any paints that are in progress.
339 // Invalidates all pages. Use this when some global parameter, such as page
340 // orientation, has changed.
341 void InvalidateAllPages();
343 // If the page is narrower than the document size, paint the extra space
344 // with the page background.
345 void FillPageSides(int progressive_index
);
347 void PaintPageShadow(int progressive_index
, pp::ImageData
* image_data
);
349 // Highlight visible find results and selections.
350 void DrawSelections(int progressive_index
, pp::ImageData
* image_data
);
352 // Paints an page that hasn't finished downloading.
353 void PaintUnavailablePage(int page_index
,
354 const pp::Rect
& dirty
,
355 pp::ImageData
* image_data
);
357 // Given a page index, returns the corresponding index in progressive_rects_,
358 // or -1 if it doesn't exist.
359 int GetProgressiveIndex(int page_index
) const;
361 // Creates a FPDF_BITMAP from a rectangle in screen coordinates.
362 FPDF_BITMAP
CreateBitmap(const pp::Rect
& rect
,
363 pp::ImageData
* image_data
) const;
365 // Given a rectangle in screen coordinates, returns the coordinates in the
366 // units that PDFium rendering functions expect.
367 void GetPDFiumRect(int page_index
, const pp::Rect
& rect
, int* start_x
,
368 int* start_y
, int* size_x
, int* size_y
) const;
370 // Returns the rendering flags to pass to PDFium.
371 int GetRenderingFlags() const;
373 // Returns the currently visible rectangle in document coordinates.
374 pp::Rect
GetVisibleRect() const;
376 // Returns a page's rect in screen coordinates, as well as its surrounding
377 // border areas and bottom separator.
378 pp::Rect
GetPageScreenRect(int page_index
) const;
380 // Given a rectangle in document coordinates, returns the rectange into screen
381 // coordinates (i.e. 0,0 is top left corner of plugin area). If it's not
382 // visible, an empty rectangle is returned.
383 pp::Rect
GetScreenRect(const pp::Rect
& rect
) const;
385 // Highlights the given rectangle.
386 void Highlight(void* buffer
,
388 const pp::Rect
& rect
,
389 std::vector
<pp::Rect
>* highlighted_rects
);
391 // Helper function to convert a device to page coordinates. If the page is
392 // not yet loaded, page_x and page_y will be set to 0.
393 void DeviceToPage(int page_index
,
399 // Helper function to get the index of a given FPDF_PAGE. Returns -1 if not
401 int GetVisiblePageIndex(FPDF_PAGE page
);
403 // Helper function to change the current page, running page open/close
404 // triggers as necessary.
405 void SetCurrentPage(int index
);
407 // Transform |page| contents to fit in the selected printer paper size.
408 void TransformPDFPageForPrinting(FPDF_PAGE page
,
409 const PP_PrintSettings_Dev
& print_settings
);
411 void DrawPageShadow(const pp::Rect
& page_rect
,
412 const pp::Rect
& shadow_rect
,
413 const pp::Rect
& clip_rect
,
414 pp::ImageData
* image_data
);
416 void GetRegion(const pp::Point
& location
,
417 pp::ImageData
* image_data
,
421 // Called when the selection changes.
422 void OnSelectionChanged();
424 // Common code shared by RotateClockwise() and RotateCounterclockwise().
425 void RotateInternal();
427 // Setting selection status of document.
428 void SetSelecting(bool selecting
);
430 // FPDF_FORMFILLINFO callbacks.
431 static void Form_Invalidate(FPDF_FORMFILLINFO
* param
,
437 static void Form_OutputSelectedRect(FPDF_FORMFILLINFO
* param
,
443 static void Form_SetCursor(FPDF_FORMFILLINFO
* param
, int cursor_type
);
444 static int Form_SetTimer(FPDF_FORMFILLINFO
* param
,
446 TimerCallback timer_func
);
447 static void Form_KillTimer(FPDF_FORMFILLINFO
* param
, int timer_id
);
448 static FPDF_SYSTEMTIME
Form_GetLocalTime(FPDF_FORMFILLINFO
* param
);
449 static void Form_OnChange(FPDF_FORMFILLINFO
* param
);
450 static FPDF_PAGE
Form_GetPage(FPDF_FORMFILLINFO
* param
,
451 FPDF_DOCUMENT document
,
453 static FPDF_PAGE
Form_GetCurrentPage(FPDF_FORMFILLINFO
* param
,
454 FPDF_DOCUMENT document
);
455 static int Form_GetRotation(FPDF_FORMFILLINFO
* param
, FPDF_PAGE page
);
456 static void Form_ExecuteNamedAction(FPDF_FORMFILLINFO
* param
,
457 FPDF_BYTESTRING named_action
);
458 static void Form_SetTextFieldFocus(FPDF_FORMFILLINFO
* param
,
459 FPDF_WIDESTRING value
,
462 static void Form_DoURIAction(FPDF_FORMFILLINFO
* param
, FPDF_BYTESTRING uri
);
463 static void Form_DoGoToAction(FPDF_FORMFILLINFO
* param
,
466 float* position_array
,
469 // IPDF_JSPLATFORM callbacks.
470 static int Form_Alert(IPDF_JSPLATFORM
* param
,
471 FPDF_WIDESTRING message
,
472 FPDF_WIDESTRING title
,
475 static void Form_Beep(IPDF_JSPLATFORM
* param
, int type
);
476 static int Form_Response(IPDF_JSPLATFORM
* param
,
477 FPDF_WIDESTRING question
,
478 FPDF_WIDESTRING title
,
479 FPDF_WIDESTRING default_response
,
480 FPDF_WIDESTRING label
,
484 static int Form_GetFilePath(IPDF_JSPLATFORM
* param
,
487 static void Form_Mail(IPDF_JSPLATFORM
* param
,
492 FPDF_WIDESTRING subject
,
495 FPDF_WIDESTRING message
);
496 static void Form_Print(IPDF_JSPLATFORM
* param
,
501 FPDF_BOOL shrink_to_fit
,
502 FPDF_BOOL print_as_image
,
504 FPDF_BOOL annotations
);
505 static void Form_SubmitForm(IPDF_JSPLATFORM
* param
,
508 FPDF_WIDESTRING url
);
509 static void Form_GotoPage(IPDF_JSPLATFORM
* param
, int page_number
);
510 static int Form_Browse(IPDF_JSPLATFORM
* param
, void* file_path
, int length
);
513 static void Form_EmailTo(FPDF_FORMFILLINFO
* param
,
514 FPDF_FILEHANDLER
* file_handler
,
516 FPDF_WIDESTRING subject
,
519 FPDF_WIDESTRING message
);
520 static void Form_DisplayCaret(FPDF_FORMFILLINFO
* param
,
527 static void Form_SetCurrentPage(FPDF_FORMFILLINFO
* param
,
528 FPDF_DOCUMENT document
,
530 static int Form_GetCurrentPageIndex(FPDF_FORMFILLINFO
* param
,
531 FPDF_DOCUMENT document
);
532 static void Form_GetPageViewRect(FPDF_FORMFILLINFO
* param
,
538 static int Form_GetPlatform(FPDF_FORMFILLINFO
* param
,
541 static FPDF_BOOL
Form_PopupMenu(FPDF_FORMFILLINFO
* param
,
547 static FPDF_BOOL
Form_PostRequestURL(FPDF_FORMFILLINFO
* param
,
549 FPDF_WIDESTRING data
,
550 FPDF_WIDESTRING content_type
,
551 FPDF_WIDESTRING encode
,
552 FPDF_WIDESTRING header
,
553 FPDF_BSTR
* response
);
554 static FPDF_BOOL
Form_PutRequestURL(FPDF_FORMFILLINFO
* param
,
556 FPDF_WIDESTRING data
,
557 FPDF_WIDESTRING encode
);
558 static void Form_UploadTo(FPDF_FORMFILLINFO
* param
,
559 FPDF_FILEHANDLER
* file_handler
,
561 FPDF_WIDESTRING dest
);
562 static FPDF_LPFILEHANDLER
Form_DownloadFromURL(FPDF_FORMFILLINFO
* param
,
563 FPDF_WIDESTRING url
);
564 static FPDF_FILEHANDLER
* Form_OpenFile(FPDF_FORMFILLINFO
* param
,
568 static void Form_GotoURL(FPDF_FORMFILLINFO
* param
,
569 FPDF_DOCUMENT document
,
570 FPDF_WIDESTRING url
);
571 static int Form_GetLanguage(FPDF_FORMFILLINFO
* param
,
574 #endif // PDF_USE_XFA
576 // IFSDK_PAUSE callbacks
577 static FPDF_BOOL
Pause_NeedToPauseNow(IFSDK_PAUSE
* param
);
579 PDFEngine::Client
* client_
;
580 pp::Size document_size_
; // Size of document in pixels.
582 // The scroll position in screen coordinates.
584 // The offset of the page into the viewport.
585 pp::Point page_offset_
;
586 // The plugin size in screen coordinates.
587 pp::Size plugin_size_
;
588 double current_zoom_
;
589 unsigned int current_rotation_
;
591 DocumentLoader doc_loader_
; // Main document's loader.
593 std::string headers_
;
594 pp::CompletionCallbackFactory
<PDFiumEngine
> find_factory_
;
596 pp::CompletionCallbackFactory
<PDFiumEngine
> password_factory_
;
597 int32_t password_tries_remaining_
;
599 // The current text used for searching.
600 std::string current_find_text_
;
602 // The PDFium wrapper object for the document.
605 // The PDFium wrapper for form data. Used even if there are no form controls
607 FPDF_FORMHANDLE form_
;
609 // The page(s) of the document. Store a vector of pointers so that when the
610 // vector is resized we don't close the pages that are used in pending
612 std::vector
<PDFiumPage
*> pages_
;
614 // The indexes of the pages currently visible.
615 std::vector
<int> visible_pages_
;
617 // The indexes of the pages pending download.
618 std::vector
<int> pending_pages_
;
620 // During handling of input events we don't want to unload any pages in
621 // callbacks to us from PDFium, since the current page can change while PDFium
622 // code still has a pointer to it.
623 bool defer_page_unload_
;
624 std::vector
<int> deferred_page_unloads_
;
626 // Used for selection. There could be more than one range if selection spans
627 // more than one page.
628 std::vector
<PDFiumRange
> selection_
;
629 // True if we're in the middle of selection.
632 MouseDownState mouse_down_state_
;
634 // Used for searching.
635 typedef std::vector
<PDFiumRange
> FindResults
;
636 FindResults find_results_
;
637 // Which page to search next.
638 int next_page_to_search_
;
639 // Where to stop searching.
640 int last_page_to_search_
;
641 int last_character_index_to_search_
; // -1 if search until end of page.
642 // Which result the user has currently selected.
643 FindTextIndex current_find_index_
;
644 // Where to resume searching.
645 FindTextIndex resume_find_index_
;
647 // Permissions bitfield.
648 unsigned long permissions_
;
650 // Permissions security handler revision number. -1 for unknown.
651 int permissions_handler_revision_
;
653 // Interface structure to provide access to document stream.
654 FPDF_FILEACCESS file_access_
;
655 // Interface structure to check data availability in the document stream.
656 FileAvail file_availability_
;
657 // Interface structure to request data chunks from the document stream.
658 DownloadHints download_hints_
;
659 // Pointer to the document availability interface.
660 FPDF_AVAIL fpdf_availability_
;
662 pp::Size default_page_size_
;
664 // Used to manage timers that form fill API needs. The pair holds the timer
665 // period, in ms, and the callback function.
666 std::map
<int, std::pair
<int, TimerCallback
> > timers_
;
669 // Holds the page index of the last page that the mouse clicked on.
670 int last_page_mouse_down_
;
672 // Holds the page index of the first visible page; refreshed by calling
673 // CalculateVisiblePages()
674 int first_visible_page_
;
676 // Holds the page index of the most visible page; refreshed by calling
677 // CalculateVisiblePages()
678 int most_visible_page_
;
680 // Set to true after FORM_DoDocumentJSAction/FORM_DoDocumentOpenAction have
681 // been called. Only after that can we call FORM_DoPageAAction.
682 bool called_do_document_action_
;
684 // Records parts of form fields that need to be highlighted at next paint, in
685 // screen coordinates.
686 std::vector
<pp::Rect
> form_highlights_
;
688 // Whether to render in grayscale or in color.
689 bool render_grayscale_
;
691 // The link currently under the cursor.
692 std::string link_under_cursor_
;
694 // Pending progressive paints.
695 struct ProgressivePaint
{
696 pp::Rect rect
; // In screen coordinates.
699 // Temporary used to figure out if in a series of Paint() calls whether this
700 // pending paint was updated or not.
703 std::vector
<ProgressivePaint
> progressive_paints_
;
705 // Keeps track of when we started the last progressive paint, so that in our
706 // callback we can determine if we need to pause.
707 base::Time last_progressive_start_time_
;
709 // The timeout to use for the current progressive paint.
710 int progressive_paint_timeout_
;
712 // Shadow matrix for generating the page shadow bitmap.
713 scoped_ptr
<ShadowMatrix
> page_shadow_
;
715 // Set to true if the user is being prompted for their password. Will be set
716 // to false after the user finishes getting their password.
717 bool getting_password_
;
719 DISALLOW_COPY_AND_ASSIGN(PDFiumEngine
);
722 // Create a local variable of this when calling PDFium functions which can call
723 // our global callback when an unsupported feature is reached.
724 class ScopedUnsupportedFeature
{
726 explicit ScopedUnsupportedFeature(PDFiumEngine
* engine
);
727 ~ScopedUnsupportedFeature();
729 PDFiumEngine
* engine_
;
730 PDFiumEngine
* old_engine_
;
733 class PDFiumEngineExports
: public PDFEngineExports
{
735 PDFiumEngineExports() {}
737 // See the definition of RenderPDFPageToDC in pdf.cc for details.
738 virtual bool RenderPDFPageToDC(const void* pdf_buffer
,
741 const RenderingSettings
& settings
,
744 virtual bool RenderPDFPageToBitmap(const void* pdf_buffer
,
747 const RenderingSettings
& settings
,
748 void* bitmap_buffer
);
750 virtual bool GetPDFDocInfo(const void* pdf_buffer
,
753 double* max_page_width
);
755 // See the definition of GetPDFPageSizeByIndex in pdf.cc for details.
756 virtual bool GetPDFPageSizeByIndex(const void* pdf_buffer
,
757 int pdf_buffer_size
, int page_number
,
758 double* width
, double* height
);
761 } // namespace chrome_pdf
763 #endif // PDF_PDFIUM_PDFIUM_ENGINE_H_