Home | History | Annotate | Download | only in pdfium
      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.
      4 
      5 #ifndef PDF_PDFIUM_PDFIUM_ENGINE_H_
      6 #define PDF_PDFIUM_PDFIUM_ENGINE_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <utility>
     11 #include <vector>
     12 
     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 "third_party/pdfium/fpdfsdk/include/fpdf_dataavail.h"
     24 #include "third_party/pdfium/fpdfsdk/include/fpdf_progressive.h"
     25 #include "third_party/pdfium/fpdfsdk/include/fpdfformfill.h"
     26 #include "third_party/pdfium/fpdfsdk/include/fpdfview.h"
     27 
     28 namespace pp {
     29 class KeyboardInputEvent;
     30 class MouseInputEvent;
     31 }
     32 
     33 namespace chrome_pdf {
     34 
     35 class ShadowMatrix;
     36 
     37 class PDFiumEngine : public PDFEngine,
     38                      public DocumentLoader::Client,
     39                      public FPDF_FORMFILLINFO,
     40                      public IPDF_JSPLATFORM,
     41                      public IFSDK_PAUSE {
     42  public:
     43   explicit PDFiumEngine(PDFEngine::Client* client);
     44   virtual ~PDFiumEngine();
     45 
     46   // PDFEngine implementation.
     47   virtual bool New(const char* url);
     48   virtual bool New(const char* url,
     49                    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 int GetNamedDestinationPage(const std::string& destination);
     82   virtual int GetFirstVisiblePage();
     83   virtual int GetMostVisiblePage();
     84   virtual pp::Rect GetPageRect(int index);
     85   virtual pp::Rect GetPageContentsRect(int index);
     86   virtual int GetVerticalScrollbarYPosition() { return position_.y(); }
     87   virtual void PaintThumbnail(pp::ImageData* image_data, int index);
     88   virtual void SetGrayscale(bool grayscale);
     89   virtual void OnCallback(int id);
     90   virtual std::string GetPageAsJSON(int index);
     91   virtual bool GetPrintScaling();
     92   virtual void AppendBlankPages(int num_pages);
     93   virtual void AppendPage(PDFEngine* engine, int index);
     94   virtual pp::Point GetScrollPosition();
     95   virtual void SetScrollPosition(const pp::Point& position);
     96   virtual bool IsProgressiveLoad();
     97 
     98   // DocumentLoader::Client implementation.
     99   virtual pp::Instance* GetPluginInstance();
    100   virtual pp::URLLoader CreateURLLoader();
    101   virtual void OnPartialDocumentLoaded();
    102   virtual void OnPendingRequestComplete();
    103   virtual void OnNewDataAvailable();
    104   virtual void OnDocumentComplete();
    105 
    106   void UnsupportedFeature(int type);
    107 
    108   std::string current_find_text() const { return current_find_text_; }
    109 
    110   FPDF_DOCUMENT doc() { return doc_; }
    111   FPDF_FORMHANDLE form() { return form_; }
    112 
    113  private:
    114   // This helper class is used to detect the difference in selection between
    115   // construction and destruction.  At destruction, it invalidates all the
    116   // parts that are newly selected, along with all the parts that used to be
    117   // selected but are not anymore.
    118   class SelectionChangeInvalidator {
    119    public:
    120     explicit SelectionChangeInvalidator(PDFiumEngine* engine);
    121     ~SelectionChangeInvalidator();
    122    private:
    123     // Sets the given container to the all the currently visible selection
    124     // rectangles, in screen coordinates.
    125     void GetVisibleSelectionsScreenRects(std::vector<pp::Rect>* rects);
    126 
    127     PDFiumEngine* engine_;
    128     // Screen rectangles that were selected on construction.
    129     std::vector<pp::Rect> old_selections_;
    130     // The origin at the time this object was constructed.
    131     pp::Point previous_origin_;
    132   };
    133 
    134   friend class SelectionChangeInvalidator;
    135 
    136   struct FileAvail : public FX_FILEAVAIL {
    137     DocumentLoader* loader;
    138   };
    139 
    140   struct DownloadHints : public FX_DOWNLOADHINTS {
    141     DocumentLoader* loader;
    142   };
    143 
    144   // PDFium interface to get block of data.
    145   static int GetBlock(void* param, unsigned long position,
    146                       unsigned char* buffer, unsigned long size);
    147 
    148   // PDFium interface to check is block of data is available.
    149   static bool IsDataAvail(FX_FILEAVAIL* param,
    150                           size_t offset, size_t size);
    151 
    152   // PDFium interface to request download of the block of data.
    153   static void AddSegment(FX_DOWNLOADHINTS* param,
    154                          size_t offset, size_t size);
    155 
    156   // We finished getting the pdf file, so load it. This will complete
    157   // asynchronously (due to password fetching) and may be run multiple times.
    158   void LoadDocument();
    159 
    160   // Try loading the document. Returns true if the document is successfully
    161   // loaded or is already loaded otherwise it will return false. If
    162   // |with_password| is set to true, the document will be loaded with
    163   // |password|. If the document could not be loaded and needs a password,
    164   // |needs_password| will be set to true.
    165   bool TryLoadingDoc(bool with_password,
    166                      const std::string& password,
    167                      bool* needs_password);
    168 
    169   // Ask the user for the document password and then continue loading the
    170   // document.
    171   void GetPasswordAndLoad();
    172 
    173   // Called when the password has been retrieved.
    174   void OnGetPasswordComplete(int32_t result,
    175                              const pp::Var& password);
    176 
    177   // Continues loading the document when the password has been retrieved, or if
    178   // there is no password.
    179   void ContinueLoadingDocument(bool has_password,
    180                                const std::string& password);
    181 
    182   // Finish loading the document and notify the client that the document has
    183   // been loaded. This should only be run after |doc_| has been loaded and the
    184   // document is fully downloaded. If this has been run once, it will result in
    185   // a no-op.
    186   void FinishLoadingDocument();
    187 
    188   // Loads information about the pages in the document and calculate the
    189   // document size.
    190   void LoadPageInfo(bool reload);
    191 
    192   // Calculate which pages should be displayed right now.
    193   void CalculateVisiblePages();
    194 
    195   // Returns true iff the given page index is visible.  CalculateVisiblePages
    196   // must have been called first.
    197   bool IsPageVisible(int index) const;
    198 
    199   // Checks if a page is now available, and if so marks it as such and returns
    200   // true.  Otherwise, it will return false and will add the index to the given
    201   // array if it's not already there.
    202   bool CheckPageAvailable(int index, std::vector<int>* pending);
    203 
    204   // Helper function to get a given page's size in pixels.  This is not part of
    205   // PDFiumPage because we might not have that structure when we need this.
    206   pp::Size GetPageSize(int index);
    207 
    208   void UpdateTickMarks();
    209 
    210   // Called to continue searching so we don't block the main thread.
    211   void ContinueFind(int32_t result);
    212 
    213   // Inserts a find result into find_results_, which is sorted.
    214   void AddFindResult(const PDFiumRange& result);
    215 
    216   // Search a page using PDFium's methods.  Doesn't work with unicode.  This
    217   // function is just kept arount in case PDFium code is fixed.
    218   void SearchUsingPDFium(const base::string16& term,
    219                          bool case_sensitive,
    220                          bool first_search,
    221                          int character_to_start_searching_from,
    222                          int current_page);
    223 
    224   // Search a page ourself using ICU.
    225   void SearchUsingICU(const base::string16& term,
    226                       bool case_sensitive,
    227                       bool first_search,
    228                       int character_to_start_searching_from,
    229                       int current_page);
    230 
    231   // Input event handlers.
    232   bool OnMouseDown(const pp::MouseInputEvent& event);
    233   bool OnMouseUp(const pp::MouseInputEvent& event);
    234   bool OnMouseMove(const pp::MouseInputEvent& event);
    235   bool OnKeyDown(const pp::KeyboardInputEvent& event);
    236   bool OnKeyUp(const pp::KeyboardInputEvent& event);
    237   bool OnChar(const pp::KeyboardInputEvent& event);
    238 
    239   pp::Buffer_Dev PrintPagesAsRasterPDF(
    240       const PP_PrintPageNumberRange_Dev* page_ranges,
    241       uint32_t page_range_count,
    242       const PP_PrintSettings_Dev& print_settings);
    243   pp::Buffer_Dev PrintPagesAsPDF(const PP_PrintPageNumberRange_Dev* page_ranges,
    244                                  uint32_t page_range_count,
    245                                  const PP_PrintSettings_Dev& print_settings);
    246   pp::Buffer_Dev GetFlattenedPrintData(const FPDF_DOCUMENT& doc);
    247   void FitContentsToPrintableAreaIfRequired(
    248       const FPDF_DOCUMENT& doc,
    249       const PP_PrintSettings_Dev& print_settings);
    250   void SaveSelectedFormForPrint();
    251 
    252   // Given a mouse event, returns which page and character location it's closest
    253   // to.
    254   PDFiumPage::Area GetCharIndex(const pp::MouseInputEvent& event,
    255                                 int* page_index,
    256                                 int* char_index,
    257                                 PDFiumPage::LinkTarget* target);
    258   PDFiumPage::Area GetCharIndex(const pp::Point& point,
    259                                 int* page_index,
    260                                 int* char_index,
    261                                 PDFiumPage::LinkTarget* target);
    262 
    263   void OnSingleClick(int page_index, int char_index);
    264   void OnMultipleClick(int click_count, int page_index, int char_index);
    265 
    266   // Starts a progressive paint operation given a rectangle in screen
    267   // coordinates. Returns the index in progressive_rects_.
    268   int StartPaint(int page_index, const pp::Rect& dirty);
    269 
    270   // Continues a paint operation that was started earlier.  Returns true if the
    271   // paint is done, or false if it needs to be continued.
    272   bool ContinuePaint(int progressive_index, pp::ImageData* image_data);
    273 
    274   // Called once PDFium is finished rendering a page so that we draw our
    275   // borders, highlighting etc.
    276   void FinishPaint(int progressive_index, pp::ImageData* image_data);
    277 
    278   // Stops any paints that are in progress.
    279   void CancelPaints();
    280 
    281   // Invalidates all pages. Use this when some global parameter, such as page
    282   // orientation, has changed.
    283   void InvalidateAllPages();
    284 
    285   // If the page is narrower than the document size, paint the extra space
    286   // with the page background.
    287   void FillPageSides(int progressive_index);
    288 
    289   void PaintPageShadow(int progressive_index, pp::ImageData* image_data);
    290 
    291   // Highlight visible find results and selections.
    292   void DrawSelections(int progressive_index, pp::ImageData* image_data);
    293 
    294   // Paints an page that hasn't finished downloading.
    295   void PaintUnavailablePage(int page_index,
    296                             const pp::Rect& dirty,
    297                             pp::ImageData* image_data);
    298 
    299   // Given a page index, returns the corresponding index in progressive_rects_,
    300   // or -1 if it doesn't exist.
    301   int GetProgressiveIndex(int page_index) const;
    302 
    303   // Creates a FPDF_BITMAP from a rectangle in screen coordinates.
    304   FPDF_BITMAP CreateBitmap(const pp::Rect& rect,
    305                            pp::ImageData* image_data) const;
    306 
    307   // Given a rectangle in screen coordinates, returns the coordinates in the
    308   // units that PDFium rendering functions expect.
    309   void GetPDFiumRect(int page_index, const pp::Rect& rect, int* start_x,
    310                      int* start_y, int* size_x, int* size_y) const;
    311 
    312   // Returns the rendering flags to pass to PDFium.
    313   int GetRenderingFlags() const;
    314 
    315   // Returns the currently visible rectangle in document coordinates.
    316   pp::Rect GetVisibleRect() const;
    317 
    318   // Returns a page's rect in screen coordinates, as well as its surrounding
    319   // border areas and bottom separator.
    320   pp::Rect GetPageScreenRect(int page_index) const;
    321 
    322   // Given a rectangle in document coordinates, returns the rectange into screen
    323   // coordinates (i.e. 0,0 is top left corner of plugin area).  If it's not
    324   // visible, an empty rectangle is returned.
    325   pp::Rect GetScreenRect(const pp::Rect& rect) const;
    326 
    327   // Highlights the given rectangle.
    328   void Highlight(void* buffer,
    329                  int stride,
    330                  const pp::Rect& rect,
    331                  std::vector<pp::Rect>* highlighted_rects);
    332 
    333   // Helper function to convert a device to page coordinates.  If the page is
    334   // not yet loaded, page_x and page_y will be set to 0.
    335   void DeviceToPage(int page_index,
    336                     float device_x,
    337                     float device_y,
    338                     double* page_x,
    339                     double* page_y);
    340 
    341   // Helper function to get the index of a given FPDF_PAGE.  Returns -1 if not
    342   // found.
    343   int GetVisiblePageIndex(FPDF_PAGE page);
    344 
    345   // Helper function to change the current page, running page open/close
    346   // triggers as necessary.
    347   void SetCurrentPage(int index);
    348 
    349   // Transform |page| contents to fit in the selected printer paper size.
    350   void TransformPDFPageForPrinting(FPDF_PAGE page,
    351                                    const PP_PrintSettings_Dev& print_settings);
    352 
    353   void DrawPageShadow(const pp::Rect& page_rect,
    354                       const pp::Rect& shadow_rect,
    355                       const pp::Rect& clip_rect,
    356                       pp::ImageData* image_data);
    357 
    358   void GetRegion(const pp::Point& location,
    359                  pp::ImageData* image_data,
    360                  void** region,
    361                  int* stride) const;
    362 
    363   // Called when the selection changes.
    364   void OnSelectionChanged();
    365 
    366   // FPDF_FORMFILLINFO callbacks.
    367   static void Form_Invalidate(FPDF_FORMFILLINFO* param,
    368                               FPDF_PAGE page,
    369                               double left,
    370                               double top,
    371                               double right,
    372                               double bottom);
    373   static void Form_OutputSelectedRect(FPDF_FORMFILLINFO* param,
    374                                       FPDF_PAGE page,
    375                                       double left,
    376                                       double top,
    377                                       double right,
    378                                       double bottom);
    379   static void Form_SetCursor(FPDF_FORMFILLINFO* param, int cursor_type);
    380   static int Form_SetTimer(FPDF_FORMFILLINFO* param,
    381                            int elapse,
    382                            TimerCallback timer_func);
    383   static void Form_KillTimer(FPDF_FORMFILLINFO* param, int timer_id);
    384   static FPDF_SYSTEMTIME Form_GetLocalTime(FPDF_FORMFILLINFO* param);
    385   static void Form_OnChange(FPDF_FORMFILLINFO* param);
    386   static FPDF_PAGE Form_GetPage(FPDF_FORMFILLINFO* param,
    387                                 FPDF_DOCUMENT document,
    388                                 int page_index);
    389   static FPDF_PAGE Form_GetCurrentPage(FPDF_FORMFILLINFO* param,
    390                                        FPDF_DOCUMENT document);
    391   static int Form_GetRotation(FPDF_FORMFILLINFO* param, FPDF_PAGE page);
    392   static void Form_ExecuteNamedAction(FPDF_FORMFILLINFO* param,
    393                                       FPDF_BYTESTRING named_action);
    394   static void Form_SetTextFieldFocus(FPDF_FORMFILLINFO* param,
    395                                      FPDF_WIDESTRING value,
    396                                      FPDF_DWORD valueLen,
    397                                      FPDF_BOOL is_focus);
    398   static void Form_DoURIAction(FPDF_FORMFILLINFO* param, FPDF_BYTESTRING uri);
    399   static void Form_DoGoToAction(FPDF_FORMFILLINFO* param,
    400                                 int page_index,
    401                                 int zoom_mode,
    402                                 float* position_array,
    403                                 int size_of_array);
    404 
    405   // IPDF_JSPLATFORM callbacks.
    406   static int Form_Alert(IPDF_JSPLATFORM* param,
    407                         FPDF_WIDESTRING message,
    408                         FPDF_WIDESTRING title,
    409                         int type,
    410                         int icon);
    411   static void Form_Beep(IPDF_JSPLATFORM* param, int type);
    412   static int Form_Response(IPDF_JSPLATFORM* param,
    413                            FPDF_WIDESTRING question,
    414                            FPDF_WIDESTRING title,
    415                            FPDF_WIDESTRING default_response,
    416                            FPDF_WIDESTRING label,
    417                            FPDF_BOOL password,
    418                            void* response,
    419                            int length);
    420   static int Form_GetFilePath(IPDF_JSPLATFORM* param,
    421                               void* file_path,
    422                               int length);
    423   static void Form_Mail(IPDF_JSPLATFORM* param,
    424                         void* mail_data,
    425                         int length,
    426                         FPDF_BOOL ui,
    427                         FPDF_WIDESTRING to,
    428                         FPDF_WIDESTRING subject,
    429                         FPDF_WIDESTRING cc,
    430                         FPDF_WIDESTRING bcc,
    431                         FPDF_WIDESTRING message);
    432   static void Form_Print(IPDF_JSPLATFORM* param,
    433                          FPDF_BOOL ui,
    434                          int start,
    435                          int end,
    436                          FPDF_BOOL silent,
    437                          FPDF_BOOL shrink_to_fit,
    438                          FPDF_BOOL print_as_image,
    439                          FPDF_BOOL reverse,
    440                          FPDF_BOOL annotations);
    441   static void Form_SubmitForm(IPDF_JSPLATFORM* param,
    442                               void* form_data,
    443                               int length,
    444                               FPDF_WIDESTRING url);
    445   static void Form_GotoPage(IPDF_JSPLATFORM* param, int page_number);
    446   static int Form_Browse(IPDF_JSPLATFORM* param, void* file_path, int length);
    447 
    448   // IFSDK_PAUSE callbacks
    449   static FPDF_BOOL Pause_NeedToPauseNow(IFSDK_PAUSE* param);
    450 
    451   PDFEngine::Client* client_;
    452   pp::Size document_size_;  // Size of document in pixels.
    453 
    454   // The scroll position in screen coordinates.
    455   pp::Point position_;
    456   // The offset of the page into the viewport.
    457   pp::Point page_offset_;
    458   // The plugin size in screen coordinates.
    459   pp::Size plugin_size_;
    460   double current_zoom_;
    461   unsigned int current_rotation_;
    462 
    463   DocumentLoader doc_loader_;  // Main document's loader.
    464   std::string url_;
    465   std::string headers_;
    466   pp::CompletionCallbackFactory<PDFiumEngine> find_factory_;
    467 
    468   pp::CompletionCallbackFactory<PDFiumEngine> password_factory_;
    469   int32_t password_tries_remaining_;
    470 
    471   // The current text used for searching.
    472   std::string current_find_text_;
    473 
    474   // The PDFium wrapper object for the document.
    475   FPDF_DOCUMENT doc_;
    476 
    477   // The PDFium wrapper for form data.  Used even if there are no form controls
    478   // on the page.
    479   FPDF_FORMHANDLE form_;
    480 
    481   // The page(s) of the document. Store a vector of pointers so that when the
    482   // vector is resized we don't close the pages that are used in pending
    483   // paints.
    484   std::vector<PDFiumPage*> pages_;
    485 
    486   // The indexes of the pages currently visible.
    487   std::vector<int> visible_pages_;
    488 
    489   // The indexes of the pages pending download.
    490   std::vector<int> pending_pages_;
    491 
    492   // During handling of input events we don't want to unload any pages in
    493   // callbacks to us from PDFium, since the current page can change while PDFium
    494   // code still has a pointer to it.
    495   bool defer_page_unload_;
    496   std::vector<int> deferred_page_unloads_;
    497 
    498   // Used for selection.  There could be more than one range if selection spans
    499   // more than one page.
    500   std::vector<PDFiumRange> selection_;
    501   // True if we're in the middle of selection.
    502   bool selecting_;
    503 
    504   // Used for searching.
    505   typedef std::vector<PDFiumRange> FindResults;
    506   FindResults find_results_;
    507   // Which page to search next.
    508   int next_page_to_search_;
    509   // Where to stop searching.
    510   int last_page_to_search_;
    511   int last_character_index_to_search_;  // -1 if search until end of page.
    512   // Which result the user has currently selected.
    513   int current_find_index_;
    514 
    515   // Permissions bitfield.
    516   unsigned long permissions_;
    517 
    518   // Interface structure to provide access to document stream.
    519   FPDF_FILEACCESS file_access_;
    520   // Interface structure to check data availability in the document stream.
    521   FileAvail file_availability_;
    522   // Interface structure to request data chunks from the document stream.
    523   DownloadHints download_hints_;
    524   // Pointer to the document availability interface.
    525   FPDF_AVAIL fpdf_availability_;
    526 
    527   pp::Size default_page_size_;
    528 
    529   // Used to manage timers that form fill API needs.  The pair holds the timer
    530   // period, in ms, and the callback function.
    531   std::map<int, std::pair<int, TimerCallback> > timers_;
    532   int next_timer_id_;
    533 
    534   // Holds the page index of the last page that the mouse clicked on.
    535   int last_page_mouse_down_;
    536 
    537   // Holds the page index of the first visible page; refreshed by calling
    538   // CalculateVisiblePages()
    539   int first_visible_page_;
    540 
    541   // Holds the page index of the most visible page; refreshed by calling
    542   // CalculateVisiblePages()
    543   int most_visible_page_;
    544 
    545   // Set to true after FORM_DoDocumentJSAction/FORM_DoDocumentOpenAction have
    546   // been called. Only after that can we call FORM_DoPageAAction.
    547   bool called_do_document_action_;
    548 
    549   // Records parts of form fields that need to be highlighted at next paint, in
    550   // screen coordinates.
    551   std::vector<pp::Rect> form_highlights_;
    552 
    553   // Whether to render in grayscale or in color.
    554   bool render_grayscale_;
    555 
    556   // The link currently under the cursor.
    557   std::string link_under_cursor_;
    558 
    559   // Pending progressive paints.
    560   struct ProgressivePaint {
    561     pp::Rect rect;  // In screen coordinates.
    562     FPDF_BITMAP bitmap;
    563     int page_index;
    564     // Temporary used to figure out if in a series of Paint() calls whether this
    565     // pending paint was updated or not.
    566     int painted_;
    567   };
    568   std::vector<ProgressivePaint> progressive_paints_;
    569 
    570   // Keeps track of when we started the last progressive paint, so that in our
    571   // callback we can determine if we need to pause.
    572   base::Time last_progressive_start_time_;
    573 
    574   // The timeout to use for the current progressive paint.
    575   int progressive_paint_timeout_;
    576 
    577   // Shadow matrix for generating the page shadow bitmap.
    578   scoped_ptr<ShadowMatrix> page_shadow_;
    579 
    580   // Set to true if the user is being prompted for their password. Will be set
    581   // to false after the user finishes getting their password.
    582   bool getting_password_;
    583 };
    584 
    585 // Create a local variable of this when calling PDFium functions which can call
    586 // our global callback when an unsupported feature is reached.
    587 class ScopedUnsupportedFeature {
    588  public:
    589   explicit ScopedUnsupportedFeature(PDFiumEngine* engine);
    590   ~ScopedUnsupportedFeature();
    591  private:
    592   PDFiumEngine* engine_;
    593   PDFiumEngine* old_engine_;
    594 };
    595 
    596 class PDFiumEngineExports : public PDFEngineExports {
    597  public:
    598   PDFiumEngineExports() {}
    599 #if defined(OS_WIN)
    600   // See the definition of RenderPDFPageToDC in pdf.cc for details.
    601   virtual bool RenderPDFPageToDC(const void* pdf_buffer,
    602                                  int buffer_size,
    603                                  int page_number,
    604                                  const RenderingSettings& settings,
    605                                  HDC dc);
    606 #endif  // OS_WIN
    607   virtual bool RenderPDFPageToBitmap(const void* pdf_buffer,
    608                                      int pdf_buffer_size,
    609                                      int page_number,
    610                                      const RenderingSettings& settings,
    611                                      void* bitmap_buffer);
    612 
    613   virtual bool GetPDFDocInfo(const void* pdf_buffer,
    614                              int buffer_size,
    615                              int* page_count,
    616                              double* max_page_width);
    617 };
    618 
    619 }  // namespace chrome_pdf
    620 
    621 #endif  // PDF_PDFIUM_PDFIUM_ENGINE_H_
    622