blob: 6650b403dac95628973f74ed3ad5c13c1d5a26c1 [file] [log] [blame]
Lei Zhang981ccf62018-12-20 23:59:34 +00001// 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/fxcrt/fx_system.h"
6#include "public/fpdf_edit.h"
7#include "testing/embedder_test.h"
8
9class FPDFEditPageEmbedderTest : public EmbedderTest {};
10
Lei Zhang03e5e682019-09-16 19:45:55 +000011// TODO(crbug.com/pdfium/11): Fix this test and enable.
12#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
13#define MAYBE_Rotation DISABLED_Rotation
14#else
15#define MAYBE_Rotation Rotation
16#endif
17TEST_F(FPDFEditPageEmbedderTest, MAYBE_Rotation) {
Lei Zhang981ccf62018-12-20 23:59:34 +000018 const char kOriginalMD5[] = "0a90de37f52127619c3dfb642b5fa2fe";
19 const char kRotatedMD5[] = "d599429574ff0dcad3bc898ea8b874ca";
20
21 {
22 ASSERT_TRUE(OpenDocument("rectangles.pdf"));
23 FPDF_PAGE page = LoadPage(0);
24 ASSERT_TRUE(page);
25
26 {
27 // Render the page as is.
28 EXPECT_EQ(0, FPDFPage_GetRotation(page));
29 const int page_width = static_cast<int>(FPDF_GetPageWidth(page));
30 const int page_height = static_cast<int>(FPDF_GetPageHeight(page));
31 EXPECT_EQ(200, page_width);
32 EXPECT_EQ(300, page_height);
33 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
34 CompareBitmap(bitmap.get(), page_width, page_height, kOriginalMD5);
35 }
36
37 FPDFPage_SetRotation(page, 1);
38
39 {
40 // Render the page after rotation.
Lei Zhangae3945f2018-12-21 19:12:45 +000041 // Note that the change affects the rendering, as expected.
42 // It behaves just like the case below, rather than the case above.
Lei Zhang981ccf62018-12-20 23:59:34 +000043 EXPECT_EQ(1, FPDFPage_GetRotation(page));
44 const int page_width = static_cast<int>(FPDF_GetPageWidth(page));
45 const int page_height = static_cast<int>(FPDF_GetPageHeight(page));
Lei Zhangae3945f2018-12-21 19:12:45 +000046 EXPECT_EQ(300, page_width);
47 EXPECT_EQ(200, page_height);
Lei Zhang981ccf62018-12-20 23:59:34 +000048 ScopedFPDFBitmap bitmap = RenderLoadedPage(page);
Lei Zhangae3945f2018-12-21 19:12:45 +000049 CompareBitmap(bitmap.get(), page_width, page_height, kRotatedMD5);
Lei Zhang981ccf62018-12-20 23:59:34 +000050 }
51
52 UnloadPage(page);
53 }
54
55 {
56 // Save a copy, open the copy, and render it.
57 // Note that it renders the rotation.
58 EXPECT_TRUE(FPDF_SaveAsCopy(document(), this, 0));
Lei Zhang0b494052019-01-31 21:41:15 +000059 ASSERT_TRUE(OpenSavedDocument());
Lei Zhang981ccf62018-12-20 23:59:34 +000060 FPDF_PAGE saved_page = LoadSavedPage(0);
61 ASSERT_TRUE(saved_page);
62
63 EXPECT_EQ(1, FPDFPage_GetRotation(saved_page));
64 const int page_width = static_cast<int>(FPDF_GetPageWidth(saved_page));
65 const int page_height = static_cast<int>(FPDF_GetPageHeight(saved_page));
66 EXPECT_EQ(300, page_width);
67 EXPECT_EQ(200, page_height);
68 ScopedFPDFBitmap bitmap = RenderSavedPage(saved_page);
69 CompareBitmap(bitmap.get(), page_width, page_height, kRotatedMD5);
70
71 CloseSavedPage(saved_page);
72 CloseSavedDocument();
73 }
74}
Lei Zhang0ca4da72019-02-13 18:22:55 +000075
76TEST_F(FPDFEditPageEmbedderTest, HasTransparencyImage) {
77 constexpr int kExpectedObjectCount = 39;
78 ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
79 FPDF_PAGE page = LoadPage(0);
80 ASSERT_TRUE(page);
81 ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
82
83 for (int i = 0; i < kExpectedObjectCount; ++i) {
84 FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
85 EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
86
87 FPDFPageObj_SetFillColor(obj, 255, 0, 0, 127);
88 EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
89 }
90
91 UnloadPage(page);
92}
93
94TEST_F(FPDFEditPageEmbedderTest, HasTransparencyInvalid) {
95 EXPECT_FALSE(FPDFPageObj_HasTransparency(nullptr));
96}
97
98TEST_F(FPDFEditPageEmbedderTest, HasTransparencyPath) {
99 constexpr int kExpectedObjectCount = 8;
100 EXPECT_TRUE(OpenDocument("rectangles.pdf"));
101 FPDF_PAGE page = LoadPage(0);
102 ASSERT_TRUE(page);
103 ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
104
105 for (int i = 0; i < kExpectedObjectCount; ++i) {
106 FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
107 EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
108
109 FPDFPageObj_SetStrokeColor(obj, 63, 63, 0, 127);
110 EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
111 }
112
113 UnloadPage(page);
114}
115
116TEST_F(FPDFEditPageEmbedderTest, HasTransparencyText) {
117 constexpr int kExpectedObjectCount = 2;
118 EXPECT_TRUE(OpenDocument("text_render_mode.pdf"));
119 FPDF_PAGE page = LoadPage(0);
120 ASSERT_TRUE(page);
121 ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
122
123 for (int i = 0; i < kExpectedObjectCount; ++i) {
124 FPDF_PAGEOBJECT obj = FPDFPage_GetObject(page, i);
125 EXPECT_FALSE(FPDFPageObj_HasTransparency(obj));
126
127 FPDFPageObj_SetBlendMode(obj, "Lighten");
128 EXPECT_TRUE(FPDFPageObj_HasTransparency(obj));
129 }
130
131 UnloadPage(page);
132}
Lei Zhangb6aa0742019-11-12 23:15:31 +0000133
134TEST_F(FPDFEditPageEmbedderTest, GetFillAndStrokeForImage) {
135 constexpr int kExpectedObjectCount = 39;
136 constexpr int kImageObjectsStartIndex = 33;
137 ASSERT_TRUE(OpenDocument("embedded_images.pdf"));
138 FPDF_PAGE page = LoadPage(0);
139 ASSERT_TRUE(page);
140
141 ASSERT_EQ(kExpectedObjectCount, FPDFPage_CountObjects(page));
142
143 for (int i = kImageObjectsStartIndex; i < kExpectedObjectCount; ++i) {
144 FPDF_PAGEOBJECT image = FPDFPage_GetObject(page, i);
145 ASSERT_TRUE(image);
146 EXPECT_EQ(FPDF_PAGEOBJ_IMAGE, FPDFPageObj_GetType(image));
147
148 unsigned int r;
149 unsigned int g;
150 unsigned int b;
151 unsigned int a;
152 EXPECT_FALSE(FPDFPageObj_GetFillColor(image, &r, &g, &b, &a));
153 EXPECT_FALSE(FPDFPageObj_GetStrokeColor(image, &r, &g, &b, &a));
154 }
155
156 UnloadPage(page);
157}