Home | History | Annotate | Download | only in base
      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 <algorithm>
      8 #include <vector>
      9 
     10 #include "cc/test/geometry_test_utils.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 namespace cc {
     14 namespace {
     15 
     16 int NumTiles(const gfx::Size& max_texture_size,
     17              const gfx::Size& tiling_size,
     18              bool has_border_texels) {
     19   TilingData tiling(max_texture_size, tiling_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 
     30 int XIndex(const gfx::Size& max_texture_size,
     31            const gfx::Size& tiling_size,
     32            bool has_border_texels,
     33            int x_coord) {
     34   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     35   return tiling.TileXIndexFromSrcCoord(x_coord);
     36 }
     37 
     38 int YIndex(const gfx::Size& max_texture_size,
     39            const gfx::Size& tiling_size,
     40            bool has_border_texels,
     41            int y_coord) {
     42   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     43   return tiling.TileYIndexFromSrcCoord(y_coord);
     44 }
     45 
     46 int MinBorderXIndex(const gfx::Size& max_texture_size,
     47                     const gfx::Size& tiling_size,
     48                     bool has_border_texels,
     49                     int x_coord) {
     50   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     51   return tiling.FirstBorderTileXIndexFromSrcCoord(x_coord);
     52 }
     53 
     54 int MinBorderYIndex(const gfx::Size& max_texture_size,
     55                     const gfx::Size& tiling_size,
     56                     bool has_border_texels,
     57                     int y_coord) {
     58   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     59   return tiling.FirstBorderTileYIndexFromSrcCoord(y_coord);
     60 }
     61 
     62 int MaxBorderXIndex(const gfx::Size& max_texture_size,
     63                     const gfx::Size& tiling_size,
     64                     bool has_border_texels,
     65                     int x_coord) {
     66   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     67   return tiling.LastBorderTileXIndexFromSrcCoord(x_coord);
     68 }
     69 
     70 int MaxBorderYIndex(const gfx::Size& max_texture_size,
     71                     const gfx::Size& tiling_size,
     72                     bool has_border_texels,
     73                     int y_coord) {
     74   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     75   return tiling.LastBorderTileYIndexFromSrcCoord(y_coord);
     76 }
     77 
     78 int PosX(const gfx::Size& max_texture_size,
     79          const gfx::Size& tiling_size,
     80          bool has_border_texels,
     81          int x_index) {
     82   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     83   return tiling.TilePositionX(x_index);
     84 }
     85 
     86 int PosY(const gfx::Size& max_texture_size,
     87          const gfx::Size& tiling_size,
     88          bool has_border_texels,
     89          int y_index) {
     90   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     91   return tiling.TilePositionY(y_index);
     92 }
     93 
     94 int SizeX(const gfx::Size& max_texture_size,
     95           const gfx::Size& tiling_size,
     96           bool has_border_texels,
     97           int x_index) {
     98   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
     99   return tiling.TileSizeX(x_index);
    100 }
    101 
    102 int SizeY(const gfx::Size& max_texture_size,
    103           const gfx::Size& tiling_size,
    104           bool has_border_texels,
    105           int y_index) {
    106   TilingData tiling(max_texture_size, tiling_size, has_border_texels);
    107   return tiling.TileSizeY(y_index);
    108 }
    109 
    110 class TilingDataTest : public ::testing::TestWithParam<gfx::Point> {};
    111 
    112 TEST(TilingDataTest, NumTiles_NoTiling) {
    113   EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), false));
    114   EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(15, 15), true));
    115   EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), true));
    116   EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(1, 16), false));
    117   EXPECT_EQ(1, NumTiles(gfx::Size(15, 15), gfx::Size(15, 15), true));
    118   EXPECT_EQ(1, NumTiles(gfx::Size(32, 16), gfx::Size(32, 16), false));
    119   EXPECT_EQ(1, NumTiles(gfx::Size(32, 16), gfx::Size(32, 16), true));
    120 }
    121 
    122 TEST(TilingDataTest, NumTiles_TilingNoBorders) {
    123   EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 0), false));
    124   EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(4, 0), false));
    125   EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 4), false));
    126   EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(4, 0), false));
    127   EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(0, 4), false));
    128   EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(1, 1), false));
    129 
    130   EXPECT_EQ(1, NumTiles(gfx::Size(1, 1), gfx::Size(1, 1), false));
    131   EXPECT_EQ(2, NumTiles(gfx::Size(1, 1), gfx::Size(1, 2), false));
    132   EXPECT_EQ(2, NumTiles(gfx::Size(1, 1), gfx::Size(2, 1), false));
    133   EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 1), false));
    134   EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 2), false));
    135   EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 1), false));
    136   EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 2), false));
    137   EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(3, 3), false));
    138 
    139   EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(1, 4), false));
    140   EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(2, 4), false));
    141   EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(3, 4), false));
    142   EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(4, 4), false));
    143   EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(5, 4), false));
    144   EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(6, 4), false));
    145   EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(7, 4), false));
    146   EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(8, 4), false));
    147   EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(9, 4), false));
    148   EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(10, 4), false));
    149   EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(11, 4), false));
    150 
    151   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(1, 5), false));
    152   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(2, 5), false));
    153   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(3, 5), false));
    154   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(4, 5), false));
    155   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(5, 5), false));
    156   EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(6, 5), false));
    157   EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(7, 5), false));
    158   EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(8, 5), false));
    159   EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(9, 5), false));
    160   EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(10, 5), false));
    161   EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(11, 5), false));
    162 
    163   EXPECT_EQ(1, NumTiles(gfx::Size(16, 16), gfx::Size(16, 16), false));
    164   EXPECT_EQ(1, NumTiles(gfx::Size(17, 17), gfx::Size(16, 16), false));
    165   EXPECT_EQ(4, NumTiles(gfx::Size(15, 15), gfx::Size(16, 16), false));
    166   EXPECT_EQ(4, NumTiles(gfx::Size(8, 8), gfx::Size(16, 16), false));
    167   EXPECT_EQ(6, NumTiles(gfx::Size(8, 8), gfx::Size(17, 16), false));
    168 
    169   EXPECT_EQ(8, NumTiles(gfx::Size(5, 8), gfx::Size(17, 16), false));
    170 }
    171 
    172 TEST(TilingDataTest, NumTiles_TilingWithBorders) {
    173   EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 0), true));
    174   EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(4, 0), true));
    175   EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(0, 4), true));
    176   EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(4, 0), true));
    177   EXPECT_EQ(0, NumTiles(gfx::Size(4, 4), gfx::Size(0, 4), true));
    178   EXPECT_EQ(0, NumTiles(gfx::Size(0, 0), gfx::Size(1, 1), true));
    179 
    180   EXPECT_EQ(1, NumTiles(gfx::Size(1, 1), gfx::Size(1, 1), true));
    181   EXPECT_EQ(0, NumTiles(gfx::Size(1, 1), gfx::Size(1, 2), true));
    182   EXPECT_EQ(0, NumTiles(gfx::Size(1, 1), gfx::Size(2, 1), true));
    183   EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 1), true));
    184   EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(1, 2), true));
    185   EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 1), true));
    186   EXPECT_EQ(1, NumTiles(gfx::Size(2, 2), gfx::Size(2, 2), true));
    187 
    188   EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(1, 3), true));
    189   EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(2, 3), true));
    190   EXPECT_EQ(1, NumTiles(gfx::Size(3, 3), gfx::Size(3, 3), true));
    191   EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(4, 3), true));
    192   EXPECT_EQ(3, NumTiles(gfx::Size(3, 3), gfx::Size(5, 3), true));
    193   EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(6, 3), true));
    194   EXPECT_EQ(5, NumTiles(gfx::Size(3, 3), gfx::Size(7, 3), true));
    195 
    196   EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(1, 4), true));
    197   EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(2, 4), true));
    198   EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(3, 4), true));
    199   EXPECT_EQ(1, NumTiles(gfx::Size(4, 4), gfx::Size(4, 4), true));
    200   EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(5, 4), true));
    201   EXPECT_EQ(2, NumTiles(gfx::Size(4, 4), gfx::Size(6, 4), true));
    202   EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(7, 4), true));
    203   EXPECT_EQ(3, NumTiles(gfx::Size(4, 4), gfx::Size(8, 4), true));
    204   EXPECT_EQ(4, NumTiles(gfx::Size(4, 4), gfx::Size(9, 4), true));
    205   EXPECT_EQ(4, NumTiles(gfx::Size(4, 4), gfx::Size(10, 4), true));
    206   EXPECT_EQ(5, NumTiles(gfx::Size(4, 4), gfx::Size(11, 4), true));
    207 
    208   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(1, 5), true));
    209   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(2, 5), true));
    210   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(3, 5), true));
    211   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(4, 5), true));
    212   EXPECT_EQ(1, NumTiles(gfx::Size(5, 5), gfx::Size(5, 5), true));
    213   EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(6, 5), true));
    214   EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(7, 5), true));
    215   EXPECT_EQ(2, NumTiles(gfx::Size(5, 5), gfx::Size(8, 5), true));
    216   EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(9, 5), true));
    217   EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(10, 5), true));
    218   EXPECT_EQ(3, NumTiles(gfx::Size(5, 5), gfx::Size(11, 5), true));
    219 
    220   EXPECT_EQ(30, NumTiles(gfx::Size(8, 5), gfx::Size(16, 32), true));
    221 }
    222 
    223 TEST(TilingDataTest, TileXIndexFromSrcCoord) {
    224   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
    225   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
    226   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
    227   EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
    228   EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
    229   EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
    230   EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
    231   EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
    232   EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
    233   EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
    234   EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
    235   EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
    236 
    237   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
    238   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
    239   EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
    240   EXPECT_EQ(2, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
    241   EXPECT_EQ(3, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
    242   EXPECT_EQ(4, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
    243   EXPECT_EQ(5, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
    244   EXPECT_EQ(6, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
    245   EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
    246   EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
    247   EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
    248   EXPECT_EQ(7, XIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
    249 
    250   EXPECT_EQ(0, XIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
    251   EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
    252   EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
    253   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
    254   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
    255   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
    256 
    257   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
    258   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
    259   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
    260   EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
    261 
    262   EXPECT_EQ(0, XIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
    263   EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
    264   EXPECT_EQ(0, XIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
    265   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
    266   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
    267   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
    268 
    269   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
    270   EXPECT_EQ(0, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
    271   EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
    272   EXPECT_EQ(1, XIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
    273 }
    274 
    275 TEST(TilingDataTest, FirstBorderTileXIndexFromSrcCoord) {
    276   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
    277   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
    278   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
    279   EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
    280   EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
    281   EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
    282   EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
    283   EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
    284   EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
    285   EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
    286   EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
    287   EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
    288 
    289   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
    290   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
    291   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
    292   EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
    293   EXPECT_EQ(2, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
    294   EXPECT_EQ(3, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
    295   EXPECT_EQ(4, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
    296   EXPECT_EQ(5, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
    297   EXPECT_EQ(6, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
    298   EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
    299   EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
    300   EXPECT_EQ(7, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
    301 
    302   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
    303   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
    304   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
    305   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
    306   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
    307   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
    308 
    309   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
    310   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
    311   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
    312   EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
    313 
    314   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
    315   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
    316   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
    317   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
    318   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
    319   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
    320 
    321   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
    322   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
    323   EXPECT_EQ(0, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
    324   EXPECT_EQ(1, MinBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
    325 }
    326 
    327 TEST(TilingDataTest, LastBorderTileXIndexFromSrcCoord) {
    328   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
    329   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
    330   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
    331   EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
    332   EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
    333   EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
    334   EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
    335   EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
    336   EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
    337   EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
    338   EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
    339   EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
    340 
    341   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
    342   EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
    343   EXPECT_EQ(2, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
    344   EXPECT_EQ(3, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
    345   EXPECT_EQ(4, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
    346   EXPECT_EQ(5, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
    347   EXPECT_EQ(6, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
    348   EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
    349   EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
    350   EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
    351   EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
    352   EXPECT_EQ(7, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
    353 
    354   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
    355   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
    356   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
    357   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
    358   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
    359   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
    360 
    361   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 0));
    362   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 1));
    363   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 2));
    364   EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), false, 3));
    365 
    366   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
    367   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
    368   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
    369   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
    370   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
    371   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
    372 
    373   EXPECT_EQ(0, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 0));
    374   EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 1));
    375   EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 2));
    376   EXPECT_EQ(1, MaxBorderXIndex(gfx::Size(3, 3), gfx::Size(4, 3), true, 3));
    377 }
    378 
    379 TEST(TilingDataTest, TileYIndexFromSrcCoord) {
    380   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
    381   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
    382   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
    383   EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
    384   EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
    385   EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
    386   EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
    387   EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
    388   EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
    389   EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
    390   EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
    391   EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
    392 
    393   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
    394   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
    395   EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
    396   EXPECT_EQ(2, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
    397   EXPECT_EQ(3, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
    398   EXPECT_EQ(4, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
    399   EXPECT_EQ(5, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
    400   EXPECT_EQ(6, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
    401   EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
    402   EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
    403   EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
    404   EXPECT_EQ(7, YIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
    405 
    406   EXPECT_EQ(0, YIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
    407   EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
    408   EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
    409   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
    410   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
    411   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
    412 
    413   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
    414   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
    415   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
    416   EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
    417 
    418   EXPECT_EQ(0, YIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
    419   EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
    420   EXPECT_EQ(0, YIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
    421   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
    422   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
    423   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
    424 
    425   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
    426   EXPECT_EQ(0, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
    427   EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
    428   EXPECT_EQ(1, YIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
    429 }
    430 
    431 TEST(TilingDataTest, FirstBorderTileYIndexFromSrcCoord) {
    432   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
    433   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
    434   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
    435   EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
    436   EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
    437   EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
    438   EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
    439   EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
    440   EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
    441   EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
    442   EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
    443   EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
    444 
    445   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
    446   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
    447   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
    448   EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
    449   EXPECT_EQ(2, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
    450   EXPECT_EQ(3, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
    451   EXPECT_EQ(4, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
    452   EXPECT_EQ(5, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
    453   EXPECT_EQ(6, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
    454   EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
    455   EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
    456   EXPECT_EQ(7, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
    457 
    458   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
    459   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
    460   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
    461   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
    462   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
    463   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
    464 
    465   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
    466   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
    467   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
    468   EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
    469 
    470   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
    471   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
    472   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
    473   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
    474   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
    475   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
    476 
    477   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
    478   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
    479   EXPECT_EQ(0, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
    480   EXPECT_EQ(1, MinBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
    481 }
    482 
    483 TEST(TilingDataTest, LastBorderTileYIndexFromSrcCoord) {
    484   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 0));
    485   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 1));
    486   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 2));
    487   EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 3));
    488   EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 4));
    489   EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 5));
    490   EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 6));
    491   EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 7));
    492   EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 8));
    493   EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 9));
    494   EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 10));
    495   EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), false, 11));
    496 
    497   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 0));
    498   EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 1));
    499   EXPECT_EQ(2, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 2));
    500   EXPECT_EQ(3, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 3));
    501   EXPECT_EQ(4, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 4));
    502   EXPECT_EQ(5, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 5));
    503   EXPECT_EQ(6, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 6));
    504   EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 7));
    505   EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 8));
    506   EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 9));
    507   EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 10));
    508   EXPECT_EQ(7, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(10, 10), true, 11));
    509 
    510   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), false, 0));
    511   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 0));
    512   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), false, 1));
    513   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 0));
    514   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 1));
    515   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), false, 2));
    516 
    517   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 0));
    518   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 1));
    519   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 2));
    520   EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), false, 3));
    521 
    522   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(1, 1), gfx::Size(1, 1), true, 0));
    523   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 0));
    524   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(2, 2), gfx::Size(2, 2), true, 1));
    525   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 0));
    526   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 1));
    527   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 3), true, 2));
    528 
    529   EXPECT_EQ(0, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 0));
    530   EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 1));
    531   EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 2));
    532   EXPECT_EQ(1, MaxBorderYIndex(gfx::Size(3, 3), gfx::Size(3, 4), true, 3));
    533 }
    534 
    535 TEST(TilingDataTest, TileSizeX) {
    536   EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(5, 5), false, 0));
    537   EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(5, 5), true, 0));
    538 
    539   EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), false, 0));
    540   EXPECT_EQ(1, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), false, 1));
    541   EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), true, 0));
    542   EXPECT_EQ(2, SizeX(gfx::Size(5, 5), gfx::Size(6, 6), true, 1));
    543 
    544   EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), false, 0));
    545   EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), false, 1));
    546   EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), true, 0));
    547   EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(8, 8), true, 1));
    548 
    549   EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), false, 0));
    550   EXPECT_EQ(5, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), false, 1));
    551   EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 0));
    552   EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 1));
    553   EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(10, 10), true, 2));
    554 
    555   EXPECT_EQ(4, SizeX(gfx::Size(5, 5), gfx::Size(11, 11), true, 2));
    556   EXPECT_EQ(3, SizeX(gfx::Size(5, 5), gfx::Size(12, 12), true, 2));
    557 
    558   EXPECT_EQ(3, SizeX(gfx::Size(5, 9), gfx::Size(12, 17), true, 2));
    559 }
    560 
    561 TEST(TilingDataTest, TileSizeY) {
    562   EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(5, 5), false, 0));
    563   EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(5, 5), true, 0));
    564 
    565   EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), false, 0));
    566   EXPECT_EQ(1, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), false, 1));
    567   EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), true, 0));
    568   EXPECT_EQ(2, SizeY(gfx::Size(5, 5), gfx::Size(6, 6), true, 1));
    569 
    570   EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), false, 0));
    571   EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), false, 1));
    572   EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), true, 0));
    573   EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(8, 8), true, 1));
    574 
    575   EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), false, 0));
    576   EXPECT_EQ(5, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), false, 1));
    577   EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 0));
    578   EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 1));
    579   EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(10, 10), true, 2));
    580 
    581   EXPECT_EQ(4, SizeY(gfx::Size(5, 5), gfx::Size(11, 11), true, 2));
    582   EXPECT_EQ(3, SizeY(gfx::Size(5, 5), gfx::Size(12, 12), true, 2));
    583 
    584   EXPECT_EQ(3, SizeY(gfx::Size(9, 5), gfx::Size(17, 12), true, 2));
    585 }
    586 
    587 TEST(TilingDataTest, TileSizeX_and_TilePositionX) {
    588   // Single tile cases:
    589   EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
    590   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
    591   EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 100), false, 0));
    592   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 100), false, 0));
    593   EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 1), false, 0));
    594   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 1), false, 0));
    595   EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 100), false, 0));
    596   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 100), false, 0));
    597   EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
    598   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
    599   EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(1, 100), true, 0));
    600   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(1, 100), true, 0));
    601   EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 1), true, 0));
    602   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 1), true, 0));
    603   EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(3, 100), true, 0));
    604   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(3, 100), true, 0));
    605 
    606   // Multiple tiles:
    607   // no border
    608   // positions 0, 3
    609   EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(6, 1), false));
    610   EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), false, 0));
    611   EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), false, 1));
    612   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 1), false, 0));
    613   EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 1), false, 1));
    614   EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 100), false, 0));
    615   EXPECT_EQ(3, SizeX(gfx::Size(3, 3), gfx::Size(6, 100), false, 1));
    616   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 100), false, 0));
    617   EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 100), false, 1));
    618 
    619   // Multiple tiles:
    620   // with border
    621   // positions 0, 2, 3, 4
    622   EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(6, 1), true));
    623   EXPECT_EQ(2, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 0));
    624   EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 1));
    625   EXPECT_EQ(1, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 2));
    626   EXPECT_EQ(2, SizeX(gfx::Size(3, 3), gfx::Size(6, 1), true, 3));
    627   EXPECT_EQ(0, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 0));
    628   EXPECT_EQ(2, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 1));
    629   EXPECT_EQ(3, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 2));
    630   EXPECT_EQ(4, PosX(gfx::Size(3, 3), gfx::Size(6, 1), true, 3));
    631   EXPECT_EQ(2, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 0));
    632   EXPECT_EQ(1, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 1));
    633   EXPECT_EQ(1, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 2));
    634   EXPECT_EQ(2, SizeX(gfx::Size(3, 7), gfx::Size(6, 100), true, 3));
    635   EXPECT_EQ(0, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 0));
    636   EXPECT_EQ(2, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 1));
    637   EXPECT_EQ(3, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 2));
    638   EXPECT_EQ(4, PosX(gfx::Size(3, 7), gfx::Size(6, 100), true, 3));
    639 }
    640 
    641 TEST(TilingDataTest, TileSizeY_and_TilePositionY) {
    642   // Single tile cases:
    643   EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
    644   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 1), false, 0));
    645   EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(100, 1), false, 0));
    646   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 1), false, 0));
    647   EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 3), false, 0));
    648   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 3), false, 0));
    649   EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 3), false, 0));
    650   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 3), false, 0));
    651   EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
    652   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 1), true, 0));
    653   EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(100, 1), true, 0));
    654   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 1), true, 0));
    655   EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 3), true, 0));
    656   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 3), true, 0));
    657   EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 3), true, 0));
    658   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 3), true, 0));
    659 
    660   // Multiple tiles:
    661   // no border
    662   // positions 0, 3
    663   EXPECT_EQ(2, NumTiles(gfx::Size(3, 3), gfx::Size(1, 6), false));
    664   EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), false, 0));
    665   EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), false, 1));
    666   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 6), false, 0));
    667   EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(1, 6), false, 1));
    668   EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 6), false, 0));
    669   EXPECT_EQ(3, SizeY(gfx::Size(3, 3), gfx::Size(100, 6), false, 1));
    670   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(100, 6), false, 0));
    671   EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(100, 6), false, 1));
    672 
    673   // Multiple tiles:
    674   // with border
    675   // positions 0, 2, 3, 4
    676   EXPECT_EQ(4, NumTiles(gfx::Size(3, 3), gfx::Size(1, 6), true));
    677   EXPECT_EQ(2, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 0));
    678   EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 1));
    679   EXPECT_EQ(1, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 2));
    680   EXPECT_EQ(2, SizeY(gfx::Size(3, 3), gfx::Size(1, 6), true, 3));
    681   EXPECT_EQ(0, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 0));
    682   EXPECT_EQ(2, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 1));
    683   EXPECT_EQ(3, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 2));
    684   EXPECT_EQ(4, PosY(gfx::Size(3, 3), gfx::Size(1, 6), true, 3));
    685   EXPECT_EQ(2, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 0));
    686   EXPECT_EQ(1, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 1));
    687   EXPECT_EQ(1, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 2));
    688   EXPECT_EQ(2, SizeY(gfx::Size(7, 3), gfx::Size(100, 6), true, 3));
    689   EXPECT_EQ(0, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 0));
    690   EXPECT_EQ(2, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 1));
    691   EXPECT_EQ(3, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 2));
    692   EXPECT_EQ(4, PosY(gfx::Size(7, 3), gfx::Size(100, 6), true, 3));
    693 }
    694 
    695 TEST(TilingDataTest, SetTotalSize) {
    696   TilingData data(gfx::Size(5, 5), gfx::Size(5, 5), false);
    697   EXPECT_EQ(5, data.tiling_size().width());
    698   EXPECT_EQ(5, data.tiling_size().height());
    699   EXPECT_EQ(1, data.num_tiles_x());
    700   EXPECT_EQ(5, data.TileSizeX(0));
    701   EXPECT_EQ(1, data.num_tiles_y());
    702   EXPECT_EQ(5, data.TileSizeY(0));
    703 
    704   data.SetTilingSize(gfx::Size(6, 5));
    705   EXPECT_EQ(6, data.tiling_size().width());
    706   EXPECT_EQ(5, data.tiling_size().height());
    707   EXPECT_EQ(2, data.num_tiles_x());
    708   EXPECT_EQ(5, data.TileSizeX(0));
    709   EXPECT_EQ(1, data.TileSizeX(1));
    710   EXPECT_EQ(1, data.num_tiles_y());
    711   EXPECT_EQ(5, data.TileSizeY(0));
    712 
    713   data.SetTilingSize(gfx::Size(5, 12));
    714   EXPECT_EQ(5, data.tiling_size().width());
    715   EXPECT_EQ(12, data.tiling_size().height());
    716   EXPECT_EQ(1, data.num_tiles_x());
    717   EXPECT_EQ(5, data.TileSizeX(0));
    718   EXPECT_EQ(3, data.num_tiles_y());
    719   EXPECT_EQ(5, data.TileSizeY(0));
    720   EXPECT_EQ(5, data.TileSizeY(1));
    721   EXPECT_EQ(2, data.TileSizeY(2));
    722 }
    723 
    724 TEST(TilingDataTest, SetMaxTextureSizeNoBorders) {
    725   TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), false);
    726   EXPECT_EQ(2, data.num_tiles_x());
    727   EXPECT_EQ(4, data.num_tiles_y());
    728 
    729   data.SetMaxTextureSize(gfx::Size(32, 32));
    730   EXPECT_EQ(gfx::Size(32, 32), data.max_texture_size());
    731   EXPECT_EQ(1, data.num_tiles_x());
    732   EXPECT_EQ(1, data.num_tiles_y());
    733 
    734   data.SetMaxTextureSize(gfx::Size(2, 2));
    735   EXPECT_EQ(gfx::Size(2, 2), data.max_texture_size());
    736   EXPECT_EQ(8, data.num_tiles_x());
    737   EXPECT_EQ(16, data.num_tiles_y());
    738 
    739   data.SetMaxTextureSize(gfx::Size(5, 5));
    740   EXPECT_EQ(gfx::Size(5, 5), data.max_texture_size());
    741   EXPECT_EQ(4, data.num_tiles_x());
    742   EXPECT_EQ(7, data.num_tiles_y());
    743 
    744   data.SetMaxTextureSize(gfx::Size(8, 5));
    745   EXPECT_EQ(gfx::Size(8, 5), data.max_texture_size());
    746   EXPECT_EQ(2, data.num_tiles_x());
    747   EXPECT_EQ(7, data.num_tiles_y());
    748 }
    749 
    750 TEST(TilingDataTest, SetMaxTextureSizeBorders) {
    751   TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), true);
    752   EXPECT_EQ(3, data.num_tiles_x());
    753   EXPECT_EQ(5, data.num_tiles_y());
    754 
    755   data.SetMaxTextureSize(gfx::Size(32, 32));
    756   EXPECT_EQ(gfx::Size(32, 32), data.max_texture_size());
    757   EXPECT_EQ(1, data.num_tiles_x());
    758   EXPECT_EQ(1, data.num_tiles_y());
    759 
    760   data.SetMaxTextureSize(gfx::Size(2, 2));
    761   EXPECT_EQ(gfx::Size(2, 2), data.max_texture_size());
    762   EXPECT_EQ(0, data.num_tiles_x());
    763   EXPECT_EQ(0, data.num_tiles_y());
    764 
    765   data.SetMaxTextureSize(gfx::Size(5, 5));
    766   EXPECT_EQ(gfx::Size(5, 5), data.max_texture_size());
    767   EXPECT_EQ(5, data.num_tiles_x());
    768   EXPECT_EQ(10, data.num_tiles_y());
    769 
    770   data.SetMaxTextureSize(gfx::Size(8, 5));
    771   EXPECT_EQ(gfx::Size(8, 5), data.max_texture_size());
    772   EXPECT_EQ(3, data.num_tiles_x());
    773   EXPECT_EQ(10, data.num_tiles_y());
    774 }
    775 
    776 TEST(TilingDataTest, ExpandRectIgnoringBordersToTileBoundsEmpty) {
    777   TilingData empty_total_size(gfx::Size(0, 0), gfx::Size(8, 8), true);
    778   EXPECT_RECT_EQ(
    779       gfx::Rect(),
    780       empty_total_size.ExpandRectIgnoringBordersToTileBounds(gfx::Rect()));
    781   EXPECT_RECT_EQ(gfx::Rect(),
    782                  empty_total_size.ExpandRectIgnoringBordersToTileBounds(
    783                      gfx::Rect(100, 100, 100, 100)));
    784   EXPECT_RECT_EQ(gfx::Rect(),
    785                  empty_total_size.ExpandRectIgnoringBordersToTileBounds(
    786                      gfx::Rect(100, 100)));
    787 
    788   TilingData empty_max_texture_size(gfx::Size(8, 8), gfx::Size(0, 0), true);
    789   EXPECT_RECT_EQ(gfx::Rect(),
    790                  empty_max_texture_size.ExpandRectIgnoringBordersToTileBounds(
    791                      gfx::Rect()));
    792   EXPECT_RECT_EQ(gfx::Rect(),
    793                  empty_max_texture_size.ExpandRectIgnoringBordersToTileBounds(
    794                      gfx::Rect(100, 100, 100, 100)));
    795   EXPECT_RECT_EQ(gfx::Rect(),
    796                  empty_max_texture_size.ExpandRectIgnoringBordersToTileBounds(
    797                      gfx::Rect(100, 100)));
    798 }
    799 
    800 TEST(TilingDataTest, ExpandRectIgnoringBordersToTileBounds) {
    801   TilingData data(gfx::Size(4, 4), gfx::Size(16, 32), true);
    802 
    803   // Small rect at origin rounds up to tile 0, 0.
    804   gfx::Rect at_origin_src(1, 1);
    805   gfx::Rect at_origin_result(data.TileBounds(0, 0));
    806   EXPECT_NE(at_origin_src, at_origin_result);
    807   EXPECT_RECT_EQ(at_origin_result,
    808                  data.ExpandRectIgnoringBordersToTileBounds(at_origin_src));
    809 
    810   // Arbitrary internal rect.
    811   gfx::Rect rect_src(6, 6, 1, 3);
    812   // Tile 2, 2 => gfx::Rect(4, 4, 4, 4)
    813   // Tile 2, 3 => gfx::Rect(4, 6, 4, 4)
    814   gfx::Rect rect_result(
    815       gfx::UnionRects(data.TileBounds(2, 2), data.TileBounds(2, 3)));
    816   EXPECT_NE(rect_src, rect_result);
    817   EXPECT_RECT_EQ(rect_result,
    818                  data.ExpandRectIgnoringBordersToTileBounds(rect_src));
    819 
    820   // On tile bounds does not round up to next tile (ignores the border).
    821   gfx::Rect border_rect_src(
    822       gfx::UnionRects(data.TileBounds(1, 2), data.TileBounds(3, 4)));
    823   gfx::Rect border_rect_result(
    824       gfx::UnionRects(data.TileBounds(1, 2), data.TileBounds(3, 4)));
    825   EXPECT_RECT_EQ(border_rect_result,
    826                  data.ExpandRectIgnoringBordersToTileBounds(border_rect_src));
    827 
    828   // Equal to tiling rect.
    829   EXPECT_RECT_EQ(gfx::Rect(data.tiling_size()),
    830                  data.ExpandRectIgnoringBordersToTileBounds(
    831                      gfx::Rect(data.tiling_size())));
    832 
    833   // Containing, but larger than tiling rect.
    834   EXPECT_RECT_EQ(
    835       gfx::Rect(data.tiling_size()),
    836       data.ExpandRectIgnoringBordersToTileBounds(gfx::Rect(100, 100)));
    837 
    838   // Non-intersecting with tiling rect.
    839   gfx::Rect non_intersect(200, 200, 100, 100);
    840   EXPECT_FALSE(non_intersect.Intersects(gfx::Rect(data.tiling_size())));
    841   EXPECT_RECT_EQ(gfx::Rect(),
    842                  data.ExpandRectIgnoringBordersToTileBounds(non_intersect));
    843 
    844   TilingData data2(gfx::Size(8, 8), gfx::Size(32, 64), true);
    845 
    846   // Inside other tile border texels doesn't include other tiles.
    847   gfx::Rect inner_rect_src(data2.TileBounds(1, 1));
    848   inner_rect_src.Inset(data2.border_texels(), data.border_texels());
    849   gfx::Rect inner_rect_result(data2.TileBounds(1, 1));
    850   gfx::Rect expanded =
    851       data2.ExpandRectIgnoringBordersToTileBounds(inner_rect_src);
    852   EXPECT_EQ(inner_rect_result.ToString(), expanded.ToString());
    853 }
    854 
    855 TEST(TilingDataTest, ExpandRectToTileBounds) {
    856   TilingData data(gfx::Size(4, 4), gfx::Size(16, 32), true);
    857 
    858   // Small rect at origin rounds up to tile 0, 0.
    859   gfx::Rect at_origin_src(1, 1);
    860   gfx::Rect at_origin_result(data.TileBounds(0, 0));
    861   EXPECT_NE(at_origin_src, at_origin_result);
    862   EXPECT_RECT_EQ(at_origin_result, data.ExpandRectToTileBounds(at_origin_src));
    863 
    864   // Arbitrary internal rect.
    865   gfx::Rect rect_src(6, 6, 1, 3);
    866   // Tile 2, 2 => gfx::Rect(4, 4, 4, 4)
    867   // Tile 3, 4 => gfx::Rect(6, 8, 4, 4)
    868   gfx::Rect rect_result(
    869       gfx::UnionRects(data.TileBounds(2, 2), data.TileBounds(3, 4)));
    870   EXPECT_NE(rect_src, rect_result);
    871   EXPECT_RECT_EQ(rect_result, data.ExpandRectToTileBounds(rect_src));
    872 
    873   // On tile bounds rounds up to next tile (since border overlaps).
    874   gfx::Rect border_rect_src(
    875       gfx::UnionRects(data.TileBounds(1, 2), data.TileBounds(3, 4)));
    876   gfx::Rect border_rect_result(
    877       gfx::UnionRects(data.TileBounds(0, 1), data.TileBounds(4, 5)));
    878   EXPECT_RECT_EQ(border_rect_result,
    879                  data.ExpandRectToTileBounds(border_rect_src));
    880 
    881   // Equal to tiling rect.
    882   EXPECT_RECT_EQ(gfx::Rect(data.tiling_size()),
    883                  data.ExpandRectToTileBounds(gfx::Rect(data.tiling_size())));
    884 
    885   // Containing, but larger than tiling rect.
    886   EXPECT_RECT_EQ(gfx::Rect(data.tiling_size()),
    887                  data.ExpandRectToTileBounds(gfx::Rect(100, 100)));
    888 
    889   // Non-intersecting with tiling rect.
    890   gfx::Rect non_intersect(200, 200, 100, 100);
    891   EXPECT_FALSE(non_intersect.Intersects(gfx::Rect(data.tiling_size())));
    892   EXPECT_RECT_EQ(gfx::Rect(), data.ExpandRectToTileBounds(non_intersect));
    893 
    894   TilingData data2(gfx::Size(8, 8), gfx::Size(32, 64), true);
    895 
    896   // Inside other tile border texels doesn't include other tiles.
    897   gfx::Rect inner_rect_src(data2.TileBounds(1, 1));
    898   inner_rect_src.Inset(data2.border_texels(), data.border_texels());
    899   gfx::Rect inner_rect_result(data2.TileBounds(1, 1));
    900   gfx::Rect expanded = data2.ExpandRectToTileBounds(inner_rect_src);
    901   EXPECT_EQ(inner_rect_result.ToString(), expanded.ToString());
    902 }
    903 
    904 TEST(TilingDataTest, Assignment) {
    905   {
    906     TilingData source(gfx::Size(8, 8), gfx::Size(16, 32), true);
    907     TilingData dest = source;
    908     EXPECT_EQ(source.border_texels(), dest.border_texels());
    909     EXPECT_EQ(source.max_texture_size(), dest.max_texture_size());
    910     EXPECT_EQ(source.num_tiles_x(), dest.num_tiles_x());
    911     EXPECT_EQ(source.num_tiles_y(), dest.num_tiles_y());
    912     EXPECT_EQ(source.tiling_size(), dest.tiling_size());
    913   }
    914   {
    915     TilingData source(gfx::Size(7, 3), gfx::Size(6, 100), false);
    916     TilingData dest(source);
    917     EXPECT_EQ(source.border_texels(), dest.border_texels());
    918     EXPECT_EQ(source.max_texture_size(), dest.max_texture_size());
    919     EXPECT_EQ(source.num_tiles_x(), dest.num_tiles_x());
    920     EXPECT_EQ(source.num_tiles_y(), dest.num_tiles_y());
    921     EXPECT_EQ(source.tiling_size(), dest.tiling_size());
    922   }
    923 }
    924 
    925 TEST(TilingDataTest, SetBorderTexels) {
    926   TilingData data(gfx::Size(8, 8), gfx::Size(16, 32), false);
    927   EXPECT_EQ(2, data.num_tiles_x());
    928   EXPECT_EQ(4, data.num_tiles_y());
    929 
    930   data.SetHasBorderTexels(true);
    931   EXPECT_EQ(3, data.num_tiles_x());
    932   EXPECT_EQ(5, data.num_tiles_y());
    933 
    934   data.SetHasBorderTexels(false);
    935   EXPECT_EQ(2, data.num_tiles_x());
    936   EXPECT_EQ(4, data.num_tiles_y());
    937 }
    938 
    939 TEST(TilingDataTest, LargeBorders) {
    940   TilingData data(gfx::Size(100, 80), gfx::Size(200, 145), 30);
    941   EXPECT_EQ(30, data.border_texels());
    942 
    943   EXPECT_EQ(70, data.TileSizeX(0));
    944   EXPECT_EQ(40, data.TileSizeX(1));
    945   EXPECT_EQ(40, data.TileSizeX(2));
    946   EXPECT_EQ(50, data.TileSizeX(3));
    947   EXPECT_EQ(4, data.num_tiles_x());
    948 
    949   EXPECT_EQ(50, data.TileSizeY(0));
    950   EXPECT_EQ(20, data.TileSizeY(1));
    951   EXPECT_EQ(20, data.TileSizeY(2));
    952   EXPECT_EQ(20, data.TileSizeY(3));
    953   EXPECT_EQ(35, data.TileSizeY(4));
    954   EXPECT_EQ(5, data.num_tiles_y());
    955 
    956   EXPECT_RECT_EQ(gfx::Rect(70, 50), data.TileBounds(0, 0));
    957   EXPECT_RECT_EQ(gfx::Rect(70, 50, 40, 20), data.TileBounds(1, 1));
    958   EXPECT_RECT_EQ(gfx::Rect(110, 110, 40, 35), data.TileBounds(2, 4));
    959   EXPECT_RECT_EQ(gfx::Rect(150, 70, 50, 20), data.TileBounds(3, 2));
    960   EXPECT_RECT_EQ(gfx::Rect(150, 110, 50, 35), data.TileBounds(3, 4));
    961 
    962   EXPECT_RECT_EQ(gfx::Rect(100, 80), data.TileBoundsWithBorder(0, 0));
    963   EXPECT_RECT_EQ(gfx::Rect(40, 20, 100, 80), data.TileBoundsWithBorder(1, 1));
    964   EXPECT_RECT_EQ(gfx::Rect(80, 80, 100, 65), data.TileBoundsWithBorder(2, 4));
    965   EXPECT_RECT_EQ(gfx::Rect(120, 40, 80, 80), data.TileBoundsWithBorder(3, 2));
    966   EXPECT_RECT_EQ(gfx::Rect(120, 80, 80, 65), data.TileBoundsWithBorder(3, 4));
    967 
    968   EXPECT_EQ(0, data.TileXIndexFromSrcCoord(0));
    969   EXPECT_EQ(0, data.TileXIndexFromSrcCoord(69));
    970   EXPECT_EQ(1, data.TileXIndexFromSrcCoord(70));
    971   EXPECT_EQ(1, data.TileXIndexFromSrcCoord(109));
    972   EXPECT_EQ(2, data.TileXIndexFromSrcCoord(110));
    973   EXPECT_EQ(2, data.TileXIndexFromSrcCoord(149));
    974   EXPECT_EQ(3, data.TileXIndexFromSrcCoord(150));
    975   EXPECT_EQ(3, data.TileXIndexFromSrcCoord(199));
    976 
    977   EXPECT_EQ(0, data.TileYIndexFromSrcCoord(0));
    978   EXPECT_EQ(0, data.TileYIndexFromSrcCoord(49));
    979   EXPECT_EQ(1, data.TileYIndexFromSrcCoord(50));
    980   EXPECT_EQ(1, data.TileYIndexFromSrcCoord(69));
    981   EXPECT_EQ(2, data.TileYIndexFromSrcCoord(70));
    982   EXPECT_EQ(2, data.TileYIndexFromSrcCoord(89));
    983   EXPECT_EQ(3, data.TileYIndexFromSrcCoord(90));
    984   EXPECT_EQ(3, data.TileYIndexFromSrcCoord(109));
    985   EXPECT_EQ(4, data.TileYIndexFromSrcCoord(110));
    986   EXPECT_EQ(4, data.TileYIndexFromSrcCoord(144));
    987 
    988   EXPECT_EQ(0, data.FirstBorderTileXIndexFromSrcCoord(0));
    989   EXPECT_EQ(0, data.FirstBorderTileXIndexFromSrcCoord(99));
    990   EXPECT_EQ(1, data.FirstBorderTileXIndexFromSrcCoord(100));
    991   EXPECT_EQ(1, data.FirstBorderTileXIndexFromSrcCoord(139));
    992   EXPECT_EQ(2, data.FirstBorderTileXIndexFromSrcCoord(140));
    993   EXPECT_EQ(2, data.FirstBorderTileXIndexFromSrcCoord(179));
    994   EXPECT_EQ(3, data.FirstBorderTileXIndexFromSrcCoord(180));
    995   EXPECT_EQ(3, data.FirstBorderTileXIndexFromSrcCoord(199));
    996 
    997   EXPECT_EQ(0, data.FirstBorderTileYIndexFromSrcCoord(0));
    998   EXPECT_EQ(0, data.FirstBorderTileYIndexFromSrcCoord(79));
    999   EXPECT_EQ(1, data.FirstBorderTileYIndexFromSrcCoord(80));
   1000   EXPECT_EQ(1, data.FirstBorderTileYIndexFromSrcCoord(99));
   1001   EXPECT_EQ(2, data.FirstBorderTileYIndexFromSrcCoord(100));
   1002   EXPECT_EQ(2, data.FirstBorderTileYIndexFromSrcCoord(119));
   1003   EXPECT_EQ(3, data.FirstBorderTileYIndexFromSrcCoord(120));
   1004   EXPECT_EQ(3, data.FirstBorderTileYIndexFromSrcCoord(139));
   1005   EXPECT_EQ(4, data.FirstBorderTileYIndexFromSrcCoord(140));
   1006   EXPECT_EQ(4, data.FirstBorderTileYIndexFromSrcCoord(144));
   1007 
   1008   EXPECT_EQ(0, data.LastBorderTileXIndexFromSrcCoord(0));
   1009   EXPECT_EQ(0, data.LastBorderTileXIndexFromSrcCoord(39));
   1010   EXPECT_EQ(1, data.LastBorderTileXIndexFromSrcCoord(40));
   1011   EXPECT_EQ(1, data.LastBorderTileXIndexFromSrcCoord(79));
   1012   EXPECT_EQ(2, data.LastBorderTileXIndexFromSrcCoord(80));
   1013   EXPECT_EQ(2, data.LastBorderTileXIndexFromSrcCoord(119));
   1014   EXPECT_EQ(3, data.LastBorderTileXIndexFromSrcCoord(120));
   1015   EXPECT_EQ(3, data.LastBorderTileXIndexFromSrcCoord(199));
   1016 
   1017   EXPECT_EQ(0, data.LastBorderTileYIndexFromSrcCoord(0));
   1018   EXPECT_EQ(0, data.LastBorderTileYIndexFromSrcCoord(19));
   1019   EXPECT_EQ(1, data.LastBorderTileYIndexFromSrcCoord(20));
   1020   EXPECT_EQ(1, data.LastBorderTileYIndexFromSrcCoord(39));
   1021   EXPECT_EQ(2, data.LastBorderTileYIndexFromSrcCoord(40));
   1022   EXPECT_EQ(2, data.LastBorderTileYIndexFromSrcCoord(59));
   1023   EXPECT_EQ(3, data.LastBorderTileYIndexFromSrcCoord(60));
   1024   EXPECT_EQ(3, data.LastBorderTileYIndexFromSrcCoord(79));
   1025   EXPECT_EQ(4, data.LastBorderTileYIndexFromSrcCoord(80));
   1026   EXPECT_EQ(4, data.LastBorderTileYIndexFromSrcCoord(144));
   1027 }
   1028 
   1029 void TestIterate(const TilingData& data,
   1030                  gfx::Rect rect,
   1031                  int expect_left,
   1032                  int expect_top,
   1033                  int expect_right,
   1034                  int expect_bottom,
   1035                  bool include_borders) {
   1036   EXPECT_GE(expect_left, 0);
   1037   EXPECT_GE(expect_top, 0);
   1038   EXPECT_LT(expect_right, data.num_tiles_x());
   1039   EXPECT_LT(expect_bottom, data.num_tiles_y());
   1040 
   1041   std::vector<std::pair<int, int> > original_expected;
   1042   for (int x = 0; x < data.num_tiles_x(); ++x) {
   1043     for (int y = 0; y < data.num_tiles_y(); ++y) {
   1044       gfx::Rect bounds;
   1045       if (include_borders)
   1046         bounds = data.TileBoundsWithBorder(x, y);
   1047       else
   1048         bounds = data.TileBounds(x, y);
   1049       if (x >= expect_left && x <= expect_right &&
   1050           y >= expect_top && y <= expect_bottom) {
   1051         EXPECT_TRUE(bounds.Intersects(rect));
   1052         original_expected.push_back(std::make_pair(x, y));
   1053       } else {
   1054         EXPECT_FALSE(bounds.Intersects(rect));
   1055       }
   1056     }
   1057   }
   1058 
   1059   // Verify with vanilla iterator.
   1060   {
   1061     std::vector<std::pair<int, int> > expected = original_expected;
   1062     for (TilingData::Iterator iter(&data, rect, include_borders); iter;
   1063          ++iter) {
   1064       bool found = false;
   1065       for (size_t i = 0; i < expected.size(); ++i) {
   1066         if (expected[i] == iter.index()) {
   1067           expected[i] = expected.back();
   1068           expected.pop_back();
   1069           found = true;
   1070           break;
   1071         }
   1072       }
   1073       EXPECT_TRUE(found);
   1074     }
   1075     EXPECT_EQ(0u, expected.size());
   1076   }
   1077 
   1078   // Make sure this also works with a difference iterator and an empty ignore.
   1079   // The difference iterator never includes borders, so ignore it otherwise.
   1080   if (!include_borders) {
   1081     std::vector<std::pair<int, int> > expected = original_expected;
   1082     for (TilingData::DifferenceIterator iter(&data, rect, gfx::Rect()); iter;
   1083          ++iter) {
   1084       bool found = false;
   1085       for (size_t i = 0; i < expected.size(); ++i) {
   1086         if (expected[i] == iter.index()) {
   1087           expected[i] = expected.back();
   1088           expected.pop_back();
   1089           found = true;
   1090           break;
   1091         }
   1092       }
   1093       EXPECT_TRUE(found);
   1094     }
   1095     EXPECT_EQ(0u, expected.size());
   1096   }
   1097 }
   1098 
   1099 void TestIterateBorders(const TilingData& data,
   1100                         gfx::Rect rect,
   1101                         int expect_left,
   1102                         int expect_top,
   1103                         int expect_right,
   1104                         int expect_bottom) {
   1105   bool include_borders = true;
   1106   TestIterate(data,
   1107               rect,
   1108               expect_left,
   1109               expect_top,
   1110               expect_right,
   1111               expect_bottom,
   1112               include_borders);
   1113 }
   1114 
   1115 void TestIterateNoBorders(const TilingData& data,
   1116                           gfx::Rect rect,
   1117                           int expect_left,
   1118                           int expect_top,
   1119                           int expect_right,
   1120                           int expect_bottom) {
   1121   bool include_borders = false;
   1122   TestIterate(data,
   1123               rect,
   1124               expect_left,
   1125               expect_top,
   1126               expect_right,
   1127               expect_bottom,
   1128               include_borders);
   1129 }
   1130 
   1131 void TestIterateAll(const TilingData& data,
   1132                     gfx::Rect rect,
   1133                     int expect_left,
   1134                     int expect_top,
   1135                     int expect_right,
   1136                     int expect_bottom) {
   1137   TestIterateBorders(
   1138       data, rect, expect_left, expect_top, expect_right, expect_bottom);
   1139   TestIterateNoBorders(
   1140       data, rect, expect_left, expect_top, expect_right, expect_bottom);
   1141 }
   1142 
   1143 TEST(TilingDataTest, IteratorNoBorderTexels) {
   1144   TilingData data(gfx::Size(10, 10), gfx::Size(40, 25), false);
   1145   // X border index by src coord: [0-10), [10-20), [20, 30), [30, 40)
   1146   // Y border index by src coord: [0-10), [10-20), [20, 25)
   1147   TestIterateAll(data, gfx::Rect(40, 25), 0, 0, 3, 2);
   1148   TestIterateAll(data, gfx::Rect(15, 15, 8, 8), 1, 1, 2, 2);
   1149 
   1150   // Oversized.
   1151   TestIterateAll(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 3, 2);
   1152   TestIterateAll(data, gfx::Rect(-100, 20, 1000, 1), 0, 2, 3, 2);
   1153   TestIterateAll(data, gfx::Rect(29, -100, 31, 1000), 2, 0, 3, 2);
   1154   // Nonintersecting.
   1155   TestIterateAll(data, gfx::Rect(60, 80, 100, 100), 0, 0, -1, -1);
   1156 }
   1157 
   1158 TEST(TilingDataTest, BordersIteratorOneBorderTexel) {
   1159   TilingData data(gfx::Size(10, 20), gfx::Size(25, 45), true);
   1160   // X border index by src coord: [0-10), [8-18), [16-25)
   1161   // Y border index by src coord: [0-20), [18-38), [36-45)
   1162   TestIterateBorders(data, gfx::Rect(25, 45), 0, 0, 2, 2);
   1163   TestIterateBorders(data, gfx::Rect(18, 19, 3, 17), 2, 0, 2, 1);
   1164   TestIterateBorders(data, gfx::Rect(10, 20, 6, 16), 1, 1, 1, 1);
   1165   TestIterateBorders(data, gfx::Rect(9, 19, 8, 18), 0, 0, 2, 2);
   1166   // Oversized.
   1167   TestIterateBorders(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 2);
   1168   TestIterateBorders(data, gfx::Rect(-100, 20, 1000, 1), 0, 1, 2, 1);
   1169   TestIterateBorders(data, gfx::Rect(18, -100, 6, 1000), 2, 0, 2, 2);
   1170   // Nonintersecting.
   1171   TestIterateBorders(data, gfx::Rect(60, 80, 100, 100), 0, 0, -1, -1);
   1172 }
   1173 
   1174 TEST(TilingDataTest, NoBordersIteratorOneBorderTexel) {
   1175   TilingData data(gfx::Size(10, 20), gfx::Size(25, 45), true);
   1176   // X index by src coord: [0-9), [9-17), [17-25)
   1177   // Y index by src coord: [0-19), [19-37), [37-45)
   1178   TestIterateNoBorders(data, gfx::Rect(25, 45), 0, 0, 2, 2);
   1179   TestIterateNoBorders(data, gfx::Rect(17, 19, 3, 18), 2, 1, 2, 1);
   1180   TestIterateNoBorders(data, gfx::Rect(17, 19, 3, 19), 2, 1, 2, 2);
   1181   TestIterateNoBorders(data, gfx::Rect(8, 18, 9, 19), 0, 0, 1, 1);
   1182   TestIterateNoBorders(data, gfx::Rect(9, 19, 9, 19), 1, 1, 2, 2);
   1183   // Oversized.
   1184   TestIterateNoBorders(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 2);
   1185   TestIterateNoBorders(data, gfx::Rect(-100, 20, 1000, 1), 0, 1, 2, 1);
   1186   TestIterateNoBorders(data, gfx::Rect(18, -100, 6, 1000), 2, 0, 2, 2);
   1187   // Nonintersecting.
   1188   TestIterateNoBorders(data, gfx::Rect(60, 80, 100, 100), 0, 0, -1, -1);
   1189 }
   1190 
   1191 TEST(TilingDataTest, BordersIteratorManyBorderTexels) {
   1192   TilingData data(gfx::Size(50, 60), gfx::Size(65, 110), 20);
   1193   // X border index by src coord: [0-50), [10-60), [20-65)
   1194   // Y border index by src coord: [0-60), [20-80), [40-100), [60-110)
   1195   TestIterateBorders(data, gfx::Rect(65, 110), 0, 0, 2, 3);
   1196   TestIterateBorders(data, gfx::Rect(50, 60, 15, 65), 1, 1, 2, 3);
   1197   TestIterateBorders(data, gfx::Rect(60, 30, 2, 10), 2, 0, 2, 1);
   1198   // Oversized.
   1199   TestIterateBorders(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 3);
   1200   TestIterateBorders(data, gfx::Rect(-100, 10, 1000, 10), 0, 0, 2, 0);
   1201   TestIterateBorders(data, gfx::Rect(10, -100, 10, 1000), 0, 0, 1, 3);
   1202   // Nonintersecting.
   1203   TestIterateBorders(data, gfx::Rect(65, 110, 100, 100), 0, 0, -1, -1);
   1204 }
   1205 
   1206 TEST(TilingDataTest, NoBordersIteratorManyBorderTexels) {
   1207   TilingData data(gfx::Size(50, 60), gfx::Size(65, 110), 20);
   1208   // X index by src coord: [0-30), [30-40), [40, 65)
   1209   // Y index by src coord: [0-40), [40-60), [60, 80), [80-110)
   1210   TestIterateNoBorders(data, gfx::Rect(65, 110), 0, 0, 2, 3);
   1211   TestIterateNoBorders(data, gfx::Rect(30, 40, 15, 65), 1, 1, 2, 3);
   1212   TestIterateNoBorders(data, gfx::Rect(60, 20, 2, 21), 2, 0, 2, 1);
   1213   // Oversized.
   1214   TestIterateNoBorders(data, gfx::Rect(-100, -100, 1000, 1000), 0, 0, 2, 3);
   1215   TestIterateNoBorders(data, gfx::Rect(-100, 10, 1000, 10), 0, 0, 2, 0);
   1216   TestIterateNoBorders(data, gfx::Rect(10, -100, 10, 1000), 0, 0, 0, 3);
   1217   // Nonintersecting.
   1218   TestIterateNoBorders(data, gfx::Rect(65, 110, 100, 100), 0, 0, -1, -1);
   1219 }
   1220 
   1221 TEST(TilingDataTest, IteratorOneTile) {
   1222   TilingData no_border(gfx::Size(1000, 1000), gfx::Size(30, 40), false);
   1223   TestIterateAll(no_border, gfx::Rect(30, 40), 0, 0, 0, 0);
   1224   TestIterateAll(no_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
   1225   TestIterateAll(no_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
   1226 
   1227   TilingData one_border(gfx::Size(1000, 1000), gfx::Size(30, 40), true);
   1228   TestIterateAll(one_border, gfx::Rect(30, 40), 0, 0, 0, 0);
   1229   TestIterateAll(one_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
   1230   TestIterateAll(one_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
   1231 
   1232   TilingData big_border(gfx::Size(1000, 1000), gfx::Size(30, 40), 50);
   1233   TestIterateAll(big_border, gfx::Rect(30, 40), 0, 0, 0, 0);
   1234   TestIterateAll(big_border, gfx::Rect(10, 10, 20, 20), 0, 0, 0, 0);
   1235   TestIterateAll(big_border, gfx::Rect(30, 40, 100, 100), 0, 0, -1, -1);
   1236 }
   1237 
   1238 TEST(TilingDataTest, IteratorNoTiles) {
   1239   TilingData data(gfx::Size(100, 100), gfx::Size(), false);
   1240   TestIterateAll(data, gfx::Rect(100, 100), 0, 0, -1, -1);
   1241 }
   1242 
   1243 void TestDiff(const TilingData& data,
   1244               gfx::Rect consider,
   1245               gfx::Rect ignore,
   1246               size_t num_tiles) {
   1247   std::vector<std::pair<int, int> > expected;
   1248   for (int y = 0; y < data.num_tiles_y(); ++y) {
   1249     for (int x = 0; x < data.num_tiles_x(); ++x) {
   1250       gfx::Rect bounds = data.TileBounds(x, y);
   1251       if (bounds.Intersects(consider) && !bounds.Intersects(ignore))
   1252         expected.push_back(std::make_pair(x, y));
   1253     }
   1254   }
   1255 
   1256   // Sanity check the test.
   1257   EXPECT_EQ(num_tiles, expected.size());
   1258 
   1259   for (TilingData::DifferenceIterator iter(&data, consider, ignore); iter;
   1260        ++iter) {
   1261     bool found = false;
   1262     for (size_t i = 0; i < expected.size(); ++i) {
   1263       if (expected[i] == iter.index()) {
   1264         expected[i] = expected.back();
   1265         expected.pop_back();
   1266         found = true;
   1267         break;
   1268       }
   1269     }
   1270     EXPECT_TRUE(found);
   1271   }
   1272   EXPECT_EQ(0u, expected.size());
   1273 }
   1274 
   1275 TEST(TilingDataTest, DifferenceIteratorIgnoreGeometry) {
   1276   // This test is checking that the iterator can handle different geometries of
   1277   // ignore rects relative to the consider rect.  The consider rect indices
   1278   // themselves are mostly tested by the non-difference iterator tests, so the
   1279   // full rect is mostly used here for simplicity.
   1280 
   1281   // X border index by src coord: [0-10), [10-20), [20, 30), [30, 40)
   1282   // Y border index by src coord: [0-10), [10-20), [20, 25)
   1283   TilingData data(gfx::Size(10, 10), gfx::Size(40, 25), false);
   1284 
   1285   // Fully ignored
   1286   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(40, 25), 0);
   1287   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(-100, -100, 200, 200), 0);
   1288   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(9, 9, 30, 15), 0);
   1289   TestDiff(data, gfx::Rect(15, 15, 8, 8), gfx::Rect(15, 15, 8, 8), 0);
   1290 
   1291   // Fully un-ignored
   1292   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(-30, -20, 8, 8), 12);
   1293   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(), 12);
   1294 
   1295   // Top left, remove 2x2 tiles
   1296   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(20, 19), 8);
   1297   // Bottom right, remove 2x2 tiles
   1298   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(20, 15, 20, 6), 8);
   1299   // Bottom left, remove 2x2 tiles
   1300   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(0, 15, 20, 6), 8);
   1301   // Top right, remove 2x2 tiles
   1302   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(20, 0, 20, 19), 8);
   1303   // Center, remove only one tile
   1304   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(10, 10, 5, 5), 11);
   1305 
   1306   // Left column, flush left, removing two columns
   1307   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(11, 25), 6);
   1308   // Middle column, removing two columns
   1309   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(11, 0, 11, 25), 6);
   1310   // Right column, flush right, removing one column
   1311   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(30, 0, 2, 25), 9);
   1312 
   1313   // Top row, flush top, removing one row
   1314   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(0, 5, 40, 5), 8);
   1315   // Middle row, removing one row
   1316   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(0, 13, 40, 5), 8);
   1317   // Bottom row, flush bottom, removing two rows
   1318   TestDiff(data, gfx::Rect(40, 25), gfx::Rect(0, 13, 40, 12), 4);
   1319 
   1320   // Non-intersecting, but still touching two of the same tiles.
   1321   TestDiff(data, gfx::Rect(8, 0, 32, 25), gfx::Rect(0, 12, 5, 12), 10);
   1322 
   1323   // Intersecting, but neither contains the other. 2x3 with one overlap.
   1324   TestDiff(data, gfx::Rect(5, 2, 20, 10), gfx::Rect(25, 15, 5, 10), 5);
   1325 }
   1326 
   1327 TEST(TilingDataTest, DifferenceIteratorManyBorderTexels) {
   1328   // X border index by src coord: [0-50), [10-60), [20-65)
   1329   // Y border index by src coord: [0-60), [20-80), [40-100), [60-110)
   1330   // X tile bounds by src coord: [0-30), [30-40), [40-65)
   1331   // Y tile bounds by src coord: [0-40), [40-60), [60-80), [80-110)
   1332   TilingData data(gfx::Size(50, 60), gfx::Size(65, 110), 20);
   1333 
   1334   // Knock out two rows, but not the left column.
   1335   TestDiff(data, gfx::Rect(10, 30, 55, 80), gfx::Rect(30, 59, 20, 2), 8);
   1336 
   1337   // Knock out one row.
   1338   TestDiff(data, gfx::Rect(10, 30, 55, 80), gfx::Rect(29, 59, 20, 1), 9);
   1339 
   1340   // Overlap all tiles with ignore rect.
   1341   TestDiff(data, gfx::Rect(65, 110), gfx::Rect(29, 39, 12, 42), 0);
   1342 
   1343   gfx::Rect tile = data.TileBounds(1, 1);
   1344 
   1345   // Ignore one tile.
   1346   TestDiff(data, gfx::Rect(20, 30, 45, 80), tile, 11);
   1347 
   1348   // Include one tile.
   1349   TestDiff(data, tile, gfx::Rect(), 1);
   1350 }
   1351 
   1352 TEST(TilingDataTest, DifferenceIteratorOneTile) {
   1353   TilingData no_border(gfx::Size(1000, 1000), gfx::Size(30, 40), false);
   1354   TestDiff(no_border, gfx::Rect(30, 40), gfx::Rect(), 1);
   1355   TestDiff(no_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
   1356 
   1357   TilingData one_border(gfx::Size(1000, 1000), gfx::Size(30, 40), true);
   1358   TestDiff(one_border, gfx::Rect(30, 40), gfx::Rect(), 1);
   1359   TestDiff(one_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
   1360 
   1361   TilingData big_border(gfx::Size(1000, 1000), gfx::Size(30, 40), 50);
   1362   TestDiff(big_border, gfx::Rect(30, 40), gfx::Rect(), 1);
   1363   TestDiff(big_border, gfx::Rect(5, 5, 100, 100), gfx::Rect(5, 5, 1, 1), 0);
   1364 }
   1365 
   1366 TEST(TilingDataTest, DifferenceIteratorNoTiles) {
   1367   TilingData data(gfx::Size(100, 100), gfx::Size(), false);
   1368   TestDiff(data, gfx::Rect(100, 100), gfx::Rect(5, 5), 0);
   1369 }
   1370 
   1371 void TestSpiralIterate(int source_line_number,
   1372                        const TilingData& tiling_data,
   1373                        const gfx::Rect& consider,
   1374                        const gfx::Rect& ignore,
   1375                        const gfx::Rect& center,
   1376                        const std::vector<std::pair<int, int> >& expected) {
   1377   std::vector<std::pair<int, int> > actual;
   1378   for (TilingData::SpiralDifferenceIterator it(
   1379            &tiling_data, consider, ignore, center);
   1380        it;
   1381        ++it) {
   1382     actual.push_back(it.index());
   1383   }
   1384 
   1385   EXPECT_EQ(expected.size(), actual.size()) << "error from line "
   1386                                             << source_line_number;
   1387   for (size_t i = 0; i < std::min(expected.size(), actual.size()); ++i) {
   1388     EXPECT_EQ(expected[i].first, actual[i].first)
   1389         << "i: " << i << " error from line: " << source_line_number;
   1390     EXPECT_EQ(expected[i].second, actual[i].second)
   1391         << "i: " << i << " error from line: " << source_line_number;
   1392   }
   1393 }
   1394 
   1395 TEST(TilingDataTest, SpiralDifferenceIteratorNoIgnoreFullConsider) {
   1396   TilingData tiling_data(gfx::Size(10, 10), gfx::Size(30, 30), false);
   1397   gfx::Rect consider(30, 30);
   1398   gfx::Rect ignore;
   1399   std::vector<std::pair<int, int> > expected;
   1400 
   1401   // Center is in the center of the tiling.
   1402   gfx::Rect center(15, 15, 1, 1);
   1403 
   1404   // Layout of the tiling data, and expected return order:
   1405   //   x 0 1 2
   1406   //  y.------
   1407   //  0| 4 3 2
   1408   //  1| 5 * 1
   1409   //  2| 6 7 8
   1410   expected.push_back(std::make_pair(2, 1));
   1411   expected.push_back(std::make_pair(2, 0));
   1412   expected.push_back(std::make_pair(1, 0));
   1413   expected.push_back(std::make_pair(0, 0));
   1414   expected.push_back(std::make_pair(0, 1));
   1415   expected.push_back(std::make_pair(0, 2));
   1416   expected.push_back(std::make_pair(1, 2));
   1417   expected.push_back(std::make_pair(2, 2));
   1418 
   1419   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1420 
   1421   // Center is off to the right side of the tiling (and far away).
   1422   center = gfx::Rect(100, 15, 1, 1);
   1423 
   1424   // Layout of the tiling data, and expected return order:
   1425   //   x 0 1 2
   1426   //  y.------
   1427   //  0| 7 4 1
   1428   //  1| 8 5 2 *
   1429   //  2| 9 6 3
   1430   expected.clear();
   1431   expected.push_back(std::make_pair(2, 0));
   1432   expected.push_back(std::make_pair(2, 1));
   1433   expected.push_back(std::make_pair(2, 2));
   1434   expected.push_back(std::make_pair(1, 0));
   1435   expected.push_back(std::make_pair(1, 1));
   1436   expected.push_back(std::make_pair(1, 2));
   1437   expected.push_back(std::make_pair(0, 0));
   1438   expected.push_back(std::make_pair(0, 1));
   1439   expected.push_back(std::make_pair(0, 2));
   1440 
   1441   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1442 
   1443   // Center is the bottom right corner of the tiling.
   1444   center = gfx::Rect(25, 25, 1, 1);
   1445 
   1446   // Layout of the tiling data, and expected return order:
   1447   //   x 0 1 2
   1448   //  y.------
   1449   //  0| 6 5 4
   1450   //  1| 7 2 1
   1451   //  2| 8 3 *
   1452   expected.clear();
   1453   expected.push_back(std::make_pair(2, 1));
   1454   expected.push_back(std::make_pair(1, 1));
   1455   expected.push_back(std::make_pair(1, 2));
   1456   expected.push_back(std::make_pair(2, 0));
   1457   expected.push_back(std::make_pair(1, 0));
   1458   expected.push_back(std::make_pair(0, 0));
   1459   expected.push_back(std::make_pair(0, 1));
   1460   expected.push_back(std::make_pair(0, 2));
   1461 
   1462   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1463 
   1464   // Center is off the top left side of the tiling.
   1465   center = gfx::Rect(-60, -50, 1, 1);
   1466 
   1467   // Layout of the tiling data, and expected return order:
   1468   // * x 0 1 2
   1469   //  y.------
   1470   //  0| 1 2 6
   1471   //  1| 3 4 5
   1472   //  2| 7 8 9
   1473   expected.clear();
   1474   expected.push_back(std::make_pair(0, 0));
   1475   expected.push_back(std::make_pair(1, 0));
   1476   expected.push_back(std::make_pair(0, 1));
   1477   expected.push_back(std::make_pair(1, 1));
   1478   expected.push_back(std::make_pair(2, 1));
   1479   expected.push_back(std::make_pair(2, 0));
   1480   expected.push_back(std::make_pair(0, 2));
   1481   expected.push_back(std::make_pair(1, 2));
   1482   expected.push_back(std::make_pair(2, 2));
   1483 
   1484   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1485 
   1486   // Two tile center.
   1487   center = gfx::Rect(15, 15, 1, 10);
   1488 
   1489   // Layout of the tiling data, and expected return order:
   1490   //   x 0 1 2
   1491   //  y.------
   1492   //  0| 5 4 3
   1493   //  1| 6 * 2
   1494   //  2| 7 * 1
   1495   expected.clear();
   1496   expected.push_back(std::make_pair(2, 2));
   1497   expected.push_back(std::make_pair(2, 1));
   1498   expected.push_back(std::make_pair(2, 0));
   1499   expected.push_back(std::make_pair(1, 0));
   1500   expected.push_back(std::make_pair(0, 0));
   1501   expected.push_back(std::make_pair(0, 1));
   1502   expected.push_back(std::make_pair(0, 2));
   1503 
   1504   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1505 }
   1506 
   1507 TEST(TilingDataTest, SpiralDifferenceIteratorSmallConsider) {
   1508   TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
   1509   gfx::Rect ignore;
   1510   std::vector<std::pair<int, int> > expected;
   1511   gfx::Rect center(15, 15, 1, 1);
   1512 
   1513   // Consider is one cell.
   1514   gfx::Rect consider(1, 1);
   1515 
   1516   // Layout of the tiling data, and expected return order:
   1517   //   x 0 1 2 3 4
   1518   //  y.----------
   1519   //  0| 1
   1520   //  1|   *
   1521   //  2|
   1522   //  3|
   1523   //  4|
   1524   expected.push_back(std::make_pair(0, 0));
   1525 
   1526   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1527 
   1528   // Consider is bottom right corner.
   1529   consider = gfx::Rect(25, 25, 10, 10);
   1530 
   1531   // Layout of the tiling data, and expected return order:
   1532   //   x 0 1 2 3 4
   1533   //  y.----------
   1534   //  0|
   1535   //  1|   *
   1536   //  2|     1 2
   1537   //  3|     3 4
   1538   //  4|
   1539   expected.clear();
   1540   expected.push_back(std::make_pair(2, 2));
   1541   expected.push_back(std::make_pair(3, 2));
   1542   expected.push_back(std::make_pair(2, 3));
   1543   expected.push_back(std::make_pair(3, 3));
   1544 
   1545   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1546 
   1547   // Consider is one column.
   1548   consider = gfx::Rect(11, 0, 1, 100);
   1549 
   1550   // Layout of the tiling data, and expected return order:
   1551   //   x 0 1 2 3 4
   1552   //  y.----------
   1553   //  0|   2
   1554   //  1|   *
   1555   //  2|   3
   1556   //  3|   4
   1557   //  4|   5
   1558   expected.clear();
   1559   expected.push_back(std::make_pair(1, 0));
   1560   expected.push_back(std::make_pair(1, 2));
   1561   expected.push_back(std::make_pair(1, 3));
   1562   expected.push_back(std::make_pair(1, 4));
   1563 
   1564   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1565 }
   1566 
   1567 TEST(TilingDataTest, SpiralDifferenceIteratorHasIgnore) {
   1568   TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
   1569   gfx::Rect consider(50, 50);
   1570   std::vector<std::pair<int, int> > expected;
   1571   gfx::Rect center(15, 15, 1, 1);
   1572 
   1573   // Full ignore.
   1574   gfx::Rect ignore(50, 50);
   1575 
   1576   // Layout of the tiling data, and expected return order:
   1577   //   x 0 1 2 3 4
   1578   //  y.----------
   1579   //  0| . . . . .
   1580   //  1| . * . . .
   1581   //  2| . . . . .
   1582   //  3| . . . . .
   1583   //  4| . . . . .
   1584   expected.clear();
   1585 
   1586   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1587 
   1588   // 3 column ignore.
   1589   ignore = gfx::Rect(15, 0, 20, 100);
   1590 
   1591   // Layout of the tiling data, and expected return order:
   1592   //   x 0 1 2 3 4
   1593   //  y.----------
   1594   //  0| 1 . . . 8
   1595   //  1| 2 * . . 7
   1596   //  2| 3 . . . 6
   1597   //  3| 4 . . . 5
   1598   //  4| 9 . . . 10
   1599   expected.clear();
   1600 
   1601   expected.push_back(std::make_pair(0, 0));
   1602   expected.push_back(std::make_pair(0, 1));
   1603   expected.push_back(std::make_pair(0, 2));
   1604   expected.push_back(std::make_pair(0, 3));
   1605   expected.push_back(std::make_pair(4, 3));
   1606   expected.push_back(std::make_pair(4, 2));
   1607   expected.push_back(std::make_pair(4, 1));
   1608   expected.push_back(std::make_pair(4, 0));
   1609   expected.push_back(std::make_pair(0, 4));
   1610   expected.push_back(std::make_pair(4, 4));
   1611 
   1612   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1613 
   1614   // Ignore covers the top half.
   1615   ignore = gfx::Rect(50, 25);
   1616 
   1617   // Layout of the tiling data, and expected return order:
   1618   //   x 0 1 2 3 4
   1619   //  y.----------
   1620   //  0| . . . . .
   1621   //  1| . * . . .
   1622   //  2| . . . . .
   1623   //  3| 1 2 3 4 5
   1624   //  4| 6 7 8 9 10
   1625   expected.clear();
   1626 
   1627   expected.push_back(std::make_pair(0, 3));
   1628   expected.push_back(std::make_pair(1, 3));
   1629   expected.push_back(std::make_pair(2, 3));
   1630   expected.push_back(std::make_pair(3, 3));
   1631   expected.push_back(std::make_pair(4, 3));
   1632   expected.push_back(std::make_pair(0, 4));
   1633   expected.push_back(std::make_pair(1, 4));
   1634   expected.push_back(std::make_pair(2, 4));
   1635   expected.push_back(std::make_pair(3, 4));
   1636   expected.push_back(std::make_pair(4, 4));
   1637 
   1638   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1639 }
   1640 
   1641 TEST(TilingDataTest, SpiralDifferenceIteratorRectangleCenter) {
   1642   TilingData tiling_data(gfx::Size(10, 10), gfx::Size(50, 50), false);
   1643   gfx::Rect consider(50, 50);
   1644   std::vector<std::pair<int, int> > expected;
   1645   gfx::Rect ignore;
   1646 
   1647   // Two cell center
   1648   gfx::Rect center(25, 25, 1, 10);
   1649 
   1650   // Layout of the tiling data, and expected return order:
   1651   //   x 0 1 2 3 4
   1652   //  y.----------
   1653   //  0| J I H G F
   1654   //  1| K 5 4 3 E
   1655   //  2| L 6 * 2 D
   1656   //  3| M 7 * 1 C
   1657   //  4| N 8 9 A B
   1658   expected.clear();
   1659 
   1660   expected.push_back(std::make_pair(3, 3));
   1661   expected.push_back(std::make_pair(3, 2));
   1662   expected.push_back(std::make_pair(3, 1));
   1663   expected.push_back(std::make_pair(2, 1));
   1664   expected.push_back(std::make_pair(1, 1));
   1665   expected.push_back(std::make_pair(1, 2));
   1666   expected.push_back(std::make_pair(1, 3));
   1667   expected.push_back(std::make_pair(1, 4));
   1668   expected.push_back(std::make_pair(2, 4));
   1669   expected.push_back(std::make_pair(3, 4));
   1670   expected.push_back(std::make_pair(4, 4));
   1671   expected.push_back(std::make_pair(4, 3));
   1672   expected.push_back(std::make_pair(4, 2));
   1673   expected.push_back(std::make_pair(4, 1));
   1674   expected.push_back(std::make_pair(4, 0));
   1675   expected.push_back(std::make_pair(3, 0));
   1676   expected.push_back(std::make_pair(2, 0));
   1677   expected.push_back(std::make_pair(1, 0));
   1678   expected.push_back(std::make_pair(0, 0));
   1679   expected.push_back(std::make_pair(0, 1));
   1680   expected.push_back(std::make_pair(0, 2));
   1681   expected.push_back(std::make_pair(0, 3));
   1682   expected.push_back(std::make_pair(0, 4));
   1683 
   1684   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1685 
   1686   // Three by two center.
   1687   center = gfx::Rect(15, 25, 20, 10);
   1688 
   1689   // Layout of the tiling data, and expected return order:
   1690   //   x 0 1 2 3 4
   1691   //  y.----------
   1692   //  0| J I H G F
   1693   //  1| 7 6 5 4 3
   1694   //  2| 8 * * * 2
   1695   //  3| 9 * * * 1
   1696   //  4| A B C D E
   1697   expected.clear();
   1698 
   1699   expected.push_back(std::make_pair(4, 3));
   1700   expected.push_back(std::make_pair(4, 2));
   1701   expected.push_back(std::make_pair(4, 1));
   1702   expected.push_back(std::make_pair(3, 1));
   1703   expected.push_back(std::make_pair(2, 1));
   1704   expected.push_back(std::make_pair(1, 1));
   1705   expected.push_back(std::make_pair(0, 1));
   1706   expected.push_back(std::make_pair(0, 2));
   1707   expected.push_back(std::make_pair(0, 3));
   1708   expected.push_back(std::make_pair(0, 4));
   1709   expected.push_back(std::make_pair(1, 4));
   1710   expected.push_back(std::make_pair(2, 4));
   1711   expected.push_back(std::make_pair(3, 4));
   1712   expected.push_back(std::make_pair(4, 4));
   1713   expected.push_back(std::make_pair(4, 0));
   1714   expected.push_back(std::make_pair(3, 0));
   1715   expected.push_back(std::make_pair(2, 0));
   1716   expected.push_back(std::make_pair(1, 0));
   1717   expected.push_back(std::make_pair(0, 0));
   1718 
   1719   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1720 
   1721   // Column center off the left side.
   1722   center = gfx::Rect(-50, 0, 30, 50);
   1723 
   1724   // Layout of the tiling data, and expected return order:
   1725   //    x 0 1 2 3 4
   1726   //   y.----------
   1727   // * 0| 5 A F K P
   1728   // * 1| 4 9 E J O
   1729   // * 2| 3 8 D I N
   1730   // * 3| 2 7 C H M
   1731   // * 4| 1 6 B G L
   1732   expected.clear();
   1733 
   1734   expected.push_back(std::make_pair(0, 4));
   1735   expected.push_back(std::make_pair(0, 3));
   1736   expected.push_back(std::make_pair(0, 2));
   1737   expected.push_back(std::make_pair(0, 1));
   1738   expected.push_back(std::make_pair(0, 0));
   1739   expected.push_back(std::make_pair(1, 4));
   1740   expected.push_back(std::make_pair(1, 3));
   1741   expected.push_back(std::make_pair(1, 2));
   1742   expected.push_back(std::make_pair(1, 1));
   1743   expected.push_back(std::make_pair(1, 0));
   1744   expected.push_back(std::make_pair(2, 4));
   1745   expected.push_back(std::make_pair(2, 3));
   1746   expected.push_back(std::make_pair(2, 2));
   1747   expected.push_back(std::make_pair(2, 1));
   1748   expected.push_back(std::make_pair(2, 0));
   1749   expected.push_back(std::make_pair(3, 4));
   1750   expected.push_back(std::make_pair(3, 3));
   1751   expected.push_back(std::make_pair(3, 2));
   1752   expected.push_back(std::make_pair(3, 1));
   1753   expected.push_back(std::make_pair(3, 0));
   1754   expected.push_back(std::make_pair(4, 4));
   1755   expected.push_back(std::make_pair(4, 3));
   1756   expected.push_back(std::make_pair(4, 2));
   1757   expected.push_back(std::make_pair(4, 1));
   1758   expected.push_back(std::make_pair(4, 0));
   1759 
   1760   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1761 }
   1762 
   1763 TEST(TilingDataTest, SpiralDifferenceIteratorEdgeCases) {
   1764   TilingData tiling_data(gfx::Size(10, 10), gfx::Size(30, 30), false);
   1765   std::vector<std::pair<int, int> > expected;
   1766   gfx::Rect center;
   1767   gfx::Rect consider;
   1768   gfx::Rect ignore;
   1769 
   1770   // Ignore contains, but is not equal to, consider and center.
   1771   ignore = gfx::Rect(15, 0, 20, 30);
   1772   consider = gfx::Rect(20, 10, 10, 20);
   1773   center = gfx::Rect(25, 0, 5, 5);
   1774 
   1775   // Layout of the tiling data, and expected return order:
   1776   //   x 0 1 2
   1777   //  y.------
   1778   //  0|   . *
   1779   //  1|   . .
   1780   //  2|   . .
   1781   expected.clear();
   1782 
   1783   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1784 
   1785   // Center intersects with consider.
   1786   ignore = gfx::Rect();
   1787   center = gfx::Rect(0, 15, 30, 15);
   1788   consider = gfx::Rect(15, 30);
   1789 
   1790   // Layout of the tiling data, and expected return order:
   1791   //   x 0 1 2
   1792   //  y.------
   1793   //  0| 2 1
   1794   //  1| * * *
   1795   //  2| * * *
   1796   expected.clear();
   1797 
   1798   expected.push_back(std::make_pair(1, 0));
   1799   expected.push_back(std::make_pair(0, 0));
   1800 
   1801   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1802 
   1803   // Consider and ignore are non-intersecting.
   1804   ignore = gfx::Rect(5, 30);
   1805   consider = gfx::Rect(25, 0, 5, 30);
   1806   center = gfx::Rect(15, 0, 1, 1);
   1807 
   1808   // Layout of the tiling data, and expected return order:
   1809   //   x 0 1 2
   1810   //  y.------
   1811   //  0| . * 1
   1812   //  1| .   2
   1813   //  2| .   3
   1814   expected.clear();
   1815 
   1816   expected.push_back(std::make_pair(2, 0));
   1817   expected.push_back(std::make_pair(2, 1));
   1818   expected.push_back(std::make_pair(2, 2));
   1819 
   1820   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1821 
   1822   // Center intersects with ignore.
   1823   consider = gfx::Rect(30, 30);
   1824   center = gfx::Rect(15, 0, 1, 30);
   1825   ignore = gfx::Rect(0, 15, 30, 1);
   1826 
   1827   // Layout of the tiling data, and expected return order:
   1828   //   x 0 1 2
   1829   //  y.------
   1830   //  0| 3 * 2
   1831   //  1| . * .
   1832   //  2| 4 * 1
   1833   expected.clear();
   1834 
   1835   expected.push_back(std::make_pair(2, 2));
   1836   expected.push_back(std::make_pair(2, 0));
   1837   expected.push_back(std::make_pair(0, 0));
   1838   expected.push_back(std::make_pair(0, 2));
   1839 
   1840   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1841 
   1842   // Center and ignore are the same.
   1843   consider = gfx::Rect(30, 30);
   1844   center = gfx::Rect(15, 0, 1, 30);
   1845   ignore = center;
   1846 
   1847   // Layout of the tiling data, and expected return order:
   1848   //   x 0 1 2
   1849   //  y.------
   1850   //  0| 4 * 3
   1851   //  1| 5 * 2
   1852   //  2| 6 * 1
   1853   expected.clear();
   1854 
   1855   expected.push_back(std::make_pair(2, 2));
   1856   expected.push_back(std::make_pair(2, 1));
   1857   expected.push_back(std::make_pair(2, 0));
   1858   expected.push_back(std::make_pair(0, 0));
   1859   expected.push_back(std::make_pair(0, 1));
   1860   expected.push_back(std::make_pair(0, 2));
   1861 
   1862   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1863 
   1864   // Empty tiling data.
   1865   TilingData empty_data(gfx::Size(0, 0), gfx::Size(0, 0), false);
   1866 
   1867   expected.clear();
   1868   TestSpiralIterate(__LINE__, empty_data, consider, ignore, center, expected);
   1869 
   1870   // Empty consider.
   1871   ignore = gfx::Rect();
   1872   center = gfx::Rect(1, 1, 1, 1);
   1873   consider = gfx::Rect();
   1874 
   1875   expected.clear();
   1876   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1877 
   1878   // Empty center. Note: This arbitrarily puts the center to be off the top-left
   1879   // corner.
   1880   consider = gfx::Rect(30, 30);
   1881   ignore = gfx::Rect();
   1882   center = gfx::Rect();
   1883 
   1884   // Layout of the tiling data, and expected return order:
   1885   // * x 0 1 2
   1886   //  y.------
   1887   //  0| 1 2 6
   1888   //  1| 3 4 5
   1889   //  2| 7 8 9
   1890   expected.clear();
   1891 
   1892   expected.push_back(std::make_pair(0, 0));
   1893   expected.push_back(std::make_pair(1, 0));
   1894   expected.push_back(std::make_pair(0, 1));
   1895   expected.push_back(std::make_pair(1, 1));
   1896   expected.push_back(std::make_pair(2, 1));
   1897   expected.push_back(std::make_pair(2, 0));
   1898   expected.push_back(std::make_pair(0, 2));
   1899   expected.push_back(std::make_pair(1, 2));
   1900   expected.push_back(std::make_pair(2, 2));
   1901 
   1902   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1903 
   1904   // Every rect is empty.
   1905   ignore = gfx::Rect();
   1906   center = gfx::Rect();
   1907   consider = gfx::Rect();
   1908 
   1909   expected.clear();
   1910   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1911 
   1912   // Center is just to the left of cover, and off of the tiling's left side.
   1913   consider = gfx::Rect(30, 30);
   1914   ignore = gfx::Rect();
   1915   center = gfx::Rect(-20, 0, 19, 30);
   1916 
   1917   // Layout of the tiling data, and expected return order:
   1918   //   x 0 1 2
   1919   //  y.------
   1920   // *0| 3 6 9
   1921   // *1| 2 5 8
   1922   // *2| 1 4 7
   1923   expected.clear();
   1924 
   1925   expected.push_back(std::make_pair(0, 2));
   1926   expected.push_back(std::make_pair(0, 1));
   1927   expected.push_back(std::make_pair(0, 0));
   1928   expected.push_back(std::make_pair(1, 2));
   1929   expected.push_back(std::make_pair(1, 1));
   1930   expected.push_back(std::make_pair(1, 0));
   1931   expected.push_back(std::make_pair(2, 2));
   1932   expected.push_back(std::make_pair(2, 1));
   1933   expected.push_back(std::make_pair(2, 0));
   1934 
   1935   TestSpiralIterate(__LINE__, tiling_data, consider, ignore, center, expected);
   1936 }
   1937 
   1938 }  // namespace
   1939 
   1940 }  // namespace cc
   1941