OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/include/fpdfdoc/fpdf_doc.h" | 7 #include "core/include/fpdfdoc/fpdf_doc.h" |
8 | 8 |
9 const int nMaxRecursion = 32; | 9 const int nMaxRecursion = 32; |
10 int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc) { | 10 int CPDF_Dest::GetPageIndex(CPDF_Document* pDoc) { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 } else { | 105 } else { |
106 break; | 106 break; |
107 } | 107 } |
108 nIndex += i; | 108 nIndex += i; |
109 return pNames->GetElementValue(i * 2 + 1); | 109 return pNames->GetElementValue(i * 2 + 1); |
110 } | 110 } |
111 nIndex += dwCount; | 111 nIndex += dwCount; |
112 return NULL; | 112 return NULL; |
113 } | 113 } |
114 CPDF_Array* pKids = pNode->GetArray("Kids"); | 114 CPDF_Array* pKids = pNode->GetArray("Kids"); |
115 if (pKids == NULL) { | 115 if (!pKids) { |
116 return NULL; | 116 return NULL; |
117 } | 117 } |
118 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { | 118 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { |
119 CPDF_Dictionary* pKid = pKids->GetDict(i); | 119 CPDF_Dictionary* pKid = pKids->GetDict(i); |
120 if (pKid == NULL) { | 120 if (!pKid) { |
121 continue; | 121 continue; |
122 } | 122 } |
123 CPDF_Object* pFound = | 123 CPDF_Object* pFound = |
124 SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1); | 124 SearchNameNode(pKid, csName, nIndex, ppFind, nLevel + 1); |
125 if (pFound) { | 125 if (pFound) { |
126 return pFound; | 126 return pFound; |
127 } | 127 } |
128 } | 128 } |
129 return NULL; | 129 return NULL; |
130 } | 130 } |
(...skipping 13 matching lines...) Expand all Loading... |
144 nCurIndex += nCount; | 144 nCurIndex += nCount; |
145 return NULL; | 145 return NULL; |
146 } | 146 } |
147 if (ppFind) { | 147 if (ppFind) { |
148 *ppFind = pNames; | 148 *ppFind = pNames; |
149 } | 149 } |
150 csName = pNames->GetString((nIndex - nCurIndex) * 2); | 150 csName = pNames->GetString((nIndex - nCurIndex) * 2); |
151 return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1); | 151 return pNames->GetElementValue((nIndex - nCurIndex) * 2 + 1); |
152 } | 152 } |
153 CPDF_Array* pKids = pNode->GetArray("Kids"); | 153 CPDF_Array* pKids = pNode->GetArray("Kids"); |
154 if (pKids == NULL) { | 154 if (!pKids) { |
155 return NULL; | 155 return NULL; |
156 } | 156 } |
157 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { | 157 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { |
158 CPDF_Dictionary* pKid = pKids->GetDict(i); | 158 CPDF_Dictionary* pKid = pKids->GetDict(i); |
159 if (pKid == NULL) { | 159 if (!pKid) { |
160 continue; | 160 continue; |
161 } | 161 } |
162 CPDF_Object* pFound = | 162 CPDF_Object* pFound = |
163 SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1); | 163 SearchNameNode(pKid, nIndex, nCurIndex, csName, ppFind, nLevel + 1); |
164 if (pFound) { | 164 if (pFound) { |
165 return pFound; | 165 return pFound; |
166 } | 166 } |
167 } | 167 } |
168 return NULL; | 168 return NULL; |
169 } | 169 } |
170 static int CountNames(CPDF_Dictionary* pNode, int nLevel = 0) { | 170 static int CountNames(CPDF_Dictionary* pNode, int nLevel = 0) { |
171 if (nLevel > nMaxRecursion) { | 171 if (nLevel > nMaxRecursion) { |
172 return 0; | 172 return 0; |
173 } | 173 } |
174 CPDF_Array* pNames = pNode->GetArray("Names"); | 174 CPDF_Array* pNames = pNode->GetArray("Names"); |
175 if (pNames) { | 175 if (pNames) { |
176 return pNames->GetCount() / 2; | 176 return pNames->GetCount() / 2; |
177 } | 177 } |
178 CPDF_Array* pKids = pNode->GetArray("Kids"); | 178 CPDF_Array* pKids = pNode->GetArray("Kids"); |
179 if (pKids == NULL) { | 179 if (!pKids) { |
180 return 0; | 180 return 0; |
181 } | 181 } |
182 int nCount = 0; | 182 int nCount = 0; |
183 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { | 183 for (FX_DWORD i = 0; i < pKids->GetCount(); i++) { |
184 CPDF_Dictionary* pKid = pKids->GetDict(i); | 184 CPDF_Dictionary* pKid = pKids->GetDict(i); |
185 if (pKid == NULL) { | 185 if (!pKid) { |
186 continue; | 186 continue; |
187 } | 187 } |
188 nCount += CountNames(pKid, nLevel + 1); | 188 nCount += CountNames(pKid, nLevel + 1); |
189 } | 189 } |
190 return nCount; | 190 return nCount; |
191 } | 191 } |
192 int CPDF_NameTree::GetCount() const { | 192 int CPDF_NameTree::GetCount() const { |
193 if (m_pRoot == NULL) { | 193 if (!m_pRoot) { |
194 return 0; | 194 return 0; |
195 } | 195 } |
196 return ::CountNames(m_pRoot); | 196 return ::CountNames(m_pRoot); |
197 } | 197 } |
198 int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const { | 198 int CPDF_NameTree::GetIndex(const CFX_ByteString& csName) const { |
199 if (m_pRoot == NULL) { | 199 if (!m_pRoot) { |
200 return -1; | 200 return -1; |
201 } | 201 } |
202 int nIndex = 0; | 202 int nIndex = 0; |
203 if (SearchNameNode(m_pRoot, csName, nIndex, NULL) == NULL) { | 203 if (!SearchNameNode(m_pRoot, csName, nIndex, NULL)) { |
204 return -1; | 204 return -1; |
205 } | 205 } |
206 return nIndex; | 206 return nIndex; |
207 } | 207 } |
208 CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, | 208 CPDF_Object* CPDF_NameTree::LookupValue(int nIndex, |
209 CFX_ByteString& csName) const { | 209 CFX_ByteString& csName) const { |
210 if (m_pRoot == NULL) { | 210 if (!m_pRoot) { |
211 return NULL; | 211 return NULL; |
212 } | 212 } |
213 int nCurIndex = 0; | 213 int nCurIndex = 0; |
214 return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, NULL); | 214 return SearchNameNode(m_pRoot, nIndex, nCurIndex, csName, NULL); |
215 } | 215 } |
216 CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const { | 216 CPDF_Object* CPDF_NameTree::LookupValue(const CFX_ByteString& csName) const { |
217 if (m_pRoot == NULL) { | 217 if (!m_pRoot) { |
218 return NULL; | 218 return NULL; |
219 } | 219 } |
220 int nIndex = 0; | 220 int nIndex = 0; |
221 return SearchNameNode(m_pRoot, csName, nIndex, NULL); | 221 return SearchNameNode(m_pRoot, csName, nIndex, NULL); |
222 } | 222 } |
223 CPDF_Array* CPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc, | 223 CPDF_Array* CPDF_NameTree::LookupNamedDest(CPDF_Document* pDoc, |
224 const CFX_ByteStringC& sName) { | 224 const CFX_ByteStringC& sName) { |
225 CPDF_Object* pValue = LookupValue(sName); | 225 CPDF_Object* pValue = LookupValue(sName); |
226 if (!pValue) { | 226 if (!pValue) { |
227 CPDF_Dictionary* pDests = pDoc->GetRoot()->GetDict("Dests"); | 227 CPDF_Dictionary* pDests = pDoc->GetRoot()->GetDict("Dests"); |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 } else if (bsStyle == "A") { | 461 } else if (bsStyle == "A") { |
462 wsNumPortion = _MakeLetters(num); | 462 wsNumPortion = _MakeLetters(num); |
463 wsNumPortion.MakeUpper(); | 463 wsNumPortion.MakeUpper(); |
464 } else if (bsStyle == "a") { | 464 } else if (bsStyle == "a") { |
465 wsNumPortion = _MakeLetters(num); | 465 wsNumPortion = _MakeLetters(num); |
466 } | 466 } |
467 return wsNumPortion; | 467 return wsNumPortion; |
468 } | 468 } |
469 CFX_WideString CPDF_PageLabel::GetLabel(int nPage) const { | 469 CFX_WideString CPDF_PageLabel::GetLabel(int nPage) const { |
470 CFX_WideString wsLabel; | 470 CFX_WideString wsLabel; |
471 if (m_pDocument == NULL) { | 471 if (!m_pDocument) { |
472 return wsLabel; | 472 return wsLabel; |
473 } | 473 } |
474 CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot(); | 474 CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot(); |
475 if (pPDFRoot == NULL) { | 475 if (!pPDFRoot) { |
476 return wsLabel; | 476 return wsLabel; |
477 } | 477 } |
478 CPDF_Dictionary* pLabels = pPDFRoot->GetDict("PageLabels"); | 478 CPDF_Dictionary* pLabels = pPDFRoot->GetDict("PageLabels"); |
479 CPDF_NumberTree numberTree(pLabels); | 479 CPDF_NumberTree numberTree(pLabels); |
480 CPDF_Object* pValue = NULL; | 480 CPDF_Object* pValue = NULL; |
481 int n = nPage; | 481 int n = nPage; |
482 while (n >= 0) { | 482 while (n >= 0) { |
483 pValue = numberTree.LookupValue(n); | 483 pValue = numberTree.LookupValue(n); |
484 if (pValue) { | 484 if (pValue) { |
485 break; | 485 break; |
(...skipping 11 matching lines...) Expand all Loading... |
497 CFX_WideString wsNumPortion = | 497 CFX_WideString wsNumPortion = |
498 _GetLabelNumPortion(nLabelNum, bsNumberingStyle); | 498 _GetLabelNumPortion(nLabelNum, bsNumberingStyle); |
499 wsLabel += wsNumPortion; | 499 wsLabel += wsNumPortion; |
500 return wsLabel; | 500 return wsLabel; |
501 } | 501 } |
502 } | 502 } |
503 wsLabel.Format(L"%d", nPage + 1); | 503 wsLabel.Format(L"%d", nPage + 1); |
504 return wsLabel; | 504 return wsLabel; |
505 } | 505 } |
506 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_ByteStringC& bsLabel) const { | 506 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_ByteStringC& bsLabel) const { |
507 if (m_pDocument == NULL) { | 507 if (!m_pDocument) { |
508 return -1; | 508 return -1; |
509 } | 509 } |
510 CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot(); | 510 CPDF_Dictionary* pPDFRoot = m_pDocument->GetRoot(); |
511 if (pPDFRoot == NULL) { | 511 if (!pPDFRoot) { |
512 return -1; | 512 return -1; |
513 } | 513 } |
514 int nPages = m_pDocument->GetPageCount(); | 514 int nPages = m_pDocument->GetPageCount(); |
515 CFX_ByteString bsLbl; | 515 CFX_ByteString bsLbl; |
516 CFX_ByteString bsOrig = bsLabel; | 516 CFX_ByteString bsOrig = bsLabel; |
517 for (int i = 0; i < nPages; i++) { | 517 for (int i = 0; i < nPages; i++) { |
518 bsLbl = PDF_EncodeText(GetLabel(i)); | 518 bsLbl = PDF_EncodeText(GetLabel(i)); |
519 if (!bsLbl.Compare(bsOrig)) { | 519 if (!bsLbl.Compare(bsOrig)) { |
520 return i; | 520 return i; |
521 } | 521 } |
522 } | 522 } |
523 bsLbl = bsOrig; | 523 bsLbl = bsOrig; |
524 int nPage = FXSYS_atoi(bsLbl); | 524 int nPage = FXSYS_atoi(bsLbl); |
525 if (nPage > 0 && nPage <= nPages) { | 525 if (nPage > 0 && nPage <= nPages) { |
526 return nPage; | 526 return nPage; |
527 } | 527 } |
528 return -1; | 528 return -1; |
529 } | 529 } |
530 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_WideStringC& wsLabel) const { | 530 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_WideStringC& wsLabel) const { |
531 CFX_ByteString bsLabel = PDF_EncodeText(wsLabel.GetPtr()); | 531 CFX_ByteString bsLabel = PDF_EncodeText(wsLabel.GetPtr()); |
532 return GetPageByLabel(bsLabel); | 532 return GetPageByLabel(bsLabel); |
533 } | 533 } |
OLD | NEW |