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 "../../include/fpdfdoc/fpdf_doc.h" | 7 #include "../../include/fpdfdoc/fpdf_doc.h" |
8 #include "doc_utils.h" | 8 #include "doc_utils.h" |
9 | 9 |
10 const int nMaxRecursion = 32; | 10 const int nMaxRecursion = 32; |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
347 LOGFONTA lf; | 347 LOGFONTA lf; |
348 } PDF_FONTDATA, FAR* LPDF_FONTDATA; | 348 } PDF_FONTDATA, FAR* LPDF_FONTDATA; |
349 static int CALLBACK EnumFontFamExProc( ENUMLOGFONTEXA *lpelfe, | 349 static int CALLBACK EnumFontFamExProc( ENUMLOGFONTEXA *lpelfe, |
350 NEWTEXTMETRICEX *lpntme, | 350 NEWTEXTMETRICEX *lpntme, |
351 DWORD FontType, | 351 DWORD FontType, |
352 LPARAM lParam | 352 LPARAM lParam |
353 ) | 353 ) |
354 { | 354 { |
355 if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL)
{ | 355 if (FontType != 0x004 || strchr(lpelfe->elfLogFont.lfFaceName, '@') != NULL)
{ |
356 return 1; | 356 return 1; |
357 } else { | |
358 LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam; | |
359 memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA)); | |
360 pData->bFind = TRUE; | |
361 return 0; | |
362 } | 357 } |
| 358 LPDF_FONTDATA pData = (LPDF_FONTDATA)lParam; |
| 359 memcpy(&pData->lf, &lpelfe->elfLogFont, sizeof(LOGFONTA)); |
| 360 pData->bFind = TRUE; |
| 361 return 0; |
363 } | 362 } |
364 static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) | 363 static FX_BOOL RetrieveSpecificFont(LOGFONTA& lf) |
365 { | 364 { |
366 PDF_FONTDATA fd; | 365 PDF_FONTDATA fd; |
367 memset(&fd, 0, sizeof(PDF_FONTDATA)); | 366 memset(&fd, 0, sizeof(PDF_FONTDATA)); |
368 HDC hDC = ::GetDC(NULL); | 367 HDC hDC = ::GetDC(NULL); |
369 EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd,
0); | 368 EnumFontFamiliesExA(hDC, &lf, (FONTENUMPROCA)EnumFontFamExProc, (LPARAM)&fd,
0); |
370 ::ReleaseDC(NULL, hDC); | 369 ::ReleaseDC(NULL, hDC); |
371 if (fd.bFind) { | 370 if (fd.bFind) { |
372 memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); | 371 memcpy(&lf, &fd.lf, sizeof(LOGFONTA)); |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 if (pControl == NULL || csNewFieldName.IsEmpty()) { | 689 if (pControl == NULL || csNewFieldName.IsEmpty()) { |
691 return FALSE; | 690 return FALSE; |
692 } | 691 } |
693 CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField(); | 692 CPDF_FormField* pField = ((CPDF_FormControl*)pControl)->GetField(); |
694 return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pCo
ntrol); | 693 return ValidateFieldName(csNewFieldName, pField->GetFieldType(), pField, pCo
ntrol); |
695 } | 694 } |
696 int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_Byte
String& name2) | 695 int CPDF_InterForm::CompareFieldName(const CFX_ByteString& name1, const CFX_Byte
String& name2) |
697 { | 696 { |
698 const FX_CHAR* ptr1 = name1; | 697 const FX_CHAR* ptr1 = name1; |
699 const FX_CHAR* ptr2 = name2; | 698 const FX_CHAR* ptr2 = name2; |
700 if (name1.GetLength() != name2.GetLength()) { | 699 if (name1.GetLength() == name2.GetLength()) { |
701 int i = 0; | |
702 while (ptr1[i] == ptr2[i]) { | |
703 i ++; | |
704 } | |
705 if (i == name1.GetLength()) { | |
706 return 2; | |
707 } | |
708 if (i == name2.GetLength()) { | |
709 return 3; | |
710 } | |
711 return 0; | |
712 } else { | |
713 return name1 == name2 ? 1 : 0; | 700 return name1 == name2 ? 1 : 0; |
714 } | 701 } |
| 702 int i = 0; |
| 703 while (ptr1[i] == ptr2[i]) { |
| 704 i ++; |
| 705 } |
| 706 if (i == name1.GetLength()) { |
| 707 return 2; |
| 708 } |
| 709 if (i == name2.GetLength()) { |
| 710 return 3; |
| 711 } |
| 712 return 0; |
715 } | 713 } |
716 int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_Wide
String& name2) | 714 int CPDF_InterForm::CompareFieldName(const CFX_WideString& name1, const CFX_Wide
String& name2) |
717 { | 715 { |
718 const FX_WCHAR* ptr1 = name1.c_str(); | 716 const FX_WCHAR* ptr1 = name1.c_str(); |
719 const FX_WCHAR* ptr2 = name2.c_str(); | 717 const FX_WCHAR* ptr2 = name2.c_str(); |
720 if (name1.GetLength() != name2.GetLength()) { | 718 if (name1.GetLength() == name2.GetLength()) { |
721 int i = 0; | |
722 while (ptr1[i] == ptr2[i]) { | |
723 i ++; | |
724 } | |
725 if (i == name1.GetLength()) { | |
726 return 2; | |
727 } | |
728 if (i == name2.GetLength()) { | |
729 return 3; | |
730 } | |
731 return 0; | |
732 } else { | |
733 return name1 == name2 ? 1 : 0; | 719 return name1 == name2 ? 1 : 0; |
734 } | 720 } |
| 721 int i = 0; |
| 722 while (ptr1[i] == ptr2[i]) { |
| 723 i ++; |
| 724 } |
| 725 if (i == name1.GetLength()) { |
| 726 return 2; |
| 727 } |
| 728 if (i == name2.GetLength()) { |
| 729 return 3; |
| 730 } |
| 731 return 0; |
735 } | 732 } |
736 FX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName) | 733 FX_DWORD CPDF_InterForm::CountFields(const CFX_WideString &csFieldName) |
737 { | 734 { |
738 if (csFieldName.IsEmpty()) { | 735 if (csFieldName.IsEmpty()) { |
739 return (FX_DWORD)m_pFieldTree->m_Root.CountFields(); | 736 return (FX_DWORD)m_pFieldTree->m_Root.CountFields(); |
740 } | 737 } |
741 CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName); | 738 CFieldTree::_Node *pNode = m_pFieldTree->FindNode(csFieldName); |
742 if (pNode == NULL) { | 739 if (pNode == NULL) { |
743 return 0; | 740 return 0; |
744 } | 741 } |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
893 return NULL; | 890 return NULL; |
894 } | 891 } |
895 CPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict)
const | 892 CPDF_FormControl* CPDF_InterForm::GetControlByDict(CPDF_Dictionary* pWidgetDict)
const |
896 { | 893 { |
897 CPDF_FormControl* pControl = NULL; | 894 CPDF_FormControl* pControl = NULL; |
898 m_ControlMap.Lookup(pWidgetDict, (void*&)pControl); | 895 m_ControlMap.Lookup(pWidgetDict, (void*&)pControl); |
899 return pControl; | 896 return pControl; |
900 } | 897 } |
901 FX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName)
const | 898 FX_DWORD CPDF_InterForm::CountInternalFields(const CFX_WideString& csFieldName)
const |
902 { | 899 { |
903 if (m_pFormDict == NULL) { | 900 if (!m_pFormDict) { |
904 return 0; | 901 return 0; |
905 } | 902 } |
906 CPDF_Array* pArray = m_pFormDict->GetArray("Fields"); | 903 CPDF_Array* pArray = m_pFormDict->GetArray("Fields"); |
907 if (pArray == NULL) { | 904 if (!pArray) { |
908 return 0; | 905 return 0; |
909 } | 906 } |
910 if (csFieldName.IsEmpty()) { | 907 if (csFieldName.IsEmpty()) { |
911 return pArray->GetCount(); | 908 return pArray->GetCount(); |
912 } else { | 909 } |
913 int iLength = csFieldName.GetLength(); | 910 int iLength = csFieldName.GetLength(); |
914 int iPos = 0; | 911 int iPos = 0; |
915 CPDF_Dictionary* pDict = NULL; | 912 CPDF_Dictionary* pDict = NULL; |
916 while (pArray != NULL) { | 913 while (pArray != NULL) { |
917 CFX_WideString csSub; | 914 CFX_WideString csSub; |
918 if (iPos < iLength && csFieldName[iPos] == L'.') { | 915 if (iPos < iLength && csFieldName[iPos] == L'.') { |
919 iPos ++; | 916 iPos ++; |
| 917 } |
| 918 while (iPos < iLength && csFieldName[iPos] != L'.') { |
| 919 csSub += csFieldName[iPos ++]; |
| 920 } |
| 921 int iCount = pArray->GetCount(); |
| 922 FX_BOOL bFind = FALSE; |
| 923 for (int i = 0; i < iCount; i ++) { |
| 924 pDict = pArray->GetDict(i); |
| 925 if (pDict == NULL) { |
| 926 continue; |
920 } | 927 } |
921 while (iPos < iLength && csFieldName[iPos] != L'.') { | 928 CFX_WideString csT = pDict->GetUnicodeText("T"); |
922 csSub += csFieldName[iPos ++]; | 929 if (csT == csSub) { |
923 } | 930 bFind = TRUE; |
924 int iCount = pArray->GetCount(); | |
925 FX_BOOL bFind = FALSE; | |
926 for (int i = 0; i < iCount; i ++) { | |
927 pDict = pArray->GetDict(i); | |
928 if (pDict == NULL) { | |
929 continue; | |
930 } | |
931 CFX_WideString csT = pDict->GetUnicodeText("T"); | |
932 if (csT == csSub) { | |
933 bFind = TRUE; | |
934 break; | |
935 } | |
936 } | |
937 if (!bFind) { | |
938 return 0; | |
939 } | |
940 if (iPos >= iLength) { | |
941 break; | 931 break; |
942 } | 932 } |
943 pArray = pDict->GetArray("Kids"); | |
944 } | 933 } |
945 if (pDict == NULL) { | 934 if (!bFind) { |
946 return 0; | 935 return 0; |
947 } else { | |
948 pArray = pDict->GetArray("Kids"); | |
949 if (pArray == NULL) { | |
950 return 1; | |
951 } else { | |
952 return pArray->GetCount(); | |
953 } | |
954 } | 936 } |
| 937 if (iPos >= iLength) { |
| 938 break; |
| 939 } |
| 940 pArray = pDict->GetArray("Kids"); |
955 } | 941 } |
| 942 if (!pDict) { |
| 943 return 0; |
| 944 } |
| 945 pArray = pDict->GetArray("Kids"); |
| 946 return pArray ? pArray->GetCount() : 1; |
956 } | 947 } |
| 948 |
957 CPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_Wide
String& csFieldName) const | 949 CPDF_Dictionary* CPDF_InterForm::GetInternalField(FX_DWORD index, const CFX_Wide
String& csFieldName) const |
958 { | 950 { |
959 if (m_pFormDict == NULL) { | 951 if (!m_pFormDict) { |
960 return NULL; | 952 return nullptr; |
961 } | 953 } |
962 CPDF_Array* pArray = m_pFormDict->GetArray("Fields"); | 954 CPDF_Array* pArray = m_pFormDict->GetArray("Fields"); |
963 if (pArray == NULL) { | 955 if (!pArray) { |
964 return 0; | 956 return nullptr; |
965 } | 957 } |
966 if (csFieldName.IsEmpty()) { | 958 if (csFieldName.IsEmpty()) { |
967 return pArray->GetDict(index); | 959 return pArray->GetDict(index); |
968 } else { | 960 } |
969 int iLength = csFieldName.GetLength(); | 961 int iLength = csFieldName.GetLength(); |
970 int iPos = 0; | 962 int iPos = 0; |
971 CPDF_Dictionary* pDict = NULL; | 963 CPDF_Dictionary* pDict = NULL; |
972 while (pArray != NULL) { | 964 while (pArray != NULL) { |
973 CFX_WideString csSub; | 965 CFX_WideString csSub; |
974 if (iPos < iLength && csFieldName[iPos] == L'.') { | 966 if (iPos < iLength && csFieldName[iPos] == L'.') { |
975 iPos ++; | 967 iPos ++; |
| 968 } |
| 969 while (iPos < iLength && csFieldName[iPos] != L'.') { |
| 970 csSub += csFieldName[iPos ++]; |
| 971 } |
| 972 int iCount = pArray->GetCount(); |
| 973 FX_BOOL bFind = FALSE; |
| 974 for (int i = 0; i < iCount; i ++) { |
| 975 pDict = pArray->GetDict(i); |
| 976 if (pDict == NULL) { |
| 977 continue; |
976 } | 978 } |
977 while (iPos < iLength && csFieldName[iPos] != L'.') { | 979 CFX_WideString csT = pDict->GetUnicodeText("T"); |
978 csSub += csFieldName[iPos ++]; | 980 if (csT == csSub) { |
979 } | 981 bFind = TRUE; |
980 int iCount = pArray->GetCount(); | |
981 FX_BOOL bFind = FALSE; | |
982 for (int i = 0; i < iCount; i ++) { | |
983 pDict = pArray->GetDict(i); | |
984 if (pDict == NULL) { | |
985 continue; | |
986 } | |
987 CFX_WideString csT = pDict->GetUnicodeText("T"); | |
988 if (csT == csSub) { | |
989 bFind = TRUE; | |
990 break; | |
991 } | |
992 } | |
993 if (!bFind) { | |
994 return NULL; | |
995 } | |
996 if (iPos >= iLength) { | |
997 break; | 982 break; |
998 } | 983 } |
999 pArray = pDict->GetArray("Kids"); | |
1000 } | 984 } |
1001 if (pDict == NULL) { | 985 if (!bFind) { |
1002 return NULL; | 986 return NULL; |
1003 } else { | |
1004 pArray = pDict->GetArray("Kids"); | |
1005 if (pArray == NULL) { | |
1006 return pDict; | |
1007 } else { | |
1008 return pArray->GetDict(index); | |
1009 } | |
1010 } | 987 } |
| 988 if (iPos >= iLength) { |
| 989 break; |
| 990 } |
| 991 pArray = pDict->GetArray("Kids"); |
1011 } | 992 } |
| 993 if (!pDict) { |
| 994 return nullptr; |
| 995 } |
| 996 pArray = pDict->GetArray("Kids"); |
| 997 return pArray ? pArray->GetDict(index) : pDict; |
1012 } | 998 } |
1013 FX_BOOL CPDF_InterForm::NeedConstructAP() | 999 FX_BOOL CPDF_InterForm::NeedConstructAP() |
1014 { | 1000 { |
1015 if (m_pFormDict == NULL) { | 1001 if (m_pFormDict == NULL) { |
1016 return FALSE; | 1002 return FALSE; |
1017 } | 1003 } |
1018 return m_pFormDict->GetBoolean("NeedAppearances"); | 1004 return m_pFormDict->GetBoolean("NeedAppearances"); |
1019 } | 1005 } |
1020 void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP) | 1006 void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP) |
1021 { | 1007 { |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1632 continue; | 1618 continue; |
1633 } | 1619 } |
1634 CPDF_FormControl* pControl = NULL; | 1620 CPDF_FormControl* pControl = NULL; |
1635 if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) { | 1621 if (m_ControlMap.Lookup(pAnnotDict, (void*&)pControl)) { |
1636 return iNewPage; | 1622 return iNewPage; |
1637 } | 1623 } |
1638 } | 1624 } |
1639 } while (TRUE); | 1625 } while (TRUE); |
1640 return -1; | 1626 return -1; |
1641 } | 1627 } |
OLD | NEW |