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