Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
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/. */
6 #include "TestScaling.h"
8 #include "ImageScaling.h"
10 using namespace mozilla::gfx;
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 }
23 void
24 TestScaling::BasicHalfScale()
25 {
26 std::vector<uint8_t> data;
27 data.resize(500 * 500 * 4);
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));
40 scaler.ScaleForSize(IntSize(220, 240));
42 VERIFY(scaler.GetSize().width == 250);
43 VERIFY(scaler.GetSize().height == 250);
45 pixels = (uint32_t*)scaler.GetScaledData();
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 }
54 void
55 TestScaling::DoubleHalfScale()
56 {
57 std::vector<uint8_t> data;
58 data.resize(500 * 500 * 4);
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));
71 scaler.ScaleForSize(IntSize(120, 110));
72 VERIFY(scaler.GetSize().width == 125);
73 VERIFY(scaler.GetSize().height == 125);
75 pixels = (uint32_t*)scaler.GetScaledData();
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 }
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);
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));
109 scaler.ScaleForSize(IntSize(220, 220));
110 VERIFY(scaler.GetSize().width == 249);
111 VERIFY(scaler.GetSize().height == 249);
113 pixels = (uint32_t*)scaler.GetScaledData();
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 }
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);
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));
146 scaler.ScaleForSize(IntSize(220, 220));
147 VERIFY(scaler.GetSize().width == 249);
148 VERIFY(scaler.GetSize().height == 249);
150 pixels = (uint32_t*)scaler.GetScaledData();
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);
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));
175 scaler.ScaleForSize(IntSize(400, 240));
176 VERIFY(scaler.GetSize().width == 500);
177 VERIFY(scaler.GetSize().height == 250);
179 pixels = (uint32_t*)scaler.GetScaledData();
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 }
189 void
190 TestScaling::HorizontalHalfScale()
191 {
192 std::vector<uint8_t> data;
193 data.resize(520 * 500 * 4);
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));
210 scaler.ScaleForSize(IntSize(240, 400));
211 VERIFY(scaler.GetSize().width == 260);
212 VERIFY(scaler.GetSize().height == 500);
214 pixels = (uint32_t*)scaler.GetScaledData();
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 }
226 void
227 TestScaling::MixedHalfScale()
228 {
229 std::vector<uint8_t> data;
230 data.resize(500 * 500 * 4);
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));
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 }