Add CPDF_Array::GetBooleanAt().
Compared to CPDF_Dictionary, CPDF_Array is missing a GetBooleanAt()
method. Add it to mirror the CPDF_Dictionary version, with unit tests.
Use it in a couple places that expect to be reading booleans.
Change-Id: I71612ac00a5c7e87126a21d2424e6ad98a68264a
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/60652
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: dsinclair <dsinclair@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_array.cpp b/core/fpdfapi/parser/cpdf_array.cpp
index 1c51341..a7ce4e6 100644
--- a/core/fpdfapi/parser/cpdf_array.cpp
+++ b/core/fpdfapi/parser/cpdf_array.cpp
@@ -9,6 +9,7 @@
#include <set>
#include <utility>
+#include "core/fpdfapi/parser/cpdf_boolean.h"
#include "core/fpdfapi/parser/cpdf_name.h"
#include "core/fpdfapi/parser/cpdf_number.h"
#include "core/fpdfapi/parser/cpdf_reference.h"
@@ -123,6 +124,13 @@
return m_Objects[index]->GetUnicodeText();
}
+bool CPDF_Array::GetBooleanAt(size_t index, bool bDefault) const {
+ if (index >= m_Objects.size())
+ return bDefault;
+ const CPDF_Object* p = m_Objects[index].Get();
+ return ToBoolean(p) ? p->GetInteger() != 0 : bDefault;
+}
+
int CPDF_Array::GetIntegerAt(size_t index) const {
if (index >= m_Objects.size())
return 0;
diff --git a/core/fpdfapi/parser/cpdf_array.h b/core/fpdfapi/parser/cpdf_array.h
index 34b7c9a..2a12d99 100644
--- a/core/fpdfapi/parser/cpdf_array.h
+++ b/core/fpdfapi/parser/cpdf_array.h
@@ -43,6 +43,7 @@
const CPDF_Object* GetDirectObjectAt(size_t index) const;
ByteString GetStringAt(size_t index) const;
WideString GetUnicodeTextAt(size_t index) const;
+ bool GetBooleanAt(size_t index, bool bDefault) const;
int GetIntegerAt(size_t index) const;
float GetNumberAt(size_t index) const;
CPDF_Dictionary* GetDictAt(size_t index);
diff --git a/core/fpdfapi/parser/cpdf_array_unittest.cpp b/core/fpdfapi/parser/cpdf_array_unittest.cpp
index a941160..457961f 100644
--- a/core/fpdfapi/parser/cpdf_array_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_array_unittest.cpp
@@ -7,11 +7,32 @@
#include <memory>
#include <utility>
+#include "core/fpdfapi/parser/cpdf_boolean.h"
#include "core/fpdfapi/parser/cpdf_number.h"
#include "core/fpdfapi/parser/cpdf_reference.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/base/ptr_util.h"
+TEST(cpdf_array, GetBooleanAt) {
+ auto arr = pdfium::MakeRetain<CPDF_Array>();
+ arr->AddNew<CPDF_Boolean>(true);
+ arr->AddNew<CPDF_Boolean>(false);
+ arr->AddNew<CPDF_Number>(100);
+ arr->AddNew<CPDF_Number>(0);
+
+ ASSERT_EQ(4u, arr->size());
+ EXPECT_TRUE(arr->GetBooleanAt(0, true));
+ EXPECT_TRUE(arr->GetBooleanAt(0, false));
+ EXPECT_FALSE(arr->GetBooleanAt(1, true));
+ EXPECT_FALSE(arr->GetBooleanAt(1, false));
+ EXPECT_TRUE(arr->GetBooleanAt(2, true));
+ EXPECT_FALSE(arr->GetBooleanAt(2, false));
+ EXPECT_TRUE(arr->GetBooleanAt(3, true));
+ EXPECT_FALSE(arr->GetBooleanAt(3, false));
+ EXPECT_TRUE(arr->GetBooleanAt(99, true));
+ EXPECT_FALSE(arr->GetBooleanAt(99, false));
+}
+
TEST(cpdf_array, RemoveAt) {
{
const int elems[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 484eff1..d412b52 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -158,13 +158,10 @@
t_min = pArray->GetNumberAt(0);
t_max = pArray->GetNumberAt(1);
}
- bool bStartExtend = false;
- bool bEndExtend = false;
pArray = pDict->GetArrayFor("Extend");
- if (pArray) {
- bStartExtend = !!pArray->GetIntegerAt(0);
- bEndExtend = !!pArray->GetIntegerAt(1);
- }
+ const bool bStartExtend = pArray && pArray->GetBooleanAt(0, false);
+ const bool bEndExtend = pArray && pArray->GetBooleanAt(1, false);
+
int width = pBitmap->GetWidth();
int height = pBitmap->GetHeight();
float x_span = end_x - start_x;
@@ -231,13 +228,9 @@
t_min = pArray->GetNumberAt(0);
t_max = pArray->GetNumberAt(1);
}
- bool bStartExtend = false;
- bool bEndExtend = false;
pArray = pDict->GetArrayFor("Extend");
- if (pArray) {
- bStartExtend = !!pArray->GetIntegerAt(0);
- bEndExtend = !!pArray->GetIntegerAt(1);
- }
+ const bool bStartExtend = pArray && pArray->GetBooleanAt(0, false);
+ const bool bEndExtend = pArray && pArray->GetBooleanAt(1, false);
std::array<FX_ARGB, kShadingSteps> shading_steps =
GetShadingSteps(t_min, t_max, funcs, pCS, alpha, total_results);