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/fpdfapi/fpdf_page/pageint.h" | 7 #include "core/fpdfapi/fpdf_page/pageint.h" |
8 | 8 |
9 #include <algorithm> | |
10 #include <memory> | 9 #include <memory> |
11 #include <utility> | 10 #include <utility> |
12 #include <vector> | 11 #include <vector> |
13 | 12 |
14 #include "core/fpdfapi/fpdf_edit/include/cpdf_creator.h" | 13 #include "core/fpdfapi/fpdf_edit/include/cpdf_creator.h" |
15 #include "core/fpdfapi/fpdf_font/cpdf_type3font.h" | 14 #include "core/fpdfapi/fpdf_font/cpdf_type3font.h" |
16 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 15 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
17 #include "core/fpdfapi/fpdf_page/cpdf_allstates.h" | 16 #include "core/fpdfapi/fpdf_page/cpdf_allstates.h" |
18 #include "core/fpdfapi/fpdf_page/cpdf_meshstream.h" | 17 #include "core/fpdfapi/fpdf_page/cpdf_meshstream.h" |
19 #include "core/fpdfapi/fpdf_page/cpdf_shadingpattern.h" | 18 #include "core/fpdfapi/fpdf_page/cpdf_shadingpattern.h" |
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 m_pCurStates->m_CTM = new_matrix; | 685 m_pCurStates->m_CTM = new_matrix; |
687 OnChangeTextMatrix(); | 686 OnChangeTextMatrix(); |
688 } | 687 } |
689 | 688 |
690 void CPDF_StreamContentParser::Handle_SetColorSpace_Fill() { | 689 void CPDF_StreamContentParser::Handle_SetColorSpace_Fill() { |
691 CPDF_ColorSpace* pCS = FindColorSpace(GetString(0)); | 690 CPDF_ColorSpace* pCS = FindColorSpace(GetString(0)); |
692 if (!pCS) | 691 if (!pCS) |
693 return; | 692 return; |
694 | 693 |
695 m_pCurStates->m_ColorState.MakePrivateCopy(); | 694 m_pCurStates->m_ColorState.MakePrivateCopy(); |
696 m_pCurStates->m_ColorState->GetFillColor()->SetColorSpace(pCS); | 695 m_pCurStates->m_ColorState->m_FillColor.SetColorSpace(pCS); |
697 } | 696 } |
698 | 697 |
699 void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke() { | 698 void CPDF_StreamContentParser::Handle_SetColorSpace_Stroke() { |
700 CPDF_ColorSpace* pCS = FindColorSpace(GetString(0)); | 699 CPDF_ColorSpace* pCS = FindColorSpace(GetString(0)); |
701 if (!pCS) | 700 if (!pCS) |
702 return; | 701 return; |
703 | 702 |
704 m_pCurStates->m_ColorState.MakePrivateCopy(); | 703 m_pCurStates->m_ColorState.MakePrivateCopy(); |
705 m_pCurStates->m_ColorState->GetStrokeColor()->SetColorSpace(pCS); | 704 m_pCurStates->m_ColorState->m_StrokeColor.SetColorSpace(pCS); |
706 } | 705 } |
707 | 706 |
708 void CPDF_StreamContentParser::Handle_SetDash() { | 707 void CPDF_StreamContentParser::Handle_SetDash() { |
709 CPDF_Array* pArray = ToArray(GetObject(1)); | 708 CPDF_Array* pArray = ToArray(GetObject(1)); |
710 if (!pArray) | 709 if (!pArray) |
711 return; | 710 return; |
712 | 711 |
713 m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f); | 712 m_pCurStates->SetLineDash(pArray, GetNumber(0), 1.0f); |
714 } | 713 } |
715 | 714 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
839 void CPDF_StreamContentParser::Handle_FillPathOld() { | 838 void CPDF_StreamContentParser::Handle_FillPathOld() { |
840 AddPathObject(FXFILL_WINDING, FALSE); | 839 AddPathObject(FXFILL_WINDING, FALSE); |
841 } | 840 } |
842 | 841 |
843 void CPDF_StreamContentParser::Handle_EOFillPath() { | 842 void CPDF_StreamContentParser::Handle_EOFillPath() { |
844 AddPathObject(FXFILL_ALTERNATE, FALSE); | 843 AddPathObject(FXFILL_ALTERNATE, FALSE); |
845 } | 844 } |
846 | 845 |
847 void CPDF_StreamContentParser::Handle_SetGray_Fill() { | 846 void CPDF_StreamContentParser::Handle_SetGray_Fill() { |
848 FX_FLOAT value = GetNumber(0); | 847 FX_FLOAT value = GetNumber(0); |
849 m_pCurStates->m_ColorState.MakePrivateCopy(); | 848 CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY); |
850 m_pCurStates->m_ColorState->SetFillColor( | 849 m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1); |
851 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY), &value, 1); | |
852 } | 850 } |
853 | 851 |
854 void CPDF_StreamContentParser::Handle_SetGray_Stroke() { | 852 void CPDF_StreamContentParser::Handle_SetGray_Stroke() { |
855 FX_FLOAT value = GetNumber(0); | 853 FX_FLOAT value = GetNumber(0); |
856 m_pCurStates->m_ColorState.MakePrivateCopy(); | 854 CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY); |
857 m_pCurStates->m_ColorState->SetStrokeColor( | 855 m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1); |
858 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY), &value, 1); | |
859 } | 856 } |
860 | 857 |
861 void CPDF_StreamContentParser::Handle_SetExtendGraphState() { | 858 void CPDF_StreamContentParser::Handle_SetExtendGraphState() { |
862 CFX_ByteString name = GetString(0); | 859 CFX_ByteString name = GetString(0); |
863 CPDF_Dictionary* pGS = ToDictionary(FindResourceObj("ExtGState", name)); | 860 CPDF_Dictionary* pGS = ToDictionary(FindResourceObj("ExtGState", name)); |
864 if (!pGS) { | 861 if (!pGS) { |
865 m_bResourceMissing = TRUE; | 862 m_bResourceMissing = TRUE; |
866 return; | 863 return; |
867 } | 864 } |
868 m_pCurStates->ProcessExtGS(pGS, this); | 865 m_pCurStates->ProcessExtGS(pGS, this); |
(...skipping 27 matching lines...) Expand all Loading... |
896 m_pCurStates->m_GraphState.MakePrivateCopy(); | 893 m_pCurStates->m_GraphState.MakePrivateCopy(); |
897 m_pCurStates->m_GraphState->m_LineCap = | 894 m_pCurStates->m_GraphState->m_LineCap = |
898 static_cast<CFX_GraphStateData::LineCap>(GetInteger(0)); | 895 static_cast<CFX_GraphStateData::LineCap>(GetInteger(0)); |
899 } | 896 } |
900 | 897 |
901 void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill() { | 898 void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill() { |
902 if (m_ParamCount != 4) | 899 if (m_ParamCount != 4) |
903 return; | 900 return; |
904 | 901 |
905 FX_FLOAT values[4]; | 902 FX_FLOAT values[4]; |
906 for (int i = 0; i < 4; i++) | 903 for (int i = 0; i < 4; i++) { |
907 values[i] = GetNumber(3 - i); | 904 values[i] = GetNumber(3 - i); |
908 | 905 } |
909 m_pCurStates->m_ColorState.MakePrivateCopy(); | 906 CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); |
910 m_pCurStates->m_ColorState->SetFillColor( | 907 m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4); |
911 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK), values, 4); | |
912 } | 908 } |
913 | 909 |
914 void CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke() { | 910 void CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke() { |
915 if (m_ParamCount != 4) | 911 if (m_ParamCount != 4) |
916 return; | 912 return; |
917 | 913 |
918 FX_FLOAT values[4]; | 914 FX_FLOAT values[4]; |
919 for (int i = 0; i < 4; i++) | 915 for (int i = 0; i < 4; i++) { |
920 values[i] = GetNumber(3 - i); | 916 values[i] = GetNumber(3 - i); |
921 | 917 } |
922 m_pCurStates->m_ColorState.MakePrivateCopy(); | 918 CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK); |
923 m_pCurStates->m_ColorState->SetStrokeColor( | 919 m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4); |
924 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK), values, 4); | |
925 } | 920 } |
926 | 921 |
927 void CPDF_StreamContentParser::Handle_LineTo() { | 922 void CPDF_StreamContentParser::Handle_LineTo() { |
928 if (m_ParamCount != 2) | 923 if (m_ParamCount != 2) |
929 return; | 924 return; |
930 | 925 |
931 AddPathPoint(GetNumber(1), GetNumber(0), FXPT_LINETO); | 926 AddPathPoint(GetNumber(1), GetNumber(0), FXPT_LINETO); |
932 } | 927 } |
933 | 928 |
934 void CPDF_StreamContentParser::Handle_MoveTo() { | 929 void CPDF_StreamContentParser::Handle_MoveTo() { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
979 AddPathPoint(x + w, y + h, FXPT_LINETO); | 974 AddPathPoint(x + w, y + h, FXPT_LINETO); |
980 AddPathPoint(x, y + h, FXPT_LINETO); | 975 AddPathPoint(x, y + h, FXPT_LINETO); |
981 AddPathPoint(x, y, FXPT_LINETO | FXPT_CLOSEFIGURE); | 976 AddPathPoint(x, y, FXPT_LINETO | FXPT_CLOSEFIGURE); |
982 } | 977 } |
983 | 978 |
984 void CPDF_StreamContentParser::Handle_SetRGBColor_Fill() { | 979 void CPDF_StreamContentParser::Handle_SetRGBColor_Fill() { |
985 if (m_ParamCount != 3) | 980 if (m_ParamCount != 3) |
986 return; | 981 return; |
987 | 982 |
988 FX_FLOAT values[3]; | 983 FX_FLOAT values[3]; |
989 for (int i = 0; i < 3; i++) | 984 for (int i = 0; i < 3; i++) { |
990 values[i] = GetNumber(2 - i); | 985 values[i] = GetNumber(2 - i); |
991 | 986 } |
992 m_pCurStates->m_ColorState.MakePrivateCopy(); | 987 CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB); |
993 m_pCurStates->m_ColorState->SetFillColor( | 988 m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3); |
994 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), values, 3); | |
995 } | 989 } |
996 | 990 |
997 void CPDF_StreamContentParser::Handle_SetRGBColor_Stroke() { | 991 void CPDF_StreamContentParser::Handle_SetRGBColor_Stroke() { |
998 if (m_ParamCount != 3) | 992 if (m_ParamCount != 3) |
999 return; | 993 return; |
1000 | 994 |
1001 FX_FLOAT values[3]; | 995 FX_FLOAT values[3]; |
1002 for (int i = 0; i < 3; i++) | 996 for (int i = 0; i < 3; i++) { |
1003 values[i] = GetNumber(2 - i); | 997 values[i] = GetNumber(2 - i); |
1004 | 998 } |
1005 m_pCurStates->m_ColorState.MakePrivateCopy(); | 999 CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB); |
1006 m_pCurStates->m_ColorState->SetStrokeColor( | 1000 m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3); |
1007 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), values, 3); | |
1008 } | 1001 } |
1009 | 1002 |
1010 void CPDF_StreamContentParser::Handle_SetRenderIntent() {} | 1003 void CPDF_StreamContentParser::Handle_SetRenderIntent() {} |
1011 | 1004 |
1012 void CPDF_StreamContentParser::Handle_CloseStrokePath() { | 1005 void CPDF_StreamContentParser::Handle_CloseStrokePath() { |
1013 Handle_ClosePath(); | 1006 Handle_ClosePath(); |
1014 AddPathObject(0, TRUE); | 1007 AddPathObject(0, TRUE); |
1015 } | 1008 } |
1016 | 1009 |
1017 void CPDF_StreamContentParser::Handle_StrokePath() { | 1010 void CPDF_StreamContentParser::Handle_StrokePath() { |
1018 AddPathObject(0, TRUE); | 1011 AddPathObject(0, TRUE); |
1019 } | 1012 } |
1020 | 1013 |
1021 void CPDF_StreamContentParser::Handle_SetColor_Fill() { | 1014 void CPDF_StreamContentParser::Handle_SetColor_Fill() { |
1022 FX_FLOAT values[4]; | 1015 FX_FLOAT values[4]; |
1023 uint32_t nargs = std::min(m_ParamCount, 4u); | 1016 int nargs = m_ParamCount; |
1024 for (uint32_t i = 0; i < nargs; i++) | 1017 if (nargs > 4) { |
| 1018 nargs = 4; |
| 1019 } |
| 1020 for (int i = 0; i < nargs; i++) { |
1025 values[i] = GetNumber(nargs - i - 1); | 1021 values[i] = GetNumber(nargs - i - 1); |
1026 | 1022 } |
1027 m_pCurStates->m_ColorState.MakePrivateCopy(); | 1023 m_pCurStates->m_ColorState.SetFillColor(nullptr, values, nargs); |
1028 m_pCurStates->m_ColorState->SetFillColor(nullptr, values, nargs); | |
1029 } | 1024 } |
1030 | 1025 |
1031 void CPDF_StreamContentParser::Handle_SetColor_Stroke() { | 1026 void CPDF_StreamContentParser::Handle_SetColor_Stroke() { |
1032 FX_FLOAT values[4]; | 1027 FX_FLOAT values[4]; |
1033 uint32_t nargs = std::min(m_ParamCount, 4u); | 1028 int nargs = m_ParamCount; |
1034 for (uint32_t i = 0; i < nargs; i++) | 1029 if (nargs > 4) { |
| 1030 nargs = 4; |
| 1031 } |
| 1032 for (int i = 0; i < nargs; i++) { |
1035 values[i] = GetNumber(nargs - i - 1); | 1033 values[i] = GetNumber(nargs - i - 1); |
1036 | 1034 } |
1037 m_pCurStates->m_ColorState.MakePrivateCopy(); | 1035 m_pCurStates->m_ColorState.SetStrokeColor(nullptr, values, nargs); |
1038 m_pCurStates->m_ColorState->SetStrokeColor(nullptr, values, nargs); | |
1039 } | 1036 } |
1040 | 1037 |
1041 void CPDF_StreamContentParser::Handle_SetColorPS_Fill() { | 1038 void CPDF_StreamContentParser::Handle_SetColorPS_Fill() { |
1042 CPDF_Object* pLastParam = GetObject(0); | 1039 CPDF_Object* pLastParam = GetObject(0); |
1043 if (!pLastParam) { | 1040 if (!pLastParam) { |
1044 return; | 1041 return; |
1045 } | 1042 } |
1046 uint32_t nargs = m_ParamCount; | 1043 uint32_t nargs = m_ParamCount; |
1047 uint32_t nvalues = nargs; | 1044 uint32_t nvalues = nargs; |
1048 if (pLastParam->IsName()) | 1045 if (pLastParam->IsName()) |
1049 nvalues--; | 1046 nvalues--; |
1050 FX_FLOAT* values = nullptr; | 1047 FX_FLOAT* values = nullptr; |
1051 if (nvalues) { | 1048 if (nvalues) { |
1052 values = FX_Alloc(FX_FLOAT, nvalues); | 1049 values = FX_Alloc(FX_FLOAT, nvalues); |
1053 for (uint32_t i = 0; i < nvalues; i++) { | 1050 for (uint32_t i = 0; i < nvalues; i++) { |
1054 values[i] = GetNumber(nargs - i - 1); | 1051 values[i] = GetNumber(nargs - i - 1); |
1055 } | 1052 } |
1056 } | 1053 } |
1057 if (nvalues != nargs) { | 1054 if (nvalues != nargs) { |
1058 CPDF_Pattern* pPattern = FindPattern(GetString(0), false); | 1055 CPDF_Pattern* pPattern = FindPattern(GetString(0), false); |
1059 if (pPattern) { | 1056 if (pPattern) { |
1060 m_pCurStates->m_ColorState.MakePrivateCopy(); | 1057 m_pCurStates->m_ColorState.SetFillPattern(pPattern, values, nvalues); |
1061 m_pCurStates->m_ColorState->SetFillPattern(pPattern, values, nvalues); | |
1062 } | 1058 } |
1063 } else { | 1059 } else { |
1064 m_pCurStates->m_ColorState.MakePrivateCopy(); | 1060 m_pCurStates->m_ColorState.SetFillColor(nullptr, values, nvalues); |
1065 m_pCurStates->m_ColorState->SetFillColor(nullptr, values, nvalues); | |
1066 } | 1061 } |
1067 FX_Free(values); | 1062 FX_Free(values); |
1068 } | 1063 } |
1069 | 1064 |
1070 void CPDF_StreamContentParser::Handle_SetColorPS_Stroke() { | 1065 void CPDF_StreamContentParser::Handle_SetColorPS_Stroke() { |
1071 CPDF_Object* pLastParam = GetObject(0); | 1066 CPDF_Object* pLastParam = GetObject(0); |
1072 if (!pLastParam) { | 1067 if (!pLastParam) { |
1073 return; | 1068 return; |
1074 } | 1069 } |
1075 int nargs = m_ParamCount; | 1070 int nargs = m_ParamCount; |
1076 int nvalues = nargs; | 1071 int nvalues = nargs; |
1077 if (pLastParam->IsName()) | 1072 if (pLastParam->IsName()) |
1078 nvalues--; | 1073 nvalues--; |
1079 | 1074 |
1080 FX_FLOAT* values = nullptr; | 1075 FX_FLOAT* values = nullptr; |
1081 if (nvalues) { | 1076 if (nvalues) { |
1082 values = FX_Alloc(FX_FLOAT, nvalues); | 1077 values = FX_Alloc(FX_FLOAT, nvalues); |
1083 for (int i = 0; i < nvalues; i++) { | 1078 for (int i = 0; i < nvalues; i++) { |
1084 values[i] = GetNumber(nargs - i - 1); | 1079 values[i] = GetNumber(nargs - i - 1); |
1085 } | 1080 } |
1086 } | 1081 } |
1087 if (nvalues != nargs) { | 1082 if (nvalues != nargs) { |
1088 CPDF_Pattern* pPattern = FindPattern(GetString(0), false); | 1083 CPDF_Pattern* pPattern = FindPattern(GetString(0), false); |
1089 if (pPattern) { | 1084 if (pPattern) { |
1090 m_pCurStates->m_ColorState.MakePrivateCopy(); | 1085 m_pCurStates->m_ColorState.SetStrokePattern(pPattern, values, nvalues); |
1091 m_pCurStates->m_ColorState->SetStrokePattern(pPattern, values, nvalues); | |
1092 } | 1086 } |
1093 } else { | 1087 } else { |
1094 m_pCurStates->m_ColorState.MakePrivateCopy(); | 1088 m_pCurStates->m_ColorState.SetStrokeColor(nullptr, values, nvalues); |
1095 m_pCurStates->m_ColorState->SetStrokeColor(nullptr, values, nvalues); | |
1096 } | 1089 } |
1097 FX_Free(values); | 1090 FX_Free(values); |
1098 } | 1091 } |
1099 | 1092 |
1100 void CPDF_StreamContentParser::Handle_ShadeFill() { | 1093 void CPDF_StreamContentParser::Handle_ShadeFill() { |
1101 CPDF_Pattern* pPattern = FindPattern(GetString(0), true); | 1094 CPDF_Pattern* pPattern = FindPattern(GetString(0), true); |
1102 if (!pPattern) | 1095 if (!pPattern) |
1103 return; | 1096 return; |
1104 | 1097 |
1105 CPDF_ShadingPattern* pShading = pPattern->AsShadingPattern(); | 1098 CPDF_ShadingPattern* pShading = pPattern->AsShadingPattern(); |
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1702 } else { | 1695 } else { |
1703 PDF_ReplaceAbbr(pElement); | 1696 PDF_ReplaceAbbr(pElement); |
1704 } | 1697 } |
1705 } | 1698 } |
1706 break; | 1699 break; |
1707 } | 1700 } |
1708 default: | 1701 default: |
1709 break; | 1702 break; |
1710 } | 1703 } |
1711 } | 1704 } |
OLD | NEW |