Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1231)

Unified Diff: Source/core/rendering/RenderVTTCue.cpp

Issue 880873002: WebVTT: Implement 'best position' from the rendering section (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Make computePositionScore impl. more clear. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « LayoutTests/media/track/track-cue-rendering-best-position-expected.html ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderVTTCue.cpp
diff --git a/Source/core/rendering/RenderVTTCue.cpp b/Source/core/rendering/RenderVTTCue.cpp
index 5d20273e884c1250f0c8b33b183c48fef4f1e35f..1902d1d8d531ad2d6512ba437ad10e690b10c76c 100644
--- a/Source/core/rendering/RenderVTTCue.cpp
+++ b/Source/core/rendering/RenderVTTCue.cpp
@@ -51,6 +51,7 @@ public:
: m_cueBox(cueBox)
, m_cueWritingDirection(writingDirection)
, m_linePosition(linePosition)
+ , m_bestPositionScore(std::numeric_limits<float>::infinity())
{
}
@@ -59,6 +60,7 @@ public:
private:
bool isOutside() const;
bool isOverlapping() const;
+ float computePositionScore() const;
bool shouldSwitchDirection(InlineFlowBox*, LayoutUnit) const;
void moveBoxesByStep(LayoutUnit);
@@ -68,10 +70,12 @@ private:
bool initializeLayoutParameters(InlineFlowBox*, LayoutUnit&, LayoutUnit&);
void placeBoxInDefaultPosition(LayoutUnit, bool&);
- LayoutPoint m_specifiedPosition;
RenderVTTCue& m_cueBox;
VTTCue::WritingDirection m_cueWritingDirection;
float m_linePosition;
+ LayoutPoint m_specifiedPosition;
+ LayoutPoint m_bestPosition;
+ float m_bestPositionScore;
};
bool SnapToLinesLayouter::findFirstLineBox(InlineFlowBox*& firstLineBox)
@@ -143,7 +147,13 @@ void SnapToLinesLayouter::placeBoxInDefaultPosition(LayoutUnit position, bool& s
m_specifiedPosition = m_cueBox.location();
// 14. Let best position be null. It will hold a position for boxes, much like specified position in the previous step.
+ ASSERT(m_bestPosition == LayoutPoint::zero());
+
// 15. Let best position score be null.
+ // (Setting score to positive infinite that should be guaranteed to be
+ // larger than any overlap - and easily recognizable as 'best position is
+ // null' as well.)
+ ASSERT(std::isinf(m_bestPositionScore));
// 16. Let switched be false.
switched = false;
@@ -213,16 +223,15 @@ bool SnapToLinesLayouter::switchDirection(bool& switched, LayoutUnit& step)
// 24. Switch direction: If switched is true, then move all the boxes in
// boxes back to their best position, and jump to the step labeled done
// positioning below.
+ if (switched) {
+ m_cueBox.setLocation(m_bestPosition);
+ return false;
+ }
// 25. Otherwise, move all the boxes in boxes back to their specified
// position as determined in the earlier step.
m_cueBox.setLocation(m_specifiedPosition);
- // XX. If switched is true, jump to the step labeled done
- // positioning below.
- if (switched)
- return false;
-
// 26. Negate step.
step = -step;
@@ -231,6 +240,26 @@ bool SnapToLinesLayouter::switchDirection(bool& switched, LayoutUnit& step)
return true;
}
+static LayoutUnit computeArea(const LayoutRect& rect)
+{
+ return rect.size().width() * rect.size().height();
+}
+
+float SnapToLinesLayouter::computePositionScore() const
+{
+ // Compute the percentage of the area of the bounding box of the boxes in
+ // boxes that is outside the title area box.
+ LayoutRect boundingBox = m_cueBox.absoluteBoundingBoxRect();
+ LayoutRect titleAreaBox = m_cueBox.containingBlock()->absoluteBoundingBoxRect();
+ LayoutRect boxOverlap = intersection(titleAreaBox, boundingBox);
+ // We know the intersection/overlap, which means we can determine the
+ // non-overlapping part by subtracting that area from the bounding box area.
+ LayoutUnit overlappingArea = computeArea(boxOverlap);
+ LayoutUnit boundingBoxArea = computeArea(boundingBox);
+ ASSERT(overlappingArea >= 0 && overlappingArea <= boundingBoxArea);
+ return (boundingBoxArea - overlappingArea) / boundingBoxArea.toFloat();
+}
+
void SnapToLinesLayouter::layout()
{
// http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings
@@ -259,6 +288,8 @@ void SnapToLinesLayouter::layout()
// 19. Let current position score be the percentage of the area of the
// bounding box of the boxes in boxes that is outside the title area
// box.
+ float currentPositionScore = computePositionScore();
+
// 20. If best position is null (i.e. this is the first run through
// this loop, switched is still false, the boxes in boxes are at their
// specified position, and best position score is still null), or if
@@ -266,6 +297,11 @@ void SnapToLinesLayouter::layout()
// position score, then remember the position of all the boxes in boxes
// as their best position, and set best position score to current
// position score.
+ if (currentPositionScore < m_bestPositionScore) {
+ m_bestPosition = m_cueBox.location();
+ m_bestPositionScore = currentPositionScore;
+ }
+
if (!shouldSwitchDirection(firstLineBox, step)) {
// 22. Move all the boxes in boxes ...
moveBoxesByStep(step);
« no previous file with comments | « LayoutTests/media/track/track-cue-rendering-best-position-expected.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698