Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
cfx_dibitmap_unittest.cpp
Go to the documentation of this file.
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/fxge/dib/cfx_dibitmap.h"
6
7#include <stdint.h>
8
9#include "core/fxcrt/compiler_specific.h"
10#include "core/fxcrt/fx_coordinates.h"
11#include "core/fxcrt/span.h"
12#include "core/fxge/dib/fx_dib.h"
13#include "testing/gmock/include/gmock/gmock.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace {
17
18using ::testing::ElementsAre;
19
20} // namespace
21
23 auto pBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
24 EXPECT_FALSE(pBitmap->Create(400, 300, FXDIB_Format::kInvalid));
25
26 pBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
27 EXPECT_TRUE(pBitmap->Create(400, 300, FXDIB_Format::k1bppRgb));
28}
29
31 // Simple case with no provided pitch.
32 std::optional<CFX_DIBitmap::PitchAndSize> result =
33 CFX_DIBitmap::CalculatePitchAndSize(100, 200, FXDIB_Format::kBgra, 0);
34 ASSERT_TRUE(result.has_value());
35 EXPECT_EQ(400u, result.value().pitch);
36 EXPECT_EQ(80000u, result.value().size);
37
38 // Simple case with no provided pitch and different format.
39 result =
40 CFX_DIBitmap::CalculatePitchAndSize(100, 200, FXDIB_Format::k8bppRgb, 0);
41 ASSERT_TRUE(result.has_value());
42 EXPECT_EQ(100u, result.value().pitch);
43 EXPECT_EQ(20000u, result.value().size);
44
45 // Simple case with provided pitch matching width * bpp.
46 result =
47 CFX_DIBitmap::CalculatePitchAndSize(100, 200, FXDIB_Format::kBgra, 400);
48 ASSERT_TRUE(result.has_value());
49 EXPECT_EQ(400u, result.value().pitch);
50 EXPECT_EQ(80000u, result.value().size);
51
52 // Simple case with provided pitch, where pitch exceeds width * bpp.
53 result =
54 CFX_DIBitmap::CalculatePitchAndSize(100, 200, FXDIB_Format::kBgra, 455);
55 ASSERT_TRUE(result.has_value());
56 EXPECT_EQ(455u, result.value().pitch);
57 EXPECT_EQ(91000u, result.value().size);
58}
59
61 // Bad width / height.
62 static const CFX_Size kBadDimensions[] = {
63 {0, 0}, {-1, -1}, {-1, 0}, {0, -1},
64 {0, 200}, {100, 0}, {-1, 200}, {100, -1},
65 };
66 for (const auto& dimension : kBadDimensions) {
67 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(
68 dimension.width, dimension.height, FXDIB_Format::kBgra, 0));
69 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(
70 dimension.width, dimension.height, FXDIB_Format::kBgra, 1));
71 }
72
73 // Bad format.
74 EXPECT_FALSE(
75 CFX_DIBitmap::CalculatePitchAndSize(100, 200, FXDIB_Format::kInvalid, 0));
76 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(
77 100, 200, FXDIB_Format::kInvalid, 800));
78
79 // Width too wide for claimed pitch.
80 EXPECT_FALSE(
81 CFX_DIBitmap::CalculatePitchAndSize(101, 200, FXDIB_Format::kBgra, 400));
82
83 // Overflow cases with calculated pitch.
84 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(1073747000, 1,
86 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(1048576, 1024,
88 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(4194304, 1024,
90
91 // Overflow cases with provided pitch.
92 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(
93 2147484000u, 1, FXDIB_Format::kBgra, 2147484000u));
94 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(
95 1048576, 1024, FXDIB_Format::kBgra, 4194304));
96 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(
97 4194304, 1024, FXDIB_Format::k8bppRgb, 4194304));
98}
99
101 // Test boundary condition for pitch overflow.
102 std::optional<CFX_DIBitmap::PitchAndSize> result =
103 CFX_DIBitmap::CalculatePitchAndSize(536870908, 4, FXDIB_Format::k8bppRgb,
104 0);
105 ASSERT_TRUE(result);
106 EXPECT_EQ(536870908u, result.value().pitch);
107 EXPECT_EQ(2147483632u, result.value().size);
108 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(536870909, 4,
110
111 // Test boundary condition for size overflow.
112 result = CFX_DIBitmap::CalculatePitchAndSize(68174084, 63,
114 ASSERT_TRUE(result);
115 EXPECT_EQ(68174084u, result.value().pitch);
116 EXPECT_EQ(4294967292u, result.value().size);
117 EXPECT_FALSE(CFX_DIBitmap::CalculatePitchAndSize(68174085, 63,
119}
120
122 auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
123 ASSERT_TRUE(bitmap->Create(3, 3, FXDIB_Format::kBgr));
124 EXPECT_EQ(3, bitmap->GetWidth());
125 EXPECT_EQ(12u, bitmap->GetPitch());
126
127 EXPECT_EQ(36u, bitmap->GetBuffer().size());
128 EXPECT_EQ(12u, bitmap->GetScanline(0).size());
129 EXPECT_EQ(3u, bitmap->GetScanlineAs<FX_BGR_STRUCT<uint8_t>>(0).size());
130
131 EXPECT_EQ(36u, bitmap->GetWritableBuffer().size());
132 EXPECT_EQ(12u, bitmap->GetWritableScanline(0).size());
133 EXPECT_EQ(3u,
134 bitmap->GetWritableScanlineAs<FX_BGR_STRUCT<uint8_t>>(0).size());
135}
136
137#if defined(PDF_USE_SKIA)
138TEST(CFXDIBitmapTest, UnPreMultiplyFromPreMultiplied) {
139 auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
140 ASSERT_TRUE(bitmap->Create(1, 1, FXDIB_Format::kBgraPremul));
141 EXPECT_TRUE(bitmap->IsPremultiplied());
142 UNSAFE_TODO(FXARGB_SetDIB(bitmap->GetWritableBuffer().data(), 0x7f'7f'7f'7f));
143
144 bitmap->UnPreMultiply();
145 EXPECT_FALSE(bitmap->IsPremultiplied());
146 EXPECT_THAT(bitmap->GetBuffer(), ElementsAre(0xff, 0xff, 0xff, 0x7f));
147}
148
149TEST(CFXDIBitmapTest, UnPreMultiplyFromUnPreMultiplied) {
150 auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
151 ASSERT_TRUE(bitmap->Create(1, 1, FXDIB_Format::kBgra));
152 EXPECT_FALSE(bitmap->IsPremultiplied());
153 UNSAFE_TODO(FXARGB_SetDIB(bitmap->GetWritableBuffer().data(), 0x7f'ff'ff'ff));
154
155 bitmap->UnPreMultiply();
156 EXPECT_FALSE(bitmap->IsPremultiplied());
157 EXPECT_THAT(bitmap->GetBuffer(), ElementsAre(0xff, 0xff, 0xff, 0x7f));
158}
159
160TEST(CFXDIBitmapTest, PreMultiplyFromUnPreMultiplied) {
161 auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
162 ASSERT_TRUE(bitmap->Create(1, 1, FXDIB_Format::kBgra));
163 EXPECT_FALSE(bitmap->IsPremultiplied());
164 UNSAFE_TODO(FXARGB_SetDIB(bitmap->GetWritableBuffer().data(), 0x7f'ff'ff'ff));
165
166 bitmap->PreMultiply();
167 EXPECT_TRUE(bitmap->IsPremultiplied());
168 EXPECT_THAT(bitmap->GetBuffer(), ElementsAre(0x7f, 0x7f, 0x7f, 0x7f));
169}
170
171TEST(CFXDIBitmapTest, PreMultiplyFromPreMultiplied) {
172 auto bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
173 ASSERT_TRUE(bitmap->Create(1, 1, FXDIB_Format::kBgraPremul));
174 EXPECT_TRUE(bitmap->IsPremultiplied());
175 UNSAFE_TODO(FXARGB_SetDIB(bitmap->GetWritableBuffer().data(), 0x7f'7f'7f'7f));
176
177 bitmap->PreMultiply();
178 EXPECT_TRUE(bitmap->IsPremultiplied());
179 EXPECT_THAT(bitmap->GetBuffer(), ElementsAre(0x7f, 0x7f, 0x7f, 0x7f));
180}
181#endif // defined(PDF_USE_SKIA)
static std::optional< PitchAndSize > CalculatePitchAndSize(int width, int height, FXDIB_Format format, uint32_t pitch)
CFX_STemplate< int32_t > CFX_Size
TEST(FXCRYPT, MD5GenerateEmtpyData)
FXDIB_Format
Definition fx_dib.h:21