diff options
Diffstat (limited to 'chromium/pdf/pdf_engine.h')
-rw-r--r-- | chromium/pdf/pdf_engine.h | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/chromium/pdf/pdf_engine.h b/chromium/pdf/pdf_engine.h new file mode 100644 index 00000000000..c5d33c87066 --- /dev/null +++ b/chromium/pdf/pdf_engine.h @@ -0,0 +1,345 @@ +// 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. + +#ifndef PDF_PDF_ENGINE_H_ +#define PDF_PDF_ENGINE_H_ + +#include <stdint.h> + +#include "build/build_config.h" + +#if defined(OS_WIN) +#include <windows.h> +#endif + +#include <string> +#include <vector> + +#include "base/strings/string16.h" + +#include "ppapi/c/dev/pp_cursor_type_dev.h" +#include "ppapi/c/dev/ppp_printing_dev.h" +#include "ppapi/c/ppb_input_event.h" +#include "ppapi/cpp/completion_callback.h" +#include "ppapi/cpp/image_data.h" +#include "ppapi/cpp/rect.h" +#include "ppapi/cpp/size.h" +#include "ppapi/cpp/url_loader.h" +#include "ppapi/cpp/var_array.h" + +namespace pp { +class InputEvent; +class VarDictionary; +} + +namespace chrome_pdf { + +class Stream; + +#if defined(OS_MACOSX) +const uint32_t kDefaultKeyModifier = PP_INPUTEVENT_MODIFIER_METAKEY; +#else // !OS_MACOSX +const uint32_t kDefaultKeyModifier = PP_INPUTEVENT_MODIFIER_CONTROLKEY; +#endif // OS_MACOSX + +// Do one time initialization of the SDK. +bool InitializeSDK(); +// Tells the SDK that we're shutting down. +void ShutdownSDK(); + +// This class encapsulates a PDF rendering engine. +class PDFEngine { + public: + enum DocumentPermission { + PERMISSION_COPY, + PERMISSION_COPY_ACCESSIBLE, + PERMISSION_PRINT_LOW_QUALITY, + PERMISSION_PRINT_HIGH_QUALITY, + }; + + // The interface that's provided to the rendering engine. + class Client { + public: + virtual ~Client() {} + + // Informs the client about the document's size in pixels. + virtual void DocumentSizeUpdated(const pp::Size& size) = 0; + + // Informs the client that the given rect needs to be repainted. + virtual void Invalidate(const pp::Rect& rect) = 0; + + // Informs the client to scroll the plugin area by the given offset. + virtual void Scroll(const pp::Point& point) = 0; + + // Scroll the horizontal/vertical scrollbars to a given position. + virtual void ScrollToX(int position) = 0; + virtual void ScrollToY(int position) = 0; + + // Scroll to the specified page. + virtual void ScrollToPage(int page) = 0; + + // Navigate to the given url. + virtual void NavigateTo(const std::string& url, bool open_in_new_tab) = 0; + + // Updates the cursor. + virtual void UpdateCursor(PP_CursorType_Dev cursor) = 0; + + // Updates the tick marks in the vertical scrollbar. + virtual void UpdateTickMarks(const std::vector<pp::Rect>& tickmarks) = 0; + + // Updates the number of find results for the current search term. If + // there are no matches 0 should be passed in. Only when the plugin has + // finished searching should it pass in the final count with final_result + // set to true. + virtual void NotifyNumberOfFindResultsChanged(int total, + bool final_result) = 0; + + // Updates the index of the currently selected search item. + virtual void NotifySelectedFindResultChanged(int current_find_index) = 0; + + // Prompts the user for a password to open this document. The callback is + // called when the password is retrieved. + virtual void GetDocumentPassword( + pp::CompletionCallbackWithOutput<pp::Var> callback) = 0; + + // Puts up an alert with the given message. + virtual void Alert(const std::string& message) = 0; + + // Puts up a confirm with the given message, and returns true if the user + // presses OK, or false if they press cancel. + virtual bool Confirm(const std::string& message) = 0; + + // Puts up a prompt with the given message and default answer and returns + // the answer. + virtual std::string Prompt(const std::string& question, + const std::string& default_answer) = 0; + + // Returns the url of the pdf. + virtual std::string GetURL() = 0; + + // Send an email. + virtual void Email(const std::string& to, + const std::string& cc, + const std::string& bcc, + const std::string& subject, + const std::string& body) = 0; + + // Put up the print dialog. + virtual void Print() = 0; + + // Submit the data using HTTP POST. + virtual void SubmitForm(const std::string& url, + const void* data, + int length) = 0; + + // Pops up a file selection dialog and returns the result. + virtual std::string ShowFileSelectionDialog() = 0; + + // Creates and returns new URL loader for partial document requests. + virtual pp::URLLoader CreateURLLoader() = 0; + + // Calls the client's OnCallback() function in delay_in_ms with the given + // id. + virtual void ScheduleCallback(int id, int delay_in_ms) = 0; + + // Searches the given string for "term" and returns the results. Unicode- + // aware. + struct SearchStringResult { + int start_index; + int length; + }; + virtual void SearchString(const base::char16* string, + const base::char16* term, + bool case_sensitive, + std::vector<SearchStringResult>* results) = 0; + + // Notifies the client that the engine has painted a page from the document. + virtual void DocumentPaintOccurred() = 0; + + // Notifies the client that the document has finished loading. + virtual void DocumentLoadComplete(int page_count) = 0; + + // Notifies the client that the document has failed to load. + virtual void DocumentLoadFailed() = 0; + + virtual pp::Instance* GetPluginInstance() = 0; + + // Notifies that an unsupported feature in the PDF was encountered. + virtual void DocumentHasUnsupportedFeature(const std::string& feature) = 0; + + // Notifies the client about document load progress. + virtual void DocumentLoadProgress(uint32_t available, + uint32_t doc_size) = 0; + + // Notifies the client about focus changes for form text fields. + virtual void FormTextFieldFocusChange(bool in_focus) = 0; + + // Returns true if the plugin has been opened within print preview. + virtual bool IsPrintPreview() = 0; + + // Get the background color of the PDF. + virtual uint32_t GetBackgroundColor() = 0; + + // Sets selection status. + virtual void IsSelectingChanged(bool is_selecting) {} + }; + + // Factory method to create an instance of the PDF Engine. + static PDFEngine* Create(Client* client); + + virtual ~PDFEngine() {} + + // Most of these functions are similar to the Pepper functions of the same + // name, so not repeating the description here unless it's different. + virtual bool New(const char* url, const char* headers) = 0; + virtual void PageOffsetUpdated(const pp::Point& page_offset) = 0; + virtual void PluginSizeUpdated(const pp::Size& size) = 0; + virtual void ScrolledToXPosition(int position) = 0; + virtual void ScrolledToYPosition(int position) = 0; + // Paint is called a series of times. Before these n calls are made, PrePaint + // is called once. After Paint is called n times, PostPaint is called once. + virtual void PrePaint() = 0; + virtual void Paint(const pp::Rect& rect, + pp::ImageData* image_data, + std::vector<pp::Rect>* ready, + std::vector<pp::Rect>* pending) = 0; + virtual void PostPaint() = 0; + virtual bool HandleDocumentLoad(const pp::URLLoader& loader) = 0; + virtual bool HandleEvent(const pp::InputEvent& event) = 0; + virtual uint32_t QuerySupportedPrintOutputFormats() = 0; + virtual void PrintBegin() = 0; + virtual pp::Resource PrintPages( + const PP_PrintPageNumberRange_Dev* page_ranges, + uint32_t page_range_count, + const PP_PrintSettings_Dev& print_settings) = 0; + virtual void PrintEnd() = 0; + virtual void StartFind(const std::string& text, bool case_sensitive) = 0; + virtual bool SelectFindResult(bool forward) = 0; + virtual void StopFind() = 0; + virtual void ZoomUpdated(double new_zoom_level) = 0; + virtual void RotateClockwise() = 0; + virtual void RotateCounterclockwise() = 0; + virtual std::string GetSelectedText() = 0; + virtual std::string GetLinkAtPosition(const pp::Point& point) = 0; + // Checks the permissions associated with this document. + virtual bool HasPermission(DocumentPermission permission) const = 0; + virtual void SelectAll() = 0; + // Gets the number of pages in the document. + 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 most visible page, or -1 if none are visible. + virtual int GetMostVisiblePage() = 0; + // Gets the rectangle of the page including shadow. + virtual pp::Rect GetPageRect(int index) = 0; + // Gets the rectangle of the page excluding any additional areas. + virtual pp::Rect GetPageContentsRect(int index) = 0; + // Returns a page's rect in screen coordinates, as well as its surrounding + // border areas and bottom separator. + virtual pp::Rect GetPageScreenRect(int page_index) const = 0; + // Gets the offset of the vertical scrollbar from the top in document + // coordinates. + virtual int GetVerticalScrollbarYPosition() = 0; + // Set color / grayscale rendering modes. + virtual void SetGrayscale(bool grayscale) = 0; + // Callback for timer that's set with ScheduleCallback(). + virtual void OnCallback(int id) = 0; + // Gets the JSON representation of the PDF file + virtual std::string GetPageAsJSON(int index) = 0; + // Gets the PDF document's print scaling preference. True if the document can + // be scaled to fit. + virtual bool GetPrintScaling() = 0; + // Returns number of copies to be printed. + virtual int GetCopiesToPrint() = 0; + // Returns the duplex setting. + virtual int GetDuplexType() = 0; + // Returns true if all the pages are the same size. + virtual bool GetPageSizeAndUniformity(pp::Size* size) = 0; + + // Returns a VarArray of Bookmarks, each a VarDictionary containing the + // following key/values: + // - "title" - a string Var. + // - "page" - an int Var. + // - "children" - a VarArray(), with each entry containing a VarDictionary of + // the same structure. + virtual pp::VarArray GetBookmarks() = 0; + + // Append blank pages to make a 1-page document to a |num_pages| document. + // Always retain the first page data. + virtual void AppendBlankPages(int num_pages) = 0; + // Append the first page of the document loaded with the |engine| to this + // document at page |index|. + virtual void AppendPage(PDFEngine* engine, int index) = 0; + + // Allow client to query and reset scroll positions in document coordinates. + // Note that this is meant for cases where the device scale factor changes, + // and not for general scrolling - the engine will not repaint due to this. + virtual pp::Point GetScrollPosition() = 0; + virtual void SetScrollPosition(const pp::Point& position) = 0; + + virtual bool IsProgressiveLoad() = 0; + + virtual std::string GetMetadata(const std::string& key) = 0; +}; + +// Interface for exports that wrap the PDF engine. +class PDFEngineExports { + public: + struct RenderingSettings { + RenderingSettings(int dpi_x, + int dpi_y, + const pp::Rect& bounds, + bool fit_to_bounds, + bool stretch_to_bounds, + bool keep_aspect_ratio, + bool center_in_bounds, + bool autorotate) + : dpi_x(dpi_x), dpi_y(dpi_y), bounds(bounds), + fit_to_bounds(fit_to_bounds), stretch_to_bounds(stretch_to_bounds), + keep_aspect_ratio(keep_aspect_ratio), + center_in_bounds(center_in_bounds), autorotate(autorotate) { + } + int dpi_x; + int dpi_y; + pp::Rect bounds; + bool fit_to_bounds; + bool stretch_to_bounds; + bool keep_aspect_ratio; + bool center_in_bounds; + bool autorotate; + }; + + PDFEngineExports() {} + virtual ~PDFEngineExports() {} + static PDFEngineExports* Get(); + +#if defined(OS_WIN) + // See the definition of RenderPDFPageToDC in pdf.cc for details. + virtual bool RenderPDFPageToDC(const void* pdf_buffer, + int buffer_size, + int page_number, + const RenderingSettings& settings, + HDC dc) = 0; +#endif // OS_WIN + // See the definition of RenderPDFPageToBitmap in pdf.cc for details. + virtual bool RenderPDFPageToBitmap(const void* pdf_buffer, + int pdf_buffer_size, + int page_number, + const RenderingSettings& settings, + void* bitmap_buffer) = 0; + + virtual bool GetPDFDocInfo(const void* pdf_buffer, + int buffer_size, + int* page_count, + double* max_page_width) = 0; + + // See the definition of GetPDFPageSizeByIndex in pdf.cc for details. + virtual bool GetPDFPageSizeByIndex(const void* pdf_buffer, + int pdf_buffer_size, int page_number, + double* width, double* height) = 0; +}; + +} // namespace chrome_pdf + +#endif // PDF_PDF_ENGINE_H_ |