void ExclusionPolygon::getIncludedIntervals(float logicalTop, float logicalHeight, SegmentList& result) const { if (isEmpty()) return; float y1 = minYForLogicalLine(logicalTop, logicalHeight); float y2 = maxYForLogicalLine(logicalTop, logicalHeight); Vector<ExclusionInterval> y1XIntervals, y2XIntervals; computeXIntersections(y1, true, y1XIntervals); computeXIntersections(y2, false, y2XIntervals); Vector<ExclusionInterval> commonIntervals; intersectExclusionIntervals(y1XIntervals, y2XIntervals, commonIntervals); Vector<ExclusionInterval> edgeIntervals; computeEdgeIntersections(y1, y2, edgeIntervals); Vector<ExclusionInterval> includedIntervals; subtractExclusionIntervals(commonIntervals, edgeIntervals, includedIntervals); for (unsigned i = 0; i < includedIntervals.size(); i++) { ExclusionInterval interval = includedIntervals[i]; result.append(LineSegment(interval.x1, interval.x2)); } }
void ExclusionPolygon::getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const { const FloatPolygon& polygon = shapePaddingBounds(); if (polygon.isEmpty()) return; float y1 = logicalTop; float y2 = logicalTop + logicalHeight; Vector<ExclusionInterval> y1XIntervals, y2XIntervals; computeXIntersections(polygon, y1, true, y1XIntervals); computeXIntersections(polygon, y2, false, y2XIntervals); Vector<ExclusionInterval> commonIntervals; intersectExclusionIntervals(y1XIntervals, y2XIntervals, commonIntervals); Vector<ExclusionInterval> edgeIntervals; computeOverlappingEdgeXProjections(polygon, y1, y2, edgeIntervals); Vector<ExclusionInterval> includedIntervals; subtractExclusionIntervals(commonIntervals, edgeIntervals, includedIntervals); for (unsigned i = 0; i < includedIntervals.size(); ++i) { ExclusionInterval interval = includedIntervals[i]; result.append(LineSegment(interval.x1, interval.x2)); } }
void PolygonShape::getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const { const FloatPolygon& polygon = shapePaddingBounds(); if (polygon.isEmpty()) return; float y1 = logicalTop; float y2 = logicalTop + logicalHeight; FloatShapeIntervals y1XIntervals, y2XIntervals; computeXIntersections(polygon, y1, true, y1XIntervals); computeXIntersections(polygon, y2, false, y2XIntervals); FloatShapeIntervals commonIntervals; FloatShapeInterval::intersectShapeIntervals(y1XIntervals, y2XIntervals, commonIntervals); FloatShapeIntervals edgeIntervals; computeOverlappingEdgeXProjections(polygon, y1, y2, edgeIntervals); FloatShapeIntervals includedIntervals; FloatShapeInterval::subtractShapeIntervals(commonIntervals, edgeIntervals, includedIntervals); for (unsigned i = 0; i < includedIntervals.size(); ++i) { const FloatShapeInterval& interval = includedIntervals[i]; result.append(LineSegment(interval.x1(), interval.x2())); } }
void ExclusionPolygon::getExcludedIntervals(float logicalTop, float logicalHeight, SegmentList& result) const { const FloatPolygon& polygon = shapeMarginBounds(); if (polygon.isEmpty()) return; float y1 = logicalTop; float y2 = y1 + logicalHeight; Vector<ExclusionInterval> y1XIntervals, y2XIntervals; computeXIntersections(polygon, y1, true, y1XIntervals); computeXIntersections(polygon, y2, false, y2XIntervals); Vector<ExclusionInterval> mergedIntervals; mergeExclusionIntervals(y1XIntervals, y2XIntervals, mergedIntervals); Vector<ExclusionInterval> edgeIntervals; computeOverlappingEdgeXProjections(polygon, y1, y2, edgeIntervals); Vector<ExclusionInterval> excludedIntervals; mergeExclusionIntervals(mergedIntervals, edgeIntervals, excludedIntervals); for (unsigned i = 0; i < excludedIntervals.size(); ++i) { ExclusionInterval interval = excludedIntervals[i]; result.append(LineSegment(interval.x1, interval.x2)); } }
void PolygonShape::getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList& result) const { const FloatPolygon& polygon = shapeMarginBounds(); if (polygon.isEmpty()) return; float y1 = logicalTop; float y2 = logicalTop + logicalHeight; FloatShapeIntervals y1XIntervals, y2XIntervals; computeXIntersections(polygon, y1, true, y1XIntervals); computeXIntersections(polygon, y2, false, y2XIntervals); FloatShapeIntervals mergedIntervals; FloatShapeInterval::uniteShapeIntervals(y1XIntervals, y2XIntervals, mergedIntervals); FloatShapeIntervals edgeIntervals; computeOverlappingEdgeXProjections(polygon, y1, y2, edgeIntervals); FloatShapeIntervals excludedIntervals; FloatShapeInterval::uniteShapeIntervals(mergedIntervals, edgeIntervals, excludedIntervals); for (unsigned i = 0; i < excludedIntervals.size(); ++i) { FloatShapeInterval interval = excludedIntervals[i]; result.append(LineSegment(interval.x1(), interval.x2())); } }