blob: 004db11c3e23f47b6119d3aca2d0cc82cf4ffff3 [file] [log] [blame]
// Copyright 2013 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 "cc/base/tiling_data.h"
#include <stddef.h>
#include <algorithm>
#include <vector>
#include "cc/test/geometry_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace cc {
namespace {
int NumTiles(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
int num_tiles = tiling.num_tiles_x() * tiling.num_tiles_y();
// Assert no overflow.
EXPECT_GE(num_tiles, 0);
if (num_tiles > 0)
EXPECT_EQ(num_tiles / tiling.num_tiles_x(), tiling.num_tiles_y());
return num_tiles;
}
int XIndex(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int x_coord) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.TileXIndexFromSrcCoord(x_coord);
}
int YIndex(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int y_coord) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.TileYIndexFromSrcCoord(y_coord);
}
int MinBorderXIndex(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int x_coord) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.FirstBorderTileXIndexFromSrcCoord(x_coord);
}
int MinBorderYIndex(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int y_coord) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.FirstBorderTileYIndexFromSrcCoord(y_coord);
}
int MaxBorderXIndex(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int x_coord) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.LastBorderTileXIndexFromSrcCoord(x_coord);
}
int MaxBorderYIndex(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int y_coord) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.LastBorderTileYIndexFromSrcCoord(y_coord);
}
int PosX(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int x_index) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.TilePositionX(x_index);
}
int PosY(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int y_index) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.TilePositionY(y_index);
}
int SizeX(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int x_index) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.TileSizeX(x_index);
}
int SizeY(const gfx::Size& max_texture_size,
const gfx::Size& tiling_size,
bool has_border_texels,
int y_index) {
TilingData tiling(max_texture_size, tiling_size, has_border_texels);
return tiling.TileSizeY(y_index);
}
class TilingDataTest : public ::testing::TestWithParam<gfx::Point> {};
TEST(TilingDataTest, NumTiles_NoTiling) {
EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), false));
EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(15, 15), true));
EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), true));
EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(1, 16), false));
EXPECT_EQ(1, NumTiles(gfx::Size(15, 15), gfx::Size(15, 15), true));
EXPECT_EQ(1, NumTiles(gfx::Size(32, 16), gfx::Size(32, 16), false));
EXPECT_EQ(1, NumTiles(gfx::Size(32, 16), gfx::Size(32, 16), true));
}
TEST(TilingDataTest, NumTiles_TilingNoBorders) {
EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 0), false));
EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(4, 0), false));
EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 4), false));
EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(4, 0), false));
EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(0, 4), false));
EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(1, 1), false));
EXPECT_EQ(1, NumTiles(gfx::Size(1, 1), gfx::Size(1, 1), false));
EXPECT_EQ(2, NumTiles(gfx::Size(1, 1), gfx::Size(1, 2), false));
EXPECT_EQ(2, NumTiles(gfx::Size(1, 1), gfx::Size(2, 1), false));
EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 1), false));
EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 2), false));
EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 1), false));
EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 2), false));
EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(3, 3), false));
EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(1, 4), false));
EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(2, 4), false));
EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(3, 4), false));
EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(4, 4), false));
EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(5, 4), false));
EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(6, 4), false));
EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(7, 4), false));
EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(8, 4), false));
EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(9, 4), false));
EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(10, 4), false));
EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(11, 4), false));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(1, 5), false));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(2, 5), false));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(3, 5), false));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(4, 5), false));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(5, 5), false));
EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(6, 5), false));
EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(7, 5), false));
EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(8, 5), false));
EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(9, 5), false));
EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(10, 5), false));
EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(11, 5), false));
EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), false));
EXPECT_EQ(1, NumTiles(gfx::Size(17, 17), gfx::Size(16, 16), false));
EXPECT_EQ(4, NumTiles(gfx::Size(15, 15), gfx::Size(16, 16), false));
EXPECT_EQ(4, NumTiles(gfx::Size(8, 8), gfx::Size(16, 16), false));
EXPECT_EQ(6, NumTiles(gfx::Size(8, 8), gfx::Size(17, 16), false));
EXPECT_EQ(8, NumTiles(gfx::Size(5, 8), gfx::Size(17, 16), false));
}
TEST(TilingDataTest, NumTiles_TilingWithBorders) {
EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 0), true));
EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(4, 0), true));
EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 4), true));
EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(4, 0), true));
EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(0, 4), true));
EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(1, 1), true));
EXPECT_EQ(1, NumTiles(gfx::Size(1, 1), gfx::Size(1, 1), true));
EXPECT_EQ(0, NumTiles(gfx::Size(1, 1), gfx::Size(1, 2), true));
EXPECT_EQ(0, NumTiles(gfx::Size(1, 1), gfx::Size(2, 1), true));
EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 1), true));
EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 2), true));
EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 1), true));
EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 2), true));
EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(1, 3), true));
EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(2, 3), true));
EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(3, 3), true));
EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(4, 3), true));
EXPECT_EQ(3, NumTiles(gfx::Size(3, 3), gfx::Size(5, 3), true));
EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(6, 3), true));
EXPECT_EQ(5, NumTiles(gfx::Size(3, 3), gfx::Size(7, 3), true));
EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(1, 4), true));
EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(2, 4), true));
EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(3, 4), true));
EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(4, 4), true));
EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(5, 4), true));
EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(6, 4), true));
EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(7, 4), true));
EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(8, 4), true));
EXPECT_EQ(4, NumTiles(gfx::Size(4, 4), gfx::Size(9, 4), true));
EXPECT_EQ(4, NumTiles(gfx::Size(4, 4), gfx::Size(10, 4), true));
EXPECT_EQ(5, NumTiles(gfx::Size(4, 4), gfx::Size(11, 4), true));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(1, 5), true));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(2, 5), true));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(3, 5), true));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(4, 5), true));
EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(5, 5), true));
EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(6, 5), true));
EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(7, 5), true));
EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(8, 5), true));
EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(9, 5), true));
EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(10, 5), true));
EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(11, 5), true));
EXPECT_EQ(30, NumTiles(gfx::Size(8, 5), gfx::Size(16, 32), true));
}
TEST(TilingDataTest, TileXIndexFromSrcCoord) {
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
EXPECT_EQ(4, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
EXPECT_EQ(5, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
EXPECT_EQ(6, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
EXPECT_EQ(0, XIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
EXPECT_EQ(0, XIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
}
TEST(TilingDataTest, FirstBorderTileXIndexFromSrcCoord) {
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
EXPECT_EQ(4, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
EXPECT_EQ(5, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
EXPECT_EQ(6, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
}
TEST(TilingDataTest, LastBorderTileXIndexFromSrcCoord) {
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
EXPECT_EQ(4, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
EXPECT_EQ(5, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
EXPECT_EQ(6, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
}
TEST(TilingDataTest, TileYIndexFromSrcCoord) {
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
EXPECT_EQ(4, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
EXPECT_EQ(5, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
EXPECT_EQ(6, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
EXPECT_EQ(0, YIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
EXPECT_EQ(0, YIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
}
TEST(TilingDataTest, FirstBorderTileYIndexFromSrcCoord) {
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
EXPECT_EQ(4, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
EXPECT_EQ(5, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
EXPECT_EQ(6, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
}
TEST(TilingDataTest, LastBorderTileYIndexFromSrcCoord) {
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
EXPECT_EQ(4, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
EXPECT_EQ(5, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
EXPECT_EQ(6, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
}
TEST(TilingDataTest, TileSizeX) {
EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(5, 5), false, 0));
EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(5, 5), true, 0));
EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), false, 0));
EXPECT_EQ(1, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), false, 1));
EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), true, 0));
EXPECT_EQ(2, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), true, 1));
EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), false, 0));
EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), false, 1));
EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), true, 0));
EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), true, 1));
EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), false, 0));
EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), false, 1));
EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 0));
EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 1));
EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 2));
EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(11, 11), true, 2));
EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(12, 12), true, 2));
EXPECT_EQ(3, SizeX(gfx::Size(5, 9), gfx::Size(12, 17), true, 2));
}
TEST(TilingDataTest, TileSizeY) {
EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(5, 5), false, 0));
EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(5, 5), true, 0));
EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), false, 0));
EXPECT_EQ(1, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), false, 1));
EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), true, 0));
EXPECT_EQ(2, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), true, 1));
EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), false, 0));
EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), false, 1));
EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), true, 0));
EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), true, 1));
EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), false, 0));
EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), false, 1));
EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 0));
EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 1));
EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 2));
EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(11, 11), true, 2));
EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(12, 12), true, 2));
EXPECT_EQ(3, SizeY(gfx::Size(9, 5), gfx::Size(17, 12), true, 2));
}
TEST(TilingDataTest, TileSizeX_and_TilePositionX) {
// Single tile cases:
EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 100), false, 0));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 100), false, 0));
EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 1), false, 0));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 1), false, 0));
EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 100), false, 0));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 100), false, 0));
EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 100), true, 0));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 100), true, 0));
EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 1), true, 0));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 1), true, 0));
EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 100), true, 0));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 100), true, 0));
// Multiple tiles:
// no border
// positions 0, 3
EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(6, 1), false));
EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), false, 0));
EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), false, 1));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 1), false, 0));
EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 1), false, 1));
EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 100), false, 0));
EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 100), false, 1));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 100), false, 0));
EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 100), false, 1));
// Multiple tiles:
// with border
// positions 0, 2, 3, 4
EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(6, 1), true));
EXPECT_EQ(2, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 0));
EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 1));
EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 2));
EXPECT_EQ(2, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 3));
EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 0));
EXPECT_EQ(2, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 1));
EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 2));
EXPECT_EQ(4, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 3));
EXPECT_EQ(2, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 0));
EXPECT_EQ(1, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 1));
EXPECT_EQ(1, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 2));
EXPECT_EQ(2, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 3));
EXPECT_EQ(0, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 0));
EXPECT_EQ(2, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 1));
EXPECT_EQ(3, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 2));
EXPECT_EQ(4, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 3));
}
TEST(TilingDataTest, TileSizeY_and_TilePositionY) {
// Single tile cases:
EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(100, 1), false, 0));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 1), false, 0));
EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 3), false, 0));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 3), false, 0));
EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 3), false, 0));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 3), false, 0));
EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(100, 1), true, 0));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 1), true, 0));
EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 3), true, 0));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 3), true, 0));
EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 3), true, 0));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 3), true, 0));
// Multiple tiles:
// no border
// positions 0, 3
EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(1, 6), false));
EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), false, 0));
EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), false, 1));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 6), false, 0));
EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(1, 6), false, 1));
EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 6), false, 0));
EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 6), false, 1));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 6), false, 0));
EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(100, 6), false, 1));
// Multiple tiles:
// with border
// positions 0, 2, 3, 4
EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(1, 6), true));
EXPECT_EQ(2, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 0));
EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 1));
EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 2));
EXPECT_EQ(2, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 3));
EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 0));
EXPECT_EQ(2, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 1));
EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 2));
EXPECT_EQ(4, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 3));
EXPECT_EQ(2, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 0));
EXPECT_EQ(1, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 1));
EXPECT_EQ(1, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 2));
EXPECT_EQ(2, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 3));
EXPECT_EQ(0, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 0));
EXPECT_EQ(2, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 1));
EXPECT_EQ(3, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 2));
EXPECT_EQ(4, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 3));
}
TEST(TilingDataTest, SetTotalSize) {
TilingData data(gfx::Size(5, 5), gfx::Size(5, 5), false);
EXPECT_EQ(5, data.tiling_size().width());
EXPECT_EQ(5, data.tiling_size().height());
EXPECT_EQ(1, data.num_tiles_x());
EXPECT_EQ(5, data.TileSizeX(0));
EXPECT_EQ(1, data.num_tiles_y());
EXPECT_EQ(5, data.TileSizeY(0));
data.SetTilingSize(gfx::Size(6, 5));
EXPECT_EQ(6, data.tiling_size().width());
EXPECT_EQ(5, data.tiling_size().height());
EXPECT_EQ(2, data.num_tiles_x());
EXPECT_EQ(5, data.TileSizeX(0));
EXPECT_EQ(1, data.TileSizeX(1));
EXPECT_EQ(1, data.num_tiles_y());
EXPECT_EQ(5, data.TileSizeY(0));
data.SetTilingSize(gfx::Size(5, 12));
EXPECT_EQ(5, data.tiling_size().width());
EXPECT_EQ(12, data.tiling_size().height());
EXPECT_EQ(1, data.num_tiles_x());
EXPECT_EQ(5, data.TileSizeX(0));
EXPECT_EQ(3, data.num_tiles_y());
EXPECT_EQ(5, data.TileSizeY(0));
EXPECT_EQ(5, data.TileSizeY(1));
EXPECT_EQ(2, data.TileSizeY(2));
}
TEST(TilingDataTest, SetMaxTextureSizeNoBorders) {
TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), false);
EXPECT_EQ(2, data.num_tiles_x());
EXPECT_EQ(4, data.num_tiles_y());
data.SetMaxTextureSize(gfx::Size(32, 32));
EXPECT_EQ(gfx::Size(32, 32), data.max_texture_size());
EXPECT_EQ(1, data.num_tiles_x());
EXPECT_EQ(1, data.num_tiles_y());
data.SetMaxTextureSize(gfx::Size(2, 2));
EXPECT_EQ(gfx::Size(2, 2), data.max_texture_size());
EXPECT_EQ(8, data.num_tiles_x());
EXPECT_EQ(16, data.num_tiles_y());
data.SetMaxTextureSize(gfx::Size(5, 5));
EXPECT_EQ(gfx::Size(5, 5), data.max_texture_size());
EXPECT_EQ(4, data.num_tiles_x());
EXPECT_EQ(7, data.num_tiles_y());
data.SetMaxTextureSize(gfx::Size(8, 5));
EXPECT_EQ(gfx::Size(8, 5), data.max_texture_size());
EXPECT_EQ(2, data.num_tiles_x());
EXPECT_EQ(7, data.num_tiles_y());
}
TEST(TilingDataTest, SetMaxTextureSizeBorders) {
TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), true);
EXPECT_EQ(3, data.num_tiles_x());
EXPECT_EQ(5, data.num_tiles_y());
data.SetMaxTextureSize(gfx::Size(32, 32));
EXPECT_EQ(gfx::Size(32, 32), data.max_texture_size());
EXPECT_EQ(1, data.num_tiles_x());
EXPECT_EQ(1, data.num_tiles_y());
data.SetMaxTextureSize(gfx::Size(2, 2));
EXPECT_EQ(gfx::Size(2, 2), data.max_texture_size());
EXPECT_EQ(0, data.num_tiles_x());
EXPECT_EQ(0, data.num_tiles_y());
data.SetMaxTextureSize(gfx::Size(5, 5));
EXPECT_EQ(gfx::Size(5, 5), data.max_texture_size());
EXPECT_EQ(5, data.num_tiles_x());
EXPECT_EQ(10, data.num_tiles_y());
data.SetMaxTextureSize(gfx::Size(8, 5));
EXPECT_EQ(gfx::Size(8, 5), data.max_texture_size());
EXPECT_EQ(3, data.num_tiles_x());
EXPECT_EQ(10, data.num_tiles_y());
}
TEST(TilingDataTest, ExpandRectIgnoringBordersToTileBoundsEmpty) {
TilingData empty_total_size(gfx::Size(0, 0), gfx::Size(8, 8), true);
EXPECT_EQ(gfx::Rect(), empty_total_size.ExpandRectIgnoringBordersToTileBounds(
gfx::Rect()));
EXPECT_EQ(gfx::Rect(), empty_total_size.ExpandRectIgnoringBordersToTileBounds(
gfx::Rect(100, 100, 100, 100)));
EXPECT_EQ(gfx::Rect(), empty_total_size.ExpandRectIgnoringBordersToTileBounds(
gfx::Rect(100, 100)));
TilingData empty_max_texture_size(gfx::Size(8, 8), gfx::Size(0, 0), true);
EXPECT_EQ(gfx::Rect(),
empty_max_texture_size.ExpandRectIgnoringBordersToTileBounds(
gfx::Rect()));
EXPECT_EQ(gfx::Rect(),
empty_max_texture_size.ExpandRectIgnoringBordersToTileBounds(
gfx::Rect(100, 100, 100, 100)));
EXPECT_EQ(gfx::Rect(),
empty_max_texture_size.ExpandRectIgnoringBordersToTileBounds(
gfx::Rect(100, 100)));
}
TEST(TilingDataTest, ExpandRectIgnoringBordersToTileBounds) {
TilingData data(gfx::Size(4, 4), gfx::Size(16, 32), true);
// Small rect at origin rounds up to tile 0, 0.
gfx::Rect at_origin_src(1, 1);
gfx::Rect at_origin_result(data.TileBounds(0, 0));
EXPECT_NE(at_origin_src, at_origin_result);
EXPECT_EQ(at_origin_result,
data.ExpandRectIgnoringBordersToTileBounds(at_origin_src));
// Arbitrary internal rect.
gfx::Rect rect_src(6, 6, 1, 3);
// Tile 2, 2 => gfx::Rect(4, 4, 4, 4)
// Tile 2, 3 => gfx::Rect(4, 6, 4, 4)
gfx::Rect rect_result(
gfx::UnionRects(data.TileBounds(2, 2), data.TileBounds(2, 3)));
EXPECT_NE(rect_src, rect_result);
EXPECT_EQ(rect_result, data.ExpandRectIgnoringBordersToTileBounds(rect_src));
// On tile bounds does not round up to next tile (ignores the border).
gfx::Rect border_rect_src(
gfx::UnionRects(data.TileBounds(1, 2), data.TileBounds(3, 4)));
gfx::Rect border_rect_result(
gfx::UnionRects(data.TileBounds(1, 2), data.TileBounds(3, 4)));
EXPECT_EQ(border_rect_result,
data.ExpandRectIgnoringBordersToTileBounds(border_rect_src));
// Equal to tiling rect.
EXPECT_EQ(gfx::Rect(data.tiling_size()),
data.ExpandRectIgnoringBordersToTileBounds(
gfx::Rect(data.tiling_size())));
// Containing, but larger than tiling rect.
EXPECT_EQ(gfx::Rect(data.tiling_size()),
data.ExpandRectIgnoringBordersToTileBounds(gfx::Rect(100, 100)));
// Non-intersecting with tiling rect.
gfx::Rect non_intersect(200, 200, 100, 100);
EXPECT_FALSE(non_intersect.Intersects(gfx::Rect(data.tiling_size())));
EXPECT_EQ(gfx::Rect(),
data.ExpandRectIgnoringBordersToTileBounds(non_intersect));
TilingData data2(gfx::Size(8, 8), gfx::Size(32, 64), true);
// Inside other tile border texels doesn't include other tiles.
gfx::Rect inner_rect_src(data2.TileBounds(1, 1));
inner_rect_src.Inset(data2.border_texels(), data.border_texels());
gfx::Rect inner_rect_result(data2.TileBounds(1, 1));
gfx::Rect expanded =
data2.ExpandRectIgnoringBordersToTileBounds(inner_rect_src);
EXPECT_EQ(inner_rect_result.ToString(), expanded.ToString());
}
TEST(TilingDataTest, ExpandRectToTileBounds) {
TilingData data(gfx::Size(4, 4), gfx::Size(16, 32), true);
// Small rect at origin rounds up to tile 0, 0.
gfx::Rect at_origin_src(1, 1);
gfx::Rect at_origin_result(data.TileBounds(0, 0));
EXPECT_NE(at_origin_src, at_origin_result);
EXPECT_EQ(at_origin_result, data.ExpandRectToTileBounds(at_origin_src));
// Arbitrary internal rect.
gfx::Rect rect_src(6, 6, 1, 3);
// Tile 2, 2 => gfx::Rect(4, 4, 4, 4)
// Tile 3, 4 => gfx::Rect(6, 8, 4, 4)
gfx::Rect rect_result(
gfx::UnionRects(data.TileBounds(2, 2), data.TileBounds(3, 4)));
EXPECT_NE(rect_src, rect_result);
EXPECT_EQ(rect_result, data.ExpandRectToTileBounds(rect_src));
// On tile bounds rounds up to next tile (since border overlaps).
gfx::Rect border_rect_src(
gfx::UnionRects(data.TileBounds(1, 2), data.TileBounds(3, 4)));
gfx::Rect border_rect_result(
gfx::UnionRects(data.TileBounds(0, 1), data.TileBounds(4, 5)));
EXPECT_EQ(border_rect_result, data.ExpandRectToTileBounds(border_rect_src));
// Equal to tiling rect.
EXPECT_EQ(gfx::Rect(data.tiling_size()),
data.ExpandRectToTileBounds(gfx::Rect(data.tiling_size())));
// Containing, but larger than tiling rect.
EXPECT_EQ(gfx::Rect(data.tiling_size()),
data.ExpandRectToTileBounds(gfx::Rect(100, 100)));
// Non-intersecting with tiling rect.
gfx::Rect non_intersect(200, 200, 100, 100);
EXPECT_FALSE(non_intersect.Intersects(gfx::Rect(data.tiling_size())));
EXPECT_EQ(gfx::Rect(), data.ExpandRectToTileBounds(non_intersect));
TilingData data2(gfx::Size(8, 8), gfx::Size(32, 64), true);
// Inside other tile border texels doesn't include other tiles.
gfx::Rect inner_rect_src(data2.TileBounds(1, 1));
inner_rect_src.Inset(data2.border_texels(), data.border_texels());
gfx::Rect inner_rect_result(data2.TileBounds(1, 1));
gfx::Rect expanded = data2.ExpandRectToTileBounds(inner_rect_src);
EXPECT_EQ(inner_rect_result.ToString(), expanded.ToString());
}
TEST(TilingDataTest, Assignment) {
{
TilingData source(gfx::Size(8, 8), gfx::Size(16, 32), true);
TilingData dest = source;
EXPECT_EQ(source.border_texels(), dest.border_texels());
EXPECT_EQ(source.max_texture_size(), dest.max_texture_size());
EXPECT_EQ(source.num_tiles_x(), dest.num_tiles_x());
EXPECT_EQ(source.num_tiles_y(), dest.num_tiles_y());
EXPECT_EQ(source.tiling_size(), dest.tiling_size());
}
{
TilingData source(gfx::Size(7, 3), gfx::Size(6, 100), false);
TilingData dest(source);
EXPECT_EQ(source.border_texels(), dest.border_texels());
EXPECT_EQ(source.max_texture_size(), dest.max_texture_size());
EXPECT_EQ(source.num_tiles_x(), dest.num_tiles_x());
EXPECT_EQ(source.num_tiles_y(), dest.num_tiles_y());
EXPECT_EQ(source.tiling_size(), dest.tiling_size());
}
}
TEST(TilingDataTest, SetBorderTexels) {
TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), false);
EXPECT_EQ(2, data.num_tiles_x());
EXPECT_EQ(4, data.num_tiles_y());
data.SetHasBorderTexels(true);
EXPECT_EQ(3, data.num_tiles_x());
EXPECT_EQ(5, data.num_tiles_y());
data.SetHasBorderTexels(false);
EXPECT_EQ(2, data.num_tiles_x());
EXPECT_EQ(4, data.num_tiles_y());
}
TEST(TilingDataTest, LargeBorders) {
TilingData data(gfx::Size(100, 80), gfx::Size(200, 145), 30);
EXPECT_EQ(30, data.border_texels());
EXPECT_EQ(70, data.TileSizeX(0));
EXPECT_EQ(40, data.TileSizeX(1));
EXPECT_EQ(40, data.TileSizeX(2));
EXPECT_EQ(50, data.TileSizeX(3));
EXPECT_EQ(4, data.num_tiles_x());
EXPECT_EQ(50, data.TileSizeY(0));
EXPECT_EQ(20, data.TileSizeY(1));
EXPECT_EQ(20, data.TileSizeY(2));
EXPECT_EQ(20, data.TileSizeY(3));
EXPECT_EQ(35, data.TileSizeY(4));
EXPECT_EQ(5, data.num_tiles_y());
EXPECT_EQ(gfx::Rect(70, 50), data.TileBounds(0, 0));
EXPECT_EQ(gfx::Rect(70, 50, 40, 20), data.TileBounds(1, 1));
EXPECT_EQ(gfx::Rect(110, 110, 40, 35), data.TileBounds(2, 4));
EXPECT_EQ(gfx::Rect(150, 70, 50, 20), data.TileBounds(3, 2));
EXPECT_EQ(gfx::Rect(150, 110, 50, 35), data.TileBounds(3, 4));
EXPECT_EQ(gfx::Rect(100, 80), data.TileBoundsWithBorder(0, 0));
EXPECT_EQ(gfx::Rect(40, 20, 100, 80), data.TileBoundsWithBorder(1, 1));
EXPECT_EQ(gfx::Rect(80, 80, 100, 65), data.TileBoundsWithBorder(2, 4));
EXPECT_EQ(gfx::Rect(120, 40, 80, 80), data.TileBoundsWithBorder(3, 2));
EXPECT_EQ(gfx::Rect(120, 80, 80, 65), data.TileBoundsWithBorder(3, 4));
EXPECT_EQ(0, data.TileXIndexFromSrcCoord(0));
EXPECT_EQ(0, data.TileXIndexFromSrcCoord(69));
EXPECT_EQ(1, data.TileXIndexFromSrcCoord(70));
EXPECT_EQ(1, data.TileXIndexFromSrcCoord(109));
EXPECT_EQ(2, data.TileXIndexFromSrcCoord(110));
EXPECT_EQ(2, data.TileXIndexFromSrcCoord(149));
EXPECT_EQ(3, data.TileXIndexFromSrcCoord(150));
EXPECT_EQ(3, data.TileXIndexFromSrcCoord(199));
EXPECT_EQ(0, data.TileYIndexFromSrcCoord(0));
EXPECT_EQ(0, data.TileYIndexFromSrcCoord(49));
EXPECT_EQ(1, data.TileYIndexFromSrcCoord(50));
EXPECT_EQ(1, data.TileYIndexFromSrcCoord(69));
EXPECT_EQ(2, data.TileYIndexFromSrcCoord(70));
EXPECT_EQ(2, data.TileYIndexFromSrcCoord(89));
EXPECT_EQ(3, data.TileYIndexFromSrcCoord(90));
EXPECT_EQ(3, data.TileYIndexFromSrcCoord(109));
EXPECT_EQ(4, data.TileYIndexFromSrcCoord(110));
EXPECT_EQ(4, data.TileYIndexFromSrcCoord(144));
EXPECT_EQ(0, data.FirstBorderTileXIndexFromSrcCoord(0));
EXPECT_EQ(0, data.FirstBorderTileXIndexFromSrcCoord(99));
EXPECT_EQ(1, data.FirstBorderTileXIndexFromSrcCoord(100));
EXPECT_EQ(1, data.FirstBorderTileXIndexFromSrcCoord(139));
EXPECT_EQ(2, data.FirstBorderTileXIndexFromSrcCoord(140));
EXPECT_EQ(2, data.FirstBorderTileXIndexFromSrcCoord(179));
EXPECT_EQ(3, data.FirstBorderTileXIndexFromSrcCoord(180));
EXPECT_EQ(3, data.FirstBorderTileXIndexFromSrcCoord(199));
EXPECT_EQ(0, data.FirstBorderTileYIndexFromSrcCoord(0));
EXPECT_EQ(0, data.FirstBorderTileYIndexFromSrcCoord(79));
EXPECT_EQ(1, data.FirstBorderTileYIndexFromSrcCoord(80));
EXPECT_EQ(1, data.FirstBorderTileYIndexFromSrcCoord(99));
EXPECT_EQ(2, data.FirstBorderTileYIndexFromSrcCoord(100));
EXPECT_EQ(2, data.FirstBorderTileYIndexFromSrcCoord(119));
EXPECT_EQ(3, data.FirstBorderTileYIndexFromSrcCoord(120));
EXPECT_EQ(3, data.FirstBorderTileYIndexFromSrcCoord(139));
EXPECT_EQ(4, data.FirstBorderTileYIndexFromSrcCoord(140));
EXPECT_EQ(4, data.FirstBorderTileYIndexFromSrcCoord(144));
EXPECT_EQ(0, data.LastBorderTileXIndexFromSrcCoord(0));
EXPECT_EQ(0, data.LastBorderTileXIndexFromSrcCoord(39));
EXPECT_EQ(1, data.LastBorderTileXIndexFromSrcCoord(40));
EXPECT_EQ(1, data.LastBorderTileXIndexFromSrcCoord(79));
EXPECT_EQ(2, data.LastBorderTileXIndexFromSrcCoord(80));
EXPECT_EQ(2, data.LastBorderTileXIndexFromSrcCoord(119));
EXPECT_EQ(3, data.LastBorderTileXIndexFromSrcCoord(120));
EXPECT_EQ(3, data.LastBorderTileXIndexFromSrcCoord(199));
EXPECT_EQ(0, data.LastBorderTileYIndexFromSrcCoord(0));
EXPECT_EQ(0, data.LastBorderTileYIndexFromSrcCoord(19));
EXPECT_EQ(1, data.LastBorderTileYIndexFromSrcCoord(20));
EXPECT_EQ(1, data.LastBorderTileYIndexFromSrcCoord(39));
EXPECT_EQ(2, data.LastBorderTileYIndexFromSrcCoord(40));
EXPECT_EQ(2, data.LastBorderTileYIndexFromSrcCoord(59));
EXPECT_EQ(3, data.LastBorderTileYIndexFromSrcCoord(60));
EXPECT_EQ(3, data.LastBorderTileYIndexFromSrcCoord(79));
EXPECT_EQ(4, data.LastBorderTileYIndexFromSrcCoord(80));
EXPECT_EQ(4, data.LastBorderTileYIndexFromSrcCoord(144));
}
void TestIterate(const TilingData& data,
gfx::Rect rect,
int expect_left,
int expect_top,
int expect_right,
int expect_bottom,
bool include_borders) {
EXPECT_GE(expect_left, 0);
EXPECT_GE(expect_top, 0);
EXPECT_LT(expect_right, data.num_tiles_x());
EXPECT_LT(expect_bottom, data.num_tiles_y());
std::vector<std::pair<int, int>> original_expected;
for (int x = 0; x < data.num_tiles_x(); ++x) {
for (int y = 0; y < data.num_tiles_y(); ++y) {
gfx::Rect bounds;
if (include_borders)
bounds = data.TileBoundsWithBorder(x, y);
else
bounds = data.TileBounds(x, y);
if (x >= expect_left && x <= expect_right &&
y >= expect_top && y <= expect_bottom) {
EXPECT_TRUE(bounds.Intersects(rect));
original_expected.push_back(std::make_pair(x, y));
} else {
EXPECT_FALSE(bounds.Intersects(rect));
}
}
}
// Verify with vanilla iterator.
{
std::vector<std::pair<int, int>> expected = original_expected;
for (TilingData::Iterator iter(&data, rect, include_borders); iter;
++iter) {
bool found = false;
for (size_t i = 0; i < expected.size(); ++i) {
if (expected[i] == iter.index()) {
expected[i] = expected.back();
expected.pop_back();
found = true;
break;
}
}
EXPECT_TRUE(found);
}
EXPECT_EQ(0u, expected.size());
}
// Make sure this also works with a difference iterator and an empty ignore.
// The difference iterator never includes borders, so ignore it otherwise.
if (!include_borders) {
std::vector<std::pair<int, int>> expected = original_expected;
for (TilingData::DifferenceIterator iter(&data, rect, gfx::Rect()); iter;
++iter) {
bool found = false;
for (size_t i = 0; i < expected.size(); ++i) {
if (expected[i] == iter.index()) {
expected[i] = expected.back();
expected.pop_back();
found = true;
break;
}
}
EXPECT_TRUE(found);
}
EXPECT_EQ(0u, expected.size());
}
}
void TestIterateBorders(const TilingData& data,
gfx::Rect rect,
int expect_left,
int expect_top,
int expect_right,
int expect_bottom) {
bool include_borders = true;
TestIterate(data,
rect,
expect_left,
expect_top,
expect_right,
expect_bottom,
include_borders);
}
void TestIterateNoBorders(const TilingData& data,
gfx::Rect rect,
int expect_left,
int expect_top,
int expect_right,
int expect_bottom) {
bool include_borders = false;
TestIterate(data,
rect,
expect_left,
expect_top,
expect_right,
expect_bottom,
include_borders);
}
void TestIterateAll(const TilingData& data,
gfx::Rect rect,
int expect_left,
int expect_top,
int expect_right,
int expect_bottom) {
TestIterateBorders(
data, rect, expect_left, expect_top, expect_right, expect_bottom);
TestIterateNoBorders(
data, rect, expect_left, expect_top, expect_right, expect_bottom);
}
TEST(TilingDataTest, IteratorNoBorderTexels) {
TilingData data(gfx::Size(10, 10), gfx::Size(40, 25), false);
// X border index by src coord: [0-10), [10-20), [20, 30), [30, 40)
// Y border index by src coord: [0-10), [10-20), [20, 25)
TestIterateAll(data, gfx::Rect(40, 25), 0, 0, 3, 2);
TestIterateAll(data, gfx::Rect(15, 15, 8, 8), 1, 1, 2, 2);
// Oversized.
TestIterateAll(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 3, 2);
TestIterateAll(data, gfx::Rect(-100, 20, 1000, 1), 0, 2, 3, 2);
TestIterateAll(data, gfx::Rect(29, -100, 31, 1000), 2, 0, 3, 2);
// Nonintersecting.
TestIterateAll(data, gfx::Rect(60, 80, 100, 100), 0, 0, -1, -1);
}
TEST(TilingDataTest, BordersIteratorOneBorderTexel) {
TilingData data(gfx::Size(10, 20), gfx::Size(25, 45), true);
// X border index by src coord: [0-10), [8-18), [16-25)
// Y border index by src coord: [0-20), [18-38), [36-45)
TestIterateBorders(data, gfx::Rect(25, 45), 0, 0, 2, 2);
TestIterateBorders(data, gfx::Rect(18, 19, 3, 17), 2, 0, 2, 1);
TestIterateBorders(data, gfx::Rect(10, 20, 6, 16), 1, 1, 1, 1);
TestIterateBorders(data, gfx::Rect(9, 19, 8, 18), 0, 0, 2, 2);
// Oversized.
TestIterateBorders(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 2);
TestIterateBorders(data, gfx::Rect(-100, 20, 1000, 1), 0, 1, 2, 1);
TestIterateBorders(data, gfx::Rect(18, -100, 6, 1000), 2, 0, 2, 2);
// Nonintersecting.
TestIterateBorders(data, gfx::Rect(60, 80, 100, 100), 0, 0, -1, -1);
}
TEST(TilingDataTest, NoBordersIteratorOneBorderTexel) {
TilingData data(gfx::Size(10, 20), gfx::Size(25, 45), true);
// X index by src coord: [0-9), [9-17), [17-25)
// Y index by src coord: [0-19), [19-37), [37-45)
TestIterateNoBorders(data, gfx::Rect(25, 45), 0, 0, 2, 2);
TestIterateNoBorders(data, gfx::Rect(17, 19, 3, 18), 2, 1, 2, 1);
TestIterateNoBorders(data, gfx::Rect(17, 19, 3, 19), 2, 1, 2, 2);
TestIterateNoBorders(data, gfx::Rect(8, 18, 9, 19), 0, 0, 1, 1);
TestIterateNoBorders(data, gfx::Rect(9, 19, 9, 19), 1, 1, 2, 2);
// Oversized.
TestIterateNoBorders(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 2);
TestIterateNoBorders(data, gfx::Rect(-100, 20, 1000, 1), 0, 1, 2, 1);
TestIterateNoBorders(data, gfx::Rect(18, -100, 6, 1000), 2, 0, 2, 2);
// Nonintersecting.
TestIterateNoBorders(data, gfx::Rect(60, 80, 100, 100), 0, 0, -1, -1);
}
TEST(TilingDataTest, BordersIteratorManyBorderTexels) {
TilingData data(gfx::Size(50, 60), gfx::Size(65, 110), 20);
// X border index by src coord: [0-50), [10-60), [20-65)
// Y border index by src coord: [0-60), [20-80), [40-100), [60-110)
TestIterateBorders(data, gfx::Rect(65, 110), 0, 0, 2, 3);
TestIterateBorders(data, gfx::Rect(50, 60, 15, 65), 1, 1, 2, 3);
TestIterateBorders(data, gfx::Rect(60, 30, 2, 10), 2, 0, 2, 1);
// Oversized.
TestIterateBorders(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 3);
TestIterateBorders(data, gfx::Rect(-100, 10, 1000, 10), 0, 0, 2, 0);
TestIterateBorders(data, gfx::Rect(10, -100, 10, 1000), 0, 0, 1, 3);
// Nonintersecting.
TestIterateBorders(data, gfx::Rect(65, 110, 100, 100), 0, 0, -1, -1);
}
TEST(TilingDataTest, NoBordersIteratorManyBorderTexels) {
TilingData data(gfx::Size(50, 60), gfx::Size(65, 110), 20);
// X index by src coord: [0-30), [30-40), [40, 65)
// Y index by src coord: [0-40), [40-60), [60, 80), [80-110)
TestIterateNoBorders(data, gfx::Rect(65, 110), 0, 0, 2, 3);
TestIterateNoBorders(data, gfx::Rect(30, 40, 15, 65), 1, 1, 2, 3);
TestIterateNoBorders(data, gfx::Rect(60, 20, 2, 21), 2, 0, 2, 1);
// Oversized.
TestIterateNoBorders(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 3);
TestIterateNoBorders(data, gfx::Rect(-100, 10, 1000, 10), 0, 0, 2, 0);
TestIterateNoBorders(data, gfx::Rect(10, -100, 10, 1000), 0, 0, 0, 3);
// Nonintersecting.
TestIterateNoBorders(data, gfx::Rect(65, 110, 100, 100), 0, 0, -1, -1);
}
TEST(TilingDataTest, IteratorOneTile) {
TilingData no_border(gfx::Size(1000, 1000), gfx::Size(30, 40), false);
TestIterateAll(no_border, gfx::Rect(30, 40), 0, 0, 0, 0);
TestIterateAll(no_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
TestIterateAll(no_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
TilingData one_border(gfx::Size(1000, 1000), gfx::Size(30, 40), true);
TestIterateAll(one_border, gfx::Rect(30, 40), 0, 0, 0, 0);
TestIterateAll(one_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
TestIterateAll(one_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
TilingData big_border(gfx::Size(1000, 1000), gfx::Size(30, 40), 50);
TestIterateAll(big_border, gfx::Rect(30, 40), 0, 0, 0, 0);
TestIterateAll(big_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
TestIterateAll(big_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
}
TEST(TilingDataTest, IteratorNoTiles) {
TilingData data(gfx::Size(100, 100), gfx::Size(), false);
TestIterateAll(data, gfx::Rect(100, 100), 0, 0, -1, -1);
}
void TestDiff(const TilingData& data,
gfx::Rect consider,
gfx::Rect ignore,
size_t num_tiles) {
std::vector<std::pair<int, int>> expected;
for (int y = 0; y < data.num_tiles_y(); ++y) {
for (int x = 0; x < data.num_tiles_x(); ++x) {
gfx::Rect bounds = data.TileBounds(x, y);
if (bounds.Intersects(consider) && !bounds.Intersects(ignore))
expected.push_back(std::make_pair(x, y));
}
}
// Sanity check the test.
EXPECT_EQ(num_tiles, expected.size());
for (TilingData::DifferenceIterator iter(&data, consider, ignore); iter;
++iter) {
bool found = false;
for (size_t i = 0; i < expected.size(); ++i) {
if (expected[i] == iter.index()) {
expected[i] = expected.back();
expected.pop_back();
found = true;
break;
}
}
EXPECT_TRUE(found);
}
EXPECT_EQ(0u, expected.size());
}
TEST(TilingDataTest, DifferenceIteratorIgnoreGeometry) {
// This test is checking that the iterator can handle different geometries of
// ignore rects relative to the consider rect. The consider rect indices
// themselves are mostly tested by the non-difference iterator tests, so the
// full rect is mostly used here for simplicity.
// X border index by src coord: [0-10), [10-20), [20, 30), [30, 40)
// Y border index by src coord: [0-10), [10-20), [20, 25)
TilingData data(gfx::Size(10, 10), gfx::Size(40, 25), false);
// Fully ignored
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(40, 25), 0);
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(-100, -100, 200, 200), 0);
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(9, 9, 30, 15), 0);
TestDiff(data, gfx::Rect(15, 15, 8, 8), gfx::Rect(15, 15, 8, 8), 0);
// Fully un-ignored
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(-30, -20, 8, 8), 12);
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(), 12);
// Top left, remove 2x2 tiles
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(20, 19), 8);
// Bottom right, remove 2x2 tiles
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(20, 15, 20, 6), 8);
// Bottom left, remove 2x2 tiles
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(0, 15, 20, 6), 8);
// Top right, remove 2x2 tiles
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(20, 0, 20, 19), 8);
// Center, remove only one tile
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(10, 10, 5, 5), 11);
// Left column, flush left, removing two columns
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(11, 25), 6);
// Middle column, removing two columns
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(11, 0, 11, 25), 6);
// Right column, flush right, removing one column
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(30, 0, 2, 25), 9);
// Top row, flush top, removing one row
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(0, 5, 40, 5), 8);
// Middle row, removing one row
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(0, 13, 40, 5), 8);
// Bottom row, flush bottom, removing two rows
TestDiff(data, gfx::Rect(40, 25), gfx::Rect(0, 13, 40, 12), 4);
// Non-intersecting, but still touching two of the same tiles.
TestDiff(data, gfx::Rect(8, 0, 32, 25), gfx::Rect(0, 12, 5, 12), 10);
// Intersecting, but neither contains the other. 2x3 with one overlap.
TestDiff(data, gfx::Rect(5, 2, 20, 10), gfx::Rect(25, 15, 5, 10), 5);
}
TEST(TilingDataTest, DifferenceIteratorManyBorderTexels) {
// X border index by src coord: [0-50), [10-60), [20-65)
// Y border index by src coord: [0-60), [20-80), [40-100), [60-110)
// X tile bounds by src coord: [0-30), [30-40), [40-65)
// Y tile bounds by src coord: [0-40), [40-60), [60-80), [80-110)
TilingData data(gfx::Size(50, 60), gfx::Size(65, 110), 20);
// Knock out two rows, but not the left column.
TestDiff(data, gfx::Rect(10, 30, 55, 80), gfx::Rect(30, 59, 20, 2), 8);
// Knock out one row.
TestDiff(data, gfx::Rect(10, 30, 55, 80), gfx::Rect(29, 59, 20, 1), 9);
// Overlap all tiles with ignore rect.
TestDiff(data, gfx::Rect(65, 110), gfx::Rect(29, 39, 12, 42), 0);
gfx::Rect tile = data.TileBounds(1, 1);
// Ignore one tile.
TestDiff(data, gfx::Rect(20, 30, 45, 80), tile, 11);
// Include one tile.
TestDiff(data, tile, gfx::Rect(), 1);
}
TEST(TilingDataTest, DifferenceIteratorOneTile) {
TilingData no_border(gfx::Size(1000, 1000), gfx::Size(30, 40), false);
TestDiff(no_border, gfx::Rect(30, 40), gfx::Rect(), 1);
TestDiff(no_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
TilingData one_border(gfx::Size(1000, 1000), gfx::Size(30, 40), true);
TestDiff(one_border, gfx::Rect(30, 40), gfx::Rect(), 1);
TestDiff(one_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
TilingData big_border(gfx::Size(1000, 1000), gfx::Size(30, 40), 50);
TestDiff(big_border, gfx::Rect(30, 40), gfx::Rect(), 1);
TestDiff(big_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
}
TEST(TilingDataTest, DifferenceIteratorNoTiles) {
TilingData data(gfx::Size(100, 100), gfx::Size(), false);
TestDiff(data, gfx::Rect(100, 100), gfx::Rect(5, 5), 0);
}
void TestSpiralIterate(int source_line_number,
const TilingData& tiling_data,
const gfx::Rect& consider,
const gfx::Rect& ignore,
const gfx::Rect& center,
const std::vector<std::pair<int, int>>& expected) {
std::vector<std::pair<int, int>> actual_forward;
for (TilingData::SpiralDifferenceIterator it(
&tiling_data, consider, ignore, center);
it;
++it) {
actual_forward.push_back(it.index());
}
EXPECT_EQ(expected.size(), actual_forward.size()) << "error from line "
<< source_line_number;
for (size_t i = 0; i < std::min(expected.size(), actual_forward.size());
++i) {
EXPECT_EQ(expected[i].first, actual_forward[i].first)
<< "i: " << i << " error from line: " << source_line_number;
EXPECT_EQ(expected[i].second, actual_forward[i].second)
<< "i: " << i << " error from line: " << source_line_number;
}
std::vector<std::pair<int, int>> actual_reverse;
for (TilingData::ReverseSpiralDifferenceIterator it(
&tiling_data, consider, ignore, center);
it;
++it) {
actual_reverse.push_back(it.index());
}
std::vector<std::pair<int, int>> reversed_expected = expected;
std::reverse(reversed_expected.begin(), reversed_expected.end());
EXPECT_EQ(reversed_expected.size(), actual_reverse.size())
<< "error from line " << source_line_number;
for (size_t i = 0;
i < std::min(reversed_expected.size(), actual_reverse.size());
++i) {
EXPECT_EQ(reversed_expected[i].first, actual_reverse[i].first)
<< "i: " << i << " error from line: " << source_line_number;
EXPECT_EQ(reversed_expected[i].second, actual_reverse[i].second)
<< "i: " << i << " error from line: " << source_line_number;
}
}
TEST(TilingDataTest, SpiralDifferenceIteratorNoIgnoreFullConsider) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(30, 30), false);
gfx::Rect consider(30, 30);
gfx::Rect ignore;
std::vector<std::pair<int, int>> expected;
// Center is in the center of the tiling.
gfx::Rect center(15, 15, 1, 1);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| 4 3 2
// 1| 5 * 1
// 2| 6 7 8
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(2, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Center is off to the right side of the tiling (and far away).
center = gfx::Rect(100, 15, 1, 1);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| 7 4 1
// 1| 8 5 2 *
// 2| 9 6 3
expected.clear();
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Center is the bottom right corner of the tiling.
center = gfx::Rect(25, 25, 1, 1);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| 6 5 4
// 1| 7 2 1
// 2| 8 3 *
expected.clear();
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Center is off the top left side of the tiling.
center = gfx::Rect(-60, -50, 1, 1);
// Layout of the tiling data, and expected return order:
// * x 0 1 2
// y.------
// 0| 1 2 6
// 1| 3 4 5
// 2| 7 8 9
expected.clear();
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(2, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Two tile center.
center = gfx::Rect(15, 15, 1, 10);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| 5 4 3
// 1| 6 * 2
// 2| 7 * 1
expected.clear();
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
TEST(TilingDataTest, SpiralDifferenceIteratorSmallConsider) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
gfx::Rect ignore;
std::vector<std::pair<int, int>> expected;
gfx::Rect center(15, 15, 1, 1);
// Consider is one cell.
gfx::Rect consider(1, 1);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// 0| 1
// 1| *
// 2|
// 3|
// 4|
expected.push_back(std::make_pair(0, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Consider is bottom right corner.
consider = gfx::Rect(25, 25, 10, 10);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// 0|
// 1| *
// 2| 1 2
// 3| 3 4
// 4|
expected.clear();
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(3, 2));
expected.push_back(std::make_pair(2, 3));
expected.push_back(std::make_pair(3, 3));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Consider is one column.
consider = gfx::Rect(11, 0, 1, 100);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// 0| 2
// 1| *
// 2| 3
// 3| 4
// 4| 5
expected.clear();
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(1, 3));
expected.push_back(std::make_pair(1, 4));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
TEST(TilingDataTest, SpiralDifferenceIteratorHasIgnore) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
gfx::Rect consider(50, 50);
std::vector<std::pair<int, int>> expected;
gfx::Rect center(15, 15, 1, 1);
// Full ignore.
gfx::Rect ignore(50, 50);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// 0| . . . . .
// 1| . * . . .
// 2| . . . . .
// 3| . . . . .
// 4| . . . . .
expected.clear();
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// 3 column ignore.
ignore = gfx::Rect(15, 0, 20, 100);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// 0| 1 . . . 8
// 1| 2 * . . 7
// 2| 3 . . . 6
// 3| 4 . . . 5
// 4| 9 . . . 10
expected.clear();
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(4, 2));
expected.push_back(std::make_pair(4, 1));
expected.push_back(std::make_pair(4, 0));
expected.push_back(std::make_pair(0, 4));
expected.push_back(std::make_pair(4, 4));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Ignore covers the top half.
ignore = gfx::Rect(50, 25);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// 0| . . . . .
// 1| . * . . .
// 2| . . . . .
// 3| 1 2 3 4 5
// 4| 6 7 8 9 10
expected.clear();
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(1, 3));
expected.push_back(std::make_pair(2, 3));
expected.push_back(std::make_pair(3, 3));
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(0, 4));
expected.push_back(std::make_pair(1, 4));
expected.push_back(std::make_pair(2, 4));
expected.push_back(std::make_pair(3, 4));
expected.push_back(std::make_pair(4, 4));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
TEST(TilingDataTest, SpiralDifferenceIteratorRectangleCenter) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
gfx::Rect consider(50, 50);
std::vector<std::pair<int, int>> expected;
gfx::Rect ignore;
// Two cell center
gfx::Rect center(25, 25, 1, 10);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// 0| J I H G F
// 1| K 5 4 3 E
// 2| L 6 * 2 D
// 3| M 7 * 1 C
// 4| N 8 9 A B
expected.clear();
expected.push_back(std::make_pair(3, 3));
expected.push_back(std::make_pair(3, 2));
expected.push_back(std::make_pair(3, 1));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(1, 3));
expected.push_back(std::make_pair(1, 4));
expected.push_back(std::make_pair(2, 4));
expected.push_back(std::make_pair(3, 4));
expected.push_back(std::make_pair(4, 4));
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(4, 2));
expected.push_back(std::make_pair(4, 1));
expected.push_back(std::make_pair(4, 0));
expected.push_back(std::make_pair(3, 0));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(0, 4));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Three by two center.
center = gfx::Rect(15, 25, 20, 10);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// 0| J I H G F
// 1| 7 6 5 4 3
// 2| 8 * * * 2
// 3| 9 * * * 1
// 4| A B C D E
expected.clear();
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(4, 2));
expected.push_back(std::make_pair(4, 1));
expected.push_back(std::make_pair(3, 1));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(0, 4));
expected.push_back(std::make_pair(1, 4));
expected.push_back(std::make_pair(2, 4));
expected.push_back(std::make_pair(3, 4));
expected.push_back(std::make_pair(4, 4));
expected.push_back(std::make_pair(4, 0));
expected.push_back(std::make_pair(3, 0));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Column center off the left side.
center = gfx::Rect(-50, 0, 30, 50);
// Layout of the tiling data, and expected return order:
// x 0 1 2 3 4
// y.----------
// * 0| 5 A F K P
// * 1| 4 9 E J O
// * 2| 3 8 D I N
// * 3| 2 7 C H M
// * 4| 1 6 B G L
expected.clear();
expected.push_back(std::make_pair(0, 4));
expected.push_back(std::make_pair(0, 3));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(1, 4));
expected.push_back(std::make_pair(1, 3));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(2, 4));
expected.push_back(std::make_pair(2, 3));
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(3, 4));
expected.push_back(std::make_pair(3, 3));
expected.push_back(std::make_pair(3, 2));
expected.push_back(std::make_pair(3, 1));
expected.push_back(std::make_pair(3, 0));
expected.push_back(std::make_pair(4, 4));
expected.push_back(std::make_pair(4, 3));
expected.push_back(std::make_pair(4, 2));
expected.push_back(std::make_pair(4, 1));
expected.push_back(std::make_pair(4, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
TEST(TilingDataTest, SpiralDifferenceIteratorEdgeCases) {
TilingData tiling_data(gfx::Size(10, 10), gfx::Size(30, 30), false);
std::vector<std::pair<int, int>> expected;
gfx::Rect center;
gfx::Rect consider;
gfx::Rect ignore;
// Ignore contains, but is not equal to, consider and center.
ignore = gfx::Rect(15, 0, 20, 30);
consider = gfx::Rect(20, 10, 10, 20);
center = gfx::Rect(25, 0, 5, 5);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| . *
// 1| . .
// 2| . .
expected.clear();
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Center intersects with consider.
ignore = gfx::Rect();
center = gfx::Rect(0, 15, 30, 15);
consider = gfx::Rect(15, 30);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| 2 1
// 1| * * *
// 2| * * *
expected.clear();
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Consider and ignore are non-intersecting.
ignore = gfx::Rect(5, 30);
consider = gfx::Rect(25, 0, 5, 30);
center = gfx::Rect(15, 0, 1, 1);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| . * 1
// 1| . 2
// 2| . 3
expected.clear();
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Center intersects with ignore.
consider = gfx::Rect(30, 30);
center = gfx::Rect(15, 0, 1, 30);
ignore = gfx::Rect(0, 15, 30, 1);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| 3 * 2
// 1| . * .
// 2| 4 * 1
expected.clear();
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Center and ignore are the same.
consider = gfx::Rect(30, 30);
center = gfx::Rect(15, 0, 1, 30);
ignore = center;
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// 0| 4 * 3
// 1| 5 * 2
// 2| 6 * 1
expected.clear();
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Empty tiling data.
TilingData empty_data(gfx::Size(0, 0), gfx::Size(0, 0), false);
expected.clear();
TestSpiralIterate(__LINE__, empty_data, consider, ignore, center, expected);
// Empty consider.
ignore = gfx::Rect();
center = gfx::Rect(1, 1, 1, 1);
consider = gfx::Rect();
expected.clear();
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Empty center. Note: This arbitrarily puts the center to be off the top-left
// corner.
consider = gfx::Rect(30, 30);
ignore = gfx::Rect();
center = gfx::Rect();
// Layout of the tiling data, and expected return order:
// * x 0 1 2
// y.------
// 0| 1 2 6
// 1| 3 4 5
// 2| 7 8 9
expected.clear();
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(2, 2));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Every rect is empty.
ignore = gfx::Rect();
center = gfx::Rect();
consider = gfx::Rect();
expected.clear();
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
// Center is just to the left of cover, and off of the tiling's left side.
consider = gfx::Rect(30, 30);
ignore = gfx::Rect();
center = gfx::Rect(-20, 0, 19, 30);
// Layout of the tiling data, and expected return order:
// x 0 1 2
// y.------
// *0| 3 6 9
// *1| 2 5 8
// *2| 1 4 7
expected.clear();
expected.push_back(std::make_pair(0, 2));
expected.push_back(std::make_pair(0, 1));
expected.push_back(std::make_pair(0, 0));
expected.push_back(std::make_pair(1, 2));
expected.push_back(std::make_pair(1, 1));
expected.push_back(std::make_pair(1, 0));
expected.push_back(std::make_pair(2, 2));
expected.push_back(std::make_pair(2, 1));
expected.push_back(std::make_pair(2, 0));
TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
}
} // namespace
} // namespace cc