Chromium Code Reviews| Index: Source/core/rendering/ExclusionPolygon.cpp |
| diff --git a/Source/core/rendering/ExclusionPolygon.cpp b/Source/core/rendering/ExclusionPolygon.cpp |
| index 760699efb962b1b07bca8a4283e6297e20f5be02..91f643eb7993ccde9ba1c842bf8fc88c4e40c458 100644 |
| --- a/Source/core/rendering/ExclusionPolygon.cpp |
| +++ b/Source/core/rendering/ExclusionPolygon.cpp |
| @@ -108,20 +108,22 @@ static inline FloatSize outwardEdgeNormal(const FloatPolygonEdge& edge) |
| return -inwardEdgeNormal(edge); |
| } |
| -static inline void appendArc(Vector<FloatPoint>& vertices, const FloatPoint& arcCenter, float arcRadius, const FloatPoint& startArcVertex, const FloatPoint& endArcVertex) |
| +static inline void appendArc(Vector<FloatPoint>& vertices, const FloatPoint& arcCenter, float arcRadius, const FloatPoint& startArcVertex, const FloatPoint& endArcVertex, bool padding) |
| { |
| float startAngle = atan2(startArcVertex.y() - arcCenter.y(), startArcVertex.x() - arcCenter.x()); |
| float endAngle = atan2(endArcVertex.y() - arcCenter.y(), endArcVertex.x() - arcCenter.x()); |
| + const float twoPI = piFloat * 2; |
| if (startAngle < 0) |
| - startAngle += piFloat * 2; |
| + startAngle += twoPI; |
| if (endAngle < 0) |
| - endAngle += piFloat * 2; |
| + endAngle += twoPI; |
| + float angle = (startAngle > endAngle) ? (startAngle - endAngle) : (startAngle + twoPI - endAngle); |
| const float arcSegmentCount = 5; // An odd number so that one arc vertex will be eactly arcRadius from arcCenter. |
| - float angle5 = ((startAngle > endAngle) ? (startAngle - endAngle) : (startAngle + piFloat * 2 - endAngle)) / arcSegmentCount; |
| + float angle5 = ((padding) ? -angle : twoPI - angle) / arcSegmentCount; |
| vertices.append(startArcVertex); |
| for (unsigned i = 1; i < arcSegmentCount; ++i) { |
| - float angle = startAngle - angle5 * i; |
| + float angle = startAngle + angle5 * i; |
| vertices.append(arcCenter + FloatPoint(cos(angle) * arcRadius, sin(angle) * arcRadius)); |
| } |
| vertices.append(endArcVertex); |
| @@ -141,20 +143,29 @@ static inline FloatPolygon *computeShapePaddingBounds(const FloatPolygon& polygo |
| if (prevOffsetEdge.intersection(thisOffsetEdge, intersection)) |
| paddedVertices->append(intersection); |
| else if (isReflexVertex(prevEdge.vertex1(), thisEdge.vertex1(), thisEdge.vertex2())) |
| - appendArc(*paddedVertices, thisEdge.vertex1(), padding, prevOffsetEdge.vertex2(), thisOffsetEdge.vertex1()); |
| + appendArc(*paddedVertices, thisEdge.vertex1(), padding, prevOffsetEdge.vertex2(), thisOffsetEdge.vertex1(), true); |
| } |
| return new FloatPolygon(adoptPtr(paddedVertices), fillRule); |
|
eseidel
2013/04/22 16:01:27
Also PassOwnPtr.
|
| } |
| -// FIXME: this is just a stub (bug 112917) |
| static inline FloatPolygon *computeShapeMarginBounds(const FloatPolygon& polygon, float margin, WindRule fillRule) |
|
eseidel
2013/04/22 16:01:27
* goes next to the type in WK style.
|
| { |
| - UNUSED_PARAM(margin); |
| + Vector<FloatPoint>* marginVertices = new Vector<FloatPoint>(); |
|
eseidel
2013/04/22 16:01:27
Please use an OwnPtr so this doens't get accidenta
|
| + FloatPoint intersection; |
| + |
| + for (unsigned i = 0; i < polygon.numberOfEdges(); ++i) { |
| + const FloatPolygonEdge& thisEdge = polygon.edgeAt(i); |
| + const FloatPolygonEdge& prevEdge = thisEdge.previousEdge(); |
| + OffsetPolygonEdge thisOffsetEdge(thisEdge, outwardEdgeNormal(thisEdge) * margin); |
| + OffsetPolygonEdge prevOffsetEdge(prevEdge, outwardEdgeNormal(prevEdge) * margin); |
| + |
| + if (prevOffsetEdge.intersection(thisOffsetEdge, intersection)) |
| + marginVertices->append(intersection); |
| + else |
| + appendArc(*marginVertices, thisEdge.vertex1(), margin, prevOffsetEdge.vertex2(), thisOffsetEdge.vertex1(), false); |
| + } |
| - Vector<FloatPoint>* marginVertices = new Vector<FloatPoint>(polygon.numberOfVertices()); |
| - for (unsigned i = 0; i < polygon.numberOfVertices(); ++i) |
| - (*marginVertices)[i] = polygon.vertexAt(i); |
| return new FloatPolygon(adoptPtr(marginVertices), fillRule); |
|
eseidel
2013/04/22 16:01:27
This needs to return a PassOwnPtr for the same rea
|
| } |
| @@ -328,21 +339,22 @@ static void computeOverlappingEdgeXProjections(const FloatPolygon& polygon, floa |
| void ExclusionPolygon::getExcludedIntervals(float logicalTop, float logicalHeight, SegmentList& result) const |
| { |
| - if (isEmpty()) |
| + const FloatPolygon& polygon = shapeMarginBounds(); |
| + if (polygon.isEmpty()) |
| return; |
| float y1 = logicalTop; |
| float y2 = y1 + logicalHeight; |
| Vector<ExclusionInterval> y1XIntervals, y2XIntervals; |
| - computeXIntersections(m_polygon, y1, true, y1XIntervals); |
| - computeXIntersections(m_polygon, y2, false, y2XIntervals); |
| + computeXIntersections(polygon, y1, true, y1XIntervals); |
| + computeXIntersections(polygon, y2, false, y2XIntervals); |
| Vector<ExclusionInterval> mergedIntervals; |
| mergeExclusionIntervals(y1XIntervals, y2XIntervals, mergedIntervals); |
| Vector<ExclusionInterval> edgeIntervals; |
| - computeOverlappingEdgeXProjections(m_polygon, y1, y2, edgeIntervals); |
| + computeOverlappingEdgeXProjections(polygon, y1, y2, edgeIntervals); |
| Vector<ExclusionInterval> excludedIntervals; |
| mergeExclusionIntervals(mergedIntervals, edgeIntervals, excludedIntervals); |