Index: cc/resources/picture_layer_tiling.cc |
diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc |
index e406417dcec8c22046079f6a7b9ea821a83b2e70..3035033bdc20e85fecf2b77ccfb4fbcdb1202447 100644 |
--- a/cc/resources/picture_layer_tiling.cc |
+++ b/cc/resources/picture_layer_tiling.cc |
@@ -527,6 +527,8 @@ scoped_ptr<base::Value> PictureLayerTiling::AsValue() const { |
return state.PassAs<base::Value>(); |
} |
+namespace { |
+ |
// This struct represents an event at which the expending rect intersects |
// one of its boundaries. 4 intersection events will occur during expansion. |
struct EdgeEvent { |
@@ -535,6 +537,24 @@ struct EdgeEvent { |
int distance; |
}; |
+// Compute the delta to expand from edges to cover target_area. |
+int ComputeExpansionDelta(int num_x_edges, int num_y_edges, |
+ int width, int height, |
+ int64 target_area) { |
+ // Compute coefficients for the quadratic equation: |
+ // a*x^2 + b*x + c = 0 |
+ int a = num_y_edges * num_x_edges; |
+ int b = num_y_edges * width + num_x_edges * height; |
+ int64 c = static_cast<int64>(width) * height - target_area; |
+ |
+ // Compute the delta for our edges using the quadratic equation. |
+ return a == 0 ? -c / b : |
+ (-b + static_cast<int>( |
+ std::sqrt(static_cast<int64>(b) * b - 4.0 * a * c))) / (2 * a); |
+} |
+ |
+} // namespace |
+ |
gfx::Rect PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy( |
gfx::Rect starting_rect, |
int64 target_area, |
@@ -545,9 +565,23 @@ gfx::Rect PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy( |
DCHECK(!bounding_rect.IsEmpty()); |
DCHECK_GT(target_area, 0); |
- gfx::Rect rect = IntersectRects(starting_rect, bounding_rect); |
- if (rect.IsEmpty()) |
+ // Expand the starting rect to cover target_area. |
+ int delta = ComputeExpansionDelta( |
+ 2, 2, starting_rect.width(), starting_rect.height(), target_area); |
+ gfx::Rect expanded_starting_rect = starting_rect; |
+ expanded_starting_rect.Inset(-delta, -delta); |
+ |
+ gfx::Rect rect = IntersectRects(expanded_starting_rect, bounding_rect); |
+ if (rect.IsEmpty()) { |
+ // The starting_rect and bounding_rect are far away. |
return rect; |
+ } |
+ if (rect == expanded_starting_rect) { |
+ // The expanded starting rect already covers target_area on bounding_rect. |
+ return rect; |
+ } |
+ |
+ // Continue to expand rect to let it cover target_area. |
// These values will be updated by the loop and uses as the output. |
int origin_x = rect.x(); |
@@ -584,14 +618,8 @@ gfx::Rect PictureLayerTiling::ExpandRectEquallyToAreaBoundedBy( |
continue; |
} |
- // Compute coefficients for the quadraic equation. |
- int a = num_y_edges * num_x_edges; |
- int b = num_y_edges * width + num_x_edges * height; |
- int c = width * height - target_area; |
- |
- // Compute the delta for our edges using the quadratic equation. |
- int delta = a == 0 ? -c / b : |
- (-b + static_cast<int>(std::sqrt(b * b - 4.0 * a * c))) / (2 * a); |
+ int delta = ComputeExpansionDelta( |
+ num_x_edges, num_y_edges, width, height, target_area); |
// Clamp delta to our event distance. |
if (delta > event.distance) |