| Index: Source/core/rendering/shapes/RasterShape.cpp
|
| diff --git a/Source/core/rendering/shapes/RasterShape.cpp b/Source/core/rendering/shapes/RasterShape.cpp
|
| index b2ca5101e5d43454120fcce931fa7a8458fbf6b9..2caf3ec295ae952d83a2a57a5013db8ae96e0c08 100644
|
| --- a/Source/core/rendering/shapes/RasterShape.cpp
|
| +++ b/Source/core/rendering/shapes/RasterShape.cpp
|
| @@ -73,97 +73,6 @@ IntShapeInterval MarginIntervalGenerator::intervalAt(int y) const
|
| return IntShapeInterval(m_x1 - dx, m_x2 + dx);
|
| }
|
|
|
| -void RasterShapeIntervals::appendInterval(int y, int x1, int x2)
|
| -{
|
| - ASSERT(x2 > x1 && (intervalsAt(y).isEmpty() || x1 > intervalsAt(y).last().x2()));
|
| - m_bounds.unite(IntRect(x1, y, x2 - x1, 1));
|
| - intervalsAt(y).append(IntShapeInterval(x1, x2));
|
| -}
|
| -
|
| -void RasterShapeIntervals::uniteMarginInterval(int y, const IntShapeInterval& interval)
|
| -{
|
| - ASSERT(intervalsAt(y).size() <= 1); // Each m_intervalLists entry has 0 or one interval.
|
| -
|
| - if (intervalsAt(y).isEmpty()) {
|
| - intervalsAt(y).append(interval);
|
| - } else {
|
| - IntShapeInterval& resultInterval = intervalsAt(y)[0];
|
| - resultInterval.set(std::min(resultInterval.x1(), interval.x1()), std::max(resultInterval.x2(), interval.x2()));
|
| - }
|
| -
|
| - m_bounds.unite(IntRect(interval.x1(), y, interval.width(), 1));
|
| -}
|
| -
|
| -static inline bool shapeIntervalsContain(const IntShapeIntervals& intervals, const IntShapeInterval& interval)
|
| -{
|
| - for (unsigned i = 0; i < intervals.size(); i++) {
|
| - if (intervals[i].x1() > interval.x2())
|
| - return false;
|
| - if (intervals[i].contains(interval))
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -bool RasterShapeIntervals::contains(const IntRect& rect) const
|
| -{
|
| - if (!bounds().contains(rect))
|
| - return false;
|
| -
|
| - const IntShapeInterval& rectInterval = IntShapeInterval(rect.x(), rect.maxX());
|
| - for (int y = rect.y(); y < rect.maxY(); y++) {
|
| - if (!shapeIntervalsContain(intervalsAt(y), rectInterval))
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -static inline void appendX1Values(const IntShapeIntervals& intervals, int minIntervalWidth, Vector<int>& result)
|
| -{
|
| - for (unsigned i = 0; i < intervals.size(); i++) {
|
| - if (intervals[i].width() >= minIntervalWidth)
|
| - result.append(intervals[i].x1());
|
| - }
|
| -}
|
| -
|
| -bool RasterShapeIntervals::getIntervalX1Values(int y1, int y2, int minIntervalWidth, Vector<int>& result) const
|
| -{
|
| - ASSERT(y1 >= 0 && y2 > y1);
|
| -
|
| - for (int y = y1; y < y2; y++) {
|
| - if (intervalsAt(y).isEmpty())
|
| - return false;
|
| - }
|
| -
|
| - appendX1Values(intervalsAt(y1), minIntervalWidth, result);
|
| - for (int y = y1 + 1; y < y2; y++) {
|
| - if (intervalsAt(y) != intervalsAt(y - 1))
|
| - appendX1Values(intervalsAt(y), minIntervalWidth, result);
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void RasterShapeIntervals::getExcludedIntervals(int y1, int y2, IntShapeIntervals& result) const
|
| -{
|
| - ASSERT(y2 >= y1);
|
| -
|
| - if (y2 < bounds().y() || y1 >= bounds().maxY())
|
| - return;
|
| -
|
| - y1 = std::max(y1, bounds().y());
|
| - y2 = std::min(y2, bounds().maxY());
|
| -
|
| - result = intervalsAt(y1);
|
| - for (int y = y1 + 1; y < y2; y++) {
|
| - IntShapeIntervals intervals;
|
| - IntShapeInterval::uniteShapeIntervals(result, intervalsAt(y), intervals);
|
| - result.swap(intervals);
|
| - }
|
| -}
|
| -
|
| PassOwnPtr<RasterShapeIntervals> RasterShapeIntervals::computeShapeMarginIntervals(int shapeMargin) const
|
| {
|
| int marginIntervalsSize = (offset() > shapeMargin) ? size() : size() - offset() * 2 + shapeMargin * 2;
|
| @@ -171,7 +80,7 @@ PassOwnPtr<RasterShapeIntervals> RasterShapeIntervals::computeShapeMarginInterva
|
| MarginIntervalGenerator marginIntervalGenerator(shapeMargin);
|
|
|
| for (int y = bounds().y(); y < bounds().maxY(); ++y) {
|
| - const IntShapeInterval& intervalAtY = limitIntervalAt(y);
|
| + const IntShapeInterval& intervalAtY = intervalAt(y);
|
| if (intervalAtY.isEmpty())
|
| continue;
|
|
|
| @@ -180,23 +89,35 @@ PassOwnPtr<RasterShapeIntervals> RasterShapeIntervals::computeShapeMarginInterva
|
| int marginY1 = std::min(maxY(), y + shapeMargin);
|
|
|
| for (int marginY = y - 1; marginY >= marginY0; --marginY) {
|
| - if (marginY > bounds().y() && limitIntervalAt(marginY).contains(intervalAtY))
|
| + if (marginY > bounds().y() && intervalAt(marginY).contains(intervalAtY))
|
| break;
|
| - result->uniteMarginInterval(marginY, marginIntervalGenerator.intervalAt(marginY));
|
| + result->intervalAt(marginY).unite(marginIntervalGenerator.intervalAt(marginY));
|
| }
|
|
|
| - result->uniteMarginInterval(y, marginIntervalGenerator.intervalAt(y));
|
| + result->intervalAt(y).unite(marginIntervalGenerator.intervalAt(y));
|
|
|
| for (int marginY = y + 1; marginY <= marginY1; ++marginY) {
|
| - if (marginY < bounds().maxY() && limitIntervalAt(marginY).contains(intervalAtY))
|
| + if (marginY < bounds().maxY() && intervalAt(marginY).contains(intervalAtY))
|
| break;
|
| - result->uniteMarginInterval(marginY, marginIntervalGenerator.intervalAt(marginY));
|
| + result->intervalAt(marginY).unite(marginIntervalGenerator.intervalAt(marginY));
|
| }
|
| }
|
|
|
| + result->initializeBounds();
|
| return result.release();
|
| }
|
|
|
| +void RasterShapeIntervals::initializeBounds()
|
| +{
|
| + m_bounds = IntRect();
|
| + for (int y = minY(); y < maxY(); ++y) {
|
| + const IntShapeInterval& intervalAtY = intervalAt(y);
|
| + if (intervalAtY.isEmpty())
|
| + continue;
|
| + m_bounds.unite(IntRect(intervalAtY.x1(), y, intervalAtY.width(), 1));
|
| + }
|
| +}
|
| +
|
| const RasterShapeIntervals& RasterShape::marginIntervals() const
|
| {
|
| ASSERT(shapeMargin() >= 0);
|
| @@ -211,21 +132,26 @@ const RasterShapeIntervals& RasterShape::marginIntervals() const
|
| return *m_marginIntervals;
|
| }
|
|
|
| -static inline void appendLineSegments(const IntShapeIntervals& intervals, SegmentList& result)
|
| -{
|
| - for (unsigned i = 0; i < intervals.size(); i++)
|
| - result.append(LineSegment(intervals[i].x1(), intervals[i].x2() + 1));
|
| -}
|
| -
|
| void RasterShape::getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const
|
| {
|
| const RasterShapeIntervals& intervals = marginIntervals();
|
| if (intervals.isEmpty())
|
| return;
|
|
|
| - IntShapeIntervals excludedIntervals;
|
| - intervals.getExcludedIntervals(logicalTop, logicalTop + logicalHeight, excludedIntervals);
|
| - appendLineSegments(excludedIntervals, result);
|
| + int y1 = logicalTop;
|
| + int y2 = logicalTop + logicalHeight;
|
| + ASSERT(y2 >= y1);
|
| + if (y2 < intervals.bounds().y() || y1 >= intervals.bounds().maxY())
|
| + return;
|
| +
|
| + y1 = std::max(y1, intervals.bounds().y());
|
| + y2 = std::min(y2, intervals.bounds().maxY());
|
| + IntShapeInterval excludedInterval;
|
| +
|
| + for (int y = y1; y < y2; y++)
|
| + excludedInterval.unite(intervals.intervalAt(y));
|
| +
|
| + result.append(LineSegment(excludedInterval.x1(), excludedInterval.x2() + 1));
|
| }
|
|
|
| } // namespace WebCore
|
|
|