Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa_test / pdf / pdfium / pdfium_page.h
1 // Copyright (c) 2010 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_PAGE_H_
6 #define PDF_PDFIUM_PDFIUM_PAGE_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/strings/string16.h"
12 #include "ppapi/cpp/rect.h"
13 #include "third_party/pdfium/fpdfsdk/include/fpdfdoc.h"
14 #include "third_party/pdfium/fpdfsdk/include/fpdfformfill.h"
15 #include "third_party/pdfium/fpdfsdk/include/fpdftext.h"
16
17 namespace base {
18 class Value;
19 }
20
21 namespace chrome_pdf {
22
23 class PDFiumEngine;
24
25 // Wrapper around a page from the document.
26 class PDFiumPage {
27  public:
28   PDFiumPage(PDFiumEngine* engine,
29              int i,
30              const pp::Rect& r,
31              bool available);
32   ~PDFiumPage();
33   // Unloads the PDFium data for this page from memory.
34   void Unload();
35   // Gets the FPDF_PAGE for this page, loading and parsing it if necessary.
36   FPDF_PAGE GetPage();
37   //Get the FPDF_PAGE for printing.
38   FPDF_PAGE GetPrintPage();
39   //Close the printing page.
40   void ClosePrintPage();
41
42   // Returns FPDF_TEXTPAGE for the page, loading and parsing it if necessary.
43   FPDF_TEXTPAGE GetTextPage();
44
45   // Returns a DictionaryValue version of the page.
46   base::Value* GetAccessibleContentAsValue(int rotation);
47
48   enum Area {
49     NONSELECTABLE_AREA,
50     TEXT_AREA,
51     WEBLINK_AREA,  // Area is a hyperlink.
52     DOCLINK_AREA,  // Area is a link to a different part of the same document.
53   };
54
55   struct LinkTarget {
56     // We are using std::string here which have a copy contructor.
57     // That prevents us from using union here.
58     std::string url;  // Valid for WEBLINK_AREA only.
59     int page;         // Valid for DOCLINK_AREA only.
60   };
61
62   // Given a point in the document that's in this page, returns its character
63   // index if it's near a character, and also the type of text.
64   // Target is optional. It will be filled in for WEBLINK_AREA or
65   // DOCLINK_AREA only.
66   Area GetCharIndex(const pp::Point& point, int rotation, int* char_index,
67                     LinkTarget* target);
68
69   // Gets the character at the given index.
70   base::char16 GetCharAtIndex(int index);
71
72   // Gets the number of characters in the page.
73   int GetCharCount();
74
75   // Converts from page coordinates to screen coordinates.
76   pp::Rect PageToScreen(const pp::Point& offset,
77                         double zoom,
78                         double left,
79                         double top,
80                         double right,
81                         double bottom,
82                         int rotation);
83
84   int index() const { return index_; }
85   pp::Rect rect() const { return rect_; }
86   void set_rect(const pp::Rect& r) { rect_ = r; }
87   bool available() const { return available_; }
88   void set_available(bool available) { available_ = available; }
89   void set_calculated_links(bool calculated_links) {
90      calculated_links_ = calculated_links;
91   }
92
93  private:
94   // Returns a link index if the given character index is over a link, or -1
95   // otherwise.
96   int GetLink(int char_index, LinkTarget* target);
97   // Returns the link indices if the given rect intersects a link rect, or an
98   // empty vector otherwise.
99   std::vector<int> GetLinks(pp::Rect text_area,
100                             std::vector<LinkTarget>* targets);
101   // Calculate the locations of any links on the page.
102   void CalculateLinks();
103   // Returns link type and target associated with a link. Returns
104   // NONSELECTABLE_AREA if link detection failed.
105   Area GetLinkTarget(FPDF_LINK link, LinkTarget* target);
106   // Returns target associated with a destination.
107   Area GetDestinationTarget(FPDF_DEST destination, LinkTarget* target);
108   // Returns the text in the supplied box as a Value Node
109   base::Value* GetTextBoxAsValue(double page_height, double left, double top,
110                                  double right, double bottom, int rotation);
111   // Helper functions for JSON generation
112   base::Value* CreateTextNode(std::string text);
113   base::Value* CreateURLNode(std::string text, std::string url);
114
115   struct Link {
116     Link();
117     ~Link();
118
119     std::string url;
120     // Bounding rectangles of characters.
121     std::vector<pp::Rect> rects;
122   };
123
124   PDFiumEngine* engine_;
125   FPDF_PAGE page_;
126   FPDF_TEXTPAGE text_page_;
127   int index_;
128   pp::Rect rect_;
129   bool calculated_links_;
130   std::vector<Link> links_;
131   bool available_;
132 };
133
134 }  // namespace chrome_pdf
135
136 #endif  // PDF_PDFIUM_PDFIUM_PAGE_H_