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

Side by Side Diff: Source/core/rendering/RenderVTTCue.cpp

Issue 882343003: Use the CSS writing-mode rather than the one from VTTCue (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Victor Carbune (victor@rosedu.org) 2 * Copyright (C) 2012 Victor Carbune (victor@rosedu.org)
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 29 matching lines...) Expand all
40 40
41 void RenderVTTCue::trace(Visitor* visitor) 41 void RenderVTTCue::trace(Visitor* visitor)
42 { 42 {
43 visitor->trace(m_cue); 43 visitor->trace(m_cue);
44 RenderBlockFlow::trace(visitor); 44 RenderBlockFlow::trace(visitor);
45 } 45 }
46 46
47 class SnapToLinesLayouter { 47 class SnapToLinesLayouter {
48 STACK_ALLOCATED(); 48 STACK_ALLOCATED();
49 public: 49 public:
50 SnapToLinesLayouter(RenderVTTCue& cueBox, VTTCue::WritingDirection writingDi rection, float linePosition) 50 SnapToLinesLayouter(RenderVTTCue& cueBox, float linePosition)
51 : m_cueBox(cueBox) 51 : m_cueBox(cueBox)
52 , m_cueWritingDirection(writingDirection)
53 , m_linePosition(linePosition) 52 , m_linePosition(linePosition)
54 { 53 {
55 } 54 }
56 55
57 void layout(); 56 void layout();
58 57
59 private: 58 private:
60 bool isOutside() const; 59 bool isOutside() const;
61 bool isOverlapping() const; 60 bool isOverlapping() const;
62 LayoutUnit computeInitialPositionAdjustment(LayoutUnit&) const; 61 LayoutUnit computeInitialPositionAdjustment(LayoutUnit&) const;
63 bool shouldSwitchDirection(InlineFlowBox*, LayoutUnit) const; 62 bool shouldSwitchDirection(InlineFlowBox*, LayoutUnit) const;
64 63
65 void moveBoxesBy(LayoutUnit distance) 64 void moveBoxesBy(LayoutUnit distance)
66 { 65 {
67 if (m_cueWritingDirection == VTTCue::Horizontal) 66 m_cueBox.setLogicalTop(m_cueBox.logicalTop() + distance);
68 m_cueBox.setY(m_cueBox.location().y() + distance);
69 else
70 m_cueBox.setX(m_cueBox.location().x() + distance);
71 } 67 }
72 68
73 InlineFlowBox* findFirstLineBox() const; 69 InlineFlowBox* findFirstLineBox() const;
74 70
75 LayoutPoint m_specifiedPosition; 71 LayoutPoint m_specifiedPosition;
76 RenderVTTCue& m_cueBox; 72 RenderVTTCue& m_cueBox;
77 VTTCue::WritingDirection m_cueWritingDirection;
78 float m_linePosition; 73 float m_linePosition;
79 }; 74 };
80 75
81 InlineFlowBox* SnapToLinesLayouter::findFirstLineBox() const 76 InlineFlowBox* SnapToLinesLayouter::findFirstLineBox() const
82 { 77 {
83 if (!m_cueBox.firstChild()->isRenderInline()) 78 if (!m_cueBox.firstChild()->isRenderInline())
84 return nullptr; 79 return nullptr;
85 return toRenderInline(m_cueBox.firstChild())->firstLineBox(); 80 return toRenderInline(m_cueBox.firstChild())->firstLineBox();
86 } 81 }
87 82
88 LayoutUnit SnapToLinesLayouter::computeInitialPositionAdjustment(LayoutUnit& ste p) const 83 LayoutUnit SnapToLinesLayouter::computeInitialPositionAdjustment(LayoutUnit& ste p) const
89 { 84 {
90 // 6. Let line position be the text track cue computed line position. 85 // 6. Let line position be the text track cue computed line position.
91 // 7. Round line position to an integer by adding 0.5 and then flooring it. 86 // 7. Round line position to an integer by adding 0.5 and then flooring it.
92 LayoutUnit linePosition = floorf(m_linePosition + 0.5f); 87 LayoutUnit linePosition = floorf(m_linePosition + 0.5f);
93 88
89 WritingMode writingMode = m_cueBox.style()->writingMode();
94 // 8. Vertical Growing Left: Add one to line position then negate it. 90 // 8. Vertical Growing Left: Add one to line position then negate it.
95 if (m_cueWritingDirection == VTTCue::VerticalGrowingLeft) 91 if (writingMode == RightToLeftWritingMode)
96 linePosition = -(linePosition + 1); 92 linePosition = -(linePosition + 1);
97 93
98 // 9. Let position be the result of multiplying step and line position. 94 // 9. Let position be the result of multiplying step and line position.
99 LayoutUnit position = step * linePosition; 95 LayoutUnit position = step * linePosition;
100 96
101 // 10. Vertical Growing Left: Decrease position by the width of the 97 // 10. Vertical Growing Left: Decrease position by the width of the
102 // bounding box of the boxes in boxes, then increase position by step. 98 // bounding box of the boxes in boxes, then increase position by step.
103 if (m_cueWritingDirection == VTTCue::VerticalGrowingLeft) { 99 if (writingMode == RightToLeftWritingMode) {
104 position -= m_cueBox.size().width(); 100 position -= m_cueBox.size().width();
105 position += step; 101 position += step;
106 } 102 }
107 103
108 // 11. If line position is less than zero... 104 // 11. If line position is less than zero...
109 if (linePosition < 0) { 105 if (linePosition < 0) {
110 RenderBlock* parentBlock = m_cueBox.containingBlock(); 106 RenderBlock* parentBlock = m_cueBox.containingBlock();
111 107
112 // Horizontal / Vertical: ... then increase position by the 108 // Horizontal / Vertical: ... then increase position by the
113 // height / width of the video's rendering area ... 109 // height / width of the video's rendering area ...
114 position += m_cueWritingDirection == VTTCue::Horizontal ? parentBlock->s ize().height() : parentBlock->size().width(); 110 position += blink::isHorizontalWritingMode(writingMode) ? parentBlock->s ize().height() : parentBlock->size().width();
115 111
116 // ... and negate step. 112 // ... and negate step.
117 step = -step; 113 step = -step;
118 } 114 }
119 return position; 115 return position;
120 } 116 }
121 117
122 bool SnapToLinesLayouter::isOutside() const 118 bool SnapToLinesLayouter::isOutside() const
123 { 119 {
124 return !m_cueBox.containingBlock()->absoluteBoundingBoxRect().contains(m_cue Box.absoluteContentBox()); 120 return !m_cueBox.containingBlock()->absoluteBoundingBoxRect().contains(m_cue Box.absoluteContentBox());
125 } 121 }
126 122
127 bool SnapToLinesLayouter::isOverlapping() const 123 bool SnapToLinesLayouter::isOverlapping() const
128 { 124 {
129 for (RenderObject* box = m_cueBox.previousSibling(); box; box = box->previou sSibling()) { 125 for (RenderObject* box = m_cueBox.previousSibling(); box; box = box->previou sSibling()) {
130 IntRect boxRect = box->absoluteBoundingBoxRect(); 126 IntRect boxRect = box->absoluteBoundingBoxRect();
131 127
132 if (m_cueBox.absoluteBoundingBoxRect().intersects(boxRect)) 128 if (m_cueBox.absoluteBoundingBoxRect().intersects(boxRect))
133 return true; 129 return true;
134 } 130 }
135 131
136 return false; 132 return false;
137 } 133 }
138 134
139 bool SnapToLinesLayouter::shouldSwitchDirection(InlineFlowBox* firstLineBox, Lay outUnit step) const 135 bool SnapToLinesLayouter::shouldSwitchDirection(InlineFlowBox* firstLineBox, Lay outUnit step) const
140 { 136 {
141 LayoutUnit top = m_cueBox.location().y();
142 LayoutUnit left = m_cueBox.location().x();
143 LayoutUnit bottom = top + firstLineBox->size().height();
144 LayoutUnit right = left + firstLineBox->size().width();
145
146 // 21. Horizontal: If step is negative and the top of the first line box in 137 // 21. Horizontal: If step is negative and the top of the first line box in
147 // boxes is now above the top of the title area, or if step is positive and 138 // boxes is now above the top of the title area, or if step is positive and
148 // the bottom of the first line box in boxes is now below the bottom of the 139 // the bottom of the first line box in boxes is now below the bottom of the
149 // title area, jump to the step labeled switch direction. 140 // title area, jump to the step labeled switch direction.
150 LayoutUnit parentHeight = m_cueBox.containingBlock()->size().height(); 141 // Vertical: If step is negative and the left edge of the first line
151 if (m_cueWritingDirection == VTTCue::Horizontal && ((step < 0 && top < 0) || (step > 0 && bottom > parentHeight)))
152 return true;
153
154 // 21. Vertical: If step is negative and the left edge of the first line
155 // box in boxes is now to the left of the left edge of the title area, or 142 // box in boxes is now to the left of the left edge of the title area, or
156 // if step is positive and the right edge of the first line box in boxes is 143 // if step is positive and the right edge of the first line box in boxes is
157 // now to the right of the right edge of the title area, jump to the step 144 // now to the right of the right edge of the title area, jump to the step
158 // labeled switch direction. 145 // labeled switch direction.
159 LayoutUnit parentWidth = m_cueBox.containingBlock()->size().width(); 146 LayoutUnit logicalTop = m_cueBox.logicalTop();
160 if (m_cueWritingDirection != VTTCue::Horizontal && ((step < 0 && left < 0) | | (step > 0 && right > parentWidth))) 147 if (step < 0 && logicalTop < 0)
161 return true; 148 return true;
162 149 if (step > 0 && logicalTop + firstLineBox->logicalHeight() > m_cueBox.contai ningBlock()->logicalHeight())
150 return true;
163 return false; 151 return false;
164 } 152 }
165 153
166 void SnapToLinesLayouter::layout() 154 void SnapToLinesLayouter::layout()
167 { 155 {
168 // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings 156 // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings
169 // Step 13, "If cue's text track cue snap-to-lines flag is set". 157 // Step 13, "If cue's text track cue snap-to-lines flag is set".
170 158
171 InlineFlowBox* firstLineBox = findFirstLineBox(); 159 InlineFlowBox* firstLineBox = findFirstLineBox();
172 if (!firstLineBox) 160 if (!firstLineBox)
173 return; 161 return;
174 162
175 // Steps 1-3 skipped. 163 // Steps 1-3 skipped.
176 // 4. Horizontal: Let step be the height of the first line box in boxes. 164 // 4. Horizontal: Let step be the height of the first line box in boxes.
177 // Vertical: Let step be the width of the first line box in boxes. 165 // Vertical: Let step be the width of the first line box in boxes.
178 LayoutUnit step = m_cueWritingDirection == VTTCue::Horizontal ? firstLineBox ->size().height() : firstLineBox->size().width(); 166 LayoutUnit step = firstLineBox->logicalHeight();
179 167
180 // 5. If step is zero, then jump to the step labeled done positioning below. 168 // 5. If step is zero, then jump to the step labeled done positioning below.
181 if (!step) 169 if (!step)
182 return; 170 return;
183 171
184 // Steps 6-11. 172 // Steps 6-11.
185 LayoutUnit positionAdjustment = computeInitialPositionAdjustment(step); 173 LayoutUnit positionAdjustment = computeInitialPositionAdjustment(step);
186 174
187 // 12. Move all boxes in boxes ... 175 // 12. Move all boxes in boxes ...
188 // Horizontal: ... down by the distance given by position 176 // Horizontal: ... down by the distance given by position
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 // have positioning information. 318 // have positioning information.
331 if (!m_cue->regionId().isEmpty()) 319 if (!m_cue->regionId().isEmpty())
332 return; 320 return;
333 321
334 ASSERT(firstChild()); 322 ASSERT(firstChild());
335 323
336 LayoutState state(*this, locationOffset()); 324 LayoutState state(*this, locationOffset());
337 325
338 // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings - step 13. 326 // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings - step 13.
339 if (m_cue->snapToLines()) { 327 if (m_cue->snapToLines()) {
340 SnapToLinesLayouter(*this, m_cue->getWritingDirection(), m_cue->calculat eComputedLinePosition()).layout(); 328 SnapToLinesLayouter(*this, m_cue->calculateComputedLinePosition()).layou t();
341 329
342 adjustForTopAndBottomMarginBorderAndPadding(); 330 adjustForTopAndBottomMarginBorderAndPadding();
343 } else { 331 } else {
344 repositionCueSnapToLinesNotSet(); 332 repositionCueSnapToLinesNotSet();
345 } 333 }
346 } 334 }
347 335
348 } // namespace blink 336 } // namespace blink
349 337
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698