Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: remoting/host/differ_unittest.cc

Issue 7491070: Switch over to using SkRegions to calculate dirty areas. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: clean up comments Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/memory/scoped_ptr.h" 5 #include "base/memory/scoped_ptr.h"
6 #include "remoting/host/differ.h" 6 #include "remoting/host/differ.h"
7 #include "remoting/host/differ_block.h" 7 #include "remoting/host/differ_block.h"
8 #include "testing/gmock/include/gmock/gmock.h" 8 #include "testing/gmock/include/gmock/gmock.h"
9 9
10 namespace remoting { 10 namespace remoting {
(...skipping 26 matching lines...) Expand all
37 memset(prev_.get(), 0, buffer_size_); 37 memset(prev_.get(), 0, buffer_size_);
38 38
39 curr_.reset(new uint8[buffer_size_]); 39 curr_.reset(new uint8[buffer_size_]);
40 memset(curr_.get(), 0, buffer_size_); 40 memset(curr_.get(), 0, buffer_size_);
41 } 41 }
42 42
43 void ClearBuffer(uint8* buffer) { 43 void ClearBuffer(uint8* buffer) {
44 memset(buffer, 0, buffer_size_); 44 memset(buffer, 0, buffer_size_);
45 } 45 }
46 46
47 // Here in DifferTest so that tests can access private methods of Differ.
48 void MarkDirtyBlocks(const void* prev_buffer, const void* curr_buffer) {
49 differ_->MarkDirtyBlocks(prev_buffer, curr_buffer);
50 }
51
52 void MergeBlocks(SkRegion* dirty) {
53 differ_->MergeBlocks(dirty);
54 }
55
56 // Convenience method to count rectangles in a region.
57 int RegionRectCount(const SkRegion& region) {
Wez 2011/08/08 20:49:34 SkRegion really doesn't have a method to query the
dmac 2011/08/10 20:30:36 Nope
58 int count = 0;
59 for(SkRegion::Iterator iter(region); !iter.done(); iter.next()) {
60 ++count;
61 }
62 return count;
63 }
64
47 // Convenience wrapper for Differ's DiffBlock that calculates the appropriate 65 // Convenience wrapper for Differ's DiffBlock that calculates the appropriate
48 // offset to the start of the desired block. 66 // offset to the start of the desired block.
49 DiffInfo DiffBlock(int block_x, int block_y) { 67 DiffInfo DiffBlock(int block_x, int block_y) {
50 // Offset from upper-left of buffer to upper-left of requested block. 68 // Offset from upper-left of buffer to upper-left of requested block.
51 int block_offset = ((block_y * stride_) + (block_x * bytes_per_pixel_)) 69 int block_offset = ((block_y * stride_) + (block_x * bytes_per_pixel_))
52 * kBlockSize; 70 * kBlockSize;
53 return BlockDifference(prev_.get() + block_offset, 71 return BlockDifference(prev_.get() + block_offset,
54 curr_.get() + block_offset, 72 curr_.get() + block_offset,
55 stride_); 73 stride_);
56 } 74 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 134
117 // Mark the range of blocks specified. 135 // Mark the range of blocks specified.
118 void MarkBlocks(int x_origin, int y_origin, int width, int height) { 136 void MarkBlocks(int x_origin, int y_origin, int width, int height) {
119 for (int y = 0; y < height; y++) { 137 for (int y = 0; y < height; y++) {
120 for (int x = 0; x < width; x++) { 138 for (int x = 0; x < width; x++) {
121 SetDiffInfo(x_origin + x, y_origin + y, 1); 139 SetDiffInfo(x_origin + x, y_origin + y, 1);
122 } 140 }
123 } 141 }
124 } 142 }
125 143
126 // Verify that the given dirty rect matches the expected |x|, |y|, |width| 144 // Verify that the given dirty region matches the expected |x|, |y|, |width|
127 // and |height|. 145 // and |height|.
128 // |x|, |y|, |width| and |height| are specified in block (not pixel) units. 146 // |x|, |y|, |width| and |height| are specified in block (not pixel) units.
Wez 2011/08/08 20:49:34 Update this comment, and the method name, to refle
dmac 2011/08/10 20:30:36 It is used in different ways below, but I did upda
129 void CheckDirtyRect(const InvalidRects& rects, int x, int y, 147 bool CheckDirtyRegion(const SkRegion& region, int x, int y,
130 int width, int height) { 148 int width, int height) {
131 gfx::Rect r(x * kBlockSize, y * kBlockSize, 149 SkIRect r = SkIRect::MakeXYWH(x * kBlockSize, y * kBlockSize,
132 width * kBlockSize, height * kBlockSize); 150 width * kBlockSize, height * kBlockSize);
133 EXPECT_TRUE(rects.find(r) != rects.end()); 151 bool found = false;
152 for (SkRegion::Iterator i(region); !found && !i.done(); i.next()) {
153 found = (i.rect() == r);
154 }
155 return found;
134 } 156 }
135 157
136 // Mark the range of blocks specified and then verify that they are 158 // Mark the range of blocks specified and then verify that they are
137 // merged correctly. 159 // merged correctly.
138 // Only one rectangular region of blocks can be checked with this routine. 160 // Only one rectangular region of blocks can be checked with this routine.
139 void MarkBlocksAndCheckMerge(int x_origin, int y_origin, 161 bool MarkBlocksAndCheckMerge(int x_origin, int y_origin,
140 int width, int height) { 162 int width, int height) {
141 ClearDiffInfo(); 163 ClearDiffInfo();
142 MarkBlocks(x_origin, y_origin, width, height); 164 MarkBlocks(x_origin, y_origin, width, height);
143 165
144 scoped_ptr<InvalidRects> dirty(new InvalidRects()); 166 SkRegion dirty;
145 differ_->MergeBlocks(dirty.get()); 167 MergeBlocks(&dirty);
146 168
147 ASSERT_EQ(1UL, dirty->size()); 169 bool is_good = RegionRectCount(dirty) == 1;
Wez 2011/08/08 20:49:34 Simpler to use isComplex() and get rid of RegionRe
dmac 2011/08/10 20:30:36 RegionRectCount is used elsewhere, but I did get r
148 CheckDirtyRect(*dirty.get(), x_origin, y_origin, width, height); 170 if (is_good) {
171 is_good = CheckDirtyRegion(dirty, x_origin, y_origin, width, height);
172 }
173 return is_good;
149 } 174 }
150 175
151 // The differ class we're testing. 176 // The differ class we're testing.
152 scoped_ptr<Differ> differ_; 177 scoped_ptr<Differ> differ_;
153 178
154 // Screen/buffer info. 179 // Screen/buffer info.
155 int width_; 180 int width_;
156 int height_; 181 int height_;
157 int bytes_per_pixel_; 182 int bytes_per_pixel_;
158 int stride_; 183 int stride_;
(...skipping 30 matching lines...) Expand all
189 InitDiffer(kScreenWidth, kScreenHeight); 214 InitDiffer(kScreenWidth, kScreenHeight);
190 ClearDiffInfo(); 215 ClearDiffInfo();
191 216
192 // Update a pixel in each block. 217 // Update a pixel in each block.
193 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { 218 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
194 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { 219 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
195 WriteBlockPixel(curr_.get(), x, y, 10, 10, 0xff00ff); 220 WriteBlockPixel(curr_.get(), x, y, 10, 10, 0xff00ff);
196 } 221 }
197 } 222 }
198 223
199 differ_->MarkDirtyBlocks(prev_.get(), curr_.get()); 224 MarkDirtyBlocks(prev_.get(), curr_.get());
200 225
201 // Make sure each block is marked as dirty. 226 // Make sure each block is marked as dirty.
202 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { 227 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
203 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { 228 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
204 EXPECT_EQ(1, GetDiffInfo(x, y)) 229 EXPECT_EQ(1, GetDiffInfo(x, y))
205 << "when x = " << x << ", and y = " << y; 230 << "when x = " << x << ", and y = " << y;
206 } 231 }
207 } 232 }
208 } 233 }
209 234
210 TEST_F(DifferTest, MarkDirtyBlocks_Sampling) { 235 TEST_F(DifferTest, MarkDirtyBlocks_Sampling) {
211 InitDiffer(kScreenWidth, kScreenHeight); 236 InitDiffer(kScreenWidth, kScreenHeight);
212 ClearDiffInfo(); 237 ClearDiffInfo();
213 238
214 // Update some pixels in image. 239 // Update some pixels in image.
215 WriteBlockPixel(curr_.get(), 1, 0, 10, 10, 0xff00ff); 240 WriteBlockPixel(curr_.get(), 1, 0, 10, 10, 0xff00ff);
216 WriteBlockPixel(curr_.get(), 2, 1, 10, 10, 0xff00ff); 241 WriteBlockPixel(curr_.get(), 2, 1, 10, 10, 0xff00ff);
217 WriteBlockPixel(curr_.get(), 0, 2, 10, 10, 0xff00ff); 242 WriteBlockPixel(curr_.get(), 0, 2, 10, 10, 0xff00ff);
218 243
219 differ_->MarkDirtyBlocks(prev_.get(), curr_.get()); 244 MarkDirtyBlocks(prev_.get(), curr_.get());
220 245
221 // Make sure corresponding blocks are updated. 246 // Make sure corresponding blocks are updated.
222 EXPECT_EQ(0, GetDiffInfo(0, 0)); 247 EXPECT_EQ(0, GetDiffInfo(0, 0));
223 EXPECT_EQ(0, GetDiffInfo(0, 1)); 248 EXPECT_EQ(0, GetDiffInfo(0, 1));
224 EXPECT_EQ(1, GetDiffInfo(0, 2)); 249 EXPECT_EQ(1, GetDiffInfo(0, 2));
225 EXPECT_EQ(1, GetDiffInfo(1, 0)); 250 EXPECT_EQ(1, GetDiffInfo(1, 0));
226 EXPECT_EQ(0, GetDiffInfo(1, 1)); 251 EXPECT_EQ(0, GetDiffInfo(1, 1));
227 EXPECT_EQ(0, GetDiffInfo(1, 2)); 252 EXPECT_EQ(0, GetDiffInfo(1, 2));
228 EXPECT_EQ(0, GetDiffInfo(2, 0)); 253 EXPECT_EQ(0, GetDiffInfo(2, 0));
229 EXPECT_EQ(1, GetDiffInfo(2, 1)); 254 EXPECT_EQ(1, GetDiffInfo(2, 1));
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 InitDiffer(kPartialScreenWidth, kPartialScreenHeight); 302 InitDiffer(kPartialScreenWidth, kPartialScreenHeight);
278 ClearDiffInfo(); 303 ClearDiffInfo();
279 304
280 // Update the first pixel in each block. 305 // Update the first pixel in each block.
281 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { 306 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
282 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { 307 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
283 WriteBlockPixel(curr_.get(), x, y, 0, 0, 0xff00ff); 308 WriteBlockPixel(curr_.get(), x, y, 0, 0, 0xff00ff);
284 } 309 }
285 } 310 }
286 311
287 differ_->MarkDirtyBlocks(prev_.get(), curr_.get()); 312 MarkDirtyBlocks(prev_.get(), curr_.get());
288 313
289 // Make sure each block is marked as dirty. 314 // Make sure each block is marked as dirty.
290 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { 315 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
291 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { 316 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
292 EXPECT_EQ(1, GetDiffInfo(x, y)) 317 EXPECT_EQ(1, GetDiffInfo(x, y))
293 << "when x = " << x << ", and y = " << y; 318 << "when x = " << x << ", and y = " << y;
294 } 319 }
295 } 320 }
296 } 321 }
297 322
298 TEST_F(DifferTest, Partial_BorderPixel) { 323 TEST_F(DifferTest, Partial_BorderPixel) {
299 InitDiffer(kPartialScreenWidth, kPartialScreenHeight); 324 InitDiffer(kPartialScreenWidth, kPartialScreenHeight);
300 ClearDiffInfo(); 325 ClearDiffInfo();
301 326
302 // Update the right/bottom border pixels. 327 // Update the right/bottom border pixels.
303 for (int y = 0; y < height_; y++) { 328 for (int y = 0; y < height_; y++) {
304 WritePixel(curr_.get(), width_ - 1, y, 0xff00ff); 329 WritePixel(curr_.get(), width_ - 1, y, 0xff00ff);
305 } 330 }
306 for (int x = 0; x < width_; x++) { 331 for (int x = 0; x < width_; x++) {
307 WritePixel(curr_.get(), x, height_ - 1, 0xff00ff); 332 WritePixel(curr_.get(), x, height_ - 1, 0xff00ff);
308 } 333 }
309 334
310 differ_->MarkDirtyBlocks(prev_.get(), curr_.get()); 335 MarkDirtyBlocks(prev_.get(), curr_.get());
311 336
312 // Make sure last (partial) block in each row/column is marked as dirty. 337 // Make sure last (partial) block in each row/column is marked as dirty.
313 int x_last = GetDiffInfoWidth() - 2; 338 int x_last = GetDiffInfoWidth() - 2;
314 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { 339 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
315 EXPECT_EQ(1, GetDiffInfo(x_last, y)) 340 EXPECT_EQ(1, GetDiffInfo(x_last, y))
316 << "when x = " << x_last << ", and y = " << y; 341 << "when x = " << x_last << ", and y = " << y;
317 } 342 }
318 int y_last = GetDiffInfoHeight() - 2; 343 int y_last = GetDiffInfoHeight() - 2;
319 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { 344 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
320 EXPECT_EQ(1, GetDiffInfo(x, y_last)) 345 EXPECT_EQ(1, GetDiffInfo(x, y_last))
(...skipping 15 matching lines...) Expand all
336 // | | | | _ | 361 // | | | | _ |
337 // +---+---+---+---+ 362 // +---+---+---+---+
338 // | | | | _ | 363 // | | | | _ |
339 // +---+---+---+---+ 364 // +---+---+---+---+
340 // | | | | _ | 365 // | | | | _ |
341 // +---+---+---+---+ 366 // +---+---+---+---+
342 // | _ | _ | _ | _ | 367 // | _ | _ | _ | _ |
343 // +---+---+---+---+ 368 // +---+---+---+---+
344 ClearDiffInfo(); 369 ClearDiffInfo();
345 370
346 scoped_ptr<InvalidRects> dirty(new InvalidRects()); 371 SkRegion dirty;
347 differ_->MergeBlocks(dirty.get()); 372 MergeBlocks(&dirty);
348 373
349 EXPECT_EQ(0UL, dirty->size()); 374 EXPECT_EQ(0, RegionRectCount(dirty));
Wez 2011/08/08 20:49:34 EXPECT_TRUE(dirty.isEmpty());
dmac 2011/08/10 20:30:36 Done.
350 } 375 }
351 376
352 TEST_F(DifferTest, MergeBlocks_SingleBlock) { 377 TEST_F(DifferTest, MergeBlocks_SingleBlock) {
353 InitDiffer(kScreenWidth, kScreenHeight); 378 InitDiffer(kScreenWidth, kScreenHeight);
354 // Mark a single block and make sure that there is a single merged 379 // Mark a single block and make sure that there is a single merged
355 // rect with the correct bounds. 380 // rect with the correct bounds.
356 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { 381 for (int y = 0; y < GetDiffInfoHeight() - 1; y++) {
357 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { 382 for (int x = 0; x < GetDiffInfoWidth() - 1; x++) {
358 MarkBlocksAndCheckMerge(x, y, 1, 1); 383 ASSERT_TRUE(MarkBlocksAndCheckMerge(x, y, 1, 1)) << "x: " << x
384 << "y: " << y;
359 } 385 }
360 } 386 }
361 } 387 }
362 388
363 TEST_F(DifferTest, MergeBlocks_BlockRow) { 389 TEST_F(DifferTest, MergeBlocks_BlockRow) {
364 InitDiffer(kScreenWidth, kScreenHeight); 390 InitDiffer(kScreenWidth, kScreenHeight);
365 391
366 // +---+---+---+---+ 392 // +---+---+---+---+
367 // | X | X | | _ | 393 // | X | X | | _ |
368 // +---+---+---+---+ 394 // +---+---+---+---+
369 // | | | | _ | 395 // | | | | _ |
370 // +---+---+---+---+ 396 // +---+---+---+---+
371 // | | | | _ | 397 // | | | | _ |
372 // +---+---+---+---+ 398 // +---+---+---+---+
373 // | _ | _ | _ | _ | 399 // | _ | _ | _ | _ |
374 // +---+---+---+---+ 400 // +---+---+---+---+
375 MarkBlocksAndCheckMerge(0, 0, 2, 1); 401 ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 0, 2, 1));
376 402
377 // +---+---+---+---+ 403 // +---+---+---+---+
378 // | | | | _ | 404 // | | | | _ |
379 // +---+---+---+---+ 405 // +---+---+---+---+
380 // | X | X | X | _ | 406 // | X | X | X | _ |
381 // +---+---+---+---+ 407 // +---+---+---+---+
382 // | | | | _ | 408 // | | | | _ |
383 // +---+---+---+---+ 409 // +---+---+---+---+
384 // | _ | _ | _ | _ | 410 // | _ | _ | _ | _ |
385 // +---+---+---+---+ 411 // +---+---+---+---+
386 MarkBlocksAndCheckMerge(0, 1, 3, 1); 412 ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 1, 3, 1));
387 413
388 // +---+---+---+---+ 414 // +---+---+---+---+
389 // | | | | _ | 415 // | | | | _ |
390 // +---+---+---+---+ 416 // +---+---+---+---+
391 // | | | | _ | 417 // | | | | _ |
392 // +---+---+---+---+ 418 // +---+---+---+---+
393 // | | X | X | _ | 419 // | | X | X | _ |
394 // +---+---+---+---+ 420 // +---+---+---+---+
395 // | _ | _ | _ | _ | 421 // | _ | _ | _ | _ |
396 // +---+---+---+---+ 422 // +---+---+---+---+
397 MarkBlocksAndCheckMerge(1, 2, 2, 1); 423 ASSERT_TRUE(MarkBlocksAndCheckMerge(1, 2, 2, 1));
398 } 424 }
399 425
400 TEST_F(DifferTest, MergeBlocks_BlockColumn) { 426 TEST_F(DifferTest, MergeBlocks_BlockColumn) {
401 InitDiffer(kScreenWidth, kScreenHeight); 427 InitDiffer(kScreenWidth, kScreenHeight);
402 428
403 // +---+---+---+---+ 429 // +---+---+---+---+
404 // | X | | | _ | 430 // | X | | | _ |
405 // +---+---+---+---+ 431 // +---+---+---+---+
406 // | X | | | _ | 432 // | X | | | _ |
407 // +---+---+---+---+ 433 // +---+---+---+---+
408 // | | | | _ | 434 // | | | | _ |
409 // +---+---+---+---+ 435 // +---+---+---+---+
410 // | _ | _ | _ | _ | 436 // | _ | _ | _ | _ |
411 // +---+---+---+---+ 437 // +---+---+---+---+
412 MarkBlocksAndCheckMerge(0, 0, 1, 2); 438 ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 0, 1, 2));
413 439
414 // +---+---+---+---+ 440 // +---+---+---+---+
415 // | | | | _ | 441 // | | | | _ |
416 // +---+---+---+---+ 442 // +---+---+---+---+
417 // | | X | | _ | 443 // | | X | | _ |
418 // +---+---+---+---+ 444 // +---+---+---+---+
419 // | | X | | _ | 445 // | | X | | _ |
420 // +---+---+---+---+ 446 // +---+---+---+---+
421 // | _ | _ | _ | _ | 447 // | _ | _ | _ | _ |
422 // +---+---+---+---+ 448 // +---+---+---+---+
423 MarkBlocksAndCheckMerge(1, 1, 1, 2); 449 ASSERT_TRUE(MarkBlocksAndCheckMerge(1, 1, 1, 2));
424 450
425 // +---+---+---+---+ 451 // +---+---+---+---+
426 // | | | X | _ | 452 // | | | X | _ |
427 // +---+---+---+---+ 453 // +---+---+---+---+
428 // | | | X | _ | 454 // | | | X | _ |
429 // +---+---+---+---+ 455 // +---+---+---+---+
430 // | | | X | _ | 456 // | | | X | _ |
431 // +---+---+---+---+ 457 // +---+---+---+---+
432 // | _ | _ | _ | _ | 458 // | _ | _ | _ | _ |
433 // +---+---+---+---+ 459 // +---+---+---+---+
434 MarkBlocksAndCheckMerge(2, 0, 1, 3); 460 ASSERT_TRUE(MarkBlocksAndCheckMerge(2, 0, 1, 3));
435 } 461 }
436 462
437 TEST_F(DifferTest, MergeBlocks_BlockRect) { 463 TEST_F(DifferTest, MergeBlocks_BlockRect) {
438 InitDiffer(kScreenWidth, kScreenHeight); 464 InitDiffer(kScreenWidth, kScreenHeight);
439 465
440 // +---+---+---+---+ 466 // +---+---+---+---+
441 // | X | X | | _ | 467 // | X | X | | _ |
442 // +---+---+---+---+ 468 // +---+---+---+---+
443 // | X | X | | _ | 469 // | X | X | | _ |
444 // +---+---+---+---+ 470 // +---+---+---+---+
445 // | | | | _ | 471 // | | | | _ |
446 // +---+---+---+---+ 472 // +---+---+---+---+
447 // | _ | _ | _ | _ | 473 // | _ | _ | _ | _ |
448 // +---+---+---+---+ 474 // +---+---+---+---+
449 MarkBlocksAndCheckMerge(0, 0, 2, 2); 475 ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 0, 2, 2));
450 476
451 // +---+---+---+---+ 477 // +---+---+---+---+
452 // | | | | _ | 478 // | | | | _ |
453 // +---+---+---+---+ 479 // +---+---+---+---+
454 // | | X | X | _ | 480 // | | X | X | _ |
455 // +---+---+---+---+ 481 // +---+---+---+---+
456 // | | X | X | _ | 482 // | | X | X | _ |
457 // +---+---+---+---+ 483 // +---+---+---+---+
458 // | _ | _ | _ | _ | 484 // | _ | _ | _ | _ |
459 // +---+---+---+---+ 485 // +---+---+---+---+
460 MarkBlocksAndCheckMerge(1, 1, 2, 2); 486 ASSERT_TRUE(MarkBlocksAndCheckMerge(1, 1, 2, 2));
461 487
462 // +---+---+---+---+ 488 // +---+---+---+---+
463 // | | X | X | _ | 489 // | | X | X | _ |
464 // +---+---+---+---+ 490 // +---+---+---+---+
465 // | | X | X | _ | 491 // | | X | X | _ |
466 // +---+---+---+---+ 492 // +---+---+---+---+
467 // | | X | X | _ | 493 // | | X | X | _ |
468 // +---+---+---+---+ 494 // +---+---+---+---+
469 // | _ | _ | _ | _ | 495 // | _ | _ | _ | _ |
470 // +---+---+---+---+ 496 // +---+---+---+---+
471 MarkBlocksAndCheckMerge(1, 0, 2, 3); 497 ASSERT_TRUE(MarkBlocksAndCheckMerge(1, 0, 2, 3));
472 498
473 // +---+---+---+---+ 499 // +---+---+---+---+
474 // | | | | _ | 500 // | | | | _ |
475 // +---+---+---+---+ 501 // +---+---+---+---+
476 // | X | X | X | _ | 502 // | X | X | X | _ |
477 // +---+---+---+---+ 503 // +---+---+---+---+
478 // | X | X | X | _ | 504 // | X | X | X | _ |
479 // +---+---+---+---+ 505 // +---+---+---+---+
480 // | _ | _ | _ | _ | 506 // | _ | _ | _ | _ |
481 // +---+---+---+---+ 507 // +---+---+---+---+
482 MarkBlocksAndCheckMerge(0, 1, 3, 2); 508 ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 1, 3, 2));
483 509
484 // +---+---+---+---+ 510 // +---+---+---+---+
485 // | X | X | X | _ | 511 // | X | X | X | _ |
486 // +---+---+---+---+ 512 // +---+---+---+---+
487 // | X | X | X | _ | 513 // | X | X | X | _ |
488 // +---+---+---+---+ 514 // +---+---+---+---+
489 // | X | X | X | _ | 515 // | X | X | X | _ |
490 // +---+---+---+---+ 516 // +---+---+---+---+
491 // | _ | _ | _ | _ | 517 // | _ | _ | _ | _ |
492 // +---+---+---+---+ 518 // +---+---+---+---+
493 MarkBlocksAndCheckMerge(0, 0, 3, 3); 519 ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 0, 3, 3));
494 } 520 }
495 521
496 // This tests marked regions that require more than 1 single dirty rect. 522 // This tests marked regions that require more than 1 single dirty rect.
497 // The exact rects returned depend on the current implementation, so these 523 // The exact rects returned depend on the current implementation, so these
498 // may need to be updated if we modify how we merge blocks. 524 // may need to be updated if we modify how we merge blocks.
499 TEST_F(DifferTest, MergeBlocks_MultiRect) { 525 TEST_F(DifferTest, MergeBlocks_MultiRect) {
500 InitDiffer(kScreenWidth, kScreenHeight); 526 InitDiffer(kScreenWidth, kScreenHeight);
501 scoped_ptr<InvalidRects> dirty; 527 SkRegion dirty;
502 528
503 // +---+---+---+---+ +---+---+---+ 529 // +---+---+---+---+ +---+---+---+
504 // | | X | | _ | | | 0 | | 530 // | | X | | _ | | | 0 | |
505 // +---+---+---+---+ +---+---+---+ 531 // +---+---+---+---+ +---+---+---+
506 // | X | | | _ | | 1 | | | 532 // | X | | | _ | | 1 | | |
507 // +---+---+---+---+ => +---+---+---+ 533 // +---+---+---+---+ => +---+---+---+
508 // | | | X | _ | | | | 2 | 534 // | | | X | _ | | | | 2 |
509 // +---+---+---+---+ +---+---+---+ 535 // +---+---+---+---+ +---+---+---+
510 // | _ | _ | _ | _ | 536 // | _ | _ | _ | _ |
511 // +---+---+---+---+ 537 // +---+---+---+---+
512 ClearDiffInfo(); 538 ClearDiffInfo();
513 MarkBlocks(1, 0, 1, 1); 539 MarkBlocks(1, 0, 1, 1);
514 MarkBlocks(0, 1, 1, 1); 540 MarkBlocks(0, 1, 1, 1);
515 MarkBlocks(2, 2, 1, 1); 541 MarkBlocks(2, 2, 1, 1);
516 542
517 dirty.reset(new InvalidRects()); 543 dirty.setEmpty();
518 differ_->MergeBlocks(dirty.get()); 544 MergeBlocks(&dirty);
519 545
520 ASSERT_EQ(3UL, dirty->size()); 546 ASSERT_EQ(3, RegionRectCount(dirty));
521 CheckDirtyRect(*dirty.get(), 1, 0, 1, 1); 547 ASSERT_TRUE(CheckDirtyRegion(dirty, 1, 0, 1, 1));
522 CheckDirtyRect(*dirty.get(), 0, 1, 1, 1); 548 ASSERT_TRUE(CheckDirtyRegion(dirty, 0, 1, 1, 1));
523 CheckDirtyRect(*dirty.get(), 2, 2, 1, 1); 549 ASSERT_TRUE(CheckDirtyRegion(dirty, 2, 2, 1, 1));
Wez 2011/08/08 20:49:34 Clearer to restructure this to iterate over dirty
dmac 2011/08/10 20:30:36 I'm going to leave as is for right now. It keeps a
524 550
525 // +---+---+---+---+ +---+---+---+ 551 // +---+---+---+---+ +---+---+---+
526 // | | | X | _ | | | | 0 | 552 // | | | X | _ | | | | 0 |
527 // +---+---+---+---+ +---+---+ + 553 // +---+---+---+---+ +---+---+---+
528 // | X | X | X | _ | | 1 1 | 0 | 554 // | X | X | X | _ | | 1 1 1 |
529 // +---+---+---+---+ => + + + 555 // +---+---+---+---+ => + +
530 // | X | X | X | _ | | 1 1 | 0 | 556 // | X | X | X | _ | | 1 1 1 |
531 // +---+---+---+---+ +---+---+---+ 557 // +---+---+---+---+ +---+---+---+
532 // | _ | _ | _ | _ | 558 // | _ | _ | _ | _ |
533 // +---+---+---+---+ 559 // +---+---+---+---+
534 ClearDiffInfo(); 560 ClearDiffInfo();
535 MarkBlocks(2, 0, 1, 3); 561 MarkBlocks(2, 0, 1, 1);
536 MarkBlocks(0, 1, 2, 2); 562 MarkBlocks(0, 1, 3, 2);
537 563
538 dirty.reset(new InvalidRects()); 564 dirty.setEmpty();
539 differ_->MergeBlocks(dirty.get()); 565 MergeBlocks(&dirty);
540 566
541 ASSERT_EQ(2UL, dirty->size()); 567 ASSERT_EQ(2, RegionRectCount(dirty));
542 CheckDirtyRect(*dirty.get(), 2, 0, 1, 3); 568 ASSERT_TRUE(CheckDirtyRegion(dirty, 2, 0, 1, 1));
543 CheckDirtyRect(*dirty.get(), 0, 1, 2, 2); 569 ASSERT_TRUE(CheckDirtyRegion(dirty, 0, 1, 3, 2));
544 570
545 // +---+---+---+---+ +---+---+---+ 571 // +---+---+---+---+ +---+---+---+
546 // | | | | _ | | | | | 572 // | | | | _ | | | | |
547 // +---+---+---+---+ +---+---+---+ 573 // +---+---+---+---+ +---+---+---+
548 // | X | | X | _ | | 0 | | 1 | 574 // | X | | X | _ | | 0 | | 1 |
549 // +---+---+---+---+ => + +---+ + 575 // +---+---+---+---+ => + +---+ +
550 // | X | X | X | _ | | 0 | 2 | 1 | 576 // | X | X | X | _ | | 2 | 2 | 2 |
551 // +---+---+---+---+ +---+---+---+ 577 // +---+---+---+---+ +---+---+---+
552 // | _ | _ | _ | _ | 578 // | _ | _ | _ | _ |
553 // +---+---+---+---+ 579 // +---+---+---+---+
554 ClearDiffInfo(); 580 ClearDiffInfo();
555 MarkBlocks(0, 1, 1, 1); 581 MarkBlocks(0, 1, 1, 1);
556 MarkBlocks(2, 1, 1, 1); 582 MarkBlocks(2, 1, 1, 1);
557 MarkBlocks(0, 2, 3, 1); 583 MarkBlocks(0, 2, 3, 1);
558 584
559 dirty.reset(new InvalidRects()); 585 dirty.setEmpty();
560 differ_->MergeBlocks(dirty.get()); 586 MergeBlocks(&dirty);
561 587
562 ASSERT_EQ(3UL, dirty->size()); 588 ASSERT_EQ(3, RegionRectCount(dirty));
563 CheckDirtyRect(*dirty.get(), 0, 1, 1, 2); 589 ASSERT_TRUE(CheckDirtyRegion(dirty, 0, 1, 1, 1));
564 CheckDirtyRect(*dirty.get(), 2, 1, 1, 2); 590 ASSERT_TRUE(CheckDirtyRegion(dirty, 2, 1, 1, 1));
565 CheckDirtyRect(*dirty.get(), 1, 2, 1, 1); 591 ASSERT_TRUE(CheckDirtyRegion(dirty, 0, 2, 3, 1));
566 592
567 // +---+---+---+---+ +---+---+---+ 593 // +---+---+---+---+ +---+---+---+
568 // | X | X | X | _ | | 0 0 0 | 594 // | X | X | X | _ | | 0 0 0 |
569 // +---+---+---+---+ +---+---+---+ 595 // +---+---+---+---+ +---+---+---+
570 // | X | | X | _ | | 1 | | 2 | 596 // | X | | X | _ | | 1 | | 2 |
571 // +---+---+---+---+ => + +---+ + 597 // +---+---+---+---+ => + +---+ +
572 // | X | X | X | _ | | 1 | 3 | 2 | 598 // | X | X | X | _ | | 3 | 3 | 3 |
573 // +---+---+---+---+ +---+---+---+ 599 // +---+---+---+---+ +---+---+---+
574 // | _ | _ | _ | _ | 600 // | _ | _ | _ | _ |
575 // +---+---+---+---+ 601 // +---+---+---+---+
576 ClearDiffInfo(); 602 ClearDiffInfo();
577 MarkBlocks(0, 0, 3, 1); 603 MarkBlocks(0, 0, 3, 1);
578 MarkBlocks(0, 1, 1, 1); 604 MarkBlocks(0, 1, 1, 1);
579 MarkBlocks(2, 1, 1, 1); 605 MarkBlocks(2, 1, 1, 1);
580 MarkBlocks(0, 2, 3, 1); 606 MarkBlocks(0, 2, 3, 1);
581 607
582 dirty.reset(new InvalidRects()); 608 dirty.setEmpty();
583 differ_->MergeBlocks(dirty.get()); 609 MergeBlocks(&dirty);
584 610
585 ASSERT_EQ(4UL, dirty->size()); 611 ASSERT_EQ(4, RegionRectCount(dirty));
586 CheckDirtyRect(*dirty.get(), 0, 0, 3, 1); 612 ASSERT_TRUE(CheckDirtyRegion(dirty, 0, 0, 3, 1));
587 CheckDirtyRect(*dirty.get(), 0, 1, 1, 2); 613 ASSERT_TRUE(CheckDirtyRegion(dirty, 0, 1, 1, 1));
588 CheckDirtyRect(*dirty.get(), 2, 1, 1, 2); 614 ASSERT_TRUE(CheckDirtyRegion(dirty, 2, 1, 1, 1));
589 CheckDirtyRect(*dirty.get(), 1, 2, 1, 1); 615 ASSERT_TRUE(CheckDirtyRegion(dirty, 0, 2, 3, 1));
590 616
591 // +---+---+---+---+ +---+---+---+ 617 // +---+---+---+---+ +---+---+---+
592 // | X | X | | _ | | 0 0 | | 618 // | X | X | | _ | | 0 0 | |
593 // +---+---+---+---+ + +---+ 619 // +---+---+---+---+ + +---+
594 // | X | X | | _ | | 0 0 | | 620 // | X | X | | _ | | 0 0 | |
595 // +---+---+---+---+ => +---+---+---+ 621 // +---+---+---+---+ => +---+---+---+
596 // | | X | | _ | | | 1 | | 622 // | | X | | _ | | | 1 | |
597 // +---+---+---+---+ +---+---+---+ 623 // +---+---+---+---+ +---+---+---+
598 // | _ | _ | _ | _ | 624 // | _ | _ | _ | _ |
599 // +---+---+---+---+ 625 // +---+---+---+---+
600 ClearDiffInfo(); 626 ClearDiffInfo();
601 MarkBlocks(0, 0, 2, 2); 627 MarkBlocks(0, 0, 2, 2);
602 MarkBlocks(1, 2, 1, 1); 628 MarkBlocks(1, 2, 1, 1);
603 629
604 dirty.reset(new InvalidRects()); 630 dirty.setEmpty();
605 differ_->MergeBlocks(dirty.get()); 631 MergeBlocks(&dirty);
606 632
607 ASSERT_EQ(2UL, dirty->size()); 633 ASSERT_EQ(2, RegionRectCount(dirty));
608 CheckDirtyRect(*dirty.get(), 0, 0, 2, 2); 634 ASSERT_TRUE(CheckDirtyRegion(dirty, 0, 0, 2, 2));
609 CheckDirtyRect(*dirty.get(), 1, 2, 1, 1); 635 ASSERT_TRUE(CheckDirtyRegion(dirty, 1, 2, 1, 1));
610 } 636 }
611 637
612 } // namespace remoting 638 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698