WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
Bug 103429
[CSS Exclusions] Add support for computing first included interval position for polygons
https://bugs.webkit.org/show_bug.cgi?id=103429
Summary
[CSS Exclusions] Add support for computing first included interval position f...
Hans Muller
Reported
2012-11-27 09:26:49 PST
Replace the ExclusionPolygon::firstIncludedIntervalPosition() stub. A description of the algorithm I anticipate implementing is here:
http://hansmuller-webkit.blogspot.com/2012/08/revised-algorithm-for-finding-first.html
Attachments
Patch
(24.02 KB, patch)
2013-01-22 11:19 PST
,
Hans Muller
no flags
Details
Formatted Diff
Diff
Patch
(23.81 KB, patch)
2013-01-22 11:38 PST
,
Hans Muller
no flags
Details
Formatted Diff
Diff
Patch
(23.48 KB, patch)
2013-01-22 16:17 PST
,
Hans Muller
krit
: review-
krit
: commit-queue-
Details
Formatted Diff
Diff
Patch
(27.27 KB, patch)
2013-01-23 12:11 PST
,
Hans Muller
krit
: review+
krit
: commit-queue-
Details
Formatted Diff
Diff
Patch
(27.27 KB, patch)
2013-01-23 13:51 PST
,
Hans Muller
no flags
Details
Formatted Diff
Diff
Show Obsolete
(4)
View All
Add attachment
proposed patch, testcase, etc.
Hans Muller
Comment 1
2013-01-22 11:19:48 PST
Created
attachment 184022
[details]
Patch
Hans Muller
Comment 2
2013-01-22 11:38:27 PST
Created
attachment 184027
[details]
Patch Removed an unused ExclusionPolygon field.
Bear Travis
Comment 3
2013-01-22 13:20:42 PST
Comment on
attachment 184027
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=184027&action=review
Only made it through the intersection code so far, but looks good. I've commented on some small tweaks you may consider.
> LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-001-expected.html:6 > + if (window.internals) > + window.internals.settings.setCSSExclusionsEnabled(true);
This isn't necessary in the expectation file.
> LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-001-expected.html:44 > + </br/> X<br/> <span id="blue">XX</span><br/> XXX
Would it be cleaner to wrap this in a pre tag rather than use the nbsp entity?
> LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-001.html:37 > + X <span id="blue">XX</span> XXX
You probably want class for 'blue', 'shape-inside', and 'shape-outline' as ids should only be used once per document.
> Source/WebCore/rendering/ExclusionPolygon.cpp:65 > +static inline bool isPointOnLineSegment(const FloatPoint& p0, const FloatPoint& p1, const FloatPoint& p2)
It would help if the argument names distinguished which point you were testing to be on the line segment.
> Source/WebCore/rendering/ExclusionPolygon.cpp:384 > +static inline float leftSide(const FloatPoint& vertex1, const FloatPoint& vertex2, const FloatPoint& point)
Returning > 0 seems a little odd, since I typically think of numbers increasing from left to right. But if it's a common polygon geometry term, don't sweat it.
> Source/WebCore/rendering/ExclusionPolygon.cpp:389 > +bool ExclusionPolygon::pointInPolygon(const FloatPoint& point) const
Where does this algorithm come from? If you can just include a reference in your changelog, that would be helpful.
> Source/WebCore/rendering/ExclusionPolygon.cpp:427 > + if (!leftSideValues[i])
Does a collinear vertex not count as overlapping?
> Source/WebCore/rendering/ExclusionPolygon.cpp:445 > + float den = determinant(thisDelta, otherDelta);
the jump from the mentioned paper to determinants was non-obvious to me and took a little head-scratching. Might be worth noting in the code or in the changelog.
> Source/WebCore/rendering/ExclusionPolygon.cpp:446 > + if (!den)
what if the two lines are collinear?
Hans Muller
Comment 4
2013-01-22 16:12:54 PST
(In reply to
comment #3
)
> (From update of
attachment 184027
[details]
) > View in context:
https://bugs.webkit.org/attachment.cgi?id=184027&action=review
> > > LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-001-expected.html:6 > > + if (window.internals) > > + window.internals.settings.setCSSExclusionsEnabled(true); > > This isn't necessary in the expectation file.
Thanks, I've removed all occurrences.
> > LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-001-expected.html:44 > > + </br/> X<br/> <span id="blue">XX</span><br/> XXX > > Would it be cleaner to wrap this in a pre tag rather than use the nbsp entity?
The pre tag is confusing (at least to me) in the way it handles leading white space, and spaces are rather critical here. I was able to use it in two of the tests, and it definitely improves readability.
> > LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-001.html:37 > > + X <span id="blue">XX</span> XXX > > You probably want class for 'blue', 'shape-inside', and 'shape-outline' as ids should only be used once per document.
Yes, I've fixed that. And I've removed the extraneous "blue" styles from the files that don't use them.
> > Source/WebCore/rendering/ExclusionPolygon.cpp:65 > > +static inline bool isPointOnLineSegment(const FloatPoint& p0, const FloatPoint& p1, const FloatPoint& p2) > > It would help if the argument names distinguished which point you were testing to be on the line segment.
I've renamed the line line segment endpoint parameters vertex1 and vertex2. Although names like lineSegmentEndpoint1,2 would be more meaningful, they kill the readability of the point arithmetic expressions.
> > Source/WebCore/rendering/ExclusionPolygon.cpp:384 > > +static inline float leftSide(const FloatPoint& vertex1, const FloatPoint& vertex2, const FloatPoint& point) > > Returning > 0 seems a little odd, since I typically think of numbers increasing from left to right. But if it's a common polygon geometry term, don't sweat it.
There's no secret geometer's convention at work here although I have seen this function coded similarly elsewhere.
> > Source/WebCore/rendering/ExclusionPolygon.cpp:389 > > +bool ExclusionPolygon::pointInPolygon(const FloatPoint& point) const > > Where does this algorithm come from? If you can just include a reference in your changelog, that would be helpful.
There are a million variations on this simple point in polygon algorithm. I don't know a definitive reference for exactly this variant, but
http://paulbourke.net/geometry/polygonmesh/
is a good source for point in polygon algorithms in general.
> > Source/WebCore/rendering/ExclusionPolygon.cpp:427 > > + if (!leftSideValues[i]) > > Does a collinear vertex not count as overlapping?
Yes. In other words if the first fit rectangle touches a polygon edge (it's guaranteed to for at least one edge) that's OK.
> > Source/WebCore/rendering/ExclusionPolygon.cpp:446 > > + if (!den) > > what if the two lines are collinear?
In the abstract I think that's OK, since there's no intersection "point" in that case. It may be necessary to deal with this when reflex vertex detection is included, since one could create a shape that pinned the first fit location between a pair of opposing reflex vertices. As a practical matter, this is unlikely to come up very often.
Hans Muller
Comment 5
2013-01-22 16:17:58 PST
Created
attachment 184068
[details]
Patch Incorporated Bear's feedback.
Dirk Schulze
Comment 6
2013-01-23 10:51:24 PST
Comment on
attachment 184068
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=184068&action=review
Some style comments. I am not so familiar with the algorithms and need to trust you here.
> Source/WebCore/rendering/ExclusionPolygon.cpp:397 > + for (unsigned i = 0; i < numberOfEdges(); i++) {
++i
> Source/WebCore/rendering/ExclusionPolygon.cpp:404 > + windingNumber += 1;
why not windingNumber++ and
> Source/WebCore/rendering/ExclusionPolygon.cpp:407 > + windingNumber -= 1;
windingNumber-- ? Use the main advantage of C++ over C :D
> Source/WebCore/rendering/ExclusionPolygon.cpp:427 > + int s = 0;
other name for s please.
> Source/WebCore/rendering/ExclusionPolygon.cpp:431 > + int sgn = leftSideValues[i] > 0 ? 1 : -1;
We don't have a competition for finding the shortest name :D More descriptive name please.
> Source/WebCore/rendering/ExclusionPolygon.cpp:447 > + float den = determinant(thisDelta, otherDelta);
Why den? det would make more sense (used in math anyway). I would even prefer float determinant = this->determinant() but don't know where it is specified.
> Source/WebCore/rendering/ExclusionPolygon.cpp:453 > + float ua = determinant(otherDelta, vertex1Delta) / den; > + float ub = determinant(thisDelta, vertex1Delta) / den;
can you choose more descriptive names here please?
> Source/WebCore/rendering/ExclusionPolygon.cpp:467 > + for (unsigned i = 0; i < overlappingEdges.size(); i++) {
++i
> Source/WebCore/rendering/ExclusionPolygon.cpp:500 > + for (unsigned i = 0; i < numberOfEdges(); i++) {
++i
> Source/WebCore/rendering/ExclusionPolygon.cpp:514 > + for (unsigned j = 0; j < offsetEdgePair.size(); j++)
++j
> Source/WebCore/rendering/ExclusionPolygon.cpp:525 > + for (unsigned i = 0; i < offsetEdges.size() - 1; i++) {
++i
> Source/WebCore/rendering/ExclusionPolygon.cpp:526 > + for (unsigned j = i + 1; j < offsetEdges.size(); j++) {
++j
Hans Muller
Comment 7
2013-01-23 12:11:08 PST
Created
attachment 184277
[details]
Patch Made the changes that Dirk recommended.
WebKit Review Bot
Comment 8
2013-01-23 12:14:13 PST
Attachment 184277
[details]
did not pass style-queue: Failed to run "['Tools/Scripts/check-webkit-style', '--diff-files', u'LayoutTests/ChangeLog', u'LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-001-expected.html', u'LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-001.html', u'LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-002-expected.html', u'LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-002.html', u'LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-003-expected.html', u'LayoutTests/fast/exclusions/shape-inside/shape-inside-first-fit-003.html', u'Source/WebCore/ChangeLog', u'Source/WebCore/platform/graphics/FloatSize.h', u'Source/WebCore/rendering/ExclusionPolygon.cpp', u'Source/WebCore/rendering/ExclusionPolygon.h']" exit_code: 1 Source/WebCore/rendering/ExclusionPolygon.cpp:452: Should have only a single space after a punctuation in a comment. [whitespace/comments] [5] Total errors found: 1 in 11 files If any of these errors are false positives, please file a bug against check-webkit-style.
Dirk Schulze
Comment 9
2013-01-23 12:26:24 PST
Comment on
attachment 184277
[details]
Patch Please fix the style issue before landing. r=me.
Hans Muller
Comment 10
2013-01-23 13:51:20 PST
Created
attachment 184303
[details]
Patch
WebKit Review Bot
Comment 11
2013-01-23 15:13:00 PST
Comment on
attachment 184303
[details]
Patch Clearing flags on attachment: 184303 Committed
r140606
: <
http://trac.webkit.org/changeset/140606
>
WebKit Review Bot
Comment 12
2013-01-23 15:13:04 PST
All reviewed patches have been landed. Closing bug.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug