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