Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Region::contains(IntPoint) is slow
https://bugs.webkit.org/show_bug.cgi?id=81008

Patch by Dana Jansens <danakj@chromium.org> on 2012-03-13
Reviewed by Anders Carlsson.

Source/WebCore:

Speed up Region::contains(IntPoint) by directly testing if the point
is inside the Region's shape, rather than using a temporary 1x1 Region
for the test.

Unit test: RegionTest.containsPoint

* platform/graphics/Region.cpp:
(WebCore::Region::contains):

Source/WebKit/chromium:

* WebKit.gypi:
* tests/RegionTest.cpp: Added.
(WebCore):
(WebCore::TEST):

Canonical link: https://commits.webkit.org/98200@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@110624 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
danakj authored and webkit-commit-queue committed Mar 13, 2012
1 parent c6779d3 commit d346796
Show file tree
Hide file tree
Showing 5 changed files with 168 additions and 3 deletions.
16 changes: 16 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,19 @@
2012-03-13 Dana Jansens <danakj@chromium.org>

Region::contains(IntPoint) is slow
https://bugs.webkit.org/show_bug.cgi?id=81008

Reviewed by Anders Carlsson.

Speed up Region::contains(IntPoint) by directly testing if the point
is inside the Region's shape, rather than using a temporary 1x1 Region
for the test.

Unit test: RegionTest.containsPoint

* platform/graphics/Region.cpp:
(WebCore::Region::contains):

2012-03-13 Adrienne Walker <enne@google.com>

[chromium] Mark root layer scrollbars as always opaque to disable blending
Expand Down
27 changes: 24 additions & 3 deletions Source/WebCore/platform/graphics/Region.cpp
Expand Up @@ -72,9 +72,30 @@ bool Region::contains(const Region& region) const

bool Region::contains(const IntPoint& point) const
{
// FIXME: This is inefficient. We should be able to iterate over the spans and find
// out if the region contains the point.
return contains(IntRect(point, IntSize(1, 1)));
if (!m_bounds.contains(point))
return false;

for (Shape::SpanIterator span = m_shape.spans_begin(), end = m_shape.spans_end(); span != end && span + 1 != end; ++span) {
int y = span->y;
int maxY = (span + 1)->y;

if (y > point.y())
break;
if (maxY <= point.y())
continue;

for (Shape::SegmentIterator segment = m_shape.segments_begin(span), end = m_shape.segments_end(span); segment != end && segment + 1 != end; segment += 2) {
int x = *segment;
int maxX = *(segment + 1);

if (x > point.x())
break;
if (maxX > point.x())
return true;
}
}

return false;
}

bool Region::intersects(const Region& region) const
Expand Down
12 changes: 12 additions & 0 deletions Source/WebKit/chromium/ChangeLog
@@ -1,3 +1,15 @@
2012-03-13 Dana Jansens <danakj@chromium.org>

Region::contains(IntPoint) is slow
https://bugs.webkit.org/show_bug.cgi?id=81008

Reviewed by Anders Carlsson.

* WebKit.gypi:
* tests/RegionTest.cpp: Added.
(WebCore):
(WebCore::TEST):

2012-03-13 Gavin Peters <gavinp@chromium.org>

Implement ApplicationCacheHost::canCacheInPageCache() for chromium.
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/chromium/WebKit.gypi
Expand Up @@ -116,6 +116,7 @@
'tests/PODArenaTest.cpp',
'tests/PODIntervalTreeTest.cpp',
'tests/PODRedBlackTreeTest.cpp',
'tests/RegionTest.cpp',
'tests/RenderTableCellTest.cpp',
'tests/ScrollbarLayerChromiumTest.cpp',
'tests/TextureManagerTest.cpp',
Expand Down
115 changes: 115 additions & 0 deletions Source/WebKit/chromium/tests/RegionTest.cpp
@@ -0,0 +1,115 @@
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "config.h"

#include "Region.h"

#include <gtest/gtest.h>

using namespace WebCore;

namespace {

#define TEST_INSIDE_RECT(r, x, y, w, h) \
EXPECT_TRUE(r.contains(IntPoint(x, y))); \
EXPECT_TRUE(r.contains(IntPoint(x + w - 1, y))); \
EXPECT_TRUE(r.contains(IntPoint(x, y + h - 1))); \
EXPECT_TRUE(r.contains(IntPoint(x + w - 1, y + h - 1))); \
EXPECT_TRUE(r.contains(IntPoint(x, y + h / 2))); \
EXPECT_TRUE(r.contains(IntPoint(x + w - 1, y + h / 2))); \
EXPECT_TRUE(r.contains(IntPoint(x + w / 2, y))); \
EXPECT_TRUE(r.contains(IntPoint(x + w / 2, y + h - 1))); \
EXPECT_TRUE(r.contains(IntPoint(x + w / 2, y + h / 2))); \

#define TEST_LEFT_OF_RECT(r, x, y, w, h) \
EXPECT_FALSE(r.contains(IntPoint(x - 1, y))); \
EXPECT_FALSE(r.contains(IntPoint(x - 1, y + h - 1))); \

#define TEST_RIGHT_OF_RECT(r, x, y, w, h) \
EXPECT_FALSE(r.contains(IntPoint(x + w, y))); \
EXPECT_FALSE(r.contains(IntPoint(x + w, y + h - 1))); \

#define TEST_TOP_OF_RECT(r, x, y, w, h) \
EXPECT_FALSE(r.contains(IntPoint(x, y - 1))); \
EXPECT_FALSE(r.contains(IntPoint(x + w - 1, y - 1))); \

#define TEST_BOTTOM_OF_RECT(r, x, y, w, h) \
EXPECT_FALSE(r.contains(IntPoint(x, y + h))); \
EXPECT_FALSE(r.contains(IntPoint(x + w - 1, y + h))); \

TEST(RegionTest, containsPoint)
{
Region r;

EXPECT_FALSE(r.contains(IntPoint(0, 0)));

r.unite(IntRect(35, 35, 1, 1));
TEST_INSIDE_RECT(r, 35, 35, 1, 1);
TEST_LEFT_OF_RECT(r, 35, 35, 1, 1);
TEST_RIGHT_OF_RECT(r, 35, 35, 1, 1);
TEST_TOP_OF_RECT(r, 35, 35, 1, 1);
TEST_BOTTOM_OF_RECT(r, 35, 35, 1, 1);

r.unite(IntRect(30, 30, 10, 10));
TEST_INSIDE_RECT(r, 30, 30, 10, 10);
TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
TEST_BOTTOM_OF_RECT(r, 30, 30, 10, 10);

r.unite(IntRect(31, 40, 10, 10));
EXPECT_FALSE(r.contains(IntPoint(30, 40)));
EXPECT_TRUE(r.contains(IntPoint(31, 40)));
EXPECT_FALSE(r.contains(IntPoint(40, 39)));
EXPECT_TRUE(r.contains(IntPoint(40, 40)));

TEST_INSIDE_RECT(r, 30, 30, 10, 10);
TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
TEST_INSIDE_RECT(r, 31, 40, 10, 10);
TEST_LEFT_OF_RECT(r, 31, 40, 10, 10);
TEST_RIGHT_OF_RECT(r, 31, 40, 10, 10);
TEST_BOTTOM_OF_RECT(r, 31, 40, 10, 10);

r.unite(IntRect(42, 40, 10, 10));

TEST_INSIDE_RECT(r, 42, 40, 10, 10);
TEST_LEFT_OF_RECT(r, 42, 40, 10, 10);
TEST_RIGHT_OF_RECT(r, 42, 40, 10, 10);
TEST_TOP_OF_RECT(r, 42, 40, 10, 10);
TEST_BOTTOM_OF_RECT(r, 42, 40, 10, 10);

TEST_INSIDE_RECT(r, 30, 30, 10, 10);
TEST_LEFT_OF_RECT(r, 30, 30, 10, 10);
TEST_RIGHT_OF_RECT(r, 30, 30, 10, 10);
TEST_TOP_OF_RECT(r, 30, 30, 10, 10);
TEST_INSIDE_RECT(r, 31, 40, 10, 10);
TEST_LEFT_OF_RECT(r, 31, 40, 10, 10);
TEST_RIGHT_OF_RECT(r, 31, 40, 10, 10);
TEST_BOTTOM_OF_RECT(r, 31, 40, 10, 10);
}

} // namespace

0 comments on commit d346796

Please sign in to comment.