TestRemoveFrameRectFilter.cpp (13393B)
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 "gtest/gtest.h" 8 9 #include "mozilla/gfx/2D.h" 10 #include "Common.h" 11 #include "Decoder.h" 12 #include "DecoderFactory.h" 13 #include "SourceBuffer.h" 14 #include "SurfaceFilters.h" 15 #include "SurfacePipe.h" 16 17 using namespace mozilla; 18 using namespace mozilla::gfx; 19 using namespace mozilla::image; 20 21 template <typename Func> 22 void WithRemoveFrameRectFilter(const IntSize& aSize, const IntRect& aFrameRect, 23 Func aFunc) { 24 RefPtr<image::Decoder> decoder = CreateTrivialDecoder(); 25 ASSERT_TRUE(decoder != nullptr); 26 27 WithFilterPipeline( 28 decoder, std::forward<Func>(aFunc), RemoveFrameRectConfig{aFrameRect}, 29 SurfaceConfig{decoder, aSize, SurfaceFormat::OS_RGBA, false}); 30 } 31 32 void AssertConfiguringRemoveFrameRectFilterFails(const IntSize& aSize, 33 const IntRect& aFrameRect) { 34 RefPtr<image::Decoder> decoder = CreateTrivialDecoder(); 35 ASSERT_TRUE(decoder != nullptr); 36 37 AssertConfiguringPipelineFails( 38 decoder, RemoveFrameRectConfig{aFrameRect}, 39 SurfaceConfig{decoder, aSize, SurfaceFormat::OS_RGBA, false}); 40 } 41 42 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_0_0_100_100) 43 { 44 WithRemoveFrameRectFilter( 45 IntSize(100, 100), IntRect(0, 0, 100, 100), 46 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 47 CheckWritePixels(aDecoder, aFilter, 48 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 49 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 50 /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 100))); 51 }); 52 } 53 54 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_0_0_0_0) 55 { 56 WithRemoveFrameRectFilter( 57 IntSize(100, 100), IntRect(0, 0, 0, 0), 58 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 59 CheckWritePixels(aDecoder, aFilter, 60 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 61 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 62 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 63 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 64 }); 65 } 66 67 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus50_50_0_0) 68 { 69 WithRemoveFrameRectFilter( 70 IntSize(100, 100), IntRect(-50, 50, 0, 0), 71 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 72 CheckWritePixels(aDecoder, aFilter, 73 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 74 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 75 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 76 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 77 }); 78 } 79 80 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_50_Minus50_0_0) 81 { 82 WithRemoveFrameRectFilter( 83 IntSize(100, 100), IntRect(50, -50, 0, 0), 84 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 85 CheckWritePixels(aDecoder, aFilter, 86 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 87 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 88 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 89 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 90 }); 91 } 92 93 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_150_50_0_0) 94 { 95 WithRemoveFrameRectFilter( 96 IntSize(100, 100), IntRect(150, 50, 0, 0), 97 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 98 CheckWritePixels(aDecoder, aFilter, 99 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 100 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 101 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 102 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 103 }); 104 } 105 106 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_50_150_0_0) 107 { 108 WithRemoveFrameRectFilter( 109 IntSize(100, 100), IntRect(50, 150, 0, 0), 110 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 111 CheckWritePixels(aDecoder, aFilter, 112 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 113 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 114 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 115 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 116 }); 117 } 118 119 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_200_200_100_100) 120 { 121 WithRemoveFrameRectFilter( 122 IntSize(100, 100), IntRect(200, 200, 100, 100), 123 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 124 // Note that aInputRect is zero-size because RemoveFrameRectFilter 125 // ignores trailing rows that don't show up in the output. (Leading rows 126 // unfortunately can't be ignored.) 127 CheckWritePixels(aDecoder, aFilter, 128 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 129 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 130 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 131 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 132 }); 133 } 134 135 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus200_25_100_100) 136 { 137 WithRemoveFrameRectFilter( 138 IntSize(100, 100), IntRect(-200, 25, 100, 100), 139 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 140 // Note that aInputRect is zero-size because RemoveFrameRectFilter 141 // ignores trailing rows that don't show up in the output. (Leading rows 142 // unfortunately can't be ignored.) 143 CheckWritePixels(aDecoder, aFilter, 144 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 145 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 146 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 147 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 148 }); 149 } 150 151 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_25_Minus200_100_100) 152 { 153 WithRemoveFrameRectFilter( 154 IntSize(100, 100), IntRect(25, -200, 100, 100), 155 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 156 // Note that aInputRect is zero-size because RemoveFrameRectFilter 157 // ignores trailing rows that don't show up in the output. (Leading rows 158 // unfortunately can't be ignored.) 159 CheckWritePixels(aDecoder, aFilter, 160 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 161 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 162 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 163 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 164 }); 165 } 166 167 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_200_25_100_100) 168 { 169 WithRemoveFrameRectFilter( 170 IntSize(100, 100), IntRect(200, 25, 100, 100), 171 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 172 // Note that aInputRect is zero-size because RemoveFrameRectFilter 173 // ignores trailing rows that don't show up in the output. (Leading rows 174 // unfortunately can't be ignored.) 175 CheckWritePixels(aDecoder, aFilter, 176 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 177 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 178 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 179 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 180 }); 181 } 182 183 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_25_200_100_100) 184 { 185 WithRemoveFrameRectFilter( 186 IntSize(100, 100), IntRect(25, 200, 100, 100), 187 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 188 // Note that aInputRect is zero-size because RemoveFrameRectFilter 189 // ignores trailing rows that don't show up in the output. (Leading rows 190 // unfortunately can't be ignored.) 191 CheckWritePixels(aDecoder, aFilter, 192 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 193 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 194 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 195 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 196 }); 197 } 198 199 TEST(ImageRemoveFrameRectFilter, 200 WritePixels100_100_to_Minus200_Minus200_100_100) 201 { 202 WithRemoveFrameRectFilter( 203 IntSize(100, 100), IntRect(-200, -200, 100, 100), 204 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 205 CheckWritePixels(aDecoder, aFilter, 206 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 207 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 208 /* aInputWriteRect = */ Some(IntRect(0, 0, 0, 0)), 209 /* aOutputWriteRect = */ Some(IntRect(0, 0, 0, 0))); 210 }); 211 } 212 213 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus50_Minus50_100_100) 214 { 215 WithRemoveFrameRectFilter( 216 IntSize(100, 100), IntRect(-50, -50, 100, 100), 217 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 218 CheckWritePixels(aDecoder, aFilter, 219 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 220 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 221 /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 100)), 222 /* aOutputWriteRect = */ Some(IntRect(0, 0, 50, 50))); 223 }); 224 } 225 226 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_Minus50_25_100_50) 227 { 228 WithRemoveFrameRectFilter( 229 IntSize(100, 100), IntRect(-50, 25, 100, 50), 230 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 231 CheckWritePixels(aDecoder, aFilter, 232 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 233 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 234 /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 50)), 235 /* aOutputWriteRect = */ Some(IntRect(0, 25, 50, 50))); 236 }); 237 } 238 239 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_25_Minus50_50_100) 240 { 241 WithRemoveFrameRectFilter( 242 IntSize(100, 100), IntRect(25, -50, 50, 100), 243 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 244 CheckWritePixels(aDecoder, aFilter, 245 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 246 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 247 /* aInputWriteRect = */ Some(IntRect(0, 0, 50, 100)), 248 /* aOutputWriteRect = */ Some(IntRect(25, 0, 50, 50))); 249 }); 250 } 251 252 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_50_25_100_50) 253 { 254 WithRemoveFrameRectFilter( 255 IntSize(100, 100), IntRect(50, 25, 100, 50), 256 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 257 CheckWritePixels( 258 aDecoder, aFilter, 259 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 260 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 261 /* aInputWriteRect = */ Some(IntRect(0, 0, 100, 50)), 262 /* aOutputWriteRect = */ Some(IntRect(50, 25, 50, 50))); 263 }); 264 } 265 266 TEST(ImageRemoveFrameRectFilter, WritePixels100_100_to_25_50_50_100) 267 { 268 WithRemoveFrameRectFilter( 269 IntSize(100, 100), IntRect(25, 50, 50, 100), 270 [](image::Decoder* aDecoder, SurfaceFilter* aFilter) { 271 // Note that aInputRect is 50x50 because RemoveFrameRectFilter ignores 272 // trailing rows that don't show up in the output. (Leading rows 273 // unfortunately can't be ignored.) 274 CheckWritePixels( 275 aDecoder, aFilter, 276 /* aOutputRect = */ Some(IntRect(0, 0, 100, 100)), 277 /* aInputRect = */ Some(IntRect(0, 0, 100, 100)), 278 /* aInputWriteRect = */ Some(IntRect(0, 0, 50, 50)), 279 /* aOutputWriteRect = */ Some(IntRect(25, 50, 50, 100))); 280 }); 281 } 282 283 TEST(ImageRemoveFrameRectFilter, RemoveFrameRectFailsFor0_0_to_0_0_100_100) 284 { 285 // A zero-size image is disallowed. 286 AssertConfiguringRemoveFrameRectFilterFails(IntSize(0, 0), 287 IntRect(0, 0, 100, 100)); 288 } 289 290 TEST(ImageRemoveFrameRectFilter, 291 RemoveFrameRectFailsForMinus1_Minus1_to_0_0_100_100) 292 { 293 // A negative-size image is disallowed. 294 AssertConfiguringRemoveFrameRectFilterFails(IntSize(-1, -1), 295 IntRect(0, 0, 100, 100)); 296 } 297 298 TEST(ImageRemoveFrameRectFilter, RemoveFrameRectFailsFor100_100_to_0_0_0_0) 299 { 300 // A zero size frame rect is disallowed. 301 AssertConfiguringRemoveFrameRectFilterFails(IntSize(100, 100), 302 IntRect(0, 0, -1, -1)); 303 } 304 305 TEST(ImageRemoveFrameRectFilter, 306 RemoveFrameRectFailsFor100_100_to_0_0_Minus1_Minus1) 307 { 308 // A negative size frame rect is disallowed. 309 AssertConfiguringRemoveFrameRectFilterFails(IntSize(100, 100), 310 IntRect(0, 0, -1, -1)); 311 }