1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 "ppapi/tests/test_paint_aggregator.h" 6 7 #include "ppapi/tests/testing_instance.h" 8 #include "ppapi/utility/graphics/paint_aggregator.h" 9 10 REGISTER_TEST_CASE(PaintAggregator); 11 12 bool TestPaintAggregator::Init() { 13 return true; 14 } 15 16 void TestPaintAggregator::RunTests(const std::string& filter) { 17 RUN_TEST(InitialState, filter); 18 RUN_TEST(SingleInvalidation, filter); 19 RUN_TEST(DoubleDisjointInvalidation, filter); 20 RUN_TEST(SingleScroll, filter); 21 RUN_TEST(DoubleOverlappingScroll, filter); 22 RUN_TEST(NegatingScroll, filter); 23 RUN_TEST(DiagonalScroll, filter); 24 RUN_TEST(ContainedPaintAfterScroll, filter); 25 RUN_TEST(ContainedPaintBeforeScroll, filter); 26 RUN_TEST(ContainedPaintsBeforeAndAfterScroll, filter); 27 RUN_TEST(LargeContainedPaintAfterScroll, filter); 28 RUN_TEST(LargeContainedPaintBeforeScroll, filter); 29 RUN_TEST(OverlappingPaintBeforeScroll, filter); 30 RUN_TEST(OverlappingPaintAfterScroll, filter); 31 RUN_TEST(DisjointPaintBeforeScroll, filter); 32 RUN_TEST(DisjointPaintAfterScroll, filter); 33 RUN_TEST(ContainedPaintTrimmedByScroll, filter); 34 RUN_TEST(ContainedPaintEliminatedByScroll, filter); 35 RUN_TEST(ContainedPaintAfterScrollTrimmedByScrollDamage, filter); 36 RUN_TEST(ContainedPaintAfterScrollEliminatedByScrollDamage, filter); 37 } 38 39 std::string TestPaintAggregator::TestInitialState() { 40 pp::PaintAggregator greg; 41 if (greg.HasPendingUpdate()) 42 return "Pending update invalid"; 43 PASS(); 44 } 45 46 std::string TestPaintAggregator::TestSingleInvalidation() { 47 pp::PaintAggregator greg; 48 49 pp::Rect rect(2, 4, 10, 16); 50 greg.InvalidateRect(rect); 51 52 ASSERT_TRUE(greg.HasPendingUpdate()); 53 ASSERT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 54 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 55 56 ASSERT_TRUE(rect == greg.GetPendingUpdate().paint_rects[0]); 57 58 PASS(); 59 } 60 61 std::string TestPaintAggregator::TestDoubleDisjointInvalidation() { 62 pp::PaintAggregator greg; 63 64 pp::Rect r1(2, 4, 2, 4); 65 pp::Rect r2(4, 2, 4, 2); 66 67 greg.InvalidateRect(r1); 68 greg.InvalidateRect(r2); 69 70 pp::Rect expected_bounds = r1.Union(r2); 71 72 ASSERT_TRUE(greg.HasPendingUpdate()); 73 ASSERT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 74 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 75 76 ASSERT_TRUE(expected_bounds == greg.GetPendingUpdate().paint_bounds); 77 PASS(); 78 } 79 80 std::string TestPaintAggregator::TestSingleScroll() { 81 pp::PaintAggregator greg; 82 83 pp::Rect r1(2, 4, 2, 4); 84 pp::Rect r2(4, 2, 4, 2); 85 86 greg.InvalidateRect(r1); 87 greg.InvalidateRect(r2); 88 89 pp::Rect expected_bounds = r1.Union(r2); 90 91 ASSERT_TRUE(greg.HasPendingUpdate()); 92 ASSERT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 93 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 94 95 ASSERT_TRUE(expected_bounds == greg.GetPendingUpdate().paint_bounds); 96 PASS(); 97 } 98 99 std::string TestPaintAggregator::TestDoubleOverlappingScroll() { 100 pp::PaintAggregator greg; 101 102 pp::Rect rect(1, 2, 3, 4); 103 pp::Point delta1(1, 0); 104 pp::Point delta2(1, 0); 105 greg.ScrollRect(rect, delta1); 106 greg.ScrollRect(rect, delta2); 107 108 ASSERT_TRUE(greg.HasPendingUpdate()); 109 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 110 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 111 112 ASSERT_TRUE(rect == greg.GetPendingUpdate().scroll_rect); 113 114 pp::Point expected_delta(delta1.x() + delta2.x(), 115 delta1.y() + delta2.y()); 116 ASSERT_TRUE(expected_delta.x() == greg.GetPendingUpdate().scroll_delta.x()); 117 ASSERT_TRUE(expected_delta.y() == greg.GetPendingUpdate().scroll_delta.y()); 118 119 pp::Rect resulting_damage = greg.GetPendingUpdate().paint_rects[0]; 120 pp::Rect expected_damage(1, 2, 2, 4); 121 ASSERT_TRUE(expected_damage == resulting_damage); 122 PASS(); 123 } 124 125 std::string TestPaintAggregator::TestNegatingScroll() { 126 pp::PaintAggregator greg; 127 128 // Scroll twice in opposite directions by equal amounts. The result 129 // should be no scrolling. 130 131 pp::Rect rect(1, 2, 3, 4); 132 pp::Point delta1(1, 0); 133 pp::Point delta2(-1, 0); 134 greg.ScrollRect(rect, delta1); 135 greg.ScrollRect(rect, delta2); 136 137 ASSERT_FALSE(greg.HasPendingUpdate()); 138 PASS(); 139 } 140 141 std::string TestPaintAggregator::TestDiagonalScroll() { 142 pp::PaintAggregator greg; 143 144 // We don't support optimized diagonal scrolling, so this should result in 145 // repainting. 146 147 pp::Rect rect(1, 2, 3, 4); 148 pp::Point delta(1, 1); 149 greg.ScrollRect(rect, delta); 150 151 ASSERT_TRUE(greg.HasPendingUpdate()); 152 ASSERT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 153 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 154 155 ASSERT_TRUE(rect == greg.GetPendingUpdate().paint_rects[0]); 156 PASS(); 157 } 158 159 std::string TestPaintAggregator::TestContainedPaintAfterScroll() { 160 pp::PaintAggregator greg; 161 162 pp::Rect scroll_rect(0, 0, 10, 10); 163 greg.ScrollRect(scroll_rect, pp::Point(2, 0)); 164 165 pp::Rect paint_rect(4, 4, 2, 2); 166 greg.InvalidateRect(paint_rect); 167 168 ASSERT_TRUE(greg.HasPendingUpdate()); 169 170 // Expecting a paint rect inside the scroll rect. The last paint rect is the 171 // scroll dirty rect. 172 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 173 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 174 175 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 176 ASSERT_TRUE(paint_rect == greg.GetPendingUpdate().paint_rects[0]); 177 PASS(); 178 } 179 180 std::string TestPaintAggregator::TestContainedPaintBeforeScroll() { 181 pp::PaintAggregator greg; 182 183 pp::Rect paint_rect(4, 4, 2, 2); 184 greg.InvalidateRect(paint_rect); 185 186 pp::Rect scroll_rect(0, 0, 10, 10); 187 greg.ScrollRect(scroll_rect, pp::Point(2, 0)); 188 189 ASSERT_TRUE(greg.HasPendingUpdate()); 190 191 // Expecting a paint rect inside the scroll rect. The last paint rect is the 192 // scroll dirty rect. 193 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 194 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 195 196 paint_rect.Offset(2, 0); 197 198 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 199 ASSERT_TRUE(paint_rect == greg.GetPendingUpdate().paint_rects[0]); 200 PASS(); 201 } 202 203 std::string TestPaintAggregator::TestContainedPaintsBeforeAndAfterScroll() { 204 pp::PaintAggregator greg; 205 206 pp::Rect paint_rect1(4, 4, 2, 2); 207 greg.InvalidateRect(paint_rect1); 208 209 pp::Rect scroll_rect(0, 0, 10, 10); 210 greg.ScrollRect(scroll_rect, pp::Point(2, 0)); 211 212 pp::Rect paint_rect2(6, 4, 2, 2); 213 greg.InvalidateRect(paint_rect2); 214 215 pp::Rect expected_paint_rect = paint_rect2; 216 217 ASSERT_TRUE(greg.HasPendingUpdate()); 218 219 // Expecting a paint rect inside the scroll rect 220 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 221 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 222 223 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 224 ASSERT_TRUE(expected_paint_rect == greg.GetPendingUpdate().paint_rects[0]); 225 PASS(); 226 } 227 228 std::string TestPaintAggregator::TestLargeContainedPaintAfterScroll() { 229 pp::PaintAggregator greg; 230 231 pp::Rect scroll_rect(0, 0, 10, 10); 232 greg.ScrollRect(scroll_rect, pp::Point(0, 1)); 233 234 pp::Rect paint_rect(0, 0, 10, 9); // Repaint 90% 235 greg.InvalidateRect(paint_rect); 236 237 ASSERT_TRUE(greg.HasPendingUpdate()); 238 239 ASSERT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 240 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 241 242 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().paint_rects[0]); 243 PASS(); 244 } 245 246 std::string TestPaintAggregator::TestLargeContainedPaintBeforeScroll() { 247 pp::PaintAggregator greg; 248 249 pp::Rect paint_rect(0, 0, 10, 9); // Repaint 90% 250 greg.InvalidateRect(paint_rect); 251 252 pp::Rect scroll_rect(0, 0, 10, 10); 253 greg.ScrollRect(scroll_rect, pp::Point(0, 1)); 254 255 ASSERT_TRUE(greg.HasPendingUpdate()); 256 257 ASSERT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 258 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 259 260 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().paint_rects[0]); 261 PASS(); 262 } 263 264 std::string TestPaintAggregator::TestOverlappingPaintBeforeScroll() { 265 pp::PaintAggregator greg; 266 267 pp::Rect paint_rect(4, 4, 10, 2); 268 greg.InvalidateRect(paint_rect); 269 270 pp::Rect scroll_rect(0, 0, 10, 10); 271 greg.ScrollRect(scroll_rect, pp::Point(2, 0)); 272 273 pp::Rect expected_paint_rect = scroll_rect.Union(paint_rect); 274 275 ASSERT_TRUE(greg.HasPendingUpdate()); 276 277 ASSERT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 278 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 279 280 ASSERT_TRUE(expected_paint_rect == greg.GetPendingUpdate().paint_rects[0]); 281 PASS(); 282 } 283 284 std::string TestPaintAggregator::TestOverlappingPaintAfterScroll() { 285 pp::PaintAggregator greg; 286 287 pp::Rect scroll_rect(0, 0, 10, 10); 288 greg.ScrollRect(scroll_rect, pp::Point(2, 0)); 289 290 pp::Rect paint_rect(4, 4, 10, 2); 291 greg.InvalidateRect(paint_rect); 292 293 pp::Rect expected_paint_rect = scroll_rect.Union(paint_rect); 294 295 ASSERT_TRUE(greg.HasPendingUpdate()); 296 297 ASSERT_TRUE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 298 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 299 300 ASSERT_TRUE(expected_paint_rect == greg.GetPendingUpdate().paint_rects[0]); 301 PASS(); 302 } 303 304 std::string TestPaintAggregator::TestDisjointPaintBeforeScroll() { 305 pp::PaintAggregator greg; 306 307 pp::Rect paint_rect(4, 4, 10, 2); 308 greg.InvalidateRect(paint_rect); 309 310 pp::Rect scroll_rect(0, 0, 2, 10); 311 greg.ScrollRect(scroll_rect, pp::Point(2, 0)); 312 313 ASSERT_TRUE(greg.HasPendingUpdate()); 314 315 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 316 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 317 318 ASSERT_TRUE(paint_rect == greg.GetPendingUpdate().paint_rects[0]); 319 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 320 PASS(); 321 } 322 323 std::string TestPaintAggregator::TestDisjointPaintAfterScroll() { 324 pp::PaintAggregator greg; 325 326 pp::Rect scroll_rect(0, 0, 2, 10); 327 greg.ScrollRect(scroll_rect, pp::Point(2, 0)); 328 329 pp::Rect paint_rect(4, 4, 10, 2); 330 greg.InvalidateRect(paint_rect); 331 332 ASSERT_TRUE(greg.HasPendingUpdate()); 333 334 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 335 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 336 337 ASSERT_TRUE(paint_rect == greg.GetPendingUpdate().paint_rects[0]); 338 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 339 PASS(); 340 } 341 342 std::string TestPaintAggregator::TestContainedPaintTrimmedByScroll() { 343 pp::PaintAggregator greg; 344 345 pp::Rect paint_rect(4, 4, 6, 6); 346 greg.InvalidateRect(paint_rect); 347 348 pp::Rect scroll_rect(0, 0, 10, 10); 349 greg.ScrollRect(scroll_rect, pp::Point(2, 0)); 350 351 // The paint rect should have become narrower. 352 pp::Rect expected_paint_rect(6, 4, 4, 6); 353 354 ASSERT_TRUE(greg.HasPendingUpdate()); 355 356 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 357 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 358 359 ASSERT_TRUE(expected_paint_rect == greg.GetPendingUpdate().paint_rects[0]); 360 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 361 PASS(); 362 } 363 364 std::string TestPaintAggregator::TestContainedPaintEliminatedByScroll() { 365 pp::PaintAggregator greg; 366 367 pp::Rect paint_rect(4, 4, 6, 6); 368 greg.InvalidateRect(paint_rect); 369 370 pp::Rect scroll_rect(0, 0, 10, 10); 371 greg.ScrollRect(scroll_rect, pp::Point(6, 0)); 372 373 ASSERT_TRUE(greg.HasPendingUpdate()); 374 375 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 376 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 377 378 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 379 PASS(); 380 } 381 382 std::string 383 TestPaintAggregator::TestContainedPaintAfterScrollTrimmedByScrollDamage() { 384 pp::PaintAggregator greg; 385 386 pp::Rect scroll_rect(0, 0, 10, 10); 387 greg.ScrollRect(scroll_rect, pp::Point(4, 0)); 388 389 pp::Rect paint_rect(2, 0, 4, 10); 390 greg.InvalidateRect(paint_rect); 391 392 pp::Rect expected_scroll_damage(0, 0, 4, 10); 393 pp::Rect expected_paint_rect(4, 0, 2, 10); 394 395 ASSERT_TRUE(greg.HasPendingUpdate()); 396 397 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 398 ASSERT_TRUE(2U == greg.GetPendingUpdate().paint_rects.size()); 399 400 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 401 ASSERT_TRUE(expected_scroll_damage == greg.GetPendingUpdate().paint_rects[1]); 402 ASSERT_TRUE(expected_paint_rect == greg.GetPendingUpdate().paint_rects[0]); 403 PASS(); 404 } 405 406 std::string 407 TestPaintAggregator::TestContainedPaintAfterScrollEliminatedByScrollDamage() { 408 pp::PaintAggregator greg; 409 410 pp::Rect scroll_rect(0, 0, 10, 10); 411 greg.ScrollRect(scroll_rect, pp::Point(4, 0)); 412 413 pp::Rect paint_rect(2, 0, 2, 10); 414 greg.InvalidateRect(paint_rect); 415 416 pp::Rect expected_scroll_damage(0, 0, 4, 10); 417 418 ASSERT_TRUE(greg.HasPendingUpdate()); 419 420 ASSERT_FALSE(greg.GetPendingUpdate().scroll_rect.IsEmpty()); 421 ASSERT_TRUE(1U == greg.GetPendingUpdate().paint_rects.size()); 422 423 ASSERT_TRUE(scroll_rect == greg.GetPendingUpdate().scroll_rect); 424 ASSERT_TRUE(expected_scroll_damage == greg.GetPendingUpdate().paint_rects[0]); 425 PASS(); 426 } 427