tiling_data_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/base/tiling_data.h"
6
7#include <vector>
8
9#include "cc/test/geometry_test_utils.h"
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace cc {
13namespace {
14
15int NumTiles(
16    gfx::Size max_texture_size,
17    gfx::Size total_size,
18    bool has_border_texels) {
19  TilingData tiling(max_texture_size, total_size, has_border_texels);
20  int num_tiles = tiling.num_tiles_x() * tiling.num_tiles_y();
21
22  // Assert no overflow.
23  EXPECT_GE(num_tiles, 0);
24  if (num_tiles > 0)
25    EXPECT_EQ(num_tiles / tiling.num_tiles_x(), tiling.num_tiles_y());
26
27  return num_tiles;
28}
29
30int XIndex(
31    gfx::Size max_texture_size,
32    gfx::Size total_size,
33    bool has_border_texels,
34    int x_coord) {
35  TilingData tiling(max_texture_size, total_size, has_border_texels);
36  return tiling.TileXIndexFromSrcCoord(x_coord);
37}
38
39int YIndex(
40    gfx::Size max_texture_size,
41    gfx::Size total_size,
42    bool has_border_texels,
43    int y_coord) {
44  TilingData tiling(max_texture_size, total_size, has_border_texels);
45  return tiling.TileYIndexFromSrcCoord(y_coord);
46}
47
48int MinBorderXIndex(
49    gfx::Size max_texture_size,
50    gfx::Size total_size,
51    bool has_border_texels,
52    int x_coord) {
53  TilingData tiling(max_texture_size, total_size, has_border_texels);
54  return tiling.FirstBorderTileXIndexFromSrcCoord(x_coord);
55}
56
57int MinBorderYIndex(
58    gfx::Size max_texture_size,
59    gfx::Size total_size,
60    bool has_border_texels,
61    int y_coord) {
62  TilingData tiling(max_texture_size, total_size, has_border_texels);
63  return tiling.FirstBorderTileYIndexFromSrcCoord(y_coord);
64}
65
66int MaxBorderXIndex(
67    gfx::Size max_texture_size,
68    gfx::Size total_size,
69    bool has_border_texels,
70    int x_coord) {
71  TilingData tiling(max_texture_size, total_size, has_border_texels);
72  return tiling.LastBorderTileXIndexFromSrcCoord(x_coord);
73}
74
75int MaxBorderYIndex(
76    gfx::Size max_texture_size,
77    gfx::Size total_size,
78    bool has_border_texels,
79    int y_coord) {
80  TilingData tiling(max_texture_size, total_size, has_border_texels);
81  return tiling.LastBorderTileYIndexFromSrcCoord(y_coord);
82}
83
84int PosX(
85    gfx::Size max_texture_size,
86    gfx::Size total_size,
87    bool has_border_texels,
88    int x_index) {
89  TilingData tiling(max_texture_size, total_size, has_border_texels);
90  return tiling.TilePositionX(x_index);
91}
92
93int PosY(
94    gfx::Size max_texture_size,
95    gfx::Size total_size,
96    bool has_border_texels,
97    int y_index) {
98  TilingData tiling(max_texture_size, total_size, has_border_texels);
99  return tiling.TilePositionY(y_index);
100}
101
102int SizeX(
103    gfx::Size max_texture_size,
104    gfx::Size total_size,
105    bool has_border_texels,
106    int x_index) {
107  TilingData tiling(max_texture_size, total_size, has_border_texels);
108  return tiling.TileSizeX(x_index);
109}
110
111int SizeY(
112    gfx::Size max_texture_size,
113    gfx::Size total_size,
114    bool has_border_texels,
115    int y_index) {
116  TilingData tiling(max_texture_size, total_size, has_border_texels);
117  return tiling.TileSizeY(y_index);
118}
119
120TEST(TilingDataTest, NumTiles_NoTiling) {
121  EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), false));
122  EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(15, 15), true));
123  EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), true));
124  EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(1, 16), false));
125  EXPECT_EQ(1, NumTiles(gfx::Size(15, 15), gfx::Size(15, 15), true));
126  EXPECT_EQ(1, NumTiles(gfx::Size(32, 16), gfx::Size(32, 16), false));
127  EXPECT_EQ(1, NumTiles(gfx::Size(32, 16), gfx::Size(32, 16), true));
128}
129
130TEST(TilingDataTest, NumTiles_TilingNoBorders) {
131  EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 0), false));
132  EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(4, 0), false));
133  EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 4), false));
134  EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(4, 0), false));
135  EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(0, 4), false));
136  EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(1, 1), false));
137
138  EXPECT_EQ(1, NumTiles(gfx::Size(1, 1), gfx::Size(1, 1), false));
139  EXPECT_EQ(2, NumTiles(gfx::Size(1, 1), gfx::Size(1, 2), false));
140  EXPECT_EQ(2, NumTiles(gfx::Size(1, 1), gfx::Size(2, 1), false));
141  EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 1), false));
142  EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 2), false));
143  EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 1), false));
144  EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 2), false));
145  EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(3, 3), false));
146
147  EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(1, 4), false));
148  EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(2, 4), false));
149  EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(3, 4), false));
150  EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(4, 4), false));
151  EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(5, 4), false));
152  EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(6, 4), false));
153  EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(7, 4), false));
154  EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(8, 4), false));
155  EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(9, 4), false));
156  EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(10, 4), false));
157  EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(11, 4), false));
158
159  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(1, 5), false));
160  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(2, 5), false));
161  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(3, 5), false));
162  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(4, 5), false));
163  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(5, 5), false));
164  EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(6, 5), false));
165  EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(7, 5), false));
166  EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(8, 5), false));
167  EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(9, 5), false));
168  EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(10, 5), false));
169  EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(11, 5), false));
170
171  EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), false));
172  EXPECT_EQ(1, NumTiles(gfx::Size(17, 17), gfx::Size(16, 16), false));
173  EXPECT_EQ(4, NumTiles(gfx::Size(15, 15), gfx::Size(16, 16), false));
174  EXPECT_EQ(4, NumTiles(gfx::Size(8, 8), gfx::Size(16, 16), false));
175  EXPECT_EQ(6, NumTiles(gfx::Size(8, 8), gfx::Size(17, 16), false));
176
177  EXPECT_EQ(8, NumTiles(gfx::Size(5, 8), gfx::Size(17, 16), false));
178}
179
180TEST(TilingDataTest, NumTiles_TilingWithBorders) {
181  EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 0), true));
182  EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(4, 0), true));
183  EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 4), true));
184  EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(4, 0), true));
185  EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(0, 4), true));
186  EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(1, 1), true));
187
188  EXPECT_EQ(1, NumTiles(gfx::Size(1, 1), gfx::Size(1, 1), true));
189  EXPECT_EQ(0, NumTiles(gfx::Size(1, 1), gfx::Size(1, 2), true));
190  EXPECT_EQ(0, NumTiles(gfx::Size(1, 1), gfx::Size(2, 1), true));
191  EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 1), true));
192  EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 2), true));
193  EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 1), true));
194  EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 2), true));
195
196  EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(1, 3), true));
197  EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(2, 3), true));
198  EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(3, 3), true));
199  EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(4, 3), true));
200  EXPECT_EQ(3, NumTiles(gfx::Size(3, 3), gfx::Size(5, 3), true));
201  EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(6, 3), true));
202  EXPECT_EQ(5, NumTiles(gfx::Size(3, 3), gfx::Size(7, 3), true));
203
204  EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(1, 4), true));
205  EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(2, 4), true));
206  EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(3, 4), true));
207  EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(4, 4), true));
208  EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(5, 4), true));
209  EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(6, 4), true));
210  EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(7, 4), true));
211  EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(8, 4), true));
212  EXPECT_EQ(4, NumTiles(gfx::Size(4, 4), gfx::Size(9, 4), true));
213  EXPECT_EQ(4, NumTiles(gfx::Size(4, 4), gfx::Size(10, 4), true));
214  EXPECT_EQ(5, NumTiles(gfx::Size(4, 4), gfx::Size(11, 4), true));
215
216  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(1, 5), true));
217  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(2, 5), true));
218  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(3, 5), true));
219  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(4, 5), true));
220  EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(5, 5), true));
221  EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(6, 5), true));
222  EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(7, 5), true));
223  EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(8, 5), true));
224  EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(9, 5), true));
225  EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(10, 5), true));
226  EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(11, 5), true));
227
228  EXPECT_EQ(30, NumTiles(gfx::Size(8, 5), gfx::Size(16, 32), true));
229}
230
231TEST(TilingDataTest, TileXIndexFromSrcCoord) {
232  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
233  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
234  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
235  EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
236  EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
237  EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
238  EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
239  EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
240  EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
241  EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
242  EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
243  EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
244
245  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
246  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
247  EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
248  EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
249  EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
250  EXPECT_EQ(4, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
251  EXPECT_EQ(5, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
252  EXPECT_EQ(6, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
253  EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
254  EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
255  EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
256  EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
257
258  EXPECT_EQ(0, XIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
259  EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
260  EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
261  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
262  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
263  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
264
265  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
266  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
267  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
268  EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
269
270  EXPECT_EQ(0, XIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
271  EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
272  EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
273  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
274  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
275  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
276
277  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
278  EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
279  EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
280  EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
281}
282
283TEST(TilingDataTest, FirstBorderTileXIndexFromSrcCoord) {
284  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
285  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
286  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
287  EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
288  EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
289  EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
290  EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
291  EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
292  EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
293  EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
294  EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
295  EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
296
297  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
298  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
299  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
300  EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
301  EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
302  EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
303  EXPECT_EQ(4, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
304  EXPECT_EQ(5, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
305  EXPECT_EQ(6, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
306  EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
307  EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
308  EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
309
310  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
311  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
312  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
313  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
314  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
315  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
316
317  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
318  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
319  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
320  EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
321
322  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
323  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
324  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
325  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
326  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
327  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
328
329  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
330  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
331  EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
332  EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
333}
334
335TEST(TilingDataTest, LastBorderTileXIndexFromSrcCoord) {
336  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
337  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
338  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
339  EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
340  EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
341  EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
342  EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
343  EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
344  EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
345  EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
346  EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
347  EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
348
349  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
350  EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
351  EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
352  EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
353  EXPECT_EQ(4, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
354  EXPECT_EQ(5, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
355  EXPECT_EQ(6, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
356  EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
357  EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
358  EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
359  EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
360  EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
361
362  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
363  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
364  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
365  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
366  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
367  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
368
369  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
370  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
371  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
372  EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
373
374  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
375  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
376  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
377  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
378  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
379  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
380
381  EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
382  EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
383  EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
384  EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
385}
386
387TEST(TilingDataTest, TileYIndexFromSrcCoord) {
388  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
389  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
390  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
391  EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
392  EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
393  EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
394  EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
395  EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
396  EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
397  EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
398  EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
399  EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
400
401  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
402  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
403  EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
404  EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
405  EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
406  EXPECT_EQ(4, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
407  EXPECT_EQ(5, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
408  EXPECT_EQ(6, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
409  EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
410  EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
411  EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
412  EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
413
414  EXPECT_EQ(0, YIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
415  EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
416  EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
417  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
418  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
419  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
420
421  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
422  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
423  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
424  EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
425
426  EXPECT_EQ(0, YIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
427  EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
428  EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
429  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
430  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
431  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
432
433  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
434  EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
435  EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
436  EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
437}
438
439TEST(TilingDataTest, FirstBorderTileYIndexFromSrcCoord) {
440  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
441  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
442  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
443  EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
444  EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
445  EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
446  EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
447  EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
448  EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
449  EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
450  EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
451  EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
452
453  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
454  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
455  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
456  EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
457  EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
458  EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
459  EXPECT_EQ(4, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
460  EXPECT_EQ(5, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
461  EXPECT_EQ(6, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
462  EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
463  EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
464  EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
465
466  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
467  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
468  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
469  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
470  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
471  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
472
473  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
474  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
475  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
476  EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
477
478  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
479  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
480  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
481  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
482  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
483  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
484
485  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
486  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
487  EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
488  EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
489}
490
491TEST(TilingDataTest, LastBorderTileYIndexFromSrcCoord) {
492  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
493  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
494  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
495  EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
496  EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
497  EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
498  EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
499  EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
500  EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
501  EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
502  EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
503  EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
504
505  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
506  EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
507  EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
508  EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
509  EXPECT_EQ(4, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
510  EXPECT_EQ(5, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
511  EXPECT_EQ(6, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
512  EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
513  EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
514  EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
515  EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
516  EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
517
518  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
519  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
520  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
521  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
522  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
523  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
524
525  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
526  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
527  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
528  EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
529
530  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
531  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
532  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
533  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
534  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
535  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
536
537  EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
538  EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
539  EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
540  EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
541}
542
543TEST(TilingDataTest, TileSizeX) {
544  EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(5, 5), false, 0));
545  EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(5, 5), true, 0));
546
547  EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), false, 0));
548  EXPECT_EQ(1, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), false, 1));
549  EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), true, 0));
550  EXPECT_EQ(2, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), true, 1));
551
552  EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), false, 0));
553  EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), false, 1));
554  EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), true, 0));
555  EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), true, 1));
556
557  EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), false, 0));
558  EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), false, 1));
559  EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 0));
560  EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 1));
561  EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 2));
562
563  EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(11, 11), true, 2));
564  EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(12, 12), true, 2));
565
566  EXPECT_EQ(3, SizeX(gfx::Size(5, 9), gfx::Size(12, 17), true, 2));
567}
568
569TEST(TilingDataTest, TileSizeY) {
570  EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(5, 5), false, 0));
571  EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(5, 5), true, 0));
572
573  EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), false, 0));
574  EXPECT_EQ(1, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), false, 1));
575  EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), true, 0));
576  EXPECT_EQ(2, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), true, 1));
577
578  EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), false, 0));
579  EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), false, 1));
580  EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), true, 0));
581  EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), true, 1));
582
583  EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), false, 0));
584  EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), false, 1));
585  EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 0));
586  EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 1));
587  EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 2));
588
589  EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(11, 11), true, 2));
590  EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(12, 12), true, 2));
591
592  EXPECT_EQ(3, SizeY(gfx::Size(9, 5), gfx::Size(17, 12), true, 2));
593}
594
595TEST(TilingDataTest, TileSizeX_and_TilePositionX) {
596  // Single tile cases:
597  EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
598  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
599  EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 100), false, 0));
600  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 100), false, 0));
601  EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 1), false, 0));
602  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 1), false, 0));
603  EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 100), false, 0));
604  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 100), false, 0));
605  EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
606  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
607  EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 100), true, 0));
608  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 100), true, 0));
609  EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 1), true, 0));
610  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 1), true, 0));
611  EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 100), true, 0));
612  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 100), true, 0));
613
614  // Multiple tiles:
615  // no border
616  // positions 0, 3
617  EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(6, 1), false));
618  EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), false, 0));
619  EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), false, 1));
620  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 1), false, 0));
621  EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 1), false, 1));
622  EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 100), false, 0));
623  EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 100), false, 1));
624  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 100), false, 0));
625  EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 100), false, 1));
626
627  // Multiple tiles:
628  // with border
629  // positions 0, 2, 3, 4
630  EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(6, 1), true));
631  EXPECT_EQ(2, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 0));
632  EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 1));
633  EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 2));
634  EXPECT_EQ(2, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 3));
635  EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 0));
636  EXPECT_EQ(2, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 1));
637  EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 2));
638  EXPECT_EQ(4, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 3));
639  EXPECT_EQ(2, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 0));
640  EXPECT_EQ(1, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 1));
641  EXPECT_EQ(1, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 2));
642  EXPECT_EQ(2, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 3));
643  EXPECT_EQ(0, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 0));
644  EXPECT_EQ(2, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 1));
645  EXPECT_EQ(3, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 2));
646  EXPECT_EQ(4, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 3));
647}
648
649TEST(TilingDataTest, TileSizeY_and_TilePositionY) {
650  // Single tile cases:
651  EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
652  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
653  EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(100, 1), false, 0));
654  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 1), false, 0));
655  EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 3), false, 0));
656  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 3), false, 0));
657  EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 3), false, 0));
658  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 3), false, 0));
659  EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
660  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
661  EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(100, 1), true, 0));
662  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 1), true, 0));
663  EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 3), true, 0));
664  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 3), true, 0));
665  EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 3), true, 0));
666  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 3), true, 0));
667
668  // Multiple tiles:
669  // no border
670  // positions 0, 3
671  EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(1, 6), false));
672  EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), false, 0));
673  EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), false, 1));
674  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 6), false, 0));
675  EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(1, 6), false, 1));
676  EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 6), false, 0));
677  EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 6), false, 1));
678  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 6), false, 0));
679  EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(100, 6), false, 1));
680
681  // Multiple tiles:
682  // with border
683  // positions 0, 2, 3, 4
684  EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(1, 6), true));
685  EXPECT_EQ(2, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 0));
686  EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 1));
687  EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 2));
688  EXPECT_EQ(2, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 3));
689  EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 0));
690  EXPECT_EQ(2, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 1));
691  EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 2));
692  EXPECT_EQ(4, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 3));
693  EXPECT_EQ(2, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 0));
694  EXPECT_EQ(1, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 1));
695  EXPECT_EQ(1, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 2));
696  EXPECT_EQ(2, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 3));
697  EXPECT_EQ(0, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 0));
698  EXPECT_EQ(2, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 1));
699  EXPECT_EQ(3, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 2));
700  EXPECT_EQ(4, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 3));
701}
702
703TEST(TilingDataTest, SetTotalSize) {
704  TilingData data(gfx::Size(5, 5), gfx::Size(5, 5), false);
705  EXPECT_EQ(5, data.total_size().width());
706  EXPECT_EQ(5, data.total_size().height());
707  EXPECT_EQ(1, data.num_tiles_x());
708  EXPECT_EQ(5, data.TileSizeX(0));
709  EXPECT_EQ(1, data.num_tiles_y());
710  EXPECT_EQ(5, data.TileSizeY(0));
711
712  data.SetTotalSize(gfx::Size(6, 5));
713  EXPECT_EQ(6, data.total_size().width());
714  EXPECT_EQ(5, data.total_size().height());
715  EXPECT_EQ(2, data.num_tiles_x());
716  EXPECT_EQ(5, data.TileSizeX(0));
717  EXPECT_EQ(1, data.TileSizeX(1));
718  EXPECT_EQ(1, data.num_tiles_y());
719  EXPECT_EQ(5, data.TileSizeY(0));
720
721  data.SetTotalSize(gfx::Size(5, 12));
722  EXPECT_EQ(5, data.total_size().width());
723  EXPECT_EQ(12, data.total_size().height());
724  EXPECT_EQ(1, data.num_tiles_x());
725  EXPECT_EQ(5, data.TileSizeX(0));
726  EXPECT_EQ(3, data.num_tiles_y());
727  EXPECT_EQ(5, data.TileSizeY(0));
728  EXPECT_EQ(5, data.TileSizeY(1));
729  EXPECT_EQ(2, data.TileSizeY(2));
730}
731
732TEST(TilingDataTest, SetMaxTextureSizeNoBorders) {
733  TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), false);
734  EXPECT_EQ(2, data.num_tiles_x());
735  EXPECT_EQ(4, data.num_tiles_y());
736
737  data.SetMaxTextureSize(gfx::Size(32, 32));
738  EXPECT_EQ(gfx::Size(32, 32), data.max_texture_size());
739  EXPECT_EQ(1, data.num_tiles_x());
740  EXPECT_EQ(1, data.num_tiles_y());
741
742  data.SetMaxTextureSize(gfx::Size(2, 2));
743  EXPECT_EQ(gfx::Size(2, 2), data.max_texture_size());
744  EXPECT_EQ(8, data.num_tiles_x());
745  EXPECT_EQ(16, data.num_tiles_y());
746
747  data.SetMaxTextureSize(gfx::Size(5, 5));
748  EXPECT_EQ(gfx::Size(5, 5), data.max_texture_size());
749  EXPECT_EQ(4, data.num_tiles_x());
750  EXPECT_EQ(7, data.num_tiles_y());
751
752  data.SetMaxTextureSize(gfx::Size(8, 5));
753  EXPECT_EQ(gfx::Size(8, 5), data.max_texture_size());
754  EXPECT_EQ(2, data.num_tiles_x());
755  EXPECT_EQ(7, data.num_tiles_y());
756}
757
758TEST(TilingDataTest, SetMaxTextureSizeBorders) {
759  TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), true);
760  EXPECT_EQ(3, data.num_tiles_x());
761  EXPECT_EQ(5, data.num_tiles_y());
762
763  data.SetMaxTextureSize(gfx::Size(32, 32));
764  EXPECT_EQ(gfx::Size(32, 32), data.max_texture_size());
765  EXPECT_EQ(1, data.num_tiles_x());
766  EXPECT_EQ(1, data.num_tiles_y());
767
768  data.SetMaxTextureSize(gfx::Size(2, 2));
769  EXPECT_EQ(gfx::Size(2, 2), data.max_texture_size());
770  EXPECT_EQ(0, data.num_tiles_x());
771  EXPECT_EQ(0, data.num_tiles_y());
772
773  data.SetMaxTextureSize(gfx::Size(5, 5));
774  EXPECT_EQ(gfx::Size(5, 5), data.max_texture_size());
775  EXPECT_EQ(5, data.num_tiles_x());
776  EXPECT_EQ(10, data.num_tiles_y());
777
778  data.SetMaxTextureSize(gfx::Size(8, 5));
779  EXPECT_EQ(gfx::Size(8, 5), data.max_texture_size());
780  EXPECT_EQ(3, data.num_tiles_x());
781  EXPECT_EQ(10, data.num_tiles_y());
782}
783
784TEST(TilingDataTest, Assignment) {
785  {
786    TilingData source(gfx::Size(8, 8), gfx::Size(16, 32), true);
787    TilingData dest = source;
788    EXPECT_EQ(source.border_texels(), dest.border_texels());
789    EXPECT_EQ(source.max_texture_size(), dest.max_texture_size());
790    EXPECT_EQ(source.num_tiles_x(), dest.num_tiles_x());
791    EXPECT_EQ(source.num_tiles_y(), dest.num_tiles_y());
792    EXPECT_EQ(source.total_size().width(), dest.total_size().width());
793    EXPECT_EQ(source.total_size().height(), dest.total_size().height());
794  }
795  {
796    TilingData source(gfx::Size(7, 3), gfx::Size(6, 100), false);
797    TilingData dest(source);
798    EXPECT_EQ(source.border_texels(), dest.border_texels());
799    EXPECT_EQ(source.max_texture_size(), dest.max_texture_size());
800    EXPECT_EQ(source.num_tiles_x(), dest.num_tiles_x());
801    EXPECT_EQ(source.num_tiles_y(), dest.num_tiles_y());
802    EXPECT_EQ(source.total_size().width(), dest.total_size().width());
803    EXPECT_EQ(source.total_size().height(), dest.total_size().height());
804  }
805}
806
807TEST(TilingDataTest, SetBorderTexels) {
808  TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), false);
809  EXPECT_EQ(2, data.num_tiles_x());
810  EXPECT_EQ(4, data.num_tiles_y());
811
812  data.SetHasBorderTexels(true);
813  EXPECT_EQ(3, data.num_tiles_x());
814  EXPECT_EQ(5, data.num_tiles_y());
815
816  data.SetHasBorderTexels(true);
817  EXPECT_EQ(3, data.num_tiles_x());
818  EXPECT_EQ(5, data.num_tiles_y());
819
820  data.SetHasBorderTexels(false);
821  EXPECT_EQ(2, data.num_tiles_x());
822  EXPECT_EQ(4, data.num_tiles_y());
823}
824
825TEST(TilingDataTest, LargeBorders) {
826  TilingData data(gfx::Size(100, 80), gfx::Size(200, 145), 30);
827  EXPECT_EQ(30, data.border_texels());
828
829  EXPECT_EQ(70, data.TileSizeX(0));
830  EXPECT_EQ(40, data.TileSizeX(1));
831  EXPECT_EQ(40, data.TileSizeX(2));
832  EXPECT_EQ(50, data.TileSizeX(3));
833  EXPECT_EQ(4, data.num_tiles_x());
834
835  EXPECT_EQ(50, data.TileSizeY(0));
836  EXPECT_EQ(20, data.TileSizeY(1));
837  EXPECT_EQ(20, data.TileSizeY(2));
838  EXPECT_EQ(20, data.TileSizeY(3));
839  EXPECT_EQ(35, data.TileSizeY(4));
840  EXPECT_EQ(5, data.num_tiles_y());
841
842  EXPECT_RECT_EQ(gfx::Rect(0, 0, 70, 50), data.TileBounds(0, 0));
843  EXPECT_RECT_EQ(gfx::Rect(70, 50, 40, 20), data.TileBounds(1, 1));
844  EXPECT_RECT_EQ(gfx::Rect(110, 110, 40, 35), data.TileBounds(2, 4));
845  EXPECT_RECT_EQ(gfx::Rect(150, 70, 50, 20), data.TileBounds(3, 2));
846  EXPECT_RECT_EQ(gfx::Rect(150, 110, 50, 35), data.TileBounds(3, 4));
847
848  EXPECT_RECT_EQ(gfx::Rect(0, 0, 100, 80), data.TileBoundsWithBorder(0, 0));
849  EXPECT_RECT_EQ(gfx::Rect(40, 20, 100, 80), data.TileBoundsWithBorder(1, 1));
850  EXPECT_RECT_EQ(gfx::Rect(80, 80, 100, 65), data.TileBoundsWithBorder(2, 4));
851  EXPECT_RECT_EQ(gfx::Rect(120, 40, 80, 80), data.TileBoundsWithBorder(3, 2));
852  EXPECT_RECT_EQ(gfx::Rect(120, 80, 80, 65), data.TileBoundsWithBorder(3, 4));
853
854  EXPECT_EQ(0, data.TileXIndexFromSrcCoord(0));
855  EXPECT_EQ(0, data.TileXIndexFromSrcCoord(69));
856  EXPECT_EQ(1, data.TileXIndexFromSrcCoord(70));
857  EXPECT_EQ(1, data.TileXIndexFromSrcCoord(109));
858  EXPECT_EQ(2, data.TileXIndexFromSrcCoord(110));
859  EXPECT_EQ(2, data.TileXIndexFromSrcCoord(149));
860  EXPECT_EQ(3, data.TileXIndexFromSrcCoord(150));
861  EXPECT_EQ(3, data.TileXIndexFromSrcCoord(199));
862
863  EXPECT_EQ(0, data.TileYIndexFromSrcCoord(0));
864  EXPECT_EQ(0, data.TileYIndexFromSrcCoord(49));
865  EXPECT_EQ(1, data.TileYIndexFromSrcCoord(50));
866  EXPECT_EQ(1, data.TileYIndexFromSrcCoord(69));
867  EXPECT_EQ(2, data.TileYIndexFromSrcCoord(70));
868  EXPECT_EQ(2, data.TileYIndexFromSrcCoord(89));
869  EXPECT_EQ(3, data.TileYIndexFromSrcCoord(90));
870  EXPECT_EQ(3, data.TileYIndexFromSrcCoord(109));
871  EXPECT_EQ(4, data.TileYIndexFromSrcCoord(110));
872  EXPECT_EQ(4, data.TileYIndexFromSrcCoord(144));
873
874  EXPECT_EQ(0, data.FirstBorderTileXIndexFromSrcCoord(0));
875  EXPECT_EQ(0, data.FirstBorderTileXIndexFromSrcCoord(99));
876  EXPECT_EQ(1, data.FirstBorderTileXIndexFromSrcCoord(100));
877  EXPECT_EQ(1, data.FirstBorderTileXIndexFromSrcCoord(139));
878  EXPECT_EQ(2, data.FirstBorderTileXIndexFromSrcCoord(140));
879  EXPECT_EQ(2, data.FirstBorderTileXIndexFromSrcCoord(179));
880  EXPECT_EQ(3, data.FirstBorderTileXIndexFromSrcCoord(180));
881  EXPECT_EQ(3, data.FirstBorderTileXIndexFromSrcCoord(199));
882
883  EXPECT_EQ(0, data.FirstBorderTileYIndexFromSrcCoord(0));
884  EXPECT_EQ(0, data.FirstBorderTileYIndexFromSrcCoord(79));
885  EXPECT_EQ(1, data.FirstBorderTileYIndexFromSrcCoord(80));
886  EXPECT_EQ(1, data.FirstBorderTileYIndexFromSrcCoord(99));
887  EXPECT_EQ(2, data.FirstBorderTileYIndexFromSrcCoord(100));
888  EXPECT_EQ(2, data.FirstBorderTileYIndexFromSrcCoord(119));
889  EXPECT_EQ(3, data.FirstBorderTileYIndexFromSrcCoord(120));
890  EXPECT_EQ(3, data.FirstBorderTileYIndexFromSrcCoord(139));
891  EXPECT_EQ(4, data.FirstBorderTileYIndexFromSrcCoord(140));
892  EXPECT_EQ(4, data.FirstBorderTileYIndexFromSrcCoord(144));
893
894  EXPECT_EQ(0, data.LastBorderTileXIndexFromSrcCoord(0));
895  EXPECT_EQ(0, data.LastBorderTileXIndexFromSrcCoord(39));
896  EXPECT_EQ(1, data.LastBorderTileXIndexFromSrcCoord(40));
897  EXPECT_EQ(1, data.LastBorderTileXIndexFromSrcCoord(79));
898  EXPECT_EQ(2, data.LastBorderTileXIndexFromSrcCoord(80));
899  EXPECT_EQ(2, data.LastBorderTileXIndexFromSrcCoord(119));
900  EXPECT_EQ(3, data.LastBorderTileXIndexFromSrcCoord(120));
901  EXPECT_EQ(3, data.LastBorderTileXIndexFromSrcCoord(199));
902
903  EXPECT_EQ(0, data.LastBorderTileYIndexFromSrcCoord(0));
904  EXPECT_EQ(0, data.LastBorderTileYIndexFromSrcCoord(19));
905  EXPECT_EQ(1, data.LastBorderTileYIndexFromSrcCoord(20));
906  EXPECT_EQ(1, data.LastBorderTileYIndexFromSrcCoord(39));
907  EXPECT_EQ(2, data.LastBorderTileYIndexFromSrcCoord(40));
908  EXPECT_EQ(2, data.LastBorderTileYIndexFromSrcCoord(59));
909  EXPECT_EQ(3, data.LastBorderTileYIndexFromSrcCoord(60));
910  EXPECT_EQ(3, data.LastBorderTileYIndexFromSrcCoord(79));
911  EXPECT_EQ(4, data.LastBorderTileYIndexFromSrcCoord(80));
912  EXPECT_EQ(4, data.LastBorderTileYIndexFromSrcCoord(144));
913}
914
915void TestIterate(
916    const TilingData& data,
917    gfx::Rect rect,
918    int expect_left,
919    int expect_top,
920    int expect_right,
921    int expect_bottom) {
922
923  EXPECT_GE(expect_left, 0);
924  EXPECT_GE(expect_top, 0);
925  EXPECT_LT(expect_right, data.num_tiles_x());
926  EXPECT_LT(expect_bottom, data.num_tiles_y());
927
928  std::vector<std::pair<int, int> > original_expected;
929  for (int x = 0; x < data.num_tiles_x(); ++x) {
930    for (int y = 0; y < data.num_tiles_y(); ++y) {
931      gfx::Rect bounds = data.TileBoundsWithBorder(x, y);
932      if (x >= expect_left && x <= expect_right &&
933          y >= expect_top && y <= expect_bottom) {
934        EXPECT_TRUE(bounds.Intersects(rect));
935        original_expected.push_back(std::make_pair(x, y));
936      } else {
937        EXPECT_FALSE(bounds.Intersects(rect));
938      }
939    }
940  }
941
942  // Verify with vanilla iterator.
943  {
944    std::vector<std::pair<int, int> > expected = original_expected;
945    for (TilingData::Iterator iter(&data, rect); iter; ++iter) {
946      bool found = false;
947      for (size_t i = 0; i < expected.size(); ++i) {
948        if (expected[i] == iter.index()) {
949          expected[i] = expected.back();
950          expected.pop_back();
951          found = true;
952          break;
953        }
954      }
955      EXPECT_TRUE(found);
956    }
957    EXPECT_EQ(0u, expected.size());
958  }
959
960  // Make sure this also works with a difference iterator and an empty ignore.
961  {
962    std::vector<std::pair<int, int> > expected = original_expected;
963    for (TilingData::DifferenceIterator iter(&data, rect, gfx::Rect());
964         iter; ++iter) {
965      bool found = false;
966      for (size_t i = 0; i < expected.size(); ++i) {
967        if (expected[i] == iter.index()) {
968          expected[i] = expected.back();
969          expected.pop_back();
970          found = true;
971          break;
972        }
973      }
974      EXPECT_TRUE(found);
975    }
976    EXPECT_EQ(0u, expected.size());
977  }
978}
979
980TEST(TilingDataTest, IteratorNoBorderTexels) {
981  TilingData data(gfx::Size(10, 10), gfx::Size(40, 25), false);
982  // X border index by src coord: [0-10), [10-20), [20, 30), [30, 40)
983  // Y border index by src coord: [0-10), [10-20), [20, 25)
984  TestIterate(data, gfx::Rect(0, 0, 40, 25), 0, 0, 3, 2);
985  TestIterate(data, gfx::Rect(15, 15, 8, 8), 1, 1, 2, 2);
986
987  // Oversized.
988  TestIterate(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 3, 2);
989  TestIterate(data, gfx::Rect(-100, 20, 1000, 1), 0, 2, 3, 2);
990  TestIterate(data, gfx::Rect(29, -100, 31, 1000), 2, 0, 3, 2);
991  // Nonintersecting.
992  TestIterate(data, gfx::Rect(60, 80, 100, 100), 0, 0, -1, -1);
993}
994
995TEST(TilingDataTest, IteratorOneBorderTexel) {
996  TilingData data(gfx::Size(10, 20), gfx::Size(25, 45), true);
997  // X border index by src coord: [0-10), [8-18), [16-25)
998  // Y border index by src coord: [0-20), [18-38), [36-45)
999  TestIterate(data, gfx::Rect(0, 0, 25, 45), 0, 0, 2, 2);
1000  TestIterate(data, gfx::Rect(18, 19, 3, 17), 2, 0, 2, 1);
1001  TestIterate(data, gfx::Rect(10, 20, 6, 16), 1, 1, 1, 1);
1002  TestIterate(data, gfx::Rect(9, 19, 8, 18), 0, 0, 2, 2);
1003
1004  // Oversized.
1005  TestIterate(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 2);
1006  TestIterate(data, gfx::Rect(-100, 20, 1000, 1), 0, 1, 2, 1);
1007  TestIterate(data, gfx::Rect(18, -100, 6, 1000), 2, 0, 2, 2);
1008  // Nonintersecting.
1009  TestIterate(data, gfx::Rect(60, 80, 100, 100), 0, 0, -1, -1);
1010}
1011
1012TEST(TilingDataTest, IteratorManyBorderTexels) {
1013  TilingData data(gfx::Size(50, 60), gfx::Size(65, 110), 20);
1014  // X border index by src coord: [0-50), [10-60), [20-65)
1015  // Y border index by src coord: [0-60), [20-80), [40-100), [60-110)
1016  TestIterate(data, gfx::Rect(0, 0, 65, 110), 0, 0, 2, 3);
1017  TestIterate(data, gfx::Rect(50, 60, 15, 65), 1, 1, 2, 3);
1018  TestIterate(data, gfx::Rect(60, 30, 2, 10), 2, 0, 2, 1);
1019
1020  // Oversized.
1021  TestIterate(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 3);
1022  TestIterate(data, gfx::Rect(-100, 10, 1000, 10), 0, 0, 2, 0);
1023  TestIterate(data, gfx::Rect(10, -100, 10, 1000), 0, 0, 1, 3);
1024  // Nonintersecting.
1025  TestIterate(data, gfx::Rect(65, 110, 100, 100), 0, 0, -1, -1);
1026}
1027
1028TEST(TilingDataTest, IteratorOneTile) {
1029  TilingData no_border(gfx::Size(1000, 1000), gfx::Size(30, 40), false);
1030  TestIterate(no_border, gfx::Rect(0, 0, 30, 40), 0, 0, 0, 0);
1031  TestIterate(no_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
1032  TestIterate(no_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
1033
1034  TilingData one_border(gfx::Size(1000, 1000), gfx::Size(30, 40), true);
1035  TestIterate(one_border, gfx::Rect(0, 0, 30, 40), 0, 0, 0, 0);
1036  TestIterate(one_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
1037  TestIterate(one_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
1038
1039  TilingData big_border(gfx::Size(1000, 1000), gfx::Size(30, 40), 50);
1040  TestIterate(big_border, gfx::Rect(0, 0, 30, 40), 0, 0, 0, 0);
1041  TestIterate(big_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
1042  TestIterate(big_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
1043}
1044
1045TEST(TilingDataTest, IteratorNoTiles) {
1046  TilingData data(gfx::Size(100, 100), gfx::Size(), false);
1047  TestIterate(data, gfx::Rect(0, 0, 100, 100), 0, 0, -1, -1);
1048}
1049
1050void TestDiff(
1051    const TilingData& data,
1052    gfx::Rect consider,
1053    gfx::Rect ignore,
1054    size_t num_tiles) {
1055
1056  std::vector<std::pair<int, int> > expected;
1057  for (int y = 0; y < data.num_tiles_y(); ++y) {
1058    for (int x = 0; x < data.num_tiles_x(); ++x) {
1059      gfx::Rect bounds = data.TileBoundsWithBorder(x, y);
1060      if (bounds.Intersects(consider) && !bounds.Intersects(ignore))
1061        expected.push_back(std::make_pair(x, y));
1062    }
1063  }
1064
1065  // Sanity check the test.
1066  EXPECT_EQ(num_tiles, expected.size());
1067
1068  for (TilingData::DifferenceIterator iter(&data, consider, ignore);
1069       iter; ++iter) {
1070    bool found = false;
1071    for (size_t i = 0; i < expected.size(); ++i) {
1072      if (expected[i] == iter.index()) {
1073        expected[i] = expected.back();
1074        expected.pop_back();
1075        found = true;
1076        break;
1077      }
1078    }
1079    EXPECT_TRUE(found);
1080  }
1081  EXPECT_EQ(0u, expected.size());
1082}
1083
1084TEST(TilingDataTest, DifferenceIteratorIgnoreGeometry) {
1085  // This test is checking that the iterator can handle different geometries of
1086  // ignore rects relative to the consider rect.  The consider rect indices
1087  // themselves are mostly tested by the non-difference iterator tests, so the
1088  // full rect is mostly used here for simplicity.
1089
1090  // X border index by src coord: [0-10), [10-20), [20, 30), [30, 40)
1091  // Y border index by src coord: [0-10), [10-20), [20, 25)
1092  TilingData data(gfx::Size(10, 10), gfx::Size(40, 25), false);
1093
1094  // Fully ignored
1095  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(0, 0, 40, 25), 0);
1096  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(-100, -100, 200, 200), 0);
1097  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(9, 9, 30, 15), 0);
1098  TestDiff(data, gfx::Rect(15, 15, 8, 8), gfx::Rect(15, 15, 8, 8), 0);
1099
1100  // Fully un-ignored
1101  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(-30, -20, 8, 8), 12);
1102  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(), 12);
1103
1104  // Top left, remove 2x2 tiles
1105  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(0, 0, 20, 19), 8);
1106  // Bottom right, remove 2x2 tiles
1107  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(20, 15, 20, 6), 8);
1108  // Bottom left, remove 2x2 tiles
1109  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(0, 15, 20, 6), 8);
1110  // Top right, remove 2x2 tiles
1111  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(20, 0, 20, 19), 8);
1112  // Center, remove only one tile
1113  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(10, 10, 5, 5), 11);
1114
1115  // Left column, flush left, removing two columns
1116  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(0, 0, 11, 25), 6);
1117  // Middle column, removing two columns
1118  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(11, 0, 11, 25), 6);
1119  // Right column, flush right, removing one column
1120  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(30, 0, 2, 25), 9);
1121
1122  // Top row, flush top, removing one row
1123  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(0, 5, 40, 5), 8);
1124  // Middle row, removing one row
1125  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(0, 13, 40, 5), 8);
1126  // Bottom row, flush bottom, removing two rows
1127  TestDiff(data, gfx::Rect(0, 0, 40, 25), gfx::Rect(0, 13, 40, 12), 4);
1128
1129  // Non-intersecting, but still touching two of the same tiles.
1130  TestDiff(data, gfx::Rect(8, 0, 32, 25), gfx::Rect(0, 12, 5, 12), 10);
1131
1132  // Intersecting, but neither contains the other. 2x3 with one overlap.
1133  TestDiff(data, gfx::Rect(5, 2, 20, 10), gfx::Rect(25, 15, 5, 10), 5);
1134}
1135
1136TEST(TilingDataTest, DifferenceIteratorManyBorderTexels) {
1137  // X border index by src coord: [0-50), [10-60), [20-65)
1138  // Y border index by src coord: [0-60), [20-80), [40-100), [60-110)
1139  TilingData data(gfx::Size(50, 60), gfx::Size(65, 110), 20);
1140
1141  // Ignore one column, three rows
1142  TestDiff(data, gfx::Rect(0, 30, 55, 80), gfx::Rect(5, 30, 5, 15), 9);
1143
1144  // Knock out three columns, leaving only one.
1145  TestDiff(data, gfx::Rect(10, 30, 55, 80), gfx::Rect(30, 59, 20, 1), 3);
1146
1147  // Overlap all tiles with ignore rect.
1148  TestDiff(data, gfx::Rect(0, 0, 65, 110), gfx::Rect(30, 59, 1, 2), 0);
1149}
1150
1151TEST(TilingDataTest, DifferenceIteratorOneTile) {
1152  TilingData no_border(gfx::Size(1000, 1000), gfx::Size(30, 40), false);
1153  TestDiff(no_border, gfx::Rect(0, 0, 30, 40), gfx::Rect(), 1);
1154  TestDiff(no_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
1155
1156  TilingData one_border(gfx::Size(1000, 1000), gfx::Size(30, 40), true);
1157  TestDiff(one_border, gfx::Rect(0, 0, 30, 40), gfx::Rect(), 1);
1158  TestDiff(one_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
1159
1160  TilingData big_border(gfx::Size(1000, 1000), gfx::Size(30, 40), 50);
1161  TestDiff(big_border, gfx::Rect(0, 0, 30, 40), gfx::Rect(), 1);
1162  TestDiff(big_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
1163}
1164
1165TEST(TilingDataTest, DifferenceIteratorNoTiles) {
1166  TilingData data(gfx::Size(100, 100), gfx::Size(), false);
1167  TestDiff(data, gfx::Rect(0, 0, 100, 100), gfx::Rect(0, 0, 5, 5), 0);
1168}
1169
1170}  // namespace
1171}  // namespace cc
1172