Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Side by Side Diff: core/fpdfdoc/doc_form.cpp

Issue 1867183002: Use std::vector as internal storage for CPDF_Array (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <vector> 7 #include <vector>
8 8
9 #include "core/fpdfapi/fpdf_font/include/cpdf_fontencoding.h" 9 #include "core/fpdfapi/fpdf_font/include/cpdf_fontencoding.h"
10 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h" 10 #include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 return; 270 return;
271 271
272 m_pFormDict = pRoot->GetDictBy("AcroForm"); 272 m_pFormDict = pRoot->GetDictBy("AcroForm");
273 if (!m_pFormDict) 273 if (!m_pFormDict)
274 return; 274 return;
275 275
276 CPDF_Array* pFields = m_pFormDict->GetArrayBy("Fields"); 276 CPDF_Array* pFields = m_pFormDict->GetArrayBy("Fields");
277 if (!pFields) 277 if (!pFields)
278 return; 278 return;
279 279
280 int count = pFields->GetCount(); 280 for (size_t i = 0; i < pFields->GetCount(); i++)
281 for (int i = 0; i < count; i++) {
282 LoadField(pFields->GetDictAt(i)); 281 LoadField(pFields->GetDictAt(i));
283 }
284 } 282 }
285 283
286 CPDF_InterForm::~CPDF_InterForm() { 284 CPDF_InterForm::~CPDF_InterForm() {
287 for (auto it : m_ControlMap) 285 for (auto it : m_ControlMap)
288 delete it.second; 286 delete it.second;
289 287
290 int nCount = m_pFieldTree->m_Root.CountFields(); 288 int nCount = m_pFieldTree->m_Root.CountFields();
291 for (int i = 0; i < nCount; ++i) { 289 for (int i = 0; i < nCount; ++i) {
292 delete m_pFieldTree->m_Root.GetField(i); 290 delete m_pFieldTree->m_Root.GetField(i);
293 } 291 }
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 } 694 }
697 695
698 CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage, 696 CPDF_FormControl* CPDF_InterForm::GetControlAtPoint(CPDF_Page* pPage,
699 FX_FLOAT pdf_x, 697 FX_FLOAT pdf_x,
700 FX_FLOAT pdf_y, 698 FX_FLOAT pdf_y,
701 int* z_order) const { 699 int* z_order) const {
702 CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArrayBy("Annots"); 700 CPDF_Array* pAnnotList = pPage->m_pFormDict->GetArrayBy("Annots");
703 if (!pAnnotList) 701 if (!pAnnotList)
704 return nullptr; 702 return nullptr;
705 703
706 for (uint32_t i = pAnnotList->GetCount(); i > 0; --i) { 704 for (size_t i = pAnnotList->GetCount(); i > 0; --i) {
707 uint32_t annot_index = i - 1; 705 size_t annot_index = i - 1;
708 CPDF_Dictionary* pAnnot = pAnnotList->GetDictAt(annot_index); 706 CPDF_Dictionary* pAnnot = pAnnotList->GetDictAt(annot_index);
709 if (!pAnnot) 707 if (!pAnnot)
710 continue; 708 continue;
711 709
712 const auto it = m_ControlMap.find(pAnnot); 710 const auto it = m_ControlMap.find(pAnnot);
713 if (it == m_ControlMap.end()) 711 if (it == m_ControlMap.end())
714 continue; 712 continue;
715 713
716 CPDF_FormControl* pControl = it->second; 714 CPDF_FormControl* pControl = it->second;
717 CFX_FloatRect rect = pControl->GetRect(); 715 CFX_FloatRect rect = pControl->GetRect();
718 if (!rect.Contains(pdf_x, pdf_y)) 716 if (!rect.Contains(pdf_x, pdf_y))
719 continue; 717 continue;
720 718
721 if (z_order) 719 if (z_order)
722 *z_order = annot_index; 720 *z_order = static_cast<int>(annot_index);
723 return pControl; 721 return pControl;
724 } 722 }
725 return nullptr; 723 return nullptr;
726 } 724 }
727 725
728 CPDF_FormControl* CPDF_InterForm::GetControlByDict( 726 CPDF_FormControl* CPDF_InterForm::GetControlByDict(
729 const CPDF_Dictionary* pWidgetDict) const { 727 const CPDF_Dictionary* pWidgetDict) const {
730 const auto it = m_ControlMap.find(pWidgetDict); 728 const auto it = m_ControlMap.find(pWidgetDict);
731 return it != m_ControlMap.end() ? it->second : nullptr; 729 return it != m_ControlMap.end() ? it->second : nullptr;
732 } 730 }
733 731
734 FX_BOOL CPDF_InterForm::NeedConstructAP() { 732 FX_BOOL CPDF_InterForm::NeedConstructAP() {
735 return m_pFormDict && m_pFormDict->GetBooleanBy("NeedAppearances"); 733 return m_pFormDict && m_pFormDict->GetBooleanBy("NeedAppearances");
736 } 734 }
737 void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP) { 735 void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP) {
738 if (!m_pFormDict) { 736 if (!m_pFormDict) {
739 InitInterFormDict(m_pFormDict, m_pDocument); 737 InitInterFormDict(m_pFormDict, m_pDocument);
740 } 738 }
741 m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP); 739 m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);
742 m_bGenerateAP = bNeedAP; 740 m_bGenerateAP = bNeedAP;
743 } 741 }
742
744 int CPDF_InterForm::CountFieldsInCalculationOrder() { 743 int CPDF_InterForm::CountFieldsInCalculationOrder() {
745 if (!m_pFormDict) { 744 if (!m_pFormDict) {
746 return 0; 745 return 0;
747 } 746 }
748 CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO"); 747 CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO");
749 return pArray ? pArray->GetCount() : 0; 748 return pArray ? pArray->GetCount() : 0;
750 } 749 }
750
751 CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index) { 751 CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index) {
752 if (!m_pFormDict || index < 0) { 752 if (!m_pFormDict || index < 0) {
753 return NULL; 753 return NULL;
754 } 754 }
755 CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO"); 755 CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO");
756 if (!pArray) { 756 if (!pArray) {
757 return NULL; 757 return NULL;
758 } 758 }
759 if (CPDF_Dictionary* pElement = 759 if (CPDF_Dictionary* pElement =
760 ToDictionary(pArray->GetDirectObjectAt(index))) { 760 ToDictionary(pArray->GetDirectObjectAt(index))) {
761 return GetFieldByDict(pElement); 761 return GetFieldByDict(pElement);
762 } 762 }
763 return NULL; 763 return NULL;
764 } 764 }
765 int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField) { 765 int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField) {
766 if (!m_pFormDict || !pField) { 766 if (!m_pFormDict || !pField) {
767 return -1; 767 return -1;
768 } 768 }
769 CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO"); 769 CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO");
770 if (!pArray) { 770 if (!pArray) {
771 return -1; 771 return -1;
772 } 772 }
773 for (uint32_t i = 0; i < pArray->GetCount(); i++) { 773 for (size_t i = 0; i < pArray->GetCount(); i++) {
774 CPDF_Object* pElement = pArray->GetDirectObjectAt(i); 774 CPDF_Object* pElement = pArray->GetDirectObjectAt(i);
775 if (pElement == pField->m_pDict) { 775 if (pElement == pField->m_pDict) {
776 return i; 776 return i;
777 } 777 }
778 } 778 }
779 return -1; 779 return -1;
780 } 780 }
781 uint32_t CPDF_InterForm::CountFormFonts() { 781 uint32_t CPDF_InterForm::CountFormFonts() {
782 return CountInterFormFonts(m_pFormDict); 782 return CountInterFormFonts(m_pFormDict);
783 } 783 }
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 CPDF_Array* pKids = pFieldDict->GetArrayBy("Kids"); 893 CPDF_Array* pKids = pFieldDict->GetArrayBy("Kids");
894 if (!pKids) { 894 if (!pKids) {
895 AddTerminalField(pFieldDict); 895 AddTerminalField(pFieldDict);
896 return; 896 return;
897 } 897 }
898 CPDF_Dictionary* pFirstKid = pKids->GetDictAt(0); 898 CPDF_Dictionary* pFirstKid = pKids->GetDictAt(0);
899 if (!pFirstKid) { 899 if (!pFirstKid) {
900 return; 900 return;
901 } 901 }
902 if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) { 902 if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {
903 for (uint32_t i = 0; i < pKids->GetCount(); i++) { 903 for (size_t i = 0; i < pKids->GetCount(); i++) {
904 CPDF_Dictionary* pChildDict = pKids->GetDictAt(i); 904 CPDF_Dictionary* pChildDict = pKids->GetDictAt(i);
905 if (pChildDict) { 905 if (pChildDict) {
906 if (pChildDict->GetObjNum() != dwParentObjNum) { 906 if (pChildDict->GetObjNum() != dwParentObjNum) {
907 LoadField(pChildDict, nLevel + 1); 907 LoadField(pChildDict, nLevel + 1);
908 } 908 }
909 } 909 }
910 } 910 }
911 } else { 911 } else {
912 AddTerminalField(pFieldDict); 912 AddTerminalField(pFieldDict);
913 } 913 }
914 } 914 }
915 FX_BOOL CPDF_InterForm::HasXFAForm() const { 915 FX_BOOL CPDF_InterForm::HasXFAForm() const {
916 return m_pFormDict && m_pFormDict->GetArrayBy("XFA"); 916 return m_pFormDict && m_pFormDict->GetArrayBy("XFA");
917 } 917 }
918 void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage) { 918 void CPDF_InterForm::FixPageFields(const CPDF_Page* pPage) {
919 CPDF_Dictionary* pPageDict = pPage->m_pFormDict; 919 CPDF_Dictionary* pPageDict = pPage->m_pFormDict;
920 if (!pPageDict) { 920 if (!pPageDict) {
921 return; 921 return;
922 } 922 }
923 CPDF_Array* pAnnots = pPageDict->GetArrayBy("Annots"); 923 CPDF_Array* pAnnots = pPageDict->GetArrayBy("Annots");
924 if (!pAnnots) { 924 if (!pAnnots) {
925 return; 925 return;
926 } 926 }
927 int iAnnotCount = pAnnots->GetCount(); 927 for (size_t i = 0; i < pAnnots->GetCount(); i++) {
928 for (int i = 0; i < iAnnotCount; i++) {
929 CPDF_Dictionary* pAnnot = pAnnots->GetDictAt(i); 928 CPDF_Dictionary* pAnnot = pAnnots->GetDictAt(i);
930 if (pAnnot && pAnnot->GetStringBy("Subtype") == "Widget") { 929 if (pAnnot && pAnnot->GetStringBy("Subtype") == "Widget") {
931 LoadField(pAnnot); 930 LoadField(pAnnot);
932 } 931 }
933 } 932 }
934 } 933 }
935 CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) { 934 CPDF_FormField* CPDF_InterForm::AddTerminalField(CPDF_Dictionary* pFieldDict) {
936 if (!pFieldDict->KeyExist("T")) { 935 if (!pFieldDict->KeyExist("T")) {
937 return NULL; 936 return NULL;
938 } 937 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 pDict->SetAtName("T", ""); 975 pDict->SetAtName("T", "");
977 } 976 }
978 m_pFieldTree->SetField(csWName, pField); 977 m_pFieldTree->SetField(csWName, pField);
979 } 978 }
980 CPDF_Array* pKids = pFieldDict->GetArrayBy("Kids"); 979 CPDF_Array* pKids = pFieldDict->GetArrayBy("Kids");
981 if (!pKids) { 980 if (!pKids) {
982 if (pFieldDict->GetStringBy("Subtype") == "Widget") { 981 if (pFieldDict->GetStringBy("Subtype") == "Widget") {
983 AddControl(pField, pFieldDict); 982 AddControl(pField, pFieldDict);
984 } 983 }
985 } else { 984 } else {
986 for (uint32_t i = 0; i < pKids->GetCount(); i++) { 985 for (size_t i = 0; i < pKids->GetCount(); i++) {
987 CPDF_Dictionary* pKid = pKids->GetDictAt(i); 986 CPDF_Dictionary* pKid = pKids->GetDictAt(i);
988 if (!pKid) { 987 if (!pKid) {
989 continue; 988 continue;
990 } 989 }
991 if (pKid->GetStringBy("Subtype") != "Widget") { 990 if (pKid->GetStringBy("Subtype") != "Widget") {
992 continue; 991 continue;
993 } 992 }
994 AddControl(pField, pKid); 993 AddControl(pField, pKid);
995 } 994 }
996 } 995 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 const CFX_WideString& parent_name, 1113 const CFX_WideString& parent_name,
1115 FX_BOOL bNotify, 1114 FX_BOOL bNotify,
1116 int nLevel) { 1115 int nLevel) {
1117 CFX_WideString name; 1116 CFX_WideString name;
1118 if (!parent_name.IsEmpty()) { 1117 if (!parent_name.IsEmpty()) {
1119 name = parent_name + L"."; 1118 name = parent_name + L".";
1120 } 1119 }
1121 name += pFieldDict->GetUnicodeTextBy("T"); 1120 name += pFieldDict->GetUnicodeTextBy("T");
1122 CPDF_Array* pKids = pFieldDict->GetArrayBy("Kids"); 1121 CPDF_Array* pKids = pFieldDict->GetArrayBy("Kids");
1123 if (pKids) { 1122 if (pKids) {
1124 for (uint32_t i = 0; i < pKids->GetCount(); i++) { 1123 for (size_t i = 0; i < pKids->GetCount(); i++) {
1125 CPDF_Dictionary* pKid = pKids->GetDictAt(i); 1124 CPDF_Dictionary* pKid = pKids->GetDictAt(i);
1126 if (!pKid) { 1125 if (!pKid) {
1127 continue; 1126 continue;
1128 } 1127 }
1129 if (nLevel <= nMaxRecursion) { 1128 if (nLevel <= nMaxRecursion) {
1130 FDF_ImportField(pKid, name, bNotify, nLevel + 1); 1129 FDF_ImportField(pKid, name, bNotify, nLevel + 1);
1131 } 1130 }
1132 } 1131 }
1133 return; 1132 return;
1134 } 1133 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1186 if (!pFields) { 1185 if (!pFields) {
1187 return FALSE; 1186 return FALSE;
1188 } 1187 }
1189 m_bsEncoding = pMainDict->GetStringBy("Encoding"); 1188 m_bsEncoding = pMainDict->GetStringBy("Encoding");
1190 if (bNotify && m_pFormNotify) { 1189 if (bNotify && m_pFormNotify) {
1191 int iRet = m_pFormNotify->BeforeFormImportData(this); 1190 int iRet = m_pFormNotify->BeforeFormImportData(this);
1192 if (iRet < 0) { 1191 if (iRet < 0) {
1193 return FALSE; 1192 return FALSE;
1194 } 1193 }
1195 } 1194 }
1196 for (uint32_t i = 0; i < pFields->GetCount(); i++) { 1195 for (size_t i = 0; i < pFields->GetCount(); i++) {
1197 CPDF_Dictionary* pField = pFields->GetDictAt(i); 1196 CPDF_Dictionary* pField = pFields->GetDictAt(i);
1198 if (!pField) { 1197 if (!pField) {
1199 continue; 1198 continue;
1200 } 1199 }
1201 FDF_ImportField(pField, L"", bNotify); 1200 FDF_ImportField(pField, L"", bNotify);
1202 } 1201 }
1203 if (bNotify && m_pFormNotify) { 1202 if (bNotify && m_pFormNotify) {
1204 m_pFormNotify->AfterFormImportData(this); 1203 m_pFormNotify->AfterFormImportData(this);
1205 } 1204 }
1206 return TRUE; 1205 return TRUE;
1207 } 1206 }
1208 void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) { 1207 void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) {
1209 m_pFormNotify = (CPDF_FormNotify*)pNotify; 1208 m_pFormNotify = (CPDF_FormNotify*)pNotify;
1210 } 1209 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698