OLD | NEW |
1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 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/fpdfdoc/cpvt_generateap.h" | 7 #include "core/fpdfdoc/cpvt_generateap.h" |
8 | 8 |
9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" | 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" |
(...skipping 656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
667 for (int i = 0; i < 3; ++i) { | 667 for (int i = 0; i < 3; ++i) { |
668 lineRect.top -= fYDelta; | 668 lineRect.top -= fYDelta; |
669 sAppStream << lineRect.left << " " << lineRect.top << " m\n" | 669 sAppStream << lineRect.left << " " << lineRect.top << " m\n" |
670 << lineRect.right << " " << lineRect.top << " l\n"; | 670 << lineRect.right << " " << lineRect.top << " l\n"; |
671 } | 671 } |
672 sAppStream << "B*\n"; | 672 sAppStream << "B*\n"; |
673 | 673 |
674 return sAppStream.MakeString(); | 674 return sAppStream.MakeString(); |
675 } | 675 } |
676 | 676 |
677 bool ShouldGenerateAPForAnnotation(CPDF_Dictionary* pAnnotDict) { | |
678 // If AP dictionary exists, we use the appearance defined in the | |
679 // existing AP dictionary. | |
680 if (pAnnotDict->KeyExist("AP")) | |
681 return false; | |
682 | |
683 return !CPDF_Annot::IsAnnotationHidden(pAnnotDict); | |
684 } | |
685 | |
686 } // namespace | 677 } // namespace |
687 | 678 |
688 bool FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) { | 679 bool FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict) { |
689 if (!pAnnotDict || pAnnotDict->GetStringBy("Subtype") != "Widget") | 680 if (!pAnnotDict || pAnnotDict->GetStringBy("Subtype") != "Widget") |
690 return false; | 681 return false; |
691 | 682 |
692 CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString(); | 683 CFX_ByteString field_type = FPDF_GetFieldAttr(pAnnotDict, "FT")->GetString(); |
693 uint32_t flags = FPDF_GetFieldAttr(pAnnotDict, "Ff") | 684 uint32_t flags = FPDF_GetFieldAttr(pAnnotDict, "Ff") |
694 ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger() | 685 ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger() |
695 : 0; | 686 : 0; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
728 } | 719 } |
729 | 720 |
730 // Static. | 721 // Static. |
731 bool CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, | 722 bool CPVT_GenerateAP::GenerateTextFieldAP(CPDF_Document* pDoc, |
732 CPDF_Dictionary* pAnnotDict) { | 723 CPDF_Dictionary* pAnnotDict) { |
733 return GenerateWidgetAP(pDoc, pAnnotDict, 0); | 724 return GenerateWidgetAP(pDoc, pAnnotDict, 0); |
734 } | 725 } |
735 | 726 |
736 bool CPVT_GenerateAP::GenerateCircleAP(CPDF_Document* pDoc, | 727 bool CPVT_GenerateAP::GenerateCircleAP(CPDF_Document* pDoc, |
737 CPDF_Dictionary* pAnnotDict) { | 728 CPDF_Dictionary* pAnnotDict) { |
738 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
739 return false; | |
740 | |
741 CFX_ByteTextBuf sAppStream; | 729 CFX_ByteTextBuf sAppStream; |
742 CFX_ByteString sExtGSDictName = "GS"; | 730 CFX_ByteString sExtGSDictName = "GS"; |
743 sAppStream << "/" << sExtGSDictName << " gs "; | 731 sAppStream << "/" << sExtGSDictName << " gs "; |
744 | 732 |
745 CPDF_Array* pInteriorColor = pAnnotDict->GetArrayBy("IC"); | 733 CPDF_Array* pInteriorColor = pAnnotDict->GetArrayBy("IC"); |
746 sAppStream << GetColorStringWithDefault(pInteriorColor, | 734 sAppStream << GetColorStringWithDefault(pInteriorColor, |
747 CPVT_Color(CPVT_Color::kTransparent), | 735 CPVT_Color(CPVT_Color::kTransparent), |
748 PaintOperation::FILL); | 736 PaintOperation::FILL); |
749 | 737 |
750 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), | 738 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 CPDF_Dictionary* pExtGStateDict = | 792 CPDF_Dictionary* pExtGStateDict = |
805 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); | 793 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); |
806 CPDF_Dictionary* pResourceDict = | 794 CPDF_Dictionary* pResourceDict = |
807 GenerateResourceDict(pExtGStateDict, nullptr); | 795 GenerateResourceDict(pExtGStateDict, nullptr); |
808 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); | 796 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); |
809 return true; | 797 return true; |
810 } | 798 } |
811 | 799 |
812 bool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc, | 800 bool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc, |
813 CPDF_Dictionary* pAnnotDict) { | 801 CPDF_Dictionary* pAnnotDict) { |
814 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
815 return false; | |
816 | |
817 CFX_ByteTextBuf sAppStream; | 802 CFX_ByteTextBuf sAppStream; |
818 CFX_ByteString sExtGSDictName = "GS"; | 803 CFX_ByteString sExtGSDictName = "GS"; |
819 sAppStream << "/" << sExtGSDictName << " gs "; | 804 sAppStream << "/" << sExtGSDictName << " gs "; |
820 | 805 |
821 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), | 806 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), |
822 CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), | 807 CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), |
823 PaintOperation::FILL); | 808 PaintOperation::FILL); |
824 | 809 |
825 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); | 810 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); |
826 rect.Normalize(); | 811 rect.Normalize(); |
827 | 812 |
828 sAppStream << rect.left << " " << rect.top << " m " << rect.right << " " | 813 sAppStream << rect.left << " " << rect.top << " m " << rect.right << " " |
829 << rect.top << " l " << rect.right << " " << rect.bottom << " l " | 814 << rect.top << " l " << rect.right << " " << rect.bottom << " l " |
830 << rect.left << " " << rect.bottom << " l " | 815 << rect.left << " " << rect.bottom << " l " |
831 << "h f\n"; | 816 << "h f\n"; |
832 | 817 |
833 CPDF_Dictionary* pExtGStateDict = | 818 CPDF_Dictionary* pExtGStateDict = |
834 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply"); | 819 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply"); |
835 CPDF_Dictionary* pResourceDict = | 820 CPDF_Dictionary* pResourceDict = |
836 GenerateResourceDict(pExtGStateDict, nullptr); | 821 GenerateResourceDict(pExtGStateDict, nullptr); |
837 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); | 822 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); |
838 | 823 |
839 return true; | 824 return true; |
840 } | 825 } |
841 | 826 |
842 bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc, | 827 bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc, |
843 CPDF_Dictionary* pAnnotDict) { | 828 CPDF_Dictionary* pAnnotDict) { |
844 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
845 return false; | |
846 | |
847 FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict); | 829 FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict); |
848 bool bIsStroke = fBorderWidth > 0; | 830 bool bIsStroke = fBorderWidth > 0; |
849 | 831 |
850 if (!bIsStroke) | 832 if (!bIsStroke) |
851 return false; | 833 return false; |
852 | 834 |
853 CPDF_Array* pInkList = pAnnotDict->GetArrayBy("InkList"); | 835 CPDF_Array* pInkList = pAnnotDict->GetArrayBy("InkList"); |
854 if (!pInkList || pInkList->IsEmpty()) | 836 if (!pInkList || pInkList->IsEmpty()) |
855 return false; | 837 return false; |
856 | 838 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 CPDF_Dictionary* pExtGStateDict = | 872 CPDF_Dictionary* pExtGStateDict = |
891 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); | 873 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); |
892 CPDF_Dictionary* pResourceDict = | 874 CPDF_Dictionary* pResourceDict = |
893 GenerateResourceDict(pExtGStateDict, nullptr); | 875 GenerateResourceDict(pExtGStateDict, nullptr); |
894 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); | 876 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); |
895 return true; | 877 return true; |
896 } | 878 } |
897 | 879 |
898 bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc, | 880 bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc, |
899 CPDF_Dictionary* pAnnotDict) { | 881 CPDF_Dictionary* pAnnotDict) { |
900 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
901 return false; | |
902 | |
903 CFX_ByteTextBuf sAppStream; | 882 CFX_ByteTextBuf sAppStream; |
904 CFX_ByteString sExtGSDictName = "GS"; | 883 CFX_ByteString sExtGSDictName = "GS"; |
905 sAppStream << "/" << sExtGSDictName << " gs "; | 884 sAppStream << "/" << sExtGSDictName << " gs "; |
906 | 885 |
907 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); | 886 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); |
908 const FX_FLOAT fNoteLength = 20; | 887 const FX_FLOAT fNoteLength = 20; |
909 CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength, | 888 CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength, |
910 rect.bottom + fNoteLength); | 889 rect.bottom + fNoteLength); |
911 pAnnotDict->SetAtRect("Rect", noteRect); | 890 pAnnotDict->SetAtRect("Rect", noteRect); |
912 | 891 |
913 sAppStream << GenerateTextSymbolAP(noteRect); | 892 sAppStream << GenerateTextSymbolAP(noteRect); |
914 | 893 |
915 CPDF_Dictionary* pExtGStateDict = | 894 CPDF_Dictionary* pExtGStateDict = |
916 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); | 895 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); |
917 CPDF_Dictionary* pResourceDict = | 896 CPDF_Dictionary* pResourceDict = |
918 GenerateResourceDict(pExtGStateDict, nullptr); | 897 GenerateResourceDict(pExtGStateDict, nullptr); |
919 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); | 898 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); |
920 return true; | 899 return true; |
921 } | 900 } |
922 | 901 |
923 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, | 902 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, |
924 CPDF_Dictionary* pAnnotDict) { | 903 CPDF_Dictionary* pAnnotDict) { |
925 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
926 return false; | |
927 | |
928 CFX_ByteTextBuf sAppStream; | 904 CFX_ByteTextBuf sAppStream; |
929 CFX_ByteString sExtGSDictName = "GS"; | 905 CFX_ByteString sExtGSDictName = "GS"; |
930 sAppStream << "/" << sExtGSDictName << " gs "; | 906 sAppStream << "/" << sExtGSDictName << " gs "; |
931 | 907 |
932 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), | 908 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), |
933 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), | 909 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), |
934 PaintOperation::STROKE); | 910 PaintOperation::STROKE); |
935 | 911 |
936 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); | 912 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); |
937 rect.Normalize(); | 913 rect.Normalize(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
982 if (!pDefFont) | 958 if (!pDefFont) |
983 return false; | 959 return false; |
984 | 960 |
985 sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName); | 961 sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName); |
986 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); | 962 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); |
987 return true; | 963 return true; |
988 } | 964 } |
989 | 965 |
990 bool CPVT_GenerateAP::GenerateSquareAP(CPDF_Document* pDoc, | 966 bool CPVT_GenerateAP::GenerateSquareAP(CPDF_Document* pDoc, |
991 CPDF_Dictionary* pAnnotDict) { | 967 CPDF_Dictionary* pAnnotDict) { |
992 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
993 return false; | |
994 | |
995 CFX_ByteTextBuf sAppStream; | 968 CFX_ByteTextBuf sAppStream; |
996 CFX_ByteString sExtGSDictName = "GS"; | 969 CFX_ByteString sExtGSDictName = "GS"; |
997 sAppStream << "/" << sExtGSDictName << " gs "; | 970 sAppStream << "/" << sExtGSDictName << " gs "; |
998 | 971 |
999 CPDF_Array* pInteriorColor = pAnnotDict->GetArrayBy("IC"); | 972 CPDF_Array* pInteriorColor = pAnnotDict->GetArrayBy("IC"); |
1000 sAppStream << GetColorStringWithDefault(pInteriorColor, | 973 sAppStream << GetColorStringWithDefault(pInteriorColor, |
1001 CPVT_Color(CPVT_Color::kTransparent), | 974 CPVT_Color(CPVT_Color::kTransparent), |
1002 PaintOperation::FILL); | 975 PaintOperation::FILL); |
1003 | 976 |
1004 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), | 977 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), |
(...skipping 27 matching lines...) Expand all Loading... |
1032 CPDF_Dictionary* pExtGStateDict = | 1005 CPDF_Dictionary* pExtGStateDict = |
1033 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); | 1006 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); |
1034 CPDF_Dictionary* pResourceDict = | 1007 CPDF_Dictionary* pResourceDict = |
1035 GenerateResourceDict(pExtGStateDict, nullptr); | 1008 GenerateResourceDict(pExtGStateDict, nullptr); |
1036 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); | 1009 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); |
1037 return true; | 1010 return true; |
1038 } | 1011 } |
1039 | 1012 |
1040 bool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc, | 1013 bool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc, |
1041 CPDF_Dictionary* pAnnotDict) { | 1014 CPDF_Dictionary* pAnnotDict) { |
1042 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
1043 return false; | |
1044 | |
1045 CFX_ByteTextBuf sAppStream; | 1015 CFX_ByteTextBuf sAppStream; |
1046 CFX_ByteString sExtGSDictName = "GS"; | 1016 CFX_ByteString sExtGSDictName = "GS"; |
1047 sAppStream << "/" << sExtGSDictName << " gs "; | 1017 sAppStream << "/" << sExtGSDictName << " gs "; |
1048 | 1018 |
1049 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), | 1019 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), |
1050 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), | 1020 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), |
1051 PaintOperation::STROKE); | 1021 PaintOperation::STROKE); |
1052 | 1022 |
1053 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); | 1023 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); |
1054 rect.Normalize(); | 1024 rect.Normalize(); |
(...skipping 28 matching lines...) Expand all Loading... |
1083 CPDF_Dictionary* pExtGStateDict = | 1053 CPDF_Dictionary* pExtGStateDict = |
1084 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); | 1054 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); |
1085 CPDF_Dictionary* pResourceDict = | 1055 CPDF_Dictionary* pResourceDict = |
1086 GenerateResourceDict(pExtGStateDict, nullptr); | 1056 GenerateResourceDict(pExtGStateDict, nullptr); |
1087 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); | 1057 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); |
1088 return true; | 1058 return true; |
1089 } | 1059 } |
1090 | 1060 |
1091 bool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc, | 1061 bool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc, |
1092 CPDF_Dictionary* pAnnotDict) { | 1062 CPDF_Dictionary* pAnnotDict) { |
1093 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
1094 return false; | |
1095 | |
1096 CFX_ByteTextBuf sAppStream; | 1063 CFX_ByteTextBuf sAppStream; |
1097 CFX_ByteString sExtGSDictName = "GS"; | 1064 CFX_ByteString sExtGSDictName = "GS"; |
1098 sAppStream << "/" << sExtGSDictName << " gs "; | 1065 sAppStream << "/" << sExtGSDictName << " gs "; |
1099 | 1066 |
1100 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), | 1067 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), |
1101 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), | 1068 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), |
1102 PaintOperation::STROKE); | 1069 PaintOperation::STROKE); |
1103 | 1070 |
1104 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); | 1071 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); |
1105 rect.Normalize(); | 1072 rect.Normalize(); |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1378 int32_t nFontIndex, | 1345 int32_t nFontIndex, |
1379 FX_FLOAT fFontSize) { | 1346 FX_FLOAT fFontSize) { |
1380 CFX_ByteTextBuf sRet; | 1347 CFX_ByteTextBuf sRet; |
1381 if (pFontMap) { | 1348 if (pFontMap) { |
1382 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); | 1349 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); |
1383 if (sFontAlias.GetLength() > 0 && fFontSize > 0) | 1350 if (sFontAlias.GetLength() > 0 && fFontSize > 0) |
1384 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; | 1351 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; |
1385 } | 1352 } |
1386 return sRet.MakeString(); | 1353 return sRet.MakeString(); |
1387 } | 1354 } |
OLD | NEW |