|
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- |
|
2 * This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #include "TestScaling.h" |
|
7 |
|
8 #include "ImageScaling.h" |
|
9 |
|
10 using namespace mozilla::gfx; |
|
11 |
|
12 TestScaling::TestScaling() |
|
13 { |
|
14 REGISTER_TEST(TestScaling, BasicHalfScale); |
|
15 REGISTER_TEST(TestScaling, DoubleHalfScale); |
|
16 REGISTER_TEST(TestScaling, UnevenHalfScale); |
|
17 REGISTER_TEST(TestScaling, OddStrideHalfScale); |
|
18 REGISTER_TEST(TestScaling, VerticalHalfScale); |
|
19 REGISTER_TEST(TestScaling, HorizontalHalfScale); |
|
20 REGISTER_TEST(TestScaling, MixedHalfScale); |
|
21 } |
|
22 |
|
23 void |
|
24 TestScaling::BasicHalfScale() |
|
25 { |
|
26 std::vector<uint8_t> data; |
|
27 data.resize(500 * 500 * 4); |
|
28 |
|
29 uint32_t *pixels = reinterpret_cast<uint32_t*>(&data.front()); |
|
30 for (int y = 0; y < 500; y += 2) { |
|
31 for (int x = 0; x < 500; x += 2) { |
|
32 pixels[y * 500 + x] = 0xff00ff00; |
|
33 pixels[y * 500 + x + 1] = 0xff00ffff; |
|
34 pixels[(y + 1) * 500 + x] = 0xff000000; |
|
35 pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; |
|
36 } |
|
37 } |
|
38 ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(500, 500)); |
|
39 |
|
40 scaler.ScaleForSize(IntSize(220, 240)); |
|
41 |
|
42 VERIFY(scaler.GetSize().width == 250); |
|
43 VERIFY(scaler.GetSize().height == 250); |
|
44 |
|
45 pixels = (uint32_t*)scaler.GetScaledData(); |
|
46 |
|
47 for (int y = 0; y < 250; y++) { |
|
48 for (int x = 0; x < 250; x++) { |
|
49 VERIFY(pixels[y * (scaler.GetStride() / 4) + x] == 0xff007f7f); |
|
50 } |
|
51 } |
|
52 } |
|
53 |
|
54 void |
|
55 TestScaling::DoubleHalfScale() |
|
56 { |
|
57 std::vector<uint8_t> data; |
|
58 data.resize(500 * 500 * 4); |
|
59 |
|
60 uint32_t *pixels = reinterpret_cast<uint32_t*>(&data.front()); |
|
61 for (int y = 0; y < 500; y += 2) { |
|
62 for (int x = 0; x < 500; x += 2) { |
|
63 pixels[y * 500 + x] = 0xff00ff00; |
|
64 pixels[y * 500 + x + 1] = 0xff00ffff; |
|
65 pixels[(y + 1) * 500 + x] = 0xff000000; |
|
66 pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; |
|
67 } |
|
68 } |
|
69 ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(500, 500)); |
|
70 |
|
71 scaler.ScaleForSize(IntSize(120, 110)); |
|
72 VERIFY(scaler.GetSize().width == 125); |
|
73 VERIFY(scaler.GetSize().height == 125); |
|
74 |
|
75 pixels = (uint32_t*)scaler.GetScaledData(); |
|
76 |
|
77 for (int y = 0; y < 125; y++) { |
|
78 for (int x = 0; x < 125; x++) { |
|
79 VERIFY(pixels[y * (scaler.GetStride() / 4) + x] == 0xff007f7f); |
|
80 } |
|
81 } |
|
82 } |
|
83 |
|
84 void |
|
85 TestScaling::UnevenHalfScale() |
|
86 { |
|
87 std::vector<uint8_t> data; |
|
88 // Use a 16-byte aligned stride still, we test none-aligned strides |
|
89 // separately. |
|
90 data.resize(499 * 500 * 4); |
|
91 |
|
92 uint32_t *pixels = reinterpret_cast<uint32_t*>(&data.front()); |
|
93 for (int y = 0; y < 500; y += 2) { |
|
94 for (int x = 0; x < 500; x += 2) { |
|
95 pixels[y * 500 + x] = 0xff00ff00; |
|
96 if (x < 498) { |
|
97 pixels[y * 500 + x + 1] = 0xff00ffff; |
|
98 } |
|
99 if (y < 498) { |
|
100 pixels[(y + 1) * 500 + x] = 0xff000000; |
|
101 if (x < 498) { |
|
102 pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; |
|
103 } |
|
104 } |
|
105 } |
|
106 } |
|
107 ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(499, 499)); |
|
108 |
|
109 scaler.ScaleForSize(IntSize(220, 220)); |
|
110 VERIFY(scaler.GetSize().width == 249); |
|
111 VERIFY(scaler.GetSize().height == 249); |
|
112 |
|
113 pixels = (uint32_t*)scaler.GetScaledData(); |
|
114 |
|
115 for (int y = 0; y < 249; y++) { |
|
116 for (int x = 0; x < 249; x++) { |
|
117 VERIFY(pixels[y * (scaler.GetStride() / 4) + x] == 0xff007f7f); |
|
118 } |
|
119 } |
|
120 } |
|
121 |
|
122 void |
|
123 TestScaling::OddStrideHalfScale() |
|
124 { |
|
125 std::vector<uint8_t> data; |
|
126 // Use a 4-byte aligned stride to test if that doesn't cause any issues. |
|
127 data.resize(499 * 499 * 4); |
|
128 |
|
129 uint32_t *pixels = reinterpret_cast<uint32_t*>(&data.front()); |
|
130 for (int y = 0; y < 500; y += 2) { |
|
131 for (int x = 0; x < 500; x += 2) { |
|
132 pixels[y * 499 + x] = 0xff00ff00; |
|
133 if (x < 498) { |
|
134 pixels[y * 499 + x + 1] = 0xff00ffff; |
|
135 } |
|
136 if (y < 498) { |
|
137 pixels[(y + 1) * 499 + x] = 0xff000000; |
|
138 if (x < 498) { |
|
139 pixels[(y + 1) * 499 + x + 1] = 0xff0000ff; |
|
140 } |
|
141 } |
|
142 } |
|
143 } |
|
144 ImageHalfScaler scaler(&data.front(), 499 * 4, IntSize(499, 499)); |
|
145 |
|
146 scaler.ScaleForSize(IntSize(220, 220)); |
|
147 VERIFY(scaler.GetSize().width == 249); |
|
148 VERIFY(scaler.GetSize().height == 249); |
|
149 |
|
150 pixels = (uint32_t*)scaler.GetScaledData(); |
|
151 |
|
152 for (int y = 0; y < 249; y++) { |
|
153 for (int x = 0; x < 249; x++) { |
|
154 VERIFY(pixels[y * (scaler.GetStride() / 4) + x] == 0xff007f7f); |
|
155 } |
|
156 } |
|
157 } |
|
158 void |
|
159 TestScaling::VerticalHalfScale() |
|
160 { |
|
161 std::vector<uint8_t> data; |
|
162 data.resize(500 * 500 * 4); |
|
163 |
|
164 uint32_t *pixels = reinterpret_cast<uint32_t*>(&data.front()); |
|
165 for (int y = 0; y < 500; y += 2) { |
|
166 for (int x = 0; x < 500; x += 2) { |
|
167 pixels[y * 500 + x] = 0xff00ff00; |
|
168 pixels[y * 500 + x + 1] = 0xff00ffff; |
|
169 pixels[(y + 1) * 500 + x] = 0xff000000; |
|
170 pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; |
|
171 } |
|
172 } |
|
173 ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(500, 500)); |
|
174 |
|
175 scaler.ScaleForSize(IntSize(400, 240)); |
|
176 VERIFY(scaler.GetSize().width == 500); |
|
177 VERIFY(scaler.GetSize().height == 250); |
|
178 |
|
179 pixels = (uint32_t*)scaler.GetScaledData(); |
|
180 |
|
181 for (int y = 0; y < 250; y++) { |
|
182 for (int x = 0; x < 500; x += 2) { |
|
183 VERIFY(pixels[y * (scaler.GetStride() / 4) + x] == 0xff007f00); |
|
184 VERIFY(pixels[y * (scaler.GetStride() / 4) + x + 1] == 0xff007fff); |
|
185 } |
|
186 } |
|
187 } |
|
188 |
|
189 void |
|
190 TestScaling::HorizontalHalfScale() |
|
191 { |
|
192 std::vector<uint8_t> data; |
|
193 data.resize(520 * 500 * 4); |
|
194 |
|
195 uint32_t *pixels = reinterpret_cast<uint32_t*>(&data.front()); |
|
196 for (int y = 0; y < 500; y ++) { |
|
197 for (int x = 0; x < 520; x += 8) { |
|
198 pixels[y * 520 + x] = 0xff00ff00; |
|
199 pixels[y * 520 + x + 1] = 0xff00ffff; |
|
200 pixels[y * 520 + x + 2] = 0xff000000; |
|
201 pixels[y * 520 + x + 3] = 0xff0000ff; |
|
202 pixels[y * 520 + x + 4] = 0xffff00ff; |
|
203 pixels[y * 520 + x + 5] = 0xff0000ff; |
|
204 pixels[y * 520 + x + 6] = 0xffffffff; |
|
205 pixels[y * 520 + x + 7] = 0xff0000ff; |
|
206 } |
|
207 } |
|
208 ImageHalfScaler scaler(&data.front(), 520 * 4, IntSize(520, 500)); |
|
209 |
|
210 scaler.ScaleForSize(IntSize(240, 400)); |
|
211 VERIFY(scaler.GetSize().width == 260); |
|
212 VERIFY(scaler.GetSize().height == 500); |
|
213 |
|
214 pixels = (uint32_t*)scaler.GetScaledData(); |
|
215 |
|
216 for (int y = 0; y < 500; y++) { |
|
217 for (int x = 0; x < 260; x += 4) { |
|
218 VERIFY(pixels[y * (scaler.GetStride() / 4) + x] == 0xff00ff7f); |
|
219 VERIFY(pixels[y * (scaler.GetStride() / 4) + x + 1] == 0xff00007f); |
|
220 VERIFY(pixels[y * (scaler.GetStride() / 4) + x + 2] == 0xff7f00ff); |
|
221 VERIFY(pixels[y * (scaler.GetStride() / 4) + x + 3] == 0xff7f7fff); |
|
222 } |
|
223 } |
|
224 } |
|
225 |
|
226 void |
|
227 TestScaling::MixedHalfScale() |
|
228 { |
|
229 std::vector<uint8_t> data; |
|
230 data.resize(500 * 500 * 4); |
|
231 |
|
232 uint32_t *pixels = reinterpret_cast<uint32_t*>(&data.front()); |
|
233 for (int y = 0; y < 500; y += 2) { |
|
234 for (int x = 0; x < 500; x += 2) { |
|
235 pixels[y * 500 + x] = 0xff00ff00; |
|
236 pixels[y * 500 + x + 1] = 0xff00ffff; |
|
237 pixels[(y + 1) * 500 + x] = 0xff000000; |
|
238 pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; |
|
239 } |
|
240 } |
|
241 ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(500, 500)); |
|
242 |
|
243 scaler.ScaleForSize(IntSize(120, 240)); |
|
244 VERIFY(scaler.GetSize().width == 125); |
|
245 VERIFY(scaler.GetSize().height == 250); |
|
246 scaler.ScaleForSize(IntSize(240, 120)); |
|
247 VERIFY(scaler.GetSize().width == 250); |
|
248 VERIFY(scaler.GetSize().height == 125); |
|
249 } |