summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp18
-rw-r--r--core/fpdfapi/page/cpdf_color.cpp10
-rw-r--r--core/fpdfapi/page/cpdf_color.h2
-rw-r--r--core/fpdfapi/page/cpdf_colorstate.cpp36
-rw-r--r--core/fpdfapi/page/cpdf_colorstate.h13
-rw-r--r--core/fpdfapi/page/cpdf_streamcontentparser.cpp73
-rw-r--r--core/fpdfapi/page/cpdf_streamcontentparser.h3
-rw-r--r--fpdfsdk/fpdf_editpage.cpp5
-rw-r--r--fpdfsdk/fpdf_editpath.cpp4
9 files changed, 68 insertions, 96 deletions
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
index 403bd6ab03..e9b3d15d30 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
@@ -117,12 +117,12 @@ TEST_F(CPDF_PageContentGeneratorTest, ProcessGraphics) {
pPathObj->m_FillType = FXFILL_WINDING;
pPathObj->m_bStroke = true;
- float rgb[3] = {0.5f, 0.7f, 0.35f};
+ static const std::vector<float> rgb = {0.5f, 0.7f, 0.35f};
CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
- pPathObj->m_ColorState.SetFillColor(pCS, rgb, 3);
+ pPathObj->m_ColorState.SetFillColor(pCS, rgb);
- float rgb2[3] = {1, 0.9f, 0};
- pPathObj->m_ColorState.SetStrokeColor(pCS, rgb2, 3);
+ static const std::vector<float> rgb2 = {1, 0.9f, 0};
+ pPathObj->m_ColorState.SetStrokeColor(pCS, rgb2);
pPathObj->m_GeneralState.SetFillAlpha(0.5f);
pPathObj->m_GeneralState.SetStrokeAlpha(0.8f);
@@ -140,7 +140,7 @@ TEST_F(CPDF_PageContentGeneratorTest, ProcessGraphics) {
pathString.Left(48));
EXPECT_EQ(" gs 1 0 0 1 0 0 cm 1 2 m 3 4 l 5 6 l h B Q\n",
pathString.Right(43));
- ASSERT_TRUE(pathString.GetLength() > 91);
+ ASSERT_GT(pathString.GetLength(), 91U);
CPDF_Dictionary* externalGS = TestGetResource(
&generator, "ExtGState", pathString.Mid(48, pathString.GetLength() - 91));
ASSERT_TRUE(externalGS);
@@ -174,12 +174,12 @@ TEST_F(CPDF_PageContentGeneratorTest, ProcessStandardText) {
CPDF_Font* pFont = CPDF_Font::GetStockFont(pDoc.get(), "Times-Roman");
pTextObj->m_TextState.SetFont(pFont);
pTextObj->m_TextState.SetFontSize(10.0f);
- float rgb[3] = {0.5f, 0.7f, 0.35f};
+ static const std::vector<float> rgb = {0.5f, 0.7f, 0.35f};
CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
- pTextObj->m_ColorState.SetFillColor(pCS, rgb, 3);
+ pTextObj->m_ColorState.SetFillColor(pCS, rgb);
- float rgb2[3] = {1, 0.9f, 0};
- pTextObj->m_ColorState.SetStrokeColor(pCS, rgb2, 3);
+ static const std::vector<float> rgb2 = {1, 0.9f, 0};
+ pTextObj->m_ColorState.SetStrokeColor(pCS, rgb2);
pTextObj->m_GeneralState.SetFillAlpha(0.5f);
pTextObj->m_GeneralState.SetStrokeAlpha(0.8f);
pTextObj->Transform(CFX_Matrix(1, 0, 0, 1, 100, 100));
diff --git a/core/fpdfapi/page/cpdf_color.cpp b/core/fpdfapi/page/cpdf_color.cpp
index 26db5dec15..3c87457d1b 100644
--- a/core/fpdfapi/page/cpdf_color.cpp
+++ b/core/fpdfapi/page/cpdf_color.cpp
@@ -79,11 +79,11 @@ void CPDF_Color::SetColorSpace(CPDF_ColorSpace* pCS) {
m_pBuffer = pCS->CreateBufAndSetDefaultColor();
}
-void CPDF_Color::SetValue(const float* comps) {
- if (!m_pBuffer)
- return;
- if (!IsPatternInternal())
- memcpy(m_pBuffer, comps, m_pCS->CountComponents() * sizeof(float));
+void CPDF_Color::SetValueForNonPattern(const std::vector<float>& values) {
+ ASSERT(m_pBuffer);
+ ASSERT(!IsPatternInternal());
+ ASSERT(m_pCS->CountComponents() <= values.size());
+ memcpy(m_pBuffer, values.data(), m_pCS->CountComponents() * sizeof(float));
}
void CPDF_Color::SetValueForPattern(CPDF_Pattern* pPattern,
diff --git a/core/fpdfapi/page/cpdf_color.h b/core/fpdfapi/page/cpdf_color.h
index a6e640c736..9b94f0d53b 100644
--- a/core/fpdfapi/page/cpdf_color.h
+++ b/core/fpdfapi/page/cpdf_color.h
@@ -25,7 +25,7 @@ class CPDF_Color {
void Copy(const CPDF_Color& src);
void SetColorSpace(CPDF_ColorSpace* pCS);
- void SetValue(const float* comp);
+ void SetValueForNonPattern(const std::vector<float>& values);
void SetValueForPattern(CPDF_Pattern* pPattern,
const std::vector<float>& values);
diff --git a/core/fpdfapi/page/cpdf_colorstate.cpp b/core/fpdfapi/page/cpdf_colorstate.cpp
index 16d2770600..492114ab00 100644
--- a/core/fpdfapi/page/cpdf_colorstate.cpp
+++ b/core/fpdfapi/page/cpdf_colorstate.cpp
@@ -70,18 +70,15 @@ bool CPDF_ColorState::HasStrokeColor() const {
}
void CPDF_ColorState::SetFillColor(CPDF_ColorSpace* pCS,
- float* pValue,
- uint32_t nValues) {
+ const std::vector<float>& values) {
ColorData* pData = m_Ref.GetPrivateCopy();
- SetColor(pData->m_FillColor, &pData->m_FillColorRef, pCS, pValue, nValues);
+ SetColor(pCS, values, &pData->m_FillColor, &pData->m_FillColorRef);
}
void CPDF_ColorState::SetStrokeColor(CPDF_ColorSpace* pCS,
- float* pValue,
- uint32_t nValues) {
+ const std::vector<float>& values) {
ColorData* pData = m_Ref.GetPrivateCopy();
- SetColor(pData->m_StrokeColor, &pData->m_StrokeColorRef, pCS, pValue,
- nValues);
+ SetColor(pCS, values, &pData->m_StrokeColor, &pData->m_StrokeColorRef);
}
void CPDF_ColorState::SetFillPattern(CPDF_Pattern* pPattern,
@@ -119,24 +116,27 @@ void CPDF_ColorState::SetStrokePattern(CPDF_Pattern* pPattern,
pData->m_StrokeColor.GetRGB(&R, &G, &B) ? FXSYS_BGR(B, G, R) : 0xFFFFFFFF;
}
-void CPDF_ColorState::SetColor(CPDF_Color& color,
- FX_COLORREF* colorref,
- CPDF_ColorSpace* pCS,
- float* pValue,
- uint32_t nValues) {
+void CPDF_ColorState::SetColor(CPDF_ColorSpace* pCS,
+ const std::vector<float>& values,
+ CPDF_Color* color,
+ FX_COLORREF* colorref) {
+ ASSERT(color);
+ ASSERT(colorref);
+
if (pCS)
- color.SetColorSpace(pCS);
- else if (color.IsNull())
- color.SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
+ color->SetColorSpace(pCS);
+ else if (color->IsNull())
+ color->SetColorSpace(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY));
- if (color.GetColorSpace()->CountComponents() > nValues)
+ if (color->GetColorSpace()->CountComponents() > values.size())
return;
- color.SetValue(pValue);
+ if (!color->IsPattern())
+ color->SetValueForNonPattern(values);
int R;
int G;
int B;
- *colorref = color.GetRGB(&R, &G, &B) ? FXSYS_BGR(B, G, R) : 0xFFFFFFFF;
+ *colorref = color->GetRGB(&R, &G, &B) ? FXSYS_BGR(B, G, R) : 0xFFFFFFFF;
}
CPDF_ColorState::ColorData::ColorData()
diff --git a/core/fpdfapi/page/cpdf_colorstate.h b/core/fpdfapi/page/cpdf_colorstate.h
index 053e103ead..a617409268 100644
--- a/core/fpdfapi/page/cpdf_colorstate.h
+++ b/core/fpdfapi/page/cpdf_colorstate.h
@@ -41,8 +41,8 @@ class CPDF_ColorState {
CPDF_Color* GetMutableStrokeColor();
bool HasStrokeColor() const;
- void SetFillColor(CPDF_ColorSpace* pCS, float* pValue, uint32_t nValues);
- void SetStrokeColor(CPDF_ColorSpace* pCS, float* pValue, uint32_t nValues);
+ void SetFillColor(CPDF_ColorSpace* pCS, const std::vector<float>& values);
+ void SetStrokeColor(CPDF_ColorSpace* pCS, const std::vector<float>& values);
void SetFillPattern(CPDF_Pattern* pattern, const std::vector<float>& values);
void SetStrokePattern(CPDF_Pattern* pattern,
const std::vector<float>& values);
@@ -64,11 +64,10 @@ class CPDF_ColorState {
CPDF_Color m_StrokeColor;
};
- void SetColor(CPDF_Color& color,
- FX_COLORREF* colorref,
- CPDF_ColorSpace* pCS,
- float* pValue,
- uint32_t nValues);
+ void SetColor(CPDF_ColorSpace* pCS,
+ const std::vector<float>& values,
+ CPDF_Color* color,
+ FX_COLORREF* colorref);
SharedCopyOnWrite<ColorData> m_Ref;
};
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 5d1f5efd49..c369604340 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -6,6 +6,7 @@
#include "core/fpdfapi/page/cpdf_streamcontentparser.h"
+#include <algorithm>
#include <memory>
#include <utility>
#include <vector>
@@ -420,6 +421,13 @@ float CPDF_StreamContentParser::GetNumber(uint32_t index) const {
return 0;
}
+std::vector<float> CPDF_StreamContentParser::GetNumbers(size_t count) const {
+ std::vector<float> values(count);
+ for (size_t i = 0; i < count; ++i)
+ values[i] = GetNumber(count - i - 1);
+ return values;
+}
+
void CPDF_StreamContentParser::SetGraphicStates(CPDF_PageObject* pObj,
bool bColor,
bool bText,
@@ -834,10 +842,7 @@ CPDF_ImageObject* CPDF_StreamContentParser::AddImageObject(
std::vector<float> CPDF_StreamContentParser::GetColors() const {
ASSERT(m_ParamCount > 0);
- std::vector<float> values(m_ParamCount);
- for (size_t i = 0; i < m_ParamCount; ++i)
- values[i] = GetNumber(m_ParamCount - i - 1);
- return values;
+ return GetNumbers(m_ParamCount);
}
std::vector<float> CPDF_StreamContentParser::GetNamedColors() const {
@@ -881,15 +886,13 @@ void CPDF_StreamContentParser::Handle_EOFillPath() {
}
void CPDF_StreamContentParser::Handle_SetGray_Fill() {
- float value = GetNumber(0);
CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
- m_pCurStates->m_ColorState.SetFillColor(pCS, &value, 1);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, GetNumbers(1));
}
void CPDF_StreamContentParser::Handle_SetGray_Stroke() {
- float value = GetNumber(0);
CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICEGRAY);
- m_pCurStates->m_ColorState.SetStrokeColor(pCS, &value, 1);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, GetNumbers(1));
}
void CPDF_StreamContentParser::Handle_SetExtendGraphState() {
@@ -932,24 +935,16 @@ void CPDF_StreamContentParser::Handle_SetCMYKColor_Fill() {
if (m_ParamCount != 4)
return;
- float values[4];
- for (int i = 0; i < 4; i++) {
- values[i] = GetNumber(3 - i);
- }
CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
- m_pCurStates->m_ColorState.SetFillColor(pCS, values, 4);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, GetNumbers(4));
}
void CPDF_StreamContentParser::Handle_SetCMYKColor_Stroke() {
if (m_ParamCount != 4)
return;
- float values[4];
- for (int i = 0; i < 4; i++) {
- values[i] = GetNumber(3 - i);
- }
CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICECMYK);
- m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 4);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, GetNumbers(4));
}
void CPDF_StreamContentParser::Handle_LineTo() {
@@ -1009,24 +1004,16 @@ void CPDF_StreamContentParser::Handle_SetRGBColor_Fill() {
if (m_ParamCount != 3)
return;
- float values[3];
- for (int i = 0; i < 3; i++) {
- values[i] = GetNumber(2 - i);
- }
CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
- m_pCurStates->m_ColorState.SetFillColor(pCS, values, 3);
+ m_pCurStates->m_ColorState.SetFillColor(pCS, GetNumbers(3));
}
void CPDF_StreamContentParser::Handle_SetRGBColor_Stroke() {
if (m_ParamCount != 3)
return;
- float values[3];
- for (int i = 0; i < 3; i++) {
- values[i] = GetNumber(2 - i);
- }
CPDF_ColorSpace* pCS = CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB);
- m_pCurStates->m_ColorState.SetStrokeColor(pCS, values, 3);
+ m_pCurStates->m_ColorState.SetStrokeColor(pCS, GetNumbers(3));
}
void CPDF_StreamContentParser::Handle_SetRenderIntent() {}
@@ -1041,27 +1028,13 @@ void CPDF_StreamContentParser::Handle_StrokePath() {
}
void CPDF_StreamContentParser::Handle_SetColor_Fill() {
- float values[4];
- int nargs = m_ParamCount;
- if (nargs > 4) {
- nargs = 4;
- }
- for (int i = 0; i < nargs; i++) {
- values[i] = GetNumber(nargs - i - 1);
- }
- m_pCurStates->m_ColorState.SetFillColor(nullptr, values, nargs);
+ int nargs = std::min(m_ParamCount, 4U);
+ m_pCurStates->m_ColorState.SetFillColor(nullptr, GetNumbers(nargs));
}
void CPDF_StreamContentParser::Handle_SetColor_Stroke() {
- float values[4];
- int nargs = m_ParamCount;
- if (nargs > 4) {
- nargs = 4;
- }
- for (int i = 0; i < nargs; i++) {
- values[i] = GetNumber(nargs - i - 1);
- }
- m_pCurStates->m_ColorState.SetStrokeColor(nullptr, values, nargs);
+ int nargs = std::min(m_ParamCount, 4U);
+ m_pCurStates->m_ColorState.SetStrokeColor(nullptr, GetNumbers(nargs));
}
void CPDF_StreamContentParser::Handle_SetColorPS_Fill() {
@@ -1070,9 +1043,7 @@ void CPDF_StreamContentParser::Handle_SetColorPS_Fill() {
return;
if (!pLastParam->IsName()) {
- std::vector<float> values = GetColors();
- m_pCurStates->m_ColorState.SetFillColor(nullptr, values.data(),
- values.size());
+ m_pCurStates->m_ColorState.SetFillColor(nullptr, GetColors());
return;
}
@@ -1089,9 +1060,7 @@ void CPDF_StreamContentParser::Handle_SetColorPS_Stroke() {
return;
if (!pLastParam->IsName()) {
- std::vector<float> values = GetColors();
- m_pCurStates->m_ColorState.SetStrokeColor(nullptr, values.data(),
- values.size());
+ m_pCurStates->m_ColorState.SetStrokeColor(nullptr, GetColors());
return;
}
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.h b/core/fpdfapi/page/cpdf_streamcontentparser.h
index 2711a39918..438be024cc 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.h
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.h
@@ -92,6 +92,9 @@ class CPDF_StreamContentParser {
CPDF_Object* GetObject(uint32_t index);
ByteString GetString(uint32_t index) const;
float GetNumber(uint32_t index) const;
+ // Calls GetNumber() |count| times and returns the values in reverse order.
+ // e.g. for |count| = 3, returns [GetNumber(2), GetNumber(1), GetNumber(0)].
+ std::vector<float> GetNumbers(size_t count) const;
int GetInteger(uint32_t index) const {
return static_cast<int>(GetNumber(index));
}
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index bc494f8d85..20d88942c8 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -9,6 +9,7 @@
#include <algorithm>
#include <memory>
#include <utility>
+#include <vector>
#include "core/fpdfapi/edit/cpdf_pagecontentgenerator.h"
#include "core/fpdfapi/page/cpdf_form.h"
@@ -399,11 +400,11 @@ FPDF_BOOL FPDFPageObj_SetFillColor(FPDF_PAGEOBJECT page_object,
if (!page_object || R > 255 || G > 255 || B > 255 || A > 255)
return false;
- float rgb[3] = {R / 255.f, G / 255.f, B / 255.f};
+ std::vector<float> rgb = {R / 255.f, G / 255.f, B / 255.f};
auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
pPageObj->m_GeneralState.SetFillAlpha(A / 255.f);
pPageObj->m_ColorState.SetFillColor(
- CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
+ CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb);
pPageObj->SetDirty(true);
return true;
}
diff --git a/fpdfsdk/fpdf_editpath.cpp b/fpdfsdk/fpdf_editpath.cpp
index 2daec67e36..82c7ca13ef 100644
--- a/fpdfsdk/fpdf_editpath.cpp
+++ b/fpdfsdk/fpdf_editpath.cpp
@@ -80,10 +80,10 @@ FPDFPath_SetStrokeColor(FPDF_PAGEOBJECT path,
if (!pPathObj || R > 255 || G > 255 || B > 255 || A > 255)
return false;
- float rgb[3] = {R / 255.f, G / 255.f, B / 255.f};
+ std::vector<float> rgb = {R / 255.f, G / 255.f, B / 255.f};
pPathObj->m_GeneralState.SetStrokeAlpha(A / 255.f);
pPathObj->m_ColorState.SetStrokeColor(
- CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
+ CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb);
pPathObj->SetDirty(true);
return true;
}