12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/layer_tiling_data.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/base/region.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/base/simple_enclosed_region.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<LayerTilingData> LayerTilingData::Create(const gfx::Size& tile_size, 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BorderTexelOption border) { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(new LayerTilingData(tile_size, border)); 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)LayerTilingData::LayerTilingData(const gfx::Size& tile_size, 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BorderTexelOption border) 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : tiling_data_(tile_size, gfx::Size(), border == HAS_BORDER_TEXELS) { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetTileSize(tile_size); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTilingData::~LayerTilingData() {} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTilingData::SetTileSize(const gfx::Size& size) { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (tile_size() == size) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reset(); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tiling_data_.SetMaxTextureSize(size); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size LayerTilingData::tile_size() const { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tiling_data_.max_texture_size(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTilingData::SetBorderTexelOption( 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BorderTexelOption border_texel_option) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool border_texels = border_texel_option == HAS_BORDER_TEXELS; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (has_border_texels() == border_texels) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reset(); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tiling_data_.SetHasBorderTexels(border_texels); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const LayerTilingData& LayerTilingData::operator= 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (const LayerTilingData & tiler) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tiling_data_ = tiler.tiling_data_; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return *this; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerTilingData::AddTile(scoped_ptr<Tile> tile, int i, int j) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!TileAt(i, j)); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile->move_to(i, j); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tiles_.add(std::make_pair(i, j), tile.Pass()); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerTilingData::Tile> LayerTilingData::TakeTile(int i, int j) { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tiles_.take_and_erase(std::make_pair(i, j)); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerTilingData::Tile* LayerTilingData::TileAt(int i, int j) const { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tiles_.get(std::make_pair(i, j)); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void LayerTilingData::ContentRectToTileIndices(const gfx::Rect& content_rect, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* left, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* top, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* right, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int* bottom) const { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An empty rect doesn't result in an empty set of tiles, so don't pass an 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // empty rect. 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // TODO(enne): Possibly we should fill a vector of tiles instead, since the 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // normal use of this function is to enumerate some tiles. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!content_rect.IsEmpty()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *left = tiling_data_.TileXIndexFromSrcCoord(content_rect.x()); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *top = tiling_data_.TileYIndexFromSrcCoord(content_rect.y()); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *right = tiling_data_.TileXIndexFromSrcCoord(content_rect.right() - 1); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *bottom = tiling_data_.TileYIndexFromSrcCoord(content_rect.bottom() - 1); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect LayerTilingData::TileRect(const Tile* tile) const { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect tile_rect = tiling_data_.TileBoundsWithBorder(tile->i(), tile->j()); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tile_rect.set_size(tile_size()); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return tile_rect; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid LayerTilingData::SetTilingSize(const gfx::Size& tiling_size) { 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tiling_data_.SetTilingSize(tiling_size); 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (tiling_size.IsEmpty()) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tiles_.clear(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Any tiles completely outside our new bounds are invalid and should be 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dropped. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int left, top, right, bottom; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ContentRectToTileIndices( 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Rect(tiling_size), &left, &top, &right, &bottom); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<TileMapKey> invalid_tile_keys; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->first.first > right || it->first.second > bottom) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) invalid_tile_keys.push_back(it->first); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < invalid_tile_keys.size(); ++i) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tiles_.erase(invalid_tile_keys[i]); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 117