Index: remoting/host/differ_unittest.cc |
diff --git a/remoting/host/differ_unittest.cc b/remoting/host/differ_unittest.cc |
deleted file mode 100644 |
index 6ddd722183131c8989bb4031014dec387faba9d2..0000000000000000000000000000000000000000 |
--- a/remoting/host/differ_unittest.cc |
+++ /dev/null |
@@ -1,639 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/memory/scoped_ptr.h" |
-#include "remoting/host/differ.h" |
-#include "remoting/host/differ_block.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
- |
-namespace remoting { |
- |
-// 96x96 screen gives a 4x4 grid of blocks. |
-const int kScreenWidth= 96; |
-const int kScreenHeight = 96; |
- |
-// To test partial blocks, we need a width and height that are not multiples |
-// of 16 (or 32, depending on current block size). |
-const int kPartialScreenWidth = 70; |
-const int kPartialScreenHeight = 70; |
- |
-class DifferTest : public testing::Test { |
- public: |
- DifferTest() { |
- } |
- |
- protected: |
- void InitDiffer(int width, int height) { |
- width_ = width; |
- height_ = height; |
- bytes_per_pixel_ = kBytesPerPixel; |
- stride_ = (kBytesPerPixel * width); |
- buffer_size_ = width_ * height_ * bytes_per_pixel_; |
- |
- differ_.reset(new Differ(width_, height_, bytes_per_pixel_, stride_)); |
- |
- prev_.reset(new uint8[buffer_size_]); |
- memset(prev_.get(), 0, buffer_size_); |
- |
- curr_.reset(new uint8[buffer_size_]); |
- memset(curr_.get(), 0, buffer_size_); |
- } |
- |
- void ClearBuffer(uint8* buffer) { |
- memset(buffer, 0, buffer_size_); |
- } |
- |
- // Here in DifferTest so that tests can access private methods of Differ. |
- void MarkDirtyBlocks(const void* prev_buffer, const void* curr_buffer) { |
- differ_->MarkDirtyBlocks(prev_buffer, curr_buffer); |
- } |
- |
- void MergeBlocks(SkRegion* dirty) { |
- differ_->MergeBlocks(dirty); |
- } |
- |
- // Convenience method to count rectangles in a region. |
- int RegionRectCount(const SkRegion& region) { |
- int count = 0; |
- for(SkRegion::Iterator iter(region); !iter.done(); iter.next()) { |
- ++count; |
- } |
- return count; |
- } |
- |
- // Convenience wrapper for Differ's DiffBlock that calculates the appropriate |
- // offset to the start of the desired block. |
- DiffInfo DiffBlock(int block_x, int block_y) { |
- // Offset from upper-left of buffer to upper-left of requested block. |
- int block_offset = ((block_y * stride_) + (block_x * bytes_per_pixel_)) |
- * kBlockSize; |
- return BlockDifference(prev_.get() + block_offset, |
- curr_.get() + block_offset, |
- stride_); |
- } |
- |
- // Write the pixel |value| into the specified block in the |buffer|. |
- // This is a convenience wrapper around WritePixel(). |
- void WriteBlockPixel(uint8* buffer, int block_x, int block_y, |
- int pixel_x, int pixel_y, uint32 value) { |
- WritePixel(buffer, (block_x * kBlockSize) + pixel_x, |
- (block_y * kBlockSize) + pixel_y, value); |
- } |
- |
- // Write the test pixel |value| into the |buffer| at the specified |x|,|y| |
- // location. |
- // Only the low-order bytes from |value| are written (assuming little-endian). |
- // So, for |value| = 0xaabbccdd: |
- // If bytes_per_pixel = 4, then ddccbbaa will be written as the pixel value. |
- // If = 3, ddccbb |
- // If = 2, ddcc |
- // If = 1, dd |
- void WritePixel(uint8* buffer, int x, int y, uint32 value) { |
- uint8* pixel = reinterpret_cast<uint8*>(&value); |
- buffer += (y * stride_) + (x * bytes_per_pixel_); |
- for (int b = bytes_per_pixel_ - 1; b >= 0; b--) { |
- *buffer++ = pixel[b]; |
- } |
- } |
- |
- // DiffInfo utility routines. |
- // These are here so that we don't have to make each DifferText_Xxx_Test |
- // class a friend class to Differ. |
- |
- // Clear out the entire |diff_info_| buffer. |
- void ClearDiffInfo() { |
- memset(differ_->diff_info_.get(), 0, differ_->diff_info_size_); |
- } |
- |
- // Get the value in the |diff_info_| array at (x,y). |
- DiffInfo GetDiffInfo(int x, int y) { |
- DiffInfo* diff_info = differ_->diff_info_.get(); |
- return diff_info[(y * GetDiffInfoWidth()) + x]; |
- } |
- |
- // Width of |diff_info_| array. |
- int GetDiffInfoWidth() { |
- return differ_->diff_info_width_; |
- } |
- |
- // Height of |diff_info_| array. |
- int GetDiffInfoHeight() { |
- return differ_->diff_info_height_; |
- } |
- |
- // Size of |diff_info_| array. |
- int GetDiffInfoSize() { |
- return differ_->diff_info_size_; |
- } |
- |
- void SetDiffInfo(int x, int y, const DiffInfo& value) { |
- DiffInfo* diff_info = differ_->diff_info_.get(); |
- diff_info[(y * GetDiffInfoWidth()) + x] = value; |
- } |
- |
- // Mark the range of blocks specified. |
- void MarkBlocks(int x_origin, int y_origin, int width, int height) { |
- for (int y = 0; y < height; y++) { |
- for (int x = 0; x < width; x++) { |
- SetDiffInfo(x_origin + x, y_origin + y, 1); |
- } |
- } |
- } |
- |
- // Verify that |region| contains a rectangle defined by |x|, |y|, |width| and |
- // |height|. |
- // |x|, |y|, |width| and |height| are specified in block (not pixel) units. |
- bool CheckDirtyRegionContainsRect(const SkRegion& region, int x, int y, |
- int width, int height) { |
- SkIRect r = SkIRect::MakeXYWH(x * kBlockSize, y * kBlockSize, |
- width * kBlockSize, height * kBlockSize); |
- bool found = false; |
- for (SkRegion::Iterator i(region); !found && !i.done(); i.next()) { |
- found = (i.rect() == r); |
- } |
- return found; |
- } |
- |
- // Mark the range of blocks specified and then verify that they are |
- // merged correctly. |
- // Only one rectangular region of blocks can be checked with this routine. |
- bool MarkBlocksAndCheckMerge(int x_origin, int y_origin, |
- int width, int height) { |
- ClearDiffInfo(); |
- MarkBlocks(x_origin, y_origin, width, height); |
- |
- SkRegion dirty; |
- MergeBlocks(&dirty); |
- |
- bool is_good = dirty.isRect(); |
- if (is_good) { |
- is_good = CheckDirtyRegionContainsRect(dirty, x_origin, y_origin, |
- width, height); |
- } |
- return is_good; |
- } |
- |
- // The differ class we're testing. |
- scoped_ptr<Differ> differ_; |
- |
- // Screen/buffer info. |
- int width_; |
- int height_; |
- int bytes_per_pixel_; |
- int stride_; |
- |
- // Size of each screen buffer. |
- int buffer_size_; |
- |
- // Previous and current screen buffers. |
- scoped_array<uint8> prev_; |
- scoped_array<uint8> curr_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(DifferTest); |
-}; |
- |
-TEST_F(DifferTest, Setup) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- // 96x96 pixels results in 3x3 array. Add 1 to each dimension as boundary. |
- // +---+---+---+---+ |
- // | o | o | o | _ | |
- // +---+---+---+---+ o = blocks mapped to screen pixels |
- // | o | o | o | _ | |
- // +---+---+---+---+ _ = boundary blocks |
- // | o | o | o | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- EXPECT_EQ(4, GetDiffInfoWidth()); |
- EXPECT_EQ(4, GetDiffInfoHeight()); |
- EXPECT_EQ(16, GetDiffInfoSize()); |
-} |
- |
-TEST_F(DifferTest, MarkDirtyBlocks_All) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- ClearDiffInfo(); |
- |
- // Update a pixel in each block. |
- for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { |
- for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { |
- WriteBlockPixel(curr_.get(), x, y, 10, 10, 0xff00ff); |
- } |
- } |
- |
- MarkDirtyBlocks(prev_.get(), curr_.get()); |
- |
- // Make sure each block is marked as dirty. |
- for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { |
- for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { |
- EXPECT_EQ(1, GetDiffInfo(x, y)) |
- << "when x = " << x << ", and y = " << y; |
- } |
- } |
-} |
- |
-TEST_F(DifferTest, MarkDirtyBlocks_Sampling) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- ClearDiffInfo(); |
- |
- // Update some pixels in image. |
- WriteBlockPixel(curr_.get(), 1, 0, 10, 10, 0xff00ff); |
- WriteBlockPixel(curr_.get(), 2, 1, 10, 10, 0xff00ff); |
- WriteBlockPixel(curr_.get(), 0, 2, 10, 10, 0xff00ff); |
- |
- MarkDirtyBlocks(prev_.get(), curr_.get()); |
- |
- // Make sure corresponding blocks are updated. |
- EXPECT_EQ(0, GetDiffInfo(0, 0)); |
- EXPECT_EQ(0, GetDiffInfo(0, 1)); |
- EXPECT_EQ(1, GetDiffInfo(0, 2)); |
- EXPECT_EQ(1, GetDiffInfo(1, 0)); |
- EXPECT_EQ(0, GetDiffInfo(1, 1)); |
- EXPECT_EQ(0, GetDiffInfo(1, 2)); |
- EXPECT_EQ(0, GetDiffInfo(2, 0)); |
- EXPECT_EQ(1, GetDiffInfo(2, 1)); |
- EXPECT_EQ(0, GetDiffInfo(2, 2)); |
-} |
- |
-TEST_F(DifferTest, DiffBlock) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- |
- // Verify no differences at start. |
- EXPECT_EQ(0, DiffBlock(0, 0)); |
- EXPECT_EQ(0, DiffBlock(1, 1)); |
- |
- // Write new data into the 4 corners of the middle block and verify that |
- // neighboring blocks are not affected. |
- int max = kBlockSize - 1; |
- WriteBlockPixel(curr_.get(), 1, 1, 0, 0, 0xffffff); |
- WriteBlockPixel(curr_.get(), 1, 1, 0, max, 0xffffff); |
- WriteBlockPixel(curr_.get(), 1, 1, max, 0, 0xffffff); |
- WriteBlockPixel(curr_.get(), 1, 1, max, max, 0xffffff); |
- EXPECT_EQ(0, DiffBlock(0, 0)); |
- EXPECT_EQ(0, DiffBlock(0, 1)); |
- EXPECT_EQ(0, DiffBlock(0, 2)); |
- EXPECT_EQ(0, DiffBlock(1, 0)); |
- EXPECT_EQ(1, DiffBlock(1, 1)); // Only this block should change. |
- EXPECT_EQ(0, DiffBlock(1, 2)); |
- EXPECT_EQ(0, DiffBlock(2, 0)); |
- EXPECT_EQ(0, DiffBlock(2, 1)); |
- EXPECT_EQ(0, DiffBlock(2, 2)); |
-} |
- |
-TEST_F(DifferTest, Partial_Setup) { |
- InitDiffer(kPartialScreenWidth, kPartialScreenHeight); |
- // 70x70 pixels results in 3x3 array: 2x2 full blocks + partials around |
- // the edge. One more is added to each dimension as a boundary. |
- // +---+---+---+---+ |
- // | o | o | + | _ | |
- // +---+---+---+---+ o = blocks mapped to screen pixels |
- // | o | o | + | _ | |
- // +---+---+---+---+ + = partial blocks (top/left mapped to screen pixels) |
- // | + | + | + | _ | |
- // +---+---+---+---+ _ = boundary blocks |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- EXPECT_EQ(4, GetDiffInfoWidth()); |
- EXPECT_EQ(4, GetDiffInfoHeight()); |
- EXPECT_EQ(16, GetDiffInfoSize()); |
-} |
- |
-TEST_F(DifferTest, Partial_FirstPixel) { |
- InitDiffer(kPartialScreenWidth, kPartialScreenHeight); |
- ClearDiffInfo(); |
- |
- // Update the first pixel in each block. |
- for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { |
- for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { |
- WriteBlockPixel(curr_.get(), x, y, 0, 0, 0xff00ff); |
- } |
- } |
- |
- MarkDirtyBlocks(prev_.get(), curr_.get()); |
- |
- // Make sure each block is marked as dirty. |
- for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { |
- for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { |
- EXPECT_EQ(1, GetDiffInfo(x, y)) |
- << "when x = " << x << ", and y = " << y; |
- } |
- } |
-} |
- |
-TEST_F(DifferTest, Partial_BorderPixel) { |
- InitDiffer(kPartialScreenWidth, kPartialScreenHeight); |
- ClearDiffInfo(); |
- |
- // Update the right/bottom border pixels. |
- for (int y = 0; y < height_; y++) { |
- WritePixel(curr_.get(), width_ - 1, y, 0xff00ff); |
- } |
- for (int x = 0; x < width_; x++) { |
- WritePixel(curr_.get(), x, height_ - 1, 0xff00ff); |
- } |
- |
- MarkDirtyBlocks(prev_.get(), curr_.get()); |
- |
- // Make sure last (partial) block in each row/column is marked as dirty. |
- int x_last = GetDiffInfoWidth() - 2; |
- for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { |
- EXPECT_EQ(1, GetDiffInfo(x_last, y)) |
- << "when x = " << x_last << ", and y = " << y; |
- } |
- int y_last = GetDiffInfoHeight() - 2; |
- for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { |
- EXPECT_EQ(1, GetDiffInfo(x, y_last)) |
- << "when x = " << x << ", and y = " << y_last; |
- } |
- // All other blocks are clean. |
- for (int y = 0; y < GetDiffInfoHeight() - 2; y++) { |
- for (int x = 0; x < GetDiffInfoWidth() - 2; x++) { |
- EXPECT_EQ(0, GetDiffInfo(x, y)) << "when x = " << x << ", and y = " << y; |
- } |
- } |
-} |
- |
-TEST_F(DifferTest, MergeBlocks_Empty) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- |
- // No blocks marked: |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ClearDiffInfo(); |
- |
- SkRegion dirty; |
- MergeBlocks(&dirty); |
- |
- EXPECT_TRUE(dirty.isEmpty()); |
-} |
- |
-TEST_F(DifferTest, MergeBlocks_SingleBlock) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- // Mark a single block and make sure that there is a single merged |
- // rect with the correct bounds. |
- for (int y = 0; y < GetDiffInfoHeight() - 1; y++) { |
- for (int x = 0; x < GetDiffInfoWidth() - 1; x++) { |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(x, y, 1, 1)) << "x: " << x |
- << "y: " << y; |
- } |
- } |
-} |
- |
-TEST_F(DifferTest, MergeBlocks_BlockRow) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- |
- // +---+---+---+---+ |
- // | X | X | | _ | |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 0, 2, 1)); |
- |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | X | X | X | _ | |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 1, 3, 1)); |
- |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | | X | X | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(1, 2, 2, 1)); |
-} |
- |
-TEST_F(DifferTest, MergeBlocks_BlockColumn) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- |
- // +---+---+---+---+ |
- // | X | | | _ | |
- // +---+---+---+---+ |
- // | X | | | _ | |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 0, 1, 2)); |
- |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | | X | | _ | |
- // +---+---+---+---+ |
- // | | X | | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(1, 1, 1, 2)); |
- |
- // +---+---+---+---+ |
- // | | | X | _ | |
- // +---+---+---+---+ |
- // | | | X | _ | |
- // +---+---+---+---+ |
- // | | | X | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(2, 0, 1, 3)); |
-} |
- |
-TEST_F(DifferTest, MergeBlocks_BlockRect) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- |
- // +---+---+---+---+ |
- // | X | X | | _ | |
- // +---+---+---+---+ |
- // | X | X | | _ | |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 0, 2, 2)); |
- |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | | X | X | _ | |
- // +---+---+---+---+ |
- // | | X | X | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(1, 1, 2, 2)); |
- |
- // +---+---+---+---+ |
- // | | X | X | _ | |
- // +---+---+---+---+ |
- // | | X | X | _ | |
- // +---+---+---+---+ |
- // | | X | X | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(1, 0, 2, 3)); |
- |
- // +---+---+---+---+ |
- // | | | | _ | |
- // +---+---+---+---+ |
- // | X | X | X | _ | |
- // +---+---+---+---+ |
- // | X | X | X | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 1, 3, 2)); |
- |
- // +---+---+---+---+ |
- // | X | X | X | _ | |
- // +---+---+---+---+ |
- // | X | X | X | _ | |
- // +---+---+---+---+ |
- // | X | X | X | _ | |
- // +---+---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ASSERT_TRUE(MarkBlocksAndCheckMerge(0, 0, 3, 3)); |
-} |
- |
-// This tests marked regions that require more than 1 single dirty rect. |
-// The exact rects returned depend on the current implementation, so these |
-// may need to be updated if we modify how we merge blocks. |
-TEST_F(DifferTest, MergeBlocks_MultiRect) { |
- InitDiffer(kScreenWidth, kScreenHeight); |
- SkRegion dirty; |
- |
- // +---+---+---+---+ +---+---+---+ |
- // | | X | | _ | | | 0 | | |
- // +---+---+---+---+ +---+---+---+ |
- // | X | | | _ | | 1 | | | |
- // +---+---+---+---+ => +---+---+---+ |
- // | | | X | _ | | | | 2 | |
- // +---+---+---+---+ +---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ClearDiffInfo(); |
- MarkBlocks(1, 0, 1, 1); |
- MarkBlocks(0, 1, 1, 1); |
- MarkBlocks(2, 2, 1, 1); |
- |
- dirty.setEmpty(); |
- MergeBlocks(&dirty); |
- |
- ASSERT_EQ(3, RegionRectCount(dirty)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 1, 0, 1, 1)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 0, 1, 1, 1)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 2, 2, 1, 1)); |
- |
- // +---+---+---+---+ +---+---+---+ |
- // | | | X | _ | | | | 0 | |
- // +---+---+---+---+ +---+---+---+ |
- // | X | X | X | _ | | 1 1 1 | |
- // +---+---+---+---+ => + + |
- // | X | X | X | _ | | 1 1 1 | |
- // +---+---+---+---+ +---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ClearDiffInfo(); |
- MarkBlocks(2, 0, 1, 1); |
- MarkBlocks(0, 1, 3, 2); |
- |
- dirty.setEmpty(); |
- MergeBlocks(&dirty); |
- |
- ASSERT_EQ(2, RegionRectCount(dirty)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 2, 0, 1, 1)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 0, 1, 3, 2)); |
- |
- // +---+---+---+---+ +---+---+---+ |
- // | | | | _ | | | | | |
- // +---+---+---+---+ +---+---+---+ |
- // | X | | X | _ | | 0 | | 1 | |
- // +---+---+---+---+ => + +---+ + |
- // | X | X | X | _ | | 2 | 2 | 2 | |
- // +---+---+---+---+ +---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ClearDiffInfo(); |
- MarkBlocks(0, 1, 1, 1); |
- MarkBlocks(2, 1, 1, 1); |
- MarkBlocks(0, 2, 3, 1); |
- |
- dirty.setEmpty(); |
- MergeBlocks(&dirty); |
- |
- ASSERT_EQ(3, RegionRectCount(dirty)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 0, 1, 1, 1)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 2, 1, 1, 1)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 0, 2, 3, 1)); |
- |
- // +---+---+---+---+ +---+---+---+ |
- // | X | X | X | _ | | 0 0 0 | |
- // +---+---+---+---+ +---+---+---+ |
- // | X | | X | _ | | 1 | | 2 | |
- // +---+---+---+---+ => + +---+ + |
- // | X | X | X | _ | | 3 | 3 | 3 | |
- // +---+---+---+---+ +---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ClearDiffInfo(); |
- MarkBlocks(0, 0, 3, 1); |
- MarkBlocks(0, 1, 1, 1); |
- MarkBlocks(2, 1, 1, 1); |
- MarkBlocks(0, 2, 3, 1); |
- |
- dirty.setEmpty(); |
- MergeBlocks(&dirty); |
- |
- ASSERT_EQ(4, RegionRectCount(dirty)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 0, 0, 3, 1)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 0, 1, 1, 1)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 2, 1, 1, 1)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 0, 2, 3, 1)); |
- |
- // +---+---+---+---+ +---+---+---+ |
- // | X | X | | _ | | 0 0 | | |
- // +---+---+---+---+ + +---+ |
- // | X | X | | _ | | 0 0 | | |
- // +---+---+---+---+ => +---+---+---+ |
- // | | X | | _ | | | 1 | | |
- // +---+---+---+---+ +---+---+---+ |
- // | _ | _ | _ | _ | |
- // +---+---+---+---+ |
- ClearDiffInfo(); |
- MarkBlocks(0, 0, 2, 2); |
- MarkBlocks(1, 2, 1, 1); |
- |
- dirty.setEmpty(); |
- MergeBlocks(&dirty); |
- |
- ASSERT_EQ(2, RegionRectCount(dirty)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 0, 0, 2, 2)); |
- ASSERT_TRUE(CheckDirtyRegionContainsRect(dirty, 1, 2, 1, 1)); |
-} |
- |
-} // namespace remoting |