Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(307)

Unified Diff: cc/base/tiling_data.cc

Issue 1017713003: cc: Reduce duplicated tiling data difference iterator code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Naming Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/base/tiling_data.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/base/tiling_data.cc
diff --git a/cc/base/tiling_data.cc b/cc/base/tiling_data.cc
index 95fd68be200bf6d91d324113ad07d33b4f50b6bf..c9b2fd9d3cc97656dcf20bb5c904ea29cda3269c 100644
--- a/cc/base/tiling_data.cc
+++ b/cc/base/tiling_data.cc
@@ -350,7 +350,11 @@ TilingData::Iterator& TilingData::Iterator::operator++() {
return *this;
}
-TilingData::DifferenceIterator::DifferenceIterator(
+TilingData::BaseDifferenceIterator::BaseDifferenceIterator() {
+ done();
+}
+
+TilingData::BaseDifferenceIterator::BaseDifferenceIterator(
const TilingData* tiling_data,
const gfx::Rect& consider_rect,
const gfx::Rect& ignore_rect)
@@ -369,9 +373,8 @@ TilingData::DifferenceIterator::DifferenceIterator(
gfx::Rect tiling_bounds_rect(tiling_data->tiling_size());
gfx::Rect consider(consider_rect);
- gfx::Rect ignore(ignore_rect);
consider.Intersect(tiling_bounds_rect);
- ignore.Intersect(tiling_bounds_rect);
+
if (consider.IsEmpty()) {
done();
return;
@@ -382,6 +385,9 @@ TilingData::DifferenceIterator::DifferenceIterator(
consider_right_ = tiling_data->TileXIndexFromSrcCoord(consider.right() - 1);
consider_bottom_ = tiling_data->TileYIndexFromSrcCoord(consider.bottom() - 1);
+ gfx::Rect ignore(ignore_rect);
+ ignore.Intersect(tiling_bounds_rect);
+
if (!ignore.IsEmpty()) {
ignore_left_ = tiling_data->TileXIndexFromSrcCoord(ignore.x());
ignore_top_ = tiling_data->TileYIndexFromSrcCoord(ignore.y());
@@ -393,10 +399,31 @@ TilingData::DifferenceIterator::DifferenceIterator(
ignore_top_ = std::max(ignore_top_, consider_top_);
ignore_right_ = std::min(ignore_right_, consider_right_);
ignore_bottom_ = std::min(ignore_bottom_, consider_bottom_);
+
+ if (ignore_left_ == consider_left_ && ignore_right_ == consider_right_ &&
+ ignore_top_ == consider_top_ && ignore_bottom_ == consider_bottom_) {
+ consider_left_ = consider_top_ = consider_right_ = consider_bottom_ = -1;
+ done();
+ return;
+ }
}
+}
+
+bool TilingData::BaseDifferenceIterator::HasConsiderRect() const {
+ // Consider indices are either all valid or all equal to -1.
+ DCHECK((0 <= consider_left_ && consider_left_ <= consider_right_ &&
+ 0 <= consider_top_ && consider_top_ <= consider_bottom_) ||
+ (consider_left_ == -1 && consider_top_ == -1 &&
+ consider_right_ == -1 && consider_bottom_ == -1));
+ return consider_left_ != -1;
+}
- if (ignore_left_ == consider_left_ && ignore_right_ == consider_right_ &&
- ignore_top_ == consider_top_ && ignore_bottom_ == consider_bottom_) {
+TilingData::DifferenceIterator::DifferenceIterator(
+ const TilingData* tiling_data,
+ const gfx::Rect& consider_rect,
+ const gfx::Rect& ignore_rect)
+ : BaseDifferenceIterator(tiling_data, consider_rect, ignore_rect) {
+ if (!HasConsiderRect()) {
done();
return;
}
@@ -446,82 +473,40 @@ TilingData::SpiralDifferenceIterator::SpiralDifferenceIterator(
const gfx::Rect& consider_rect,
const gfx::Rect& ignore_rect,
const gfx::Rect& center_rect)
- : consider_left_(-1),
- consider_top_(-1),
- consider_right_(-1),
- consider_bottom_(-1),
- ignore_left_(-1),
- ignore_top_(-1),
- ignore_right_(-1),
- ignore_bottom_(-1),
+ : BaseDifferenceIterator(tiling_data, consider_rect, ignore_rect),
direction_(RIGHT),
delta_x_(1),
delta_y_(0),
current_step_(0),
horizontal_step_count_(0),
vertical_step_count_(0) {
- if (tiling_data->num_tiles_x() <= 0 || tiling_data->num_tiles_y() <= 0) {
- done();
- return;
- }
-
- gfx::Rect tiling_bounds_rect(tiling_data->tiling_size());
- gfx::Rect consider(consider_rect);
- gfx::Rect ignore(ignore_rect);
- gfx::Rect center(center_rect);
- consider.Intersect(tiling_bounds_rect);
- ignore.Intersect(tiling_bounds_rect);
- if (consider.IsEmpty()) {
- done();
- return;
- }
-
- consider_left_ = tiling_data->TileXIndexFromSrcCoord(consider.x());
- consider_top_ = tiling_data->TileYIndexFromSrcCoord(consider.y());
- consider_right_ = tiling_data->TileXIndexFromSrcCoord(consider.right() - 1);
- consider_bottom_ = tiling_data->TileYIndexFromSrcCoord(consider.bottom() - 1);
-
- if (!ignore.IsEmpty()) {
- ignore_left_ = tiling_data->TileXIndexFromSrcCoord(ignore.x());
- ignore_top_ = tiling_data->TileYIndexFromSrcCoord(ignore.y());
- ignore_right_ = tiling_data->TileXIndexFromSrcCoord(ignore.right() - 1);
- ignore_bottom_ = tiling_data->TileYIndexFromSrcCoord(ignore.bottom() - 1);
-
- // Clamp ignore indices to consider indices.
- ignore_left_ = std::max(ignore_left_, consider_left_);
- ignore_top_ = std::max(ignore_top_, consider_top_);
- ignore_right_ = std::min(ignore_right_, consider_right_);
- ignore_bottom_ = std::min(ignore_bottom_, consider_bottom_);
- }
-
- if (ignore_left_ == consider_left_ && ignore_right_ == consider_right_ &&
- ignore_top_ == consider_top_ && ignore_bottom_ == consider_bottom_) {
+ if (!HasConsiderRect()) {
done();
return;
}
// Determine around left, such that it is between -1 and num_tiles_x.
int around_left = 0;
- if (center.x() < 0 || center.IsEmpty())
+ if (center_rect.x() < 0 || center_rect.IsEmpty())
around_left = -1;
- else if (center.x() >= tiling_data->tiling_size().width())
+ else if (center_rect.x() >= tiling_data->tiling_size().width())
around_left = tiling_data->num_tiles_x();
else
- around_left = tiling_data->TileXIndexFromSrcCoord(center.x());
+ around_left = tiling_data->TileXIndexFromSrcCoord(center_rect.x());
// Determine around top, such that it is between -1 and num_tiles_y.
int around_top = 0;
- if (center.y() < 0 || center.IsEmpty())
+ if (center_rect.y() < 0 || center_rect.IsEmpty())
around_top = -1;
- else if (center.y() >= tiling_data->tiling_size().height())
+ else if (center_rect.y() >= tiling_data->tiling_size().height())
around_top = tiling_data->num_tiles_y();
else
- around_top = tiling_data->TileYIndexFromSrcCoord(center.y());
+ around_top = tiling_data->TileYIndexFromSrcCoord(center_rect.y());
// Determine around right, such that it is between -1 and num_tiles_x.
- int right_src_coord = center.right() - 1;
+ int right_src_coord = center_rect.right() - 1;
int around_right = 0;
- if (right_src_coord < 0 || center.IsEmpty()) {
+ if (right_src_coord < 0 || center_rect.IsEmpty()) {
around_right = -1;
} else if (right_src_coord >= tiling_data->tiling_size().width()) {
around_right = tiling_data->num_tiles_x();
@@ -530,9 +515,9 @@ TilingData::SpiralDifferenceIterator::SpiralDifferenceIterator(
}
// Determine around bottom, such that it is between -1 and num_tiles_y.
- int bottom_src_coord = center.bottom() - 1;
+ int bottom_src_coord = center_rect.bottom() - 1;
int around_bottom = 0;
- if (bottom_src_coord < 0 || center.IsEmpty()) {
+ if (bottom_src_coord < 0 || center_rect.IsEmpty()) {
around_bottom = -1;
} else if (bottom_src_coord >= tiling_data->tiling_size().height()) {
around_bottom = tiling_data->num_tiles_y();
@@ -669,83 +654,41 @@ TilingData::ReverseSpiralDifferenceIterator::ReverseSpiralDifferenceIterator(
const gfx::Rect& consider_rect,
const gfx::Rect& ignore_rect,
const gfx::Rect& center_rect)
- : consider_left_(-1),
- consider_top_(-1),
- consider_right_(-1),
- consider_bottom_(-1),
+ : BaseDifferenceIterator(tiling_data, consider_rect, ignore_rect),
around_left_(-1),
around_top_(-1),
around_right_(-1),
around_bottom_(-1),
- ignore_left_(-1),
- ignore_top_(-1),
- ignore_right_(-1),
- ignore_bottom_(-1),
direction_(LEFT),
delta_x_(-1),
delta_y_(0),
current_step_(0),
horizontal_step_count_(0),
vertical_step_count_(0) {
- if (tiling_data->num_tiles_x() <= 0 || tiling_data->num_tiles_y() <= 0) {
- done();
- return;
- }
-
- gfx::Rect tiling_bounds_rect(tiling_data->tiling_size());
- gfx::Rect consider(consider_rect);
- gfx::Rect ignore(ignore_rect);
- gfx::Rect center(center_rect);
- consider.Intersect(tiling_bounds_rect);
- ignore.Intersect(tiling_bounds_rect);
- if (consider.IsEmpty()) {
- done();
- return;
- }
-
- consider_left_ = tiling_data->TileXIndexFromSrcCoord(consider.x());
- consider_top_ = tiling_data->TileYIndexFromSrcCoord(consider.y());
- consider_right_ = tiling_data->TileXIndexFromSrcCoord(consider.right() - 1);
- consider_bottom_ = tiling_data->TileYIndexFromSrcCoord(consider.bottom() - 1);
-
- if (!ignore.IsEmpty()) {
- ignore_left_ = tiling_data->TileXIndexFromSrcCoord(ignore.x());
- ignore_top_ = tiling_data->TileYIndexFromSrcCoord(ignore.y());
- ignore_right_ = tiling_data->TileXIndexFromSrcCoord(ignore.right() - 1);
- ignore_bottom_ = tiling_data->TileYIndexFromSrcCoord(ignore.bottom() - 1);
-
- // Clamp ignore indices to consider indices.
- ignore_left_ = std::max(ignore_left_, consider_left_);
- ignore_top_ = std::max(ignore_top_, consider_top_);
- ignore_right_ = std::min(ignore_right_, consider_right_);
- ignore_bottom_ = std::min(ignore_bottom_, consider_bottom_);
- }
-
- if (ignore_left_ == consider_left_ && ignore_right_ == consider_right_ &&
- ignore_top_ == consider_top_ && ignore_bottom_ == consider_bottom_) {
+ if (!HasConsiderRect()) {
done();
return;
}
// Determine around left, such that it is between -1 and num_tiles_x.
- if (center.x() < 0 || center.IsEmpty())
+ if (center_rect.x() < 0 || center_rect.IsEmpty())
around_left_ = -1;
- else if (center.x() >= tiling_data->tiling_size().width())
+ else if (center_rect.x() >= tiling_data->tiling_size().width())
around_left_ = tiling_data->num_tiles_x();
else
- around_left_ = tiling_data->TileXIndexFromSrcCoord(center.x());
+ around_left_ = tiling_data->TileXIndexFromSrcCoord(center_rect.x());
// Determine around top, such that it is between -1 and num_tiles_y.
- if (center.y() < 0 || center.IsEmpty())
+ if (center_rect.y() < 0 || center_rect.IsEmpty())
around_top_ = -1;
- else if (center.y() >= tiling_data->tiling_size().height())
+ else if (center_rect.y() >= tiling_data->tiling_size().height())
around_top_ = tiling_data->num_tiles_y();
else
- around_top_ = tiling_data->TileYIndexFromSrcCoord(center.y());
+ around_top_ = tiling_data->TileYIndexFromSrcCoord(center_rect.y());
// Determine around right, such that it is between -1 and num_tiles_x.
- int right_src_coord = center.right() - 1;
- if (right_src_coord < 0 || center.IsEmpty()) {
+ int right_src_coord = center_rect.right() - 1;
+ if (right_src_coord < 0 || center_rect.IsEmpty()) {
around_right_ = -1;
} else if (right_src_coord >= tiling_data->tiling_size().width()) {
around_right_ = tiling_data->num_tiles_x();
@@ -754,8 +697,8 @@ TilingData::ReverseSpiralDifferenceIterator::ReverseSpiralDifferenceIterator(
}
// Determine around bottom, such that it is between -1 and num_tiles_y.
- int bottom_src_coord = center.bottom() - 1;
- if (bottom_src_coord < 0 || center.IsEmpty()) {
+ int bottom_src_coord = center_rect.bottom() - 1;
+ if (bottom_src_coord < 0 || center_rect.IsEmpty()) {
around_bottom_ = -1;
} else if (bottom_src_coord >= tiling_data->tiling_size().height()) {
around_bottom_ = tiling_data->num_tiles_y();
« no previous file with comments | « cc/base/tiling_data.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698