Allow FPDFBookmark_GetFirstChild to return the top level bookmark
[pdfium.git] / fpdfsdk / src / formfiller / FFL_Utils.cpp
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 #include "../../include/formfiller/FormFiller.h"
8 #include "../../include/formfiller/FFL_Utils.h"
9
10 CPDF_Rect CFFL_Utils::MaxRect(const CPDF_Rect & rect1,const CPDF_Rect & rect2)
11 {
12         CPDF_Rect rcRet;
13
14         rcRet.left = FFL_MIN(rect1.left,rect2.left);
15         rcRet.bottom = FFL_MIN(rect1.bottom,rect2.bottom);
16         rcRet.right = FFL_MAX(rect1.right,rect2.right);
17         rcRet.top = FFL_MAX(rect1.top,rect2.top);
18
19         return rcRet;
20 }
21
22 CPDF_Rect CFFL_Utils::InflateRect(const CPDF_Rect & crRect,const FX_FLOAT & fSize)
23 {
24         CPDF_Rect crNew(crRect.left - fSize,
25                                         crRect.bottom - fSize,
26                                         crRect.right + fSize,
27                                         crRect.top + fSize);
28         crNew.Normalize();
29         return crNew;
30 }
31
32 CPDF_Rect CFFL_Utils::DeflateRect(const CPDF_Rect & crRect,const FX_FLOAT & fSize)
33 {
34         CPDF_Rect crNew(crRect.left + fSize,
35                                         crRect.bottom + fSize,
36                                         crRect.right - fSize,
37                                         crRect.top - fSize);
38         crNew.Normalize();
39         return crNew;
40 }
41
42 /*
43 FX_BOOL CFFL_Utils::RectContainsRect(const CPDF_Rect & father,const CPDF_Rect & son)
44 {
45         return (father.left <= son.left && father.right >= son.right && 
46                                 father.bottom <= son.bottom && father.top >= son.top);
47
48 }
49
50 FX_BOOL CFFL_Utils::RectContainsPoint(const CPDF_Rect & father,const CPDF_Point & son)
51 {
52         return (father.left <= son.x && father.right >= son.x && 
53                                 father.bottom <= son.y && father.top >= son.y);
54 }
55
56 FX_BOOL CFFL_Utils::RectContainsXY(const CPDF_Rect & father,FX_FLOAT x,FX_FLOAT y)
57 {
58         return (father.left <= x && father.right >= x && 
59                                 father.bottom <= y && father.top >= y);
60 }
61 */
62
63 FX_BOOL CFFL_Utils::TraceObject(CPDF_Object* pObj)
64 {
65         if (!pObj) return FALSE;
66
67         FX_DWORD        dwObjNum = pObj->GetObjNum();
68         switch (pObj->GetType())
69         {
70         case PDFOBJ_ARRAY:
71                 {
72                         CPDF_Array* pArray = (CPDF_Array*)pObj;
73                         for (FX_DWORD i = 0; i < pArray->GetCount(); i ++)
74                         {
75                                 CPDF_Object* pElement = pArray->GetElementValue(i);                             
76                                 TraceObject(pElement);
77                         }
78                 }
79                 break;
80
81         case PDFOBJ_DICTIONARY:
82                 {
83                         CPDF_Dictionary* pDict = (CPDF_Dictionary*)pObj;
84
85                         FX_POSITION fPos = pDict->GetStartPos();
86                         CFX_ByteString csKey;
87                         do
88                         {
89                                 CPDF_Object* pElement = pDict->GetNextElement(fPos, csKey);
90                                 //TRACE(csKey + "\n");
91                                 if (!pElement) break;
92                                 TraceObject(pElement);
93                         }while (TRUE);
94                 }
95                 break;
96
97         case PDFOBJ_STREAM:
98                 {
99                         CPDF_Stream* pStream = (CPDF_Stream*)pObj;
100                         CPDF_Dictionary* pDict = pStream->GetDict();
101                         TraceObject(pDict);
102                 }
103                 break;
104
105         case PDFOBJ_REFERENCE:
106                 {
107                         CPDF_Object* pDirectObj = pObj->GetDirect();
108                         TraceObject(pDirectObj);
109                 }
110                 break;
111
112         case PDFOBJ_BOOLEAN:
113                 break;
114         case PDFOBJ_NUMBER:
115                 //TRACE("%d\n",(FX_INT32)pObj);
116                 break;
117         case PDFOBJ_STRING:
118                 //TRACE(((CPDF_String*)pObj)->GetString() + "\n");
119                 break;
120         case PDFOBJ_NAME:
121                 //TRACE(((CPDF_Name*)pObj)->GetString() + "\n");
122                 break;
123         case PDFOBJ_NULL:
124 //      case PDFOBJ_KEYWORD:
125 //      case PDFOBJ_EOF:
126         default:
127                 break;
128         }
129         if (dwObjNum == 0) return FALSE;
130
131         return TRUE;
132 }
133