• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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