0588a3a914a53c85edcf5d262c58701c025e65b1
[pdfium.git] / core / include / fpdfdoc / fpdf_doc.h
1 // Copyright 2014 PDFium 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 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #ifndef CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_
8 #define CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_
9
10 #include <map>
11 #include <vector>
12
13 #include "../../../third_party/base/nonstd_unique_ptr.h"
14 #include "../fpdfapi/fpdf_parser.h"
15 #include "../fpdfapi/fpdf_render.h"
16
17 class CFieldTree;
18 class CPDF_AAction;
19 class CPDF_Action;
20 class CPDF_ActionFields;
21 class CPDF_Annot;
22 class CPDF_AnnotList;
23 class CPDF_ApSettings;
24 class CPDF_Bookmark;
25 class CPDF_BookmarkTree;
26 class CPDF_DefaultAppearance;
27 class CPDF_Dest;
28 class CPDF_DocJSActions;
29 class CPDF_FileSpec;
30 class CPDF_FormControl;
31 class CPDF_FormField;
32 class CPDF_FormNotify;
33 class CPDF_IconFit;
34 class CPDF_InterForm;
35 class CPDF_Link;
36 class CPDF_Metadata;
37 class CPDF_NumberTree;
38 class CPDF_OCContext;
39 class CPDF_Page;
40 class CPDF_RenderOptions;
41 class CPDF_TextObject;
42 class CPDF_ViewerPreferences;
43 class CXML_Element;
44
45 class CPDF_NameTree {
46  public:
47   CPDF_NameTree(CPDF_Dictionary* pRoot) { m_pRoot = pRoot; }
48
49   CPDF_NameTree(CPDF_Document* pDoc, const CFX_ByteStringC& category);
50
51   CPDF_Object* LookupValue(int nIndex, CFX_ByteString& csName) const;
52
53   CPDF_Object* LookupValue(const CFX_ByteString& csName) const;
54
55   CPDF_Array* LookupNamedDest(CPDF_Document* pDoc,
56                               const CFX_ByteStringC& sName);
57
58   int GetIndex(const CFX_ByteString& csName) const;
59
60   int GetCount() const;
61
62   CPDF_Dictionary* GetRoot() const { return m_pRoot; }
63
64  protected:
65   CPDF_Dictionary* m_pRoot;
66 };
67 class CPDF_BookmarkTree {
68  public:
69   CPDF_BookmarkTree(CPDF_Document* pDoc) : m_pDocument(pDoc) {}
70
71   CPDF_Bookmark GetFirstChild(const CPDF_Bookmark& parent) const;
72
73   CPDF_Bookmark GetNextSibling(const CPDF_Bookmark& bookmark) const;
74
75   CPDF_Document* GetDocument() const { return m_pDocument; }
76
77  protected:
78   CPDF_Document* m_pDocument;
79 };
80 #define PDFBOOKMARK_ITALIC 1
81 #define PDFBOOKMARK_BOLD 2
82 class CPDF_Bookmark {
83  public:
84   CPDF_Bookmark() : m_pDict(NULL) {}
85
86   explicit CPDF_Bookmark(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
87
88   CPDF_Dictionary* GetDict() const { return m_pDict; }
89
90   operator bool() const { return m_pDict != NULL; }
91
92   FX_DWORD GetColorRef() const;
93
94   FX_DWORD GetFontStyle() const;
95
96   CFX_WideString GetTitle() const;
97
98   CPDF_Dest GetDest(CPDF_Document* pDocument) const;
99
100   CPDF_Action GetAction() const;
101
102   CPDF_Dictionary* m_pDict;
103 };
104 #define PDFZOOM_XYZ 1
105 #define PDFZOOM_FITPAGE 2
106 #define PDFZOOM_FITHORZ 3
107 #define PDFZOOM_FITVERT 4
108 #define PDFZOOM_FITRECT 5
109 #define PDFZOOM_FITBBOX 6
110 #define PDFZOOM_FITBHORZ 7
111 #define PDFZOOM_FITBVERT 8
112 class CPDF_Dest {
113  public:
114   CPDF_Dest() : m_pObj(nullptr) {}
115   explicit CPDF_Dest(CPDF_Object* pObj) : m_pObj(pObj) {}
116
117   operator bool() const { return m_pObj != NULL; }
118   CPDF_Object* GetObject() const { return m_pObj; }
119
120   CFX_ByteString GetRemoteName();
121   int GetPageIndex(CPDF_Document* pDoc);
122   FX_DWORD GetPageObjNum();
123   int GetZoomMode();
124   FX_FLOAT GetParam(int index);
125
126  protected:
127   CPDF_Object* m_pObj;
128 };
129 class CPDF_OCContext : public IPDF_OCContext {
130  public:
131   enum UsageType { View = 0, Design, Print, Export };
132
133   CPDF_OCContext(CPDF_Document* pDoc, UsageType eUsageType = View);
134   ~CPDF_OCContext() override;
135
136   CPDF_Document* GetDocument() const { return m_pDocument; }
137
138   UsageType GetUsageType() const { return m_eUsageType; }
139
140   FX_BOOL CheckOCGVisible(const CPDF_Dictionary* pOCGDict) override;
141
142   void ResetOCContext();
143
144  protected:
145   FX_BOOL LoadOCGStateFromConfig(const CFX_ByteStringC& csConfig,
146                                  const CPDF_Dictionary* pOCGDict,
147                                  FX_BOOL& bValidConfig) const;
148
149   FX_BOOL LoadOCGState(const CPDF_Dictionary* pOCGDict) const;
150
151   FX_BOOL GetOCGVisible(const CPDF_Dictionary* pOCGDict);
152
153   FX_BOOL GetOCGVE(CPDF_Array* pExpression,
154                    FX_BOOL bFromConfig,
155                    int nLevel = 0);
156
157   FX_BOOL LoadOCMDState(const CPDF_Dictionary* pOCMDDict, FX_BOOL bFromConfig);
158
159   CPDF_Document* m_pDocument;
160
161   UsageType m_eUsageType;
162
163   std::map<const CPDF_Dictionary*, FX_BOOL> m_OCGStates;
164 };
165
166 class CPDF_ActionFields {
167  public:
168   CPDF_ActionFields(const CPDF_Action* pAction) {
169     m_pAction = (CPDF_Action*)pAction;
170   }
171
172   operator CPDF_Action*() const { return m_pAction; }
173
174   FX_DWORD GetFieldsCount() const;
175
176   void GetAllFields(CFX_PtrArray& fieldObjects) const;
177
178   CPDF_Object* GetField(FX_DWORD iIndex) const;
179
180   CPDF_Action* m_pAction;
181 };
182
183 #define PDFNAMED_NEXTPAGE 1
184 #define PDFNAMED_PREVPAGE 2
185 #define PDFNAMED_FIRSTPAGE 3
186 #define PDFNAMED_LASTPAGE 4
187 #define PDFJS_MAXLENGTH 64
188 class CPDF_Action {
189  public:
190   enum ActionType {
191     Unknown = 0,
192     GoTo,
193     GoToR,
194     GoToE,
195     Launch,
196     Thread,
197     URI,
198     Sound,
199     Movie,
200     Hide,
201     Named,
202     SubmitForm,
203     ResetForm,
204     ImportData,
205     JavaScript,
206     SetOCGState,
207     Rendition,
208     Trans,
209     GoTo3DView
210   };
211
212   CPDF_Action() : m_pDict(nullptr) {}
213   explicit CPDF_Action(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
214
215   operator bool() const { return m_pDict != NULL; }
216
217   CPDF_Dictionary* GetDict() const { return m_pDict; }
218
219   CFX_ByteString GetTypeName() const { return m_pDict->GetString("S"); }
220
221   ActionType GetType() const;
222
223   CPDF_Dest GetDest(CPDF_Document* pDoc) const;
224
225   CFX_WideString GetFilePath() const;
226
227   FX_BOOL GetNewWindow() const { return m_pDict->GetBoolean("NewWindow"); }
228
229   CFX_ByteString GetURI(CPDF_Document* pDoc) const;
230
231   FX_BOOL GetMouseMap() const { return m_pDict->GetBoolean("IsMap"); }
232
233   CPDF_ActionFields GetWidgets() const { return this; }
234
235   FX_BOOL GetHideStatus() const { return m_pDict->GetBoolean("H", TRUE); }
236
237   CFX_ByteString GetNamedAction() const { return m_pDict->GetString("N"); }
238
239   FX_DWORD GetFlags() const { return m_pDict->GetInteger("Flags"); }
240
241   CFX_WideString GetJavaScript() const;
242
243   CPDF_Dictionary* GetAnnot() const;
244
245   int32_t GetOperationType() const;
246
247   CPDF_Stream* GetSoundStream() const { return m_pDict->GetStream("Sound"); }
248
249   FX_FLOAT GetVolume() const { return m_pDict->GetNumber("Volume"); }
250
251   FX_BOOL IsSynchronous() const { return m_pDict->GetBoolean("Synchronous"); }
252
253   FX_BOOL IsRepeat() const { return m_pDict->GetBoolean("Repeat"); }
254
255   FX_BOOL IsMixPlay() const { return m_pDict->GetBoolean("Mix"); }
256
257   FX_DWORD GetSubActionsCount() const;
258
259   CPDF_Action GetSubAction(FX_DWORD iIndex) const;
260
261  protected:
262   CPDF_Dictionary* m_pDict;
263 };
264 class CPDF_AAction {
265  public:
266   CPDF_AAction(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
267
268   operator CPDF_Dictionary*() const { return m_pDict; }
269
270   enum AActionType {
271     CursorEnter = 0,
272     CursorExit,
273     ButtonDown,
274     ButtonUp,
275     GetFocus,
276     LoseFocus,
277     PageOpen,
278     PageClose,
279     PageVisible,
280     PageInvisible,
281     OpenPage,
282     ClosePage,
283     KeyStroke,
284     Format,
285     Validate,
286     Calculate,
287     CloseDocument,
288     SaveDocument,
289     DocumentSaved,
290     PrintDocument,
291     DocumentPrinted
292   };
293
294   FX_BOOL ActionExist(AActionType eType) const;
295
296   CPDF_Action GetAction(AActionType eType) const;
297
298   FX_POSITION GetStartPos() const;
299
300   CPDF_Action GetNextAction(FX_POSITION& pos, AActionType& eType) const;
301
302   CPDF_Dictionary* m_pDict;
303 };
304 class CPDF_DocJSActions {
305  public:
306   CPDF_DocJSActions(CPDF_Document* pDoc);
307
308   int CountJSActions() const;
309
310   CPDF_Action GetJSAction(int index, CFX_ByteString& csName) const;
311
312   CPDF_Action GetJSAction(const CFX_ByteString& csName) const;
313
314   int FindJSAction(const CFX_ByteString& csName) const;
315
316   CPDF_Document* GetDocument() const { return m_pDocument; }
317
318  protected:
319   CPDF_Document* m_pDocument;
320 };
321 class CPDF_FileSpec {
322  public:
323   CPDF_FileSpec();
324
325   CPDF_FileSpec(CPDF_Object* pObj) { m_pObj = pObj; }
326
327   operator CPDF_Object*() const { return m_pObj; }
328
329   FX_BOOL IsURL() const;
330
331   FX_BOOL GetFileName(CFX_WideString& wsFileName) const;
332
333   CPDF_Stream* GetFileStream() const;
334
335   void SetFileName(const CFX_WideStringC& wsFileName, FX_BOOL bURL = FALSE);
336
337  protected:
338   CPDF_Object* m_pObj;
339 };
340
341 class CPDF_LinkList {
342  public:
343   CPDF_LinkList();
344   ~CPDF_LinkList();
345
346   CPDF_Link GetLinkAtPoint(CPDF_Page* pPage,
347                            FX_FLOAT pdf_x,
348                            FX_FLOAT pdf_y,
349                            int* z_order);
350
351  private:
352   const std::vector<CPDF_Dictionary*>* GetPageLinks(CPDF_Page* pPage);
353
354   void LoadPageLinks(CPDF_Page* pPage, std::vector<CPDF_Dictionary*>* pList);
355
356   std::map<FX_DWORD, std::vector<CPDF_Dictionary*>> m_PageMap;
357 };
358
359 class CPDF_Link {
360  public:
361   CPDF_Link() : m_pDict(nullptr) {}
362   explicit CPDF_Link(CPDF_Dictionary* pDict) : m_pDict(pDict) {}
363
364   CPDF_Dictionary* GetDict() const { return m_pDict; }
365
366   CFX_FloatRect GetRect();
367   CPDF_Dest GetDest(CPDF_Document* pDoc);
368   CPDF_Action GetAction();
369
370  protected:
371   CPDF_Dictionary* m_pDict;
372 };
373
374 #define ANNOTFLAG_INVISIBLE 0x0001
375 #define ANNOTFLAG_HIDDEN 0x0002
376 #define ANNOTFLAG_PRINT 0x0004
377 #define ANNOTFLAG_NOZOOM 0x0008
378 #define ANNOTFLAG_NOROTATE 0x0010
379 #define ANNOTFLAG_NOVIEW 0x0020
380 #define ANNOTFLAG_READONLY 0x0040
381 #define ANNOTFLAG_LOCKED 0x0080
382 #define ANNOTFLAG_TOGGLENOVIEW 0x0100
383
384 class CPDF_Annot : public CFX_PrivateData {
385  public:
386   enum AppearanceMode { Normal, Rollover, Down };
387
388   CPDF_Annot(CPDF_Dictionary* pDict, CPDF_AnnotList* pList);
389   ~CPDF_Annot();
390
391   CFX_ByteString GetSubType() const;
392
393   FX_DWORD GetFlags() const;
394
395   void GetRect(CFX_FloatRect& rect) const;
396
397   CPDF_Dictionary* GetAnnotDict();
398
399   FX_BOOL DrawAppearance(const CPDF_Page* pPage,
400                          CFX_RenderDevice* pDevice,
401                          const CFX_AffineMatrix* pUser2Device,
402                          AppearanceMode mode,
403                          const CPDF_RenderOptions* pOptions);
404
405   FX_BOOL DrawInContext(const CPDF_Page* pPage,
406                         const CPDF_RenderContext* pContext,
407                         const CFX_AffineMatrix* pUser2Device,
408                         AppearanceMode mode);
409
410   void ClearCachedAP();
411
412   void DrawBorder(CFX_RenderDevice* pDevice,
413                   const CFX_AffineMatrix* pUser2Device,
414                   const CPDF_RenderOptions* pOptions);
415
416   CPDF_Form* GetAPForm(const CPDF_Page* pPage, AppearanceMode mode);
417
418  private:
419   CPDF_Dictionary* const m_pAnnotDict;
420
421   CPDF_AnnotList* const m_pList;
422
423   const CFX_ByteString m_sSubtype;
424
425   CFX_MapPtrToPtr m_APMap;
426 };
427
428 class CPDF_AnnotList {
429  public:
430   CPDF_AnnotList(CPDF_Page* pPage);
431
432   ~CPDF_AnnotList();
433
434   void GetAnnotMatrix(const CPDF_Dictionary* pAnnotDict,
435                       const CFX_Matrix* pUser2Device,
436                       CFX_Matrix& matrix) const;
437
438   void GetAnnotRect(const CPDF_Dictionary* pAnnotDict,
439                     const CFX_Matrix* pUser2Device,
440                     CPDF_Rect& rtAnnot) const;
441
442   void DisplayAnnots(const CPDF_Page* pPage,
443                      CFX_RenderDevice* pDevice,
444                      CFX_AffineMatrix* pMatrix,
445                      FX_BOOL bShowWidget,
446                      CPDF_RenderOptions* pOptions);
447
448   void DisplayAnnots(const CPDF_Page* pPage,
449                      CPDF_RenderContext* pContext,
450                      FX_BOOL bPrinting,
451                      CFX_AffineMatrix* pMatrix,
452                      FX_BOOL bShowWidget,
453                      CPDF_RenderOptions* pOptions) {
454     DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix,
455                   bShowWidget ? 3 : 1, pOptions, NULL);
456   }
457
458   void DisplayAnnots(const CPDF_Page* pPage,
459                      CPDF_RenderContext* pContext,
460                      FX_BOOL bPrinting,
461                      CFX_AffineMatrix* pMatrix,
462                      FX_BOOL bShowWidget,
463                      CPDF_RenderOptions* pOptions,
464                      FX_RECT* pClipRect) {
465     DisplayAnnots(pPage, NULL, pContext, bPrinting, pMatrix,
466                   bShowWidget ? 3 : 1, pOptions, pClipRect);
467   }
468
469   void DisplayAnnots(const CPDF_Page* pPage,
470                      CFX_RenderDevice* pDevice,
471                      CPDF_RenderContext* pContext,
472                      FX_BOOL bPrinting,
473                      CFX_AffineMatrix* pMatrix,
474                      FX_DWORD dwAnnotFlags,
475                      CPDF_RenderOptions* pOptions,
476                      FX_RECT* pClipRect);
477
478   CPDF_Annot* GetAt(int index) { return (CPDF_Annot*)m_AnnotList.GetAt(index); }
479
480   int Count() { return m_AnnotList.GetSize(); }
481
482   int GetIndex(CPDF_Annot* pAnnot);
483
484   CPDF_Document* GetDocument() const { return m_pDocument; }
485
486  protected:
487   CFX_PtrArray m_AnnotList;
488
489   CPDF_Dictionary* m_pPageDict;
490
491   CPDF_Document* m_pDocument;
492
493   CFX_PtrArray m_Borders;
494
495   void DisplayPass(const CPDF_Page* pPage,
496                    CFX_RenderDevice* pDevice,
497                    CPDF_RenderContext* pContext,
498                    FX_BOOL bPrinting,
499                    CFX_AffineMatrix* pMatrix,
500                    FX_BOOL bWidget,
501                    CPDF_RenderOptions* pOptions,
502                    FX_RECT* clip_rect);
503   friend class CPDF_Annot;
504 };
505 #define COLORTYPE_TRANSPARENT 0
506 #define COLORTYPE_GRAY 1
507 #define COLORTYPE_RGB 2
508 #define COLORTYPE_CMYK 3
509 class CPDF_DefaultAppearance {
510  public:
511   CPDF_DefaultAppearance(const CFX_ByteString& csDA = "") { m_csDA = csDA; }
512
513   CPDF_DefaultAppearance(const CPDF_DefaultAppearance& cDA) {
514     m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
515   }
516
517   operator CFX_ByteString() const { return m_csDA; }
518
519   const CPDF_DefaultAppearance& operator=(const CFX_ByteString& csDA) {
520     m_csDA = csDA;
521     return *this;
522   }
523
524   const CPDF_DefaultAppearance& operator=(const CPDF_DefaultAppearance& cDA) {
525     m_csDA = (CFX_ByteString)(CPDF_DefaultAppearance&)cDA;
526     return *this;
527   }
528
529   FX_BOOL HasFont();
530
531   CFX_ByteString GetFontString();
532
533   void GetFont(CFX_ByteString& csFontNameTag, FX_FLOAT& fFontSize);
534
535   FX_BOOL HasColor(FX_BOOL bStrokingOperation = FALSE);
536
537   CFX_ByteString GetColorString(FX_BOOL bStrokingOperation = FALSE);
538
539   void GetColor(int& iColorType,
540                 FX_FLOAT fc[4],
541                 FX_BOOL bStrokingOperation = FALSE);
542
543   void GetColor(FX_ARGB& color,
544                 int& iColorType,
545                 FX_BOOL bStrokingOperation = FALSE);
546
547   FX_BOOL HasTextMatrix();
548
549   CFX_ByteString GetTextMatrixString();
550
551   CFX_AffineMatrix GetTextMatrix();
552
553  protected:
554   CFX_ByteString m_csDA;
555 };
556 #define FIELDTYPE_UNKNOWN 0
557 #define FIELDTYPE_PUSHBUTTON 1
558 #define FIELDTYPE_CHECKBOX 2
559 #define FIELDTYPE_RADIOBUTTON 3
560 #define FIELDTYPE_COMBOBOX 4
561 #define FIELDTYPE_LISTBOX 5
562 #define FIELDTYPE_TEXTFIELD 6
563 #define FIELDTYPE_SIGNATURE 7
564 class CPDF_InterForm : public CFX_PrivateData {
565  public:
566   CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);
567   ~CPDF_InterForm();
568
569   static void EnableUpdateAP(FX_BOOL bUpdateAP);
570
571   static FX_BOOL UpdatingAPEnabled();
572
573   static CFX_ByteString GenerateNewResourceName(const CPDF_Dictionary* pResDict,
574                                                 const FX_CHAR* csType,
575                                                 int iMinLen = 2,
576                                                 const FX_CHAR* csPrefix = "");
577
578   static CPDF_Font* AddSystemDefaultFont(const CPDF_Document* pDocument);
579
580   static CPDF_Font* AddSystemFont(const CPDF_Document* pDocument,
581                                   CFX_ByteString csFontName,
582                                   uint8_t iCharSet = 1);
583
584   static CPDF_Font* AddSystemFont(const CPDF_Document* pDocument,
585                                   CFX_WideString csFontName,
586                                   uint8_t iCharSet = 1);
587
588   static CPDF_Font* AddStandardFont(const CPDF_Document* pDocument,
589                                     CFX_ByteString csFontName);
590
591   static CFX_ByteString GetNativeFont(uint8_t iCharSet, void* pLogFont = NULL);
592
593   static CFX_ByteString GetNativeFont(void* pLogFont = NULL);
594
595   static uint8_t GetNativeCharSet();
596
597   static CPDF_Font* AddNativeFont(uint8_t iCharSet,
598                                   const CPDF_Document* pDocument);
599
600   static CPDF_Font* AddNativeFont(const CPDF_Document* pDocument);
601
602   FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName, int iType);
603
604   FX_BOOL ValidateFieldName(const CPDF_FormField* pField,
605                             CFX_WideString& csNewFieldName);
606
607   FX_BOOL ValidateFieldName(const CPDF_FormControl* pControl,
608                             CFX_WideString& csNewFieldName);
609
610   FX_DWORD CountFields(const CFX_WideString& csFieldName = L"");
611
612   CPDF_FormField* GetField(FX_DWORD index,
613                            const CFX_WideString& csFieldName = L"");
614
615   void GetAllFieldNames(CFX_WideStringArray& allFieldNames);
616
617   FX_BOOL IsValidFormField(const void* pField);
618
619   CPDF_FormField* GetFieldByDict(CPDF_Dictionary* pFieldDict) const;
620
621   CPDF_FormControl* GetControlAtPoint(CPDF_Page* pPage,
622                                       FX_FLOAT pdf_x,
623                                       FX_FLOAT pdf_y,
624                                       int* z_order) const;
625
626   CPDF_FormControl* GetControlByDict(CPDF_Dictionary* pWidgetDict) const;
627
628   CPDF_Document* GetDocument() const { return m_pDocument; }
629
630   CPDF_Dictionary* GetFormDict() const { return m_pFormDict; }
631
632   FX_BOOL NeedConstructAP();
633
634   void NeedConstructAP(FX_BOOL bNeedAP);
635
636   int CountFieldsInCalculationOrder();
637
638   CPDF_FormField* GetFieldInCalculationOrder(int index);
639
640   int FindFieldInCalculationOrder(const CPDF_FormField* pField);
641
642   FX_DWORD CountFormFonts();
643
644   CPDF_Font* GetFormFont(FX_DWORD index, CFX_ByteString& csNameTag);
645
646   CPDF_Font* GetFormFont(CFX_ByteString csNameTag);
647
648   CPDF_Font* GetFormFont(CFX_ByteString csFontName, CFX_ByteString& csNameTag);
649
650   CPDF_Font* GetNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
651
652   CPDF_Font* GetNativeFormFont(CFX_ByteString& csNameTag);
653
654   FX_BOOL FindFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
655
656   FX_BOOL FindFormFont(CFX_ByteString csFontName,
657                        CPDF_Font*& pFont,
658                        CFX_ByteString& csNameTag);
659
660   inline FX_BOOL FindFormFont(CFX_WideString csFontName,
661                               CPDF_Font*& pFont,
662                               CFX_ByteString& csNameTag) {
663     return FindFormFont(PDF_EncodeText(csFontName), pFont, csNameTag);
664   }
665
666   void AddFormFont(const CPDF_Font* pFont, CFX_ByteString& csNameTag);
667
668   CPDF_Font* AddNativeFormFont(uint8_t iCharSet, CFX_ByteString& csNameTag);
669
670   CPDF_Font* AddNativeFormFont(CFX_ByteString& csNameTag);
671
672   void RemoveFormFont(const CPDF_Font* pFont);
673
674   void RemoveFormFont(CFX_ByteString csNameTag);
675
676   CPDF_DefaultAppearance GetDefaultAppearance();
677
678   CPDF_Font* GetDefaultFormFont();
679
680   int GetFormAlignment();
681
682   CPDF_FormField* CheckRequiredFields(const CFX_PtrArray* fields = NULL,
683                                       FX_BOOL bIncludeOrExclude = TRUE) const;
684
685   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
686                              FX_BOOL bSimpleFileSpec = FALSE) const;
687
688   CFDF_Document* ExportToFDF(const CFX_WideStringC& pdf_path,
689                              CFX_PtrArray& fields,
690                              FX_BOOL bIncludeOrExclude = TRUE,
691                              FX_BOOL bSimpleFileSpec = FALSE) const;
692
693   FX_BOOL ImportFromFDF(const CFDF_Document* pFDFDoc, FX_BOOL bNotify = FALSE);
694
695   FX_BOOL ResetForm(const CFX_PtrArray& fields,
696                     FX_BOOL bIncludeOrExclude = TRUE,
697                     FX_BOOL bNotify = FALSE);
698
699   FX_BOOL ResetForm(FX_BOOL bNotify = FALSE);
700
701   CPDF_FormNotify* GetFormNotify() const { return m_pFormNotify; }
702
703   void SetFormNotify(const CPDF_FormNotify* pNotify);
704
705   FX_BOOL IsUpdated() { return m_bUpdated; }
706
707   void ClearUpdatedFlag() { m_bUpdated = FALSE; }
708
709   FX_BOOL HasXFAForm() const;
710
711   void FixPageFields(const CPDF_Page* pPage);
712
713  protected:
714   static FX_BOOL m_bUpdateAP;
715
716   void LoadField(CPDF_Dictionary* pFieldDict, int nLevel = 0);
717
718   CPDF_Object* GetFieldAttr(CPDF_Dictionary* pFieldDict, const FX_CHAR* name);
719
720   CPDF_FormField* AddTerminalField(const CPDF_Dictionary* pFieldDict);
721
722   CPDF_FormControl* AddControl(const CPDF_FormField* pField,
723                                const CPDF_Dictionary* pWidgetDict);
724
725   void FDF_ImportField(CPDF_Dictionary* pField,
726                        const CFX_WideString& parent_name,
727                        FX_BOOL bNotify = FALSE,
728                        int nLevel = 0);
729
730   FX_BOOL ValidateFieldName(CFX_WideString& csNewFieldName,
731                             int iType,
732                             const CPDF_FormField* pExcludedField,
733                             const CPDF_FormControl* pExcludedControl);
734
735   int CompareFieldName(const CFX_WideString& name1,
736                        const CFX_WideString& name2);
737
738   int CompareFieldName(const CFX_ByteString& name1,
739                        const CFX_ByteString& name2);
740
741   CPDF_Document* m_pDocument;
742
743   FX_BOOL m_bGenerateAP;
744
745   CPDF_Dictionary* m_pFormDict;
746
747   std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap;
748
749   CFieldTree* m_pFieldTree;
750
751   CFX_ByteString m_bsEncoding;
752
753   CPDF_FormNotify* m_pFormNotify;
754
755   FX_BOOL m_bUpdated;
756   friend class CPDF_FormControl;
757   friend class CPDF_FormField;
758 };
759 #define FORMFIELD_READONLY 0x01
760 #define FORMFIELD_REQUIRED 0x02
761 #define FORMFIELD_NOEXPORT 0x04
762 #define FORMRADIO_NOTOGGLEOFF 0x100
763 #define FORMRADIO_UNISON 0x200
764 #define FORMTEXT_MULTILINE 0x100
765 #define FORMTEXT_PASSWORD 0x200
766 #define FORMTEXT_NOSCROLL 0x400
767 #define FORMTEXT_COMB 0x800
768 #define FORMCOMBO_EDIT 0x100
769 #define FORMLIST_MULTISELECT 0x100
770 class CPDF_FormField {
771  public:
772   enum Type {
773     Unknown,
774     PushButton,
775     RadioButton,
776     CheckBox,
777     Text,
778     RichText,
779     File,
780     ListBox,
781     ComboBox,
782     Sign
783   };
784
785   CFX_WideString GetFullName();
786
787   Type GetType() { return m_Type; }
788
789   FX_DWORD GetFlags() { return m_Flags; }
790
791   CPDF_Dictionary* GetFieldDict() const { return m_pDict; }
792
793   void SetFieldDict(CPDF_Dictionary* pDict) { m_pDict = pDict; }
794
795   FX_BOOL ResetField(FX_BOOL bNotify = FALSE);
796
797   int CountControls() { return m_ControlList.GetSize(); }
798
799   CPDF_FormControl* GetControl(int index) {
800     return (CPDF_FormControl*)m_ControlList.GetAt(index);
801   }
802
803   int GetControlIndex(const CPDF_FormControl* pControl);
804
805   int GetFieldType();
806
807   CPDF_AAction GetAdditionalAction();
808
809   CFX_WideString GetAlternateName();
810
811   CFX_WideString GetMappingName();
812
813   FX_DWORD GetFieldFlags();
814
815   CFX_ByteString GetDefaultStyle();
816
817   CFX_WideString GetRichTextString();
818
819   CFX_WideString GetValue();
820
821   CFX_WideString GetDefaultValue();
822
823   FX_BOOL SetValue(const CFX_WideString& value, FX_BOOL bNotify = FALSE);
824
825   int GetMaxLen();
826
827   int CountSelectedItems();
828
829   int GetSelectedIndex(int index);
830
831   FX_BOOL ClearSelection(FX_BOOL bNotify = FALSE);
832
833   FX_BOOL IsItemSelected(int index);
834
835   FX_BOOL SetItemSelection(int index,
836                            FX_BOOL bSelected,
837                            FX_BOOL bNotify = FALSE);
838
839   FX_BOOL IsItemDefaultSelected(int index);
840
841   int GetDefaultSelectedItem();
842
843   int CountOptions();
844
845   CFX_WideString GetOptionLabel(int index);
846
847   CFX_WideString GetOptionValue(int index);
848
849   int FindOption(CFX_WideString csOptLabel);
850
851   int FindOptionValue(const CFX_WideString& csOptValue, int iStartIndex = 0);
852
853   FX_BOOL CheckControl(int iControlIndex,
854                        FX_BOOL bChecked,
855                        FX_BOOL bNotify = FALSE);
856
857   int GetTopVisibleIndex();
858
859   int CountSelectedOptions();
860
861   int GetSelectedOptionIndex(int index);
862
863   FX_BOOL IsOptionSelected(int iOptIndex);
864
865   FX_BOOL SelectOption(int iOptIndex,
866                        FX_BOOL bSelected,
867                        FX_BOOL bNotify = FALSE);
868
869   FX_BOOL ClearSelectedOptions(FX_BOOL bNotify = FALSE);
870
871   FX_FLOAT GetFontSize() { return m_FontSize; }
872
873   CPDF_Font* GetFont() { return m_pFont; }
874
875  protected:
876   CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict);
877
878   ~CPDF_FormField();
879
880   CPDF_FormField::Type m_Type;
881
882   FX_DWORD m_Flags;
883
884   CPDF_InterForm* m_pForm;
885
886   CPDF_Dictionary* m_pDict;
887
888   CFX_PtrArray m_ControlList;
889   friend class CPDF_InterForm;
890   friend class CPDF_FormControl;
891
892   CFX_WideString GetValue(FX_BOOL bDefault);
893
894   FX_BOOL SetValue(const CFX_WideString& value,
895                    FX_BOOL bDefault,
896                    FX_BOOL bNotify);
897
898   void SyncFieldFlags();
899
900   int FindListSel(CPDF_String* str);
901
902   CFX_WideString GetOptionText(int index, int sub_index);
903
904   void LoadDA();
905
906   void UpdateAP(CPDF_FormControl* pControl);
907
908   CFX_WideString GetCheckValue(FX_BOOL bDefault);
909
910   FX_BOOL SetCheckValue(const CFX_WideString& value,
911                         FX_BOOL bDefault,
912                         FX_BOOL bNotify);
913
914   FX_FLOAT m_FontSize;
915
916   CPDF_Font* m_pFont;
917 };
918 CPDF_Object* FPDF_GetFieldAttr(CPDF_Dictionary* pFieldDict,
919                                const FX_CHAR* name,
920                                int nLevel = 0);
921 class CPDF_IconFit {
922  public:
923   CPDF_IconFit(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
924
925   operator CPDF_Dictionary*() const { return m_pDict; }
926
927   enum ScaleMethod { Always = 0, Bigger, Smaller, Never };
928
929   ScaleMethod GetScaleMethod();
930
931   FX_BOOL IsProportionalScale();
932
933   void GetIconPosition(FX_FLOAT& fLeft, FX_FLOAT& fBottom);
934
935   FX_BOOL GetFittingBounds();
936
937   CPDF_Dictionary* m_pDict;
938 };
939
940 #define TEXTPOS_CAPTION 0
941 #define TEXTPOS_ICON 1
942 #define TEXTPOS_BELOW 2
943 #define TEXTPOS_ABOVE 3
944 #define TEXTPOS_RIGHT 4
945 #define TEXTPOS_LEFT 5
946 #define TEXTPOS_OVERLAID 6
947 class CPDF_FormControl {
948  public:
949   CPDF_FormField::Type GetType() { return m_pField->GetType(); }
950
951   CPDF_InterForm* GetInterForm() const { return m_pForm; }
952
953   CPDF_FormField* GetField() const { return m_pField; }
954
955   CPDF_Dictionary* GetWidget() const { return m_pWidgetDict; }
956
957   CFX_FloatRect GetRect() const;
958
959   void DrawControl(CFX_RenderDevice* pDevice,
960                    CFX_AffineMatrix* pMatrix,
961                    CPDF_Page* pPage,
962                    CPDF_Annot::AppearanceMode mode,
963                    const CPDF_RenderOptions* pOptions = NULL);
964
965   CFX_ByteString GetCheckedAPState();
966
967   CFX_WideString GetExportValue();
968
969   FX_BOOL IsChecked();
970
971   FX_BOOL IsDefaultChecked();
972
973   enum HighlightingMode { None = 0, Invert, Outline, Push, Toggle };
974
975   HighlightingMode GetHighlightingMode();
976
977   FX_BOOL HasMKEntry(CFX_ByteString csEntry);
978
979   int GetRotation();
980
981   inline FX_ARGB GetBorderColor(int& iColorType) {
982     return GetColor(iColorType, "BC");
983   }
984
985   inline FX_FLOAT GetOriginalBorderColor(int index) {
986     return GetOriginalColor(index, "BC");
987   }
988
989   inline void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) {
990     GetOriginalColor(iColorType, fc, "BC");
991   }
992
993   inline FX_ARGB GetBackgroundColor(int& iColorType) {
994     return GetColor(iColorType, "BG");
995   }
996
997   inline FX_FLOAT GetOriginalBackgroundColor(int index) {
998     return GetOriginalColor(index, "BG");
999   }
1000
1001   inline void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) {
1002     GetOriginalColor(iColorType, fc, "BG");
1003   }
1004
1005   inline CFX_WideString GetNormalCaption() { return GetCaption("CA"); }
1006
1007   inline CFX_WideString GetRolloverCaption() { return GetCaption("RC"); }
1008
1009   inline CFX_WideString GetDownCaption() { return GetCaption("AC"); }
1010
1011   inline CPDF_Stream* GetNormalIcon() { return GetIcon("I"); }
1012
1013   inline CPDF_Stream* GetRolloverIcon() { return GetIcon("RI"); }
1014
1015   inline CPDF_Stream* GetDownIcon() { return GetIcon("IX"); }
1016
1017   CPDF_IconFit GetIconFit();
1018
1019   int GetTextPosition();
1020
1021   CPDF_Action GetAction();
1022
1023   CPDF_AAction GetAdditionalAction();
1024
1025   CPDF_DefaultAppearance GetDefaultAppearance();
1026
1027   CPDF_Font* GetDefaultControlFont();
1028
1029   int GetControlAlignment();
1030
1031  protected:
1032   CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
1033
1034   CFX_ByteString GetOnStateName();
1035
1036   void SetOnStateName(const CFX_ByteString& csOn);
1037
1038   void CheckControl(FX_BOOL bChecked);
1039
1040   FX_ARGB GetColor(int& iColorType, CFX_ByteString csEntry);
1041
1042   FX_FLOAT GetOriginalColor(int index, CFX_ByteString csEntry);
1043
1044   void GetOriginalColor(int& iColorType,
1045                         FX_FLOAT fc[4],
1046                         CFX_ByteString csEntry);
1047
1048   CFX_WideString GetCaption(CFX_ByteString csEntry);
1049
1050   CPDF_Stream* GetIcon(CFX_ByteString csEntry);
1051
1052   CPDF_ApSettings GetMK(FX_BOOL bCreate);
1053
1054   CPDF_InterForm* m_pForm;
1055
1056   CPDF_FormField* m_pField;
1057
1058   CPDF_Dictionary* m_pWidgetDict;
1059   friend class CPDF_InterForm;
1060   friend class CPDF_FormField;
1061 };
1062 class CPDF_FormNotify {
1063  public:
1064   virtual ~CPDF_FormNotify() {}
1065
1066   virtual int BeforeValueChange(const CPDF_FormField* pField,
1067                                 CFX_WideString& csValue) {
1068     return 0;
1069   }
1070
1071   virtual int AfterValueChange(const CPDF_FormField* pField) { return 0; }
1072
1073   virtual int BeforeSelectionChange(const CPDF_FormField* pField,
1074                                     CFX_WideString& csValue) {
1075     return 0;
1076   }
1077
1078   virtual int AfterSelectionChange(const CPDF_FormField* pField) { return 0; }
1079
1080   virtual int AfterCheckedStatusChange(const CPDF_FormField* pField,
1081                                        const CFX_ByteArray& statusArray) {
1082     return 0;
1083   }
1084
1085   virtual int BeforeFormReset(const CPDF_InterForm* pForm) { return 0; }
1086
1087   virtual int AfterFormReset(const CPDF_InterForm* pForm) { return 0; }
1088
1089   virtual int BeforeFormImportData(const CPDF_InterForm* pForm) { return 0; }
1090
1091   virtual int AfterFormImportData(const CPDF_InterForm* pForm) { return 0; }
1092 };
1093 FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
1094 class CPDF_PageLabel {
1095  public:
1096   CPDF_PageLabel(CPDF_Document* pDocument) { m_pDocument = pDocument; }
1097
1098   CFX_WideString GetLabel(int nPage) const;
1099
1100   int32_t GetPageByLabel(const CFX_ByteStringC& bsLabel) const;
1101
1102   int32_t GetPageByLabel(const CFX_WideStringC& wsLabel) const;
1103
1104  protected:
1105   CPDF_Document* m_pDocument;
1106 };
1107
1108 class CPDF_Metadata {
1109  public:
1110   explicit CPDF_Metadata(CPDF_Document* pDoc);
1111   ~CPDF_Metadata();
1112
1113   const CXML_Element* GetRoot() const;
1114
1115  private:
1116   nonstd::unique_ptr<CXML_Element> m_pXmlElement;
1117 };
1118
1119 class CPDF_ViewerPreferences {
1120  public:
1121   CPDF_ViewerPreferences(CPDF_Document* pDoc);
1122
1123   ~CPDF_ViewerPreferences();
1124
1125   FX_BOOL IsDirectionR2L() const;
1126
1127   FX_BOOL PrintScaling() const;
1128
1129   int32_t NumCopies() const;
1130
1131   CPDF_Array* PrintPageRange() const;
1132
1133   CFX_ByteString Duplex() const;
1134
1135  protected:
1136   CPDF_Document* m_pDoc;
1137 };
1138 class CPDF_ApSettings {
1139  public:
1140   CPDF_ApSettings(CPDF_Dictionary* pDict = NULL) { m_pDict = pDict; }
1141
1142   operator CPDF_Dictionary*() const { return m_pDict; }
1143
1144   FX_BOOL HasMKEntry(const CFX_ByteStringC& csEntry);
1145
1146   int GetRotation();
1147
1148   inline FX_ARGB GetBorderColor(int& iColorType) {
1149     return GetColor(iColorType, FX_BSTRC("BC"));
1150   }
1151
1152   inline FX_FLOAT GetOriginalBorderColor(int index) {
1153     return GetOriginalColor(index, FX_BSTRC("BC"));
1154   }
1155
1156   inline void GetOriginalBorderColor(int& iColorType, FX_FLOAT fc[4]) {
1157     GetOriginalColor(iColorType, fc, FX_BSTRC("BC"));
1158   }
1159
1160   inline FX_ARGB GetBackgroundColor(int& iColorType) {
1161     return GetColor(iColorType, FX_BSTRC("BG"));
1162   }
1163
1164   inline FX_FLOAT GetOriginalBackgroundColor(int index) {
1165     return GetOriginalColor(index, FX_BSTRC("BG"));
1166   }
1167
1168   inline void GetOriginalBackgroundColor(int& iColorType, FX_FLOAT fc[4]) {
1169     GetOriginalColor(iColorType, fc, FX_BSTRC("BG"));
1170   }
1171
1172   inline CFX_WideString GetNormalCaption() {
1173     return GetCaption(FX_BSTRC("CA"));
1174   }
1175
1176   inline CFX_WideString GetRolloverCaption() {
1177     return GetCaption(FX_BSTRC("RC"));
1178   }
1179
1180   inline CFX_WideString GetDownCaption() { return GetCaption(FX_BSTRC("AC")); }
1181
1182   inline CPDF_Stream* GetNormalIcon() { return GetIcon(FX_BSTRC("I")); }
1183
1184   inline CPDF_Stream* GetRolloverIcon() { return GetIcon(FX_BSTRC("RI")); }
1185
1186   inline CPDF_Stream* GetDownIcon() { return GetIcon(FX_BSTRC("IX")); }
1187
1188   CPDF_IconFit GetIconFit();
1189
1190   int GetTextPosition();
1191
1192   CPDF_Dictionary* m_pDict;
1193
1194  protected:
1195   FX_ARGB GetColor(int& iColorType, const CFX_ByteStringC& csEntry);
1196
1197   FX_FLOAT GetOriginalColor(int index, const CFX_ByteStringC& csEntry);
1198
1199   void GetOriginalColor(int& iColorType,
1200                         FX_FLOAT fc[4],
1201                         const CFX_ByteStringC& csEntry);
1202
1203   CFX_WideString GetCaption(const CFX_ByteStringC& csEntry);
1204
1205   CPDF_Stream* GetIcon(const CFX_ByteStringC& csEntry);
1206   friend class CPDF_FormControl;
1207 };
1208
1209 #endif  // CORE_INCLUDE_FPDFDOC_FPDF_DOC_H_