| 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 |