[webkit-reviews] review granted: [Bug 240259] Implement contain flag for ray() in offset path : [Attachment 459267] Patch

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Tue May 17 16:22:50 PDT 2022


Simon Fraser (smfr) <simon.fraser at apple.com> has granted Nikos Mouchtaris
<nmouchtaris at apple.com>'s request for review:
Bug 240259: Implement contain flag for ray() in offset path
https://bugs.webkit.org/show_bug.cgi?id=240259

Attachment 459267: Patch

https://bugs.webkit.org/attachment.cgi?id=459267&action=review




--- Comment #4 from Simon Fraser (smfr) <simon.fraser at apple.com> ---
Comment on attachment 459267
  --> https://bugs.webkit.org/attachment.cgi?id=459267
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=459267&action=review

> Source/WebCore/ChangeLog:23
> +	   Implement contain flag for ray(). Contains purpose is to have the
entire box
> +	   being animated be contained within the path. "Contained within the
path" is defined
> +	   as having the box remain within a circle with a radius of the path
length and positioned at the offset
> +	   anchor. The way this problem is tackled is based on the approach
here: 
> +	  
https://github.com/ewilligers/petrogale-purpureicollis/blob/20b7403d85d664eb943
232e2a34bc95b6f4a8b62/ray.py.
> +	   The way this solution works is that you construct a coordinate
system with the origin being the offset anchor.
> +	   You then calculate the position of each vertex of the box in this
coordinate system. Next, rotate the vertices based
> +	   on the angle's difference from the x axis. We rotate based on the
x-axis as we will translate the box along the 
> +	   x axis (rather than in the direction of the angle of the ray) as
this simplifies the calculation. Next, using the
> +	   circle equation (x^2 + y^2 = r^2), we want to find an offset such
that (x + offset)^2 + y^2 <= r^2, as this will
> +	   result in all points being contained in the circle. Solving for this
equation, we get the upper and lower bounds 
> +	   of such an offset for each vertex: -x - sqrt(r^2 - y^2) <= offset <=
-x + sqrt(r^2 - y^2). Finally, we find the 
> +	   largest lower bound and smallest upper bound, and choose the larger
of the two values to get the clamped offset.
> +	   This currently doesn't take into account if it is not possible to
fit the box within the path, as this will 
> +	   be completed in a separate patch. Currently test 4 is failing due to
rounding error (might want to look into fixing/
> +	   deleting this test), and test 5 is failing due to the part not
implemented yet.

This needs breaking into paragraphs.

> Source/WebCore/platform/graphics/GeometryUtilities.h:96
> +Vector<FloatPoint> verticesForBox(const FloatRect&, const FloatPoint);

The return value should be a FloatQuad (per maybe a std::array<FloatPoint, 4>.
Vector<> implies variable size, and it never is.

> Source/WebCore/rendering/PathOperation.cpp:87
> +    Vector<std::pair<double, double>> bounds;

Vector<..., 4> for inline capacity. Or use a std::array<> and track the early
exit some other way.

> Source/WebCore/rendering/PathOperation.cpp:125
> +    double length = lengthForPath();

lengthForPath returns a float


More information about the webkit-reviews mailing list