• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Init()12 bool TestPaintAggregator::Init() {
13   return true;
14 }
15 
RunTests(const std::string & filter)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 
TestInitialState()39 std::string TestPaintAggregator::TestInitialState() {
40   pp::PaintAggregator greg;
41   if (greg.HasPendingUpdate())
42     return "Pending update invalid";
43   PASS();
44 }
45 
TestSingleInvalidation()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 
TestDoubleDisjointInvalidation()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 
TestSingleScroll()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 
TestDoubleOverlappingScroll()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 
TestNegatingScroll()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 
TestDiagonalScroll()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 
TestContainedPaintAfterScroll()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 
TestContainedPaintBeforeScroll()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 
TestContainedPaintsBeforeAndAfterScroll()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 
TestLargeContainedPaintAfterScroll()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 
TestLargeContainedPaintBeforeScroll()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 
TestOverlappingPaintBeforeScroll()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 
TestOverlappingPaintAfterScroll()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 
TestDisjointPaintBeforeScroll()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 
TestDisjointPaintAfterScroll()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 
TestContainedPaintTrimmedByScroll()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 
TestContainedPaintEliminatedByScroll()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
TestContainedPaintAfterScrollTrimmedByScrollDamage()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
TestContainedPaintAfterScrollEliminatedByScrollDamage()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