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