diff options
-rw-r--r-- | cc/layers/content_layer_unittest.cc | 6 | ||||
-rw-r--r-- | cc/layers/picture_layer.cc | 4 | ||||
-rw-r--r-- | cc/layers/picture_layer_impl_unittest.cc | 12 | ||||
-rw-r--r-- | cc/layers/scrollbar_layer.cc | 7 | ||||
-rw-r--r-- | cc/layers/tiled_layer_unittest.cc | 2 | ||||
-rw-r--r-- | cc/output/renderer_pixeltest.cc | 2 | ||||
-rw-r--r-- | cc/resources/content_layer_updater.cc | 9 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling.cc | 25 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling.h | 4 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling_set.cc | 4 | ||||
-rw-r--r-- | cc/resources/picture_layer_tiling_unittest.cc | 4 | ||||
-rw-r--r-- | cc/resources/picture_pile_base.cc | 4 | ||||
-rw-r--r-- | cc/resources/picture_pile_impl.cc | 16 | ||||
-rw-r--r-- | cc/resources/picture_pile_unittest.cc | 8 | ||||
-rw-r--r-- | ui/gfx/rect.h | 29 | ||||
-rw-r--r-- | ui/gfx/rect_unittest.cc | 88 |
16 files changed, 169 insertions, 55 deletions
diff --git a/cc/layers/content_layer_unittest.cc b/cc/layers/content_layer_unittest.cc index defb246..16e42ed 100644 --- a/cc/layers/content_layer_unittest.cc +++ b/cc/layers/content_layer_unittest.cc @@ -35,7 +35,7 @@ TEST(ContentLayerTest, ContentLayerPainterWithDeviceScale) { float contents_scale = 2.f; gfx::Rect content_rect(10, 10, 100, 100); gfx::Rect opaque_rect_in_layer_space(5, 5, 20, 20); - gfx::RectF opaque_rect_in_content_space = gfx::ScaleRect( + gfx::Rect opaque_rect_in_content_space = gfx::ScaleToEnclosingRect( opaque_rect_in_layer_space, contents_scale, contents_scale); MockContentLayerClient client(opaque_rect_in_layer_space); FakeRenderingStatsInstrumentation stats_instrumentation; @@ -52,8 +52,8 @@ TEST(ContentLayerTest, ContentLayerPainterWithDeviceScale) { &resulting_opaque_rect, NULL); - EXPECT_RECT_EQ(gfx::ToEnclosingRect(opaque_rect_in_content_space), - resulting_opaque_rect); + EXPECT_EQ(opaque_rect_in_content_space.ToString(), + resulting_opaque_rect.ToString()); } } // namespace diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc index 87c19d7..dfb645f 100644 --- a/cc/layers/picture_layer.cc +++ b/cc/layers/picture_layer.cc @@ -87,8 +87,8 @@ void PictureLayer::Update(ResourceUpdateQueue*, pile_invalidation_.Swap(&pending_invalidation_); pending_invalidation_.Clear(); - gfx::Rect visible_layer_rect = gfx::ToEnclosingRect( - gfx::ScaleRect(visible_content_rect(), 1.f / contents_scale_x())); + gfx::Rect visible_layer_rect = gfx::ScaleToEnclosingRect( + visible_content_rect(), 1.f / contents_scale_x()); devtools_instrumentation::ScopedPaintLayer paint_layer(id()); pile_->Update(client_, background_color(), diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc index 4111e07..e6cb0f5 100644 --- a/cc/layers/picture_layer_impl_unittest.cc +++ b/cc/layers/picture_layer_impl_unittest.cc @@ -246,9 +246,9 @@ TEST_F(PictureLayerImplTest, ClonePartialInvalidation) { EXPECT_GT(tilings->num_tilings(), 0u); for (size_t i = 0; i < tilings->num_tilings(); ++i) { const PictureLayerTiling* tiling = tilings->tiling_at(i); - gfx::Rect content_invalidation = gfx::ToEnclosingRect(gfx::ScaleRect( + gfx::Rect content_invalidation = gfx::ScaleToEnclosingRect( layer_invalidation, - tiling->contents_scale())); + tiling->contents_scale()); for (PictureLayerTiling::CoverageIterator iter(tiling, tiling->contents_scale(), @@ -309,9 +309,9 @@ TEST_F(PictureLayerImplTest, NoInvalidationBoundsChange) { EXPECT_GT(tilings->num_tilings(), 0u); for (size_t i = 0; i < tilings->num_tilings(); ++i) { const PictureLayerTiling* tiling = tilings->tiling_at(i); - gfx::Rect active_content_bounds = gfx::ToEnclosingRect(gfx::ScaleRect( + gfx::Rect active_content_bounds = gfx::ScaleToEnclosingRect( gfx::Rect(active_layer_bounds), - tiling->contents_scale())); + tiling->contents_scale()); for (PictureLayerTiling::CoverageIterator iter(tiling, tiling->contents_scale(), @@ -376,8 +376,8 @@ TEST_F(PictureLayerImplTest, AddTilesFromNewRecording) { ++iter) { EXPECT_FALSE(iter.full_tile_geometry_rect().IsEmpty()); // Ensure there is a recording for this tile. - gfx::Rect layer_rect = gfx::ToEnclosingRect(gfx::ScaleRect( - iter.full_tile_geometry_rect(), 1.f / tiling->contents_scale())); + gfx::Rect layer_rect = gfx::ScaleToEnclosingRect( + iter.full_tile_geometry_rect(), 1.f / tiling->contents_scale()); layer_rect.Intersect(gfx::Rect(layer_bounds)); bool in_pending = pending_pile->recorded_region().Contains(layer_rect); diff --git a/cc/layers/scrollbar_layer.cc b/cc/layers/scrollbar_layer.cc index 3d6f6f5..4b8accb 100644 --- a/cc/layers/scrollbar_layer.cc +++ b/cc/layers/scrollbar_layer.cc @@ -358,10 +358,9 @@ gfx::Rect ScrollbarLayer::ScrollbarLayerRectToContentRect( gfx::Rect layer_rect) const { // Don't intersect with the bounds as in LayerRectToContentRect() because // layer_rect here might be in coordinates of the containing layer. - gfx::RectF content_rect = gfx::ScaleRect(layer_rect, - contents_scale_y(), - contents_scale_y()); - return gfx::ToEnclosingRect(content_rect); + return gfx::ScaleToEnclosingRect(layer_rect, + contents_scale_y(), + contents_scale_y()); } void ScrollbarLayer::SetTexturePriorities( diff --git a/cc/layers/tiled_layer_unittest.cc b/cc/layers/tiled_layer_unittest.cc index d6b5d69..fb682d4 100644 --- a/cc/layers/tiled_layer_unittest.cc +++ b/cc/layers/tiled_layer_unittest.cc @@ -1379,7 +1379,7 @@ TEST_F(TiledLayerTest, TilesPaintedWithOcclusionAndScaling) { gfx::Rect layer_bounds_rect(layer->bounds()); layer->draw_properties().drawable_content_rect = - gfx::ToEnclosingRect(gfx::ScaleRect(layer_bounds_rect, 0.5)); + gfx::ScaleToEnclosingRect(layer_bounds_rect, 0.5f); layer->draw_properties().visible_content_rect = gfx::Rect(layer->content_bounds()); layer->InvalidateContentRect(gfx::Rect(0, 0, 600, 600)); diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc index 672f64b..060a284 100644 --- a/cc/output/renderer_pixeltest.cc +++ b/cc/output/renderer_pixeltest.cc @@ -910,7 +910,7 @@ TYPED_TEST(RendererPixelTest, PictureDrawQuadNonIdentityScale) { pile->RerecordPile(); gfx::Rect content_rect( - gfx::ToEnclosingRect(gfx::ScaleRect(layer_rect, contents_scale))); + gfx::ScaleToEnclosingRect(layer_rect, contents_scale)); gfx::Rect content_union_rect( gfx::ToEnclosingRect(gfx::ScaleRect(union_layer_rect, contents_scale))); diff --git a/cc/resources/content_layer_updater.cc b/cc/resources/content_layer_updater.cc index e267398..4e967e2 100644 --- a/cc/resources/content_layer_updater.cc +++ b/cc/resources/content_layer_updater.cc @@ -42,9 +42,8 @@ void ContentLayerUpdater::PaintContents(SkCanvas* canvas, canvas->scale(SkFloatToScalar(contents_width_scale), SkFloatToScalar(contents_height_scale)); - gfx::RectF rect = gfx::ScaleRect( + layer_rect = gfx::ScaleToEnclosingRect( content_rect, 1.f / contents_width_scale, 1.f / contents_height_scale); - layer_rect = gfx::ToEnclosingRect(rect); } SkPaint paint; @@ -59,9 +58,9 @@ void ContentLayerUpdater::PaintContents(SkCanvas* canvas, painter_->Paint(canvas, layer_rect, &opaque_layer_rect); canvas->restore(); - gfx::RectF opaque_content_rect = gfx::ScaleRect( - opaque_layer_rect, contents_width_scale, contents_height_scale); - *resulting_opaque_rect = gfx::ToEnclosedRect(opaque_content_rect); + gfx::Rect opaque_content_rect = gfx::ToEnclosedRect(gfx::ScaleRect( + opaque_layer_rect, contents_width_scale, contents_height_scale)); + *resulting_opaque_rect = opaque_content_rect; content_rect_ = content_rect; } diff --git a/cc/resources/picture_layer_tiling.cc b/cc/resources/picture_layer_tiling.cc index 8913c64..8aef066 100644 --- a/cc/resources/picture_layer_tiling.cc +++ b/cc/resources/picture_layer_tiling.cc @@ -89,7 +89,7 @@ void PictureLayerTiling::CreateTile(int i, int j) { Tile* candidate_tile = twin->TileAt(i, j); if (candidate_tile) { gfx::Rect rect = - gfx::ToEnclosingRect(ScaleRect(paint_rect, 1.0f / contents_scale_)); + gfx::ScaleToEnclosingRect(paint_rect, 1.0f / contents_scale_); if (!client_->GetInvalidation()->Intersects(rect)) { tiles_[key] = candidate_tile; return; @@ -160,9 +160,9 @@ PictureLayerTiling::CoverageIterator::CoverageIterator( 1 / dest_to_content_scale_)); gfx::Rect content_rect = - gfx::ToEnclosingRect(gfx::ScaleRect(dest_rect_, - dest_to_content_scale_, - dest_to_content_scale_)); + gfx::ScaleToEnclosingRect(dest_rect_, + dest_to_content_scale_, + dest_to_content_scale_); // IndexFromSrcCoord clamps to valid tile ranges, so it's necessary to // check for non-intersection first. content_rect.Intersect(gfx::Rect(tiling_->tiling_data_.total_size())); @@ -211,9 +211,10 @@ PictureLayerTiling::CoverageIterator::operator++() { gfx::Rect content_rect = tiling_->tiling_data_.TileBounds(tile_i_, tile_j_); - current_geometry_rect_ = gfx::ToEnclosingRect( - gfx::ScaleRect(content_rect, 1 / dest_to_content_scale_, - 1 / dest_to_content_scale_)); + current_geometry_rect_ = + gfx::ScaleToEnclosingRect(content_rect, + 1 / dest_to_content_scale_, + 1 / dest_to_content_scale_); current_geometry_rect_.Intersect(dest_rect_); @@ -283,8 +284,8 @@ void PictureLayerTiling::Reset() { void PictureLayerTiling::UpdateTilePriorities( WhichTree tree, gfx::Size device_viewport, - const gfx::RectF& viewport_in_layer_space, - const gfx::RectF& visible_layer_rect, + gfx::Rect viewport_in_layer_space, + gfx::Rect visible_layer_rect, gfx::Size last_layer_bounds, gfx::Size current_layer_bounds, float last_layer_contents_scale, @@ -304,11 +305,9 @@ void PictureLayerTiling::UpdateTilePriorities( } gfx::Rect viewport_in_content_space = - gfx::ToEnclosingRect(gfx::ScaleRect(viewport_in_layer_space, - contents_scale_)); + gfx::ScaleToEnclosingRect(viewport_in_layer_space, contents_scale_); gfx::Rect visible_content_rect = - gfx::ToEnclosingRect(gfx::ScaleRect(visible_layer_rect, - contents_scale_)); + gfx::ScaleToEnclosingRect(visible_layer_rect, contents_scale_); gfx::Size tile_size = tiling_data_.max_texture_size(); int64 interest_rect_area = diff --git a/cc/resources/picture_layer_tiling.h b/cc/resources/picture_layer_tiling.h index 3243dd8..c6521ad 100644 --- a/cc/resources/picture_layer_tiling.h +++ b/cc/resources/picture_layer_tiling.h @@ -129,8 +129,8 @@ class CC_EXPORT PictureLayerTiling { void UpdateTilePriorities( WhichTree tree, gfx::Size device_viewport, - const gfx::RectF& viewport_in_layer_space, - const gfx::RectF& visible_layer_rect, + gfx::Rect viewport_in_layer_space, + gfx::Rect visible_layer_rect, gfx::Size last_layer_bounds, gfx::Size current_layer_bounds, float last_layer_contents_scale, diff --git a/cc/resources/picture_layer_tiling_set.cc b/cc/resources/picture_layer_tiling_set.cc index 47d384b..865a434 100644 --- a/cc/resources/picture_layer_tiling_set.cc +++ b/cc/resources/picture_layer_tiling_set.cc @@ -263,10 +263,10 @@ void PictureLayerTilingSet::UpdateTilePriorities( const gfx::Transform& current_screen_transform, double current_frame_time_in_seconds, size_t max_tiles_for_interest_area) { - gfx::RectF viewport_in_layer_space = gfx::ScaleRect( + gfx::Rect viewport_in_layer_space = gfx::ScaleToEnclosingRect( viewport_in_content_space, 1.f / current_layer_contents_scale); - gfx::RectF visible_layer_rect = gfx::ScaleRect( + gfx::Rect visible_layer_rect = gfx::ScaleToEnclosingRect( visible_content_rect, 1.f / current_layer_contents_scale); diff --git a/cc/resources/picture_layer_tiling_unittest.cc b/cc/resources/picture_layer_tiling_unittest.cc index 3a90796..e708251 100644 --- a/cc/resources/picture_layer_tiling_unittest.cc +++ b/cc/resources/picture_layer_tiling_unittest.cc @@ -128,8 +128,8 @@ class PictureLayerTilingIteratorTest : public testing::Test { void VerifyTilesCoverNonContainedRect(float rect_scale, gfx::Rect dest_rect) { float dest_to_contents_scale = tiling_->contents_scale() / rect_scale; - gfx::Rect clamped_rect(gfx::ToEnclosingRect(gfx::ScaleRect( - tiling_->ContentRect(), 1 / dest_to_contents_scale))); + gfx::Rect clamped_rect = gfx::ScaleToEnclosingRect( + tiling_->ContentRect(), 1.f / dest_to_contents_scale); clamped_rect.Intersect(dest_rect); VerifyTilesExactlyCoverRect(rect_scale, dest_rect, clamped_rect); } diff --git a/cc/resources/picture_pile_base.cc b/cc/resources/picture_pile_base.cc index 85c2ee8..ed1b6a2 100644 --- a/cc/resources/picture_pile_base.cc +++ b/cc/resources/picture_pile_base.cc @@ -170,8 +170,8 @@ bool PicturePileBase::HasRecordingAt(int x, int y) { bool PicturePileBase::CanRaster(float contents_scale, gfx::Rect content_rect) { if (tiling_.total_size().IsEmpty()) return false; - gfx::Rect layer_rect = gfx::ToEnclosingRect( - gfx::ScaleRect(content_rect, 1.f / contents_scale)); + gfx::Rect layer_rect = gfx::ScaleToEnclosingRect( + content_rect, 1.f / contents_scale); layer_rect.Intersect(gfx::Rect(tiling_.total_size())); return recorded_region_.Contains(layer_rect); } diff --git a/cc/resources/picture_pile_impl.cc b/cc/resources/picture_pile_impl.cc index 7cd06a8..052e075 100644 --- a/cc/resources/picture_pile_impl.cc +++ b/cc/resources/picture_pile_impl.cc @@ -112,8 +112,8 @@ void PicturePileImpl::Raster( } // Rasterize the collection of relevant picture piles. - gfx::Rect layer_rect = gfx::ToEnclosingRect( - gfx::ScaleRect(content_rect, 1.f / contents_scale)); + gfx::Rect layer_rect = gfx::ScaleToEnclosingRect( + content_rect, 1.f / contents_scale); canvas->clipRect(gfx::RectToSkRect(content_rect), SkRegion::kReplace_Op); @@ -144,8 +144,8 @@ void PicturePileImpl::Raster( // of the picture's layer rect. The min_contents_scale enforces that // enough buffer pixels have been added such that the enclosed rect // encompasses all invalidated pixels at any larger scale level. - gfx::Rect content_clip = gfx::ToEnclosedRect( - gfx::ScaleRect((*i)->LayerRect(), contents_scale)); + gfx::Rect content_clip = gfx::ScaleToEnclosedRect( + (*i)->LayerRect(), contents_scale); DCHECK(!content_clip.IsEmpty()) << "Layer rect: " << (*i)->LayerRect().ToString() << "Contents scale: " << contents_scale; @@ -246,8 +246,8 @@ void PicturePileImpl::AnalyzeInRect(gfx::Rect content_rect, DCHECK(analysis); TRACE_EVENT0("cc", "PicturePileImpl::AnalyzeInRect"); - gfx::Rect layer_rect = gfx::ToEnclosingRect( - gfx::ScaleRect(content_rect, 1.0f / contents_scale)); + gfx::Rect layer_rect = gfx::ScaleToEnclosingRect( + content_rect, 1.0f / contents_scale); layer_rect.Intersect(gfx::Rect(tiling_.total_size())); @@ -277,8 +277,8 @@ PicturePileImpl::PixelRefIterator::PixelRefIterator( float contents_scale, const PicturePileImpl* picture_pile) : picture_pile_(picture_pile), - layer_rect_(gfx::ToEnclosingRect( - gfx::ScaleRect(content_rect, 1.f / contents_scale))), + layer_rect_(gfx::ScaleToEnclosingRect( + content_rect, 1.f / contents_scale)), tile_iterator_(&picture_pile_->tiling_, layer_rect_), picture_list_(NULL) { // Early out if there isn't a single tile. diff --git a/cc/resources/picture_pile_unittest.cc b/cc/resources/picture_pile_unittest.cc index f8e1a63..7f75cee 100644 --- a/cc/resources/picture_pile_unittest.cc +++ b/cc/resources/picture_pile_unittest.cc @@ -64,8 +64,8 @@ TEST(PicturePileTest, SmallInvalidateInflated) { it != picture_list.end(); ++it) { scoped_refptr<Picture> picture = *it; - gfx::Rect picture_rect = gfx::ToEnclosedRect( - gfx::ScaleRect(picture->LayerRect(), min_scale)); + gfx::Rect picture_rect = + gfx::ScaleToEnclosedRect(picture->LayerRect(), min_scale); // The invalidation in each tile should have been made large enough // that scaling it never makes a rect smaller than 1 px wide or tall. @@ -185,8 +185,8 @@ TEST(PicturePileTest, InvalidateOnTileBoundaryInflated) { it != picture_list.end(); ++it) { scoped_refptr<Picture> picture = *it; - gfx::Rect picture_rect = gfx::ToEnclosedRect( - gfx::ScaleRect(picture->LayerRect(), min_scale)); + gfx::Rect picture_rect = + gfx::ScaleToEnclosedRect(picture->LayerRect(), min_scale); // The invalidation in each tile should have been made large enough // that scaling it never makes a rect smaller than 1 px wide or tall. diff --git a/ui/gfx/rect.h b/ui/gfx/rect.h index 52856d7..d983770 100644 --- a/ui/gfx/rect.h +++ b/ui/gfx/rect.h @@ -12,6 +12,7 @@ #ifndef UI_GFX_RECT_H_ #define UI_GFX_RECT_H_ +#include <cmath> #include <string> #include "ui/gfx/point.h" @@ -107,6 +108,34 @@ UI_EXPORT Rect SubtractRects(const Rect& a, const Rect& b); // contained within the rect, because they will appear on one of these edges. UI_EXPORT Rect BoundingRect(const Point& p1, const Point& p2); +inline Rect ScaleToEnclosingRect(const Rect& rect, + float x_scale, + float y_scale) { + int x = std::floor(rect.x() * x_scale); + int y = std::floor(rect.y() * y_scale); + int r = rect.width() == 0 ? x : std::ceil(rect.right() * x_scale); + int b = rect.height() == 0 ? y : std::ceil(rect.bottom() * y_scale); + return Rect(x, y, r - x, b - y); +} + +inline Rect ScaleToEnclosingRect(const Rect& rect, float scale) { + return ScaleToEnclosingRect(rect, scale, scale); +} + +inline Rect ScaleToEnclosedRect(const Rect& rect, + float x_scale, + float y_scale) { + int x = std::ceil(rect.x() * x_scale); + int y = std::ceil(rect.y() * y_scale); + int r = rect.width() == 0 ? x : std::floor(rect.right() * x_scale); + int b = rect.height() == 0 ? y : std::floor(rect.bottom() * y_scale); + return Rect(x, y, r - x, b - y); +} + +inline Rect ScaleToEnclosedRect(const Rect& rect, float scale) { + return ScaleToEnclosedRect(rect, scale, scale); +} + #if !defined(COMPILER_MSVC) extern template class RectBase<Rect, Point, Size, Insets, Vector2d, int>; #endif diff --git a/ui/gfx/rect_unittest.cc b/ui/gfx/rect_unittest.cc index 2e18ae7..50ccdcf 100644 --- a/ui/gfx/rect_unittest.cc +++ b/ui/gfx/rect_unittest.cc @@ -602,6 +602,94 @@ TEST(RectTest, ToFlooredRect) { } } +TEST(RectTest, ScaleToEnclosedRect) { + static const struct Test { + Rect input_rect; + float input_scale; + Rect expected_rect; + } tests[] = { + { + Rect(), + 5.f, + Rect(), + }, { + Rect(1, 1, 1, 1), + 5.f, + Rect(5, 5, 5, 5), + }, { + Rect(-1, -1, 0, 0), + 5.f, + Rect(-5, -5, 0, 0), + }, { + Rect(1, -1, 0, 1), + 5.f, + Rect(5, -5, 0, 5), + }, { + Rect(-1, 1, 1, 0), + 5.f, + Rect(-5, 5, 5, 0), + }, { + Rect(1, 2, 3, 4), + 1.5f, + Rect(2, 3, 4, 6), + }, { + Rect(-1, -2, 0, 0), + 1.5f, + Rect(-1, -3, 0, 0), + } + }; + + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { + Rect result = ScaleToEnclosedRect(tests[i].input_rect, + tests[i].input_scale); + EXPECT_EQ(tests[i].expected_rect.ToString(), result.ToString()); + } +} + +TEST(RectTest, ScaleToEnclosingRect) { + static const struct Test { + Rect input_rect; + float input_scale; + Rect expected_rect; + } tests[] = { + { + Rect(), + 5.f, + Rect(), + }, { + Rect(1, 1, 1, 1), + 5.f, + Rect(5, 5, 5, 5), + }, { + Rect(-1, -1, 0, 0), + 5.f, + Rect(-5, -5, 0, 0), + }, { + Rect(1, -1, 0, 1), + 5.f, + Rect(5, -5, 0, 5), + }, { + Rect(-1, 1, 1, 0), + 5.f, + Rect(-5, 5, 5, 0), + }, { + Rect(1, 2, 3, 4), + 1.5f, + Rect(1, 3, 5, 6), + }, { + Rect(-1, -2, 0, 0), + 1.5f, + Rect(-2, -3, 0, 0), + } + }; + + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { + Rect result = ScaleToEnclosingRect(tests[i].input_rect, + tests[i].input_scale); + EXPECT_EQ(tests[i].expected_rect.ToString(), result.ToString()); + } +} + #if defined(OS_WIN) TEST(RectTest, ConstructAndAssign) { const RECT rect_1 = { 0, 0, 10, 10 }; |