| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013, Opera Software ASA. All rights reserved. | 2 * Copyright (c) 2013, Opera Software ASA. All rights reserved. |
| 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 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 650 return 100; | 650 return 100; |
| 651 // 4. If the text track cue text alignment is middle, return 50 and abort th
ese steps. | 651 // 4. If the text track cue text alignment is middle, return 50 and abort th
ese steps. |
| 652 case Middle: | 652 case Middle: |
| 653 return 50; | 653 return 50; |
| 654 default: | 654 default: |
| 655 ASSERT_NOT_REACHED(); | 655 ASSERT_NOT_REACHED(); |
| 656 return 0; | 656 return 0; |
| 657 } | 657 } |
| 658 } | 658 } |
| 659 | 659 |
| 660 static inline VTTCue::CueAlignment resolveCueAlignment(VTTCue::CueAlignment spec
ifiedCueAlignment, CSSValueID direction) | 660 VTTCue::CueAlignment VTTCue::calculateComputedCueAlignment() const |
| 661 { | 661 { |
| 662 ASSERT(direction == CSSValueLtr || direction == CSSValueRtl); | 662 switch (m_cueAlignment) { |
| 663 switch (specifiedCueAlignment) { | 663 case VTTCue::Left: |
| 664 case VTTCue::Start: | 664 return VTTCue::Start; |
| 665 return direction == CSSValueLtr ? VTTCue::Left : VTTCue::Right; | 665 case VTTCue::Right: |
| 666 case VTTCue::End: | 666 return VTTCue::End; |
| 667 return direction == CSSValueLtr ? VTTCue::Right : VTTCue::Left; | |
| 668 default: | 667 default: |
| 669 return specifiedCueAlignment; | 668 return m_cueAlignment; |
| 670 } | 669 } |
| 671 } | 670 } |
| 672 | 671 |
| 673 void VTTCue::calculateDisplayParameters() | 672 void VTTCue::calculateDisplayParameters() |
| 674 { | 673 { |
| 675 createVTTNodeTree(); | 674 createVTTNodeTree(); |
| 676 | 675 |
| 677 // Steps 10.2, 10.3 | 676 // http://dev.w3.org/html5/webvtt/#dfn-apply-webvtt-cue-settings |
| 677 |
| 678 // Steps 1 and 2. |
| 678 m_displayDirection = determineTextDirection(m_vttNodeTree.get()); | 679 m_displayDirection = determineTextDirection(m_vttNodeTree.get()); |
| 679 | 680 |
| 680 if (m_displayDirection == CSSValueRtl) | 681 if (m_displayDirection == CSSValueRtl) |
| 681 UseCounter::count(document(), UseCounter::VTTCueRenderRtl); | 682 UseCounter::count(document(), UseCounter::VTTCueRenderRtl); |
| 682 | 683 |
| 683 // 10.4 If the text track cue writing direction is horizontal, then let | 684 // 3. If the text track cue writing direction is horizontal, then let |
| 684 // block-flow be 'tb'. Otherwise, if the text track cue writing direction is | 685 // block-flow be 'tb'. Otherwise, if the text track cue writing direction is |
| 685 // vertical growing left, then let block-flow be 'lr'. Otherwise, the text | 686 // vertical growing left, then let block-flow be 'lr'. Otherwise, the text |
| 686 // track cue writing direction is vertical growing right; let block-flow be | 687 // track cue writing direction is vertical growing right; let block-flow be |
| 687 // 'rl'. | 688 // 'rl'. |
| 688 | 689 |
| 689 // The above step is done through the writing direction static map. | 690 // The above step is done through the writing direction static map. |
| 690 | 691 |
| 691 // 10.5 Determine the value of maximum size for cue as per the appropriate | 692 // Resolve the cue alignment to one of the values {start, end, middle}. |
| 693 CueAlignment computedCueAlignment = calculateComputedCueAlignment(); |
| 694 |
| 695 // 4. Determine the value of maximum size for cue as per the appropriate |
| 692 // rules from the following list: | 696 // rules from the following list: |
| 693 float computedTextPosition = calculateComputedTextPosition(); | 697 float computedTextPosition = calculateComputedTextPosition(); |
| 694 float maximumSize = computedTextPosition; | 698 float maximumSize = computedTextPosition; |
| 695 if ((m_writingDirection == Horizontal && m_cueAlignment == Start && m_displa
yDirection == CSSValueLtr) | 699 if (computedCueAlignment == Start) { |
| 696 || (m_writingDirection == Horizontal && m_cueAlignment == End && m_displ
ayDirection == CSSValueRtl) | |
| 697 || (m_writingDirection == Horizontal && m_cueAlignment == Left) | |
| 698 || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == Star
t || m_cueAlignment == Left)) | |
| 699 || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == Sta
rt || m_cueAlignment == Left))) { | |
| 700 maximumSize = 100 - computedTextPosition; | 700 maximumSize = 100 - computedTextPosition; |
| 701 } else if ((m_writingDirection == Horizontal && m_cueAlignment == End && m_d
isplayDirection == CSSValueLtr) | 701 } else if (computedCueAlignment == End) { |
| 702 || (m_writingDirection == Horizontal && m_cueAlignment == Start && m_dis
playDirection == CSSValueRtl) | |
| 703 || (m_writingDirection == Horizontal && m_cueAlignment == Right) | |
| 704 || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == End
|| m_cueAlignment == Right)) | |
| 705 || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == End
|| m_cueAlignment == Right))) { | |
| 706 maximumSize = computedTextPosition; | 702 maximumSize = computedTextPosition; |
| 707 } else if (m_cueAlignment == Middle) { | 703 } else if (computedCueAlignment == Middle) { |
| 708 maximumSize = computedTextPosition <= 50 ? computedTextPosition : (100 -
computedTextPosition); | 704 maximumSize = computedTextPosition <= 50 ? computedTextPosition : (100 -
computedTextPosition); |
| 709 maximumSize = maximumSize * 2; | 705 maximumSize = maximumSize * 2; |
| 710 } else { | 706 } else { |
| 711 ASSERT_NOT_REACHED(); | 707 ASSERT_NOT_REACHED(); |
| 712 } | 708 } |
| 713 | 709 |
| 714 // 10.6 If the text track cue size is less than maximum size, then let size | 710 // 5. If the text track cue size is less than maximum size, then let size |
| 715 // be text track cue size. Otherwise, let size be maximum size. | 711 // be text track cue size. Otherwise, let size be maximum size. |
| 716 m_displaySize = std::min(m_cueSize, maximumSize); | 712 m_displaySize = std::min(m_cueSize, maximumSize); |
| 717 | 713 |
| 718 // FIXME: Understand why step 10.7 is missing (just a copy/paste error?) | 714 // 6. If the text track cue writing direction is horizontal, then let width |
| 719 // Could be done within a spec implementation check - http://crbug.com/30158
0 | 715 // be 'size vw' and height be 'auto'. Otherwise, let width be 'auto' and |
| 716 // height be 'size vh'. (These are CSS values used by the next section to |
| 717 // set CSS properties for the rendering; 'vw' and 'vh' are CSS units.) |
| 718 // (Emulated in VTTCueBox::applyCSSProperties.) |
| 720 | 719 |
| 721 // 10.8 Determine the value of x-position or y-position for cue as per the | 720 // 7. Determine the value of x-position or y-position for cue as per the |
| 722 // appropriate rules from the following list: | 721 // appropriate rules from the following list: |
| 723 if (m_writingDirection == Horizontal) { | 722 if (m_writingDirection == Horizontal) { |
| 724 float visualTextPosition = m_displayDirection == CSSValueLtr ? computedT
extPosition : 100 - computedTextPosition; | 723 switch (computedCueAlignment) { |
| 725 | 724 case Start: |
| 726 switch (resolveCueAlignment(m_cueAlignment, m_displayDirection)) { | 725 m_displayPosition.setX(computedTextPosition); |
| 727 case Left: | |
| 728 m_displayPosition.setX(visualTextPosition); | |
| 729 break; | 726 break; |
| 730 case Right: | 727 case End: |
| 731 m_displayPosition.setX(visualTextPosition - m_displaySize); | 728 m_displayPosition.setX(computedTextPosition - m_displaySize); |
| 732 break; | 729 break; |
| 733 case Middle: | 730 case Middle: |
| 734 m_displayPosition.setX(visualTextPosition - m_displaySize / 2); | 731 m_displayPosition.setX(computedTextPosition - m_displaySize / 2); |
| 735 break; | 732 break; |
| 736 default: | 733 default: |
| 737 ASSERT_NOT_REACHED(); | 734 ASSERT_NOT_REACHED(); |
| 738 } | 735 } |
| 739 } else { | 736 } else { |
| 740 // Cases for m_writingDirection being VerticalGrowing{Left|Right} | 737 // Cases for m_writingDirection being VerticalGrowing{Left|Right} |
| 741 switch (m_cueAlignment) { | 738 switch (computedCueAlignment) { |
| 742 case Start: | 739 case Start: |
| 743 case Left: | |
| 744 m_displayPosition.setY(computedTextPosition); | 740 m_displayPosition.setY(computedTextPosition); |
| 745 break; | 741 break; |
| 746 case End: | 742 case End: |
| 747 case Right: | |
| 748 m_displayPosition.setY(computedTextPosition - m_displaySize); | 743 m_displayPosition.setY(computedTextPosition - m_displaySize); |
| 749 break; | 744 break; |
| 750 case Middle: | 745 case Middle: |
| 751 m_displayPosition.setY(computedTextPosition - m_displaySize / 2); | 746 m_displayPosition.setY(computedTextPosition - m_displaySize / 2); |
| 752 break; | 747 break; |
| 753 default: | 748 default: |
| 754 ASSERT_NOT_REACHED(); | 749 ASSERT_NOT_REACHED(); |
| 755 } | 750 } |
| 756 } | 751 } |
| 757 | 752 |
| 758 // A text track cue has a text track cue computed line position whose value | 753 // A text track cue has a text track cue computed line position whose value |
| 759 // is defined in terms of the other aspects of the cue. | 754 // is defined in terms of the other aspects of the cue. |
| 760 m_computedLinePosition = calculateComputedLinePosition(); | 755 m_computedLinePosition = calculateComputedLinePosition(); |
| 761 | 756 |
| 762 // 10.9 Determine the value of whichever of x-position or y-position is not | 757 // 8. Determine the value of whichever of x-position or y-position is not |
| 763 // yet calculated for cue as per the appropriate rules from the following | 758 // yet calculated for cue as per the appropriate rules from the following |
| 764 // list: | 759 // list: |
| 765 if (m_snapToLines && m_writingDirection == Horizontal) | 760 if (!m_snapToLines) { |
| 766 m_displayPosition.setY(0); | 761 if (m_writingDirection == Horizontal) |
| 767 | 762 m_displayPosition.setY(m_computedLinePosition); |
| 768 if (!m_snapToLines && m_writingDirection == Horizontal) | 763 else |
| 769 m_displayPosition.setY(m_computedLinePosition); | 764 m_displayPosition.setX(m_computedLinePosition); |
| 770 | 765 } else { |
| 771 if (m_snapToLines && (m_writingDirection == VerticalGrowingLeft || m_writing
Direction == VerticalGrowingRight)) | 766 if (m_writingDirection == Horizontal) |
| 772 m_displayPosition.setX(0); | 767 m_displayPosition.setY(0); |
| 773 | 768 else |
| 774 if (!m_snapToLines && (m_writingDirection == VerticalGrowingLeft || m_writin
gDirection == VerticalGrowingRight)) | 769 m_displayPosition.setX(0); |
| 775 m_displayPosition.setX(m_computedLinePosition); | 770 } |
| 776 } | 771 } |
| 777 | 772 |
| 778 void VTTCue::markFutureAndPastNodes(ContainerNode* root, double previousTimestam
p, double movieTime) | 773 void VTTCue::markFutureAndPastNodes(ContainerNode* root, double previousTimestam
p, double movieTime) |
| 779 { | 774 { |
| 780 DEFINE_STATIC_LOCAL(const String, timestampTag, ("timestamp")); | 775 DEFINE_STATIC_LOCAL(const String, timestampTag, ("timestamp")); |
| 781 | 776 |
| 782 bool isPastNode = true; | 777 bool isPastNode = true; |
| 783 double currentTimestamp = previousTimestamp; | 778 double currentTimestamp = previousTimestamp; |
| 784 if (currentTimestamp > movieTime) | 779 if (currentTimestamp > movieTime) |
| 785 isPastNode = false; | 780 isPastNode = false; |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1186 | 1181 |
| 1187 void VTTCue::trace(Visitor* visitor) | 1182 void VTTCue::trace(Visitor* visitor) |
| 1188 { | 1183 { |
| 1189 visitor->trace(m_vttNodeTree); | 1184 visitor->trace(m_vttNodeTree); |
| 1190 visitor->trace(m_cueBackgroundBox); | 1185 visitor->trace(m_cueBackgroundBox); |
| 1191 visitor->trace(m_displayTree); | 1186 visitor->trace(m_displayTree); |
| 1192 TextTrackCue::trace(visitor); | 1187 TextTrackCue::trace(visitor); |
| 1193 } | 1188 } |
| 1194 | 1189 |
| 1195 } // namespace blink | 1190 } // namespace blink |
| OLD | NEW |