Chromium Code Reviews| Index: cc/tiling_data.cc |
| diff --git a/cc/tiling_data.cc b/cc/tiling_data.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..022c40f3b5e538f25e7c6a9c6f417c7dddb7743b |
| --- /dev/null |
| +++ b/cc/tiling_data.cc |
| @@ -0,0 +1,174 @@ |
| +// Copyright 2010 The Chromium Authors. All rights reserved. |
|
tfarina
2012/11/02 00:25:45
2010 -> 2012?
danakj
2012/11/02 00:28:03
Keeping the year from the old file, as this is a c
|
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "config.h" |
|
tfarina
2012/11/02 00:25:45
what is this for?
danakj
2012/11/02 00:28:03
same as all the other .cc in cc/ until we are clea
|
| + |
| +#include "cc/tiling_data.h" |
| + |
| +#include <algorithm> |
| + |
| +#include "ui/gfx/rect.h" |
| +#include "ui/gfx/vector2d.h" |
| + |
| +namespace cc { |
| + |
| +static int ComputeNumTiles(int max_texture_size, int total_size, int border_texels) { |
| + if (max_texture_size - 2 * border_texels <= 0) |
| + return total_size > 0 && max_texture_size >= total_size ? 1 : 0; |
| + |
| + int num_tiles = std::max(1, 1 + (total_size - 1 - 2 * border_texels) / (max_texture_size - 2 * border_texels)); |
| + return total_size > 0 ? num_tiles : 0; |
| +} |
| + |
| +TilingData::TilingData(gfx::Size max_texture_size, gfx::Size total_size, bool hasBorderTexels) |
| + : max_texture_size_(max_texture_size), |
| + total_size_(total_size), |
| + border_texels_(hasBorderTexels ? 1 : 0) { |
| + RecomputeNumTiles(); |
| +} |
| + |
| +TilingData::~TilingData() { |
| +} |
| + |
| +void TilingData::SetTotalSize(gfx::Size total_size) { |
| + total_size_ = total_size; |
| + RecomputeNumTiles(); |
| +} |
| + |
| +void TilingData::SetMaxTextureSize(gfx::Size max_texture_size) { |
| + max_texture_size_ = max_texture_size; |
| + RecomputeNumTiles(); |
| +} |
| + |
| +void TilingData::SetHasBorderTexels(bool has_border_texels) { |
| + border_texels_ = has_border_texels ? 1 : 0; |
| + RecomputeNumTiles(); |
| +} |
| + |
| +int TilingData::TileXIndexFromSrcCoord(int src_position) const { |
| + if (num_tiles_x_ <= 1) |
| + return 0; |
| + |
| + DCHECK(max_texture_size_.width() - 2 * border_texels_); |
| + int x = (src_position - border_texels_) / (max_texture_size_.width() - 2 * border_texels_); |
| + return std::min(std::max(x, 0), num_tiles_x_ - 1); |
| +} |
| + |
| +int TilingData::TileYIndexFromSrcCoord(int src_position) const { |
| + if (num_tiles_y_ <= 1) |
| + return 0; |
| + |
| + DCHECK(max_texture_size_.height() - 2 * border_texels_); |
| + int y = (src_position - border_texels_) / (max_texture_size_.height() - 2 * border_texels_); |
| + return std::min(std::max(y, 0), num_tiles_y_ - 1); |
| +} |
| + |
| +gfx::Rect TilingData::TileBounds(int i, int j) const { |
| + AssertTile(i, j); |
| + int x = TilePositionX(i); |
| + int y = TilePositionY(j); |
| + int width = TileSizeX(i); |
| + int height = TileSizeY(j); |
| + DCHECK_GE(x, 0); |
| + DCHECK_GE(y, 0); |
| + DCHECK_GE(width, 0); |
| + DCHECK_GE(height, 0); |
| + DCHECK_LE(x, total_size_.width()); |
| + DCHECK_LE(y, total_size_.height()); |
| + return gfx::Rect(x, y, width, height); |
| +} |
| + |
| +gfx::Rect TilingData::TileBoundsWithBorder(int i, int j) const { |
| + gfx::Rect bounds = TileBounds(i, j); |
| + |
| + if (border_texels_) { |
| + int x1 = bounds.x(); |
| + int x2 = bounds.right(); |
| + int y1 = bounds.y(); |
| + int y2 = bounds.bottom(); |
| + |
| + if (i > 0) |
| + x1--; |
| + if (i < (num_tiles_x_ - 1)) |
| + x2++; |
| + if (j > 0) |
| + y1--; |
| + if (j < (num_tiles_y_ - 1)) |
| + y2++; |
| + |
| + bounds = gfx::Rect(x1, y1, x2 - x1, y2 - y1); |
| + } |
| + |
| + return bounds; |
| +} |
| + |
| +int TilingData::TilePositionX(int x_index) const { |
| + DCHECK_GE(x_index, 0); |
| + DCHECK_LT(x_index, num_tiles_x_); |
| + |
| + int pos = 0; |
| + for (int i = 0; i < x_index; i++) |
| + pos += TileSizeX(i); |
| + |
| + return pos; |
| +} |
| + |
| +int TilingData::TilePositionY(int y_index) const { |
| + DCHECK_GE(y_index, 0); |
| + DCHECK_LT(y_index, num_tiles_y_); |
| + |
| + int pos = 0; |
| + for (int i = 0; i < y_index; i++) |
| + pos += TileSizeY(i); |
| + |
| + return pos; |
| +} |
| + |
| +int TilingData::TileSizeX(int x_index) const { |
| + DCHECK_GE(x_index, 0); |
| + DCHECK_LT(x_index, num_tiles_x_); |
| + |
| + if (!x_index && num_tiles_x_ == 1) |
| + return total_size_.width(); |
| + if (!x_index && num_tiles_x_ > 1) |
| + return max_texture_size_.width() - border_texels_; |
| + if (x_index < num_tiles_x_ - 1) |
| + return max_texture_size_.width() - 2 * border_texels_; |
| + if (x_index == num_tiles_x_ - 1) |
| + return total_size_.width() - TilePositionX(x_index); |
| + |
| + NOTREACHED(); |
| + return 0; |
| +} |
| + |
| +int TilingData::TileSizeY(int y_index) const { |
| + DCHECK_GE(y_index, 0); |
| + DCHECK_LT(y_index, num_tiles_y_); |
| + |
| + if (!y_index && num_tiles_y_ == 1) |
| + return total_size_.height(); |
| + if (!y_index && num_tiles_y_ > 1) |
| + return max_texture_size_.height() - border_texels_; |
| + if (y_index < num_tiles_y_ - 1) |
| + return max_texture_size_.height() - 2 * border_texels_; |
| + if (y_index == num_tiles_y_ - 1) |
| + return total_size_.height() - TilePositionY(y_index); |
| + |
| + NOTREACHED(); |
| + return 0; |
| +} |
| + |
| +gfx::Vector2d TilingData::TextureOffset(int x_index, int y_index) const { |
| + int left = (!x_index || num_tiles_x_ == 1) ? 0 : border_texels_; |
| + int top = (!y_index || num_tiles_y_ == 1) ? 0 : border_texels_; |
| + |
| + return gfx::Vector2d(left, top); |
| +} |
| + |
| +void TilingData::RecomputeNumTiles() { |
| + num_tiles_x_ = ComputeNumTiles(max_texture_size_.width(), total_size_.width(), border_texels_); |
| + num_tiles_y_ = ComputeNumTiles(max_texture_size_.height(), total_size_.height(), border_texels_); |
| +} |
| + |
| +} // namespace cc |