• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "core/fpdfdoc/cpdf_annot.h"
6 
7 #include <vector>
8 
9 #include "core/fpdfapi/parser/cpdf_array.h"
10 #include "core/fpdfapi/parser/cpdf_dictionary.h"
11 #include "core/fpdfapi/parser/cpdf_number.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 
14 namespace {
15 
CreateQuadPointArrayFromVector(const std::vector<int> & points)16 RetainPtr<CPDF_Array> CreateQuadPointArrayFromVector(
17     const std::vector<int>& points) {
18   auto array = pdfium::MakeRetain<CPDF_Array>();
19   for (float point : points)
20     array->AppendNew<CPDF_Number>(point);
21   return array;
22 }
23 
24 }  // namespace
25 
TEST(CPDFAnnotTest,RectFromQuadPointsArray)26 TEST(CPDFAnnotTest, RectFromQuadPointsArray) {
27   RetainPtr<CPDF_Array> array = CreateQuadPointArrayFromVector(
28       {0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5, 4, 3, 2, 1});
29   CFX_FloatRect rect = CPDF_Annot::RectFromQuadPointsArray(array.Get(), 0);
30   EXPECT_EQ(4.0f, rect.left);
31   EXPECT_EQ(5.0f, rect.bottom);
32   EXPECT_EQ(2.0f, rect.right);
33   EXPECT_EQ(3.0f, rect.top);
34 
35   rect = CPDF_Annot::RectFromQuadPointsArray(array.Get(), 1);
36   EXPECT_EQ(4.0f, rect.left);
37   EXPECT_EQ(3.0f, rect.bottom);
38   EXPECT_EQ(6.0f, rect.right);
39   EXPECT_EQ(5.0f, rect.top);
40 }
41 
TEST(CPDFAnnotTest,BoundingRectFromQuadPoints)42 TEST(CPDFAnnotTest, BoundingRectFromQuadPoints) {
43   auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
44   CFX_FloatRect rect = CPDF_Annot::BoundingRectFromQuadPoints(dict.Get());
45   EXPECT_EQ(0.0f, rect.left);
46   EXPECT_EQ(0.0f, rect.bottom);
47   EXPECT_EQ(0.0f, rect.right);
48   EXPECT_EQ(0.0f, rect.top);
49 
50   dict->SetFor("QuadPoints", CreateQuadPointArrayFromVector({0, 1, 2}));
51   rect = CPDF_Annot::BoundingRectFromQuadPoints(dict.Get());
52   EXPECT_EQ(0.0f, rect.left);
53   EXPECT_EQ(0.0f, rect.bottom);
54   EXPECT_EQ(0.0f, rect.right);
55   EXPECT_EQ(0.0f, rect.top);
56 
57   dict->SetFor("QuadPoints",
58                CreateQuadPointArrayFromVector({0, 1, 2, 3, 4, 5, 6, 7}));
59   rect = CPDF_Annot::BoundingRectFromQuadPoints(dict.Get());
60   EXPECT_EQ(4.0f, rect.left);
61   EXPECT_EQ(5.0f, rect.bottom);
62   EXPECT_EQ(2.0f, rect.right);
63   EXPECT_EQ(3.0f, rect.top);
64 
65   dict->SetFor("QuadPoints", CreateQuadPointArrayFromVector(
66                                  {0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5,
67                                   4, 3, 2, 1, 9, 2, 5, 7, 3, 6, 4, 1}));
68   rect = CPDF_Annot::BoundingRectFromQuadPoints(dict.Get());
69   EXPECT_EQ(2.0f, rect.left);
70   EXPECT_EQ(3.0f, rect.bottom);
71   EXPECT_EQ(6.0f, rect.right);
72   EXPECT_EQ(7.0f, rect.top);
73 }
74 
TEST(CPDFAnnotTest,RectFromQuadPoints)75 TEST(CPDFAnnotTest, RectFromQuadPoints) {
76   auto dict = pdfium::MakeRetain<CPDF_Dictionary>();
77   CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(dict.Get(), 0);
78   EXPECT_EQ(0.0f, rect.left);
79   EXPECT_EQ(0.0f, rect.bottom);
80   EXPECT_EQ(0.0f, rect.right);
81   EXPECT_EQ(0.0f, rect.top);
82   rect = CPDF_Annot::RectFromQuadPoints(dict.Get(), 5);
83   EXPECT_EQ(0.0f, rect.left);
84   EXPECT_EQ(0.0f, rect.bottom);
85   EXPECT_EQ(0.0f, rect.right);
86   EXPECT_EQ(0.0f, rect.top);
87 
88   dict->SetFor("QuadPoints",
89                CreateQuadPointArrayFromVector({0, 1, 2, 3, 4, 5, 6, 7}));
90   rect = CPDF_Annot::RectFromQuadPoints(dict.Get(), 0);
91   EXPECT_EQ(4.0f, rect.left);
92   EXPECT_EQ(5.0f, rect.bottom);
93   EXPECT_EQ(2.0f, rect.right);
94   EXPECT_EQ(3.0f, rect.top);
95   rect = CPDF_Annot::RectFromQuadPoints(dict.Get(), 5);
96   EXPECT_EQ(0.0f, rect.left);
97   EXPECT_EQ(0.0f, rect.bottom);
98   EXPECT_EQ(0.0f, rect.right);
99   EXPECT_EQ(0.0f, rect.top);
100 
101   dict->SetFor("QuadPoints", CreateQuadPointArrayFromVector(
102                                  {0, 1, 2, 3, 4, 5, 6, 7, 8, 7, 6, 5,
103                                   4, 3, 2, 1, 9, 2, 5, 7, 3, 6, 4, 1}));
104   rect = CPDF_Annot::RectFromQuadPoints(dict.Get(), 0);
105   EXPECT_EQ(4.0f, rect.left);
106   EXPECT_EQ(5.0f, rect.bottom);
107   EXPECT_EQ(2.0f, rect.right);
108   EXPECT_EQ(3.0f, rect.top);
109   rect = CPDF_Annot::RectFromQuadPoints(dict.Get(), 1);
110   EXPECT_EQ(4.0f, rect.left);
111   EXPECT_EQ(3.0f, rect.bottom);
112   EXPECT_EQ(6.0f, rect.right);
113   EXPECT_EQ(5.0f, rect.top);
114   rect = CPDF_Annot::RectFromQuadPoints(dict.Get(), 2);
115   EXPECT_EQ(3.0f, rect.left);
116   EXPECT_EQ(6.0f, rect.bottom);
117   EXPECT_EQ(5.0f, rect.right);
118   EXPECT_EQ(7.0f, rect.top);
119 }
120 
TEST(CPDFAnnotTest,QuadPointCount)121 TEST(CPDFAnnotTest, QuadPointCount) {
122   RetainPtr<CPDF_Array> array = CreateQuadPointArrayFromVector({});
123   EXPECT_EQ(0u, CPDF_Annot::QuadPointCount(array.Get()));
124 
125   for (int i = 0; i < 7; ++i) {
126     array->AppendNew<CPDF_Number>(0);
127     EXPECT_EQ(0u, CPDF_Annot::QuadPointCount(array.Get()));
128   }
129   for (int i = 0; i < 8; ++i) {
130     array->AppendNew<CPDF_Number>(0);
131     EXPECT_EQ(1u, CPDF_Annot::QuadPointCount(array.Get()));
132   }
133   for (int i = 0; i < 50; ++i)
134     array->AppendNew<CPDF_Number>(0);
135   EXPECT_EQ(8u, CPDF_Annot::QuadPointCount(array.Get()));
136 }
137