| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 setIntrinsicSize(size); | 68 setIntrinsicSize(size); |
| 69 setPreferredLogicalWidthsDirty(); | 69 setPreferredLogicalWidthsDirty(); |
| 70 setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::SizeChanged); | 70 setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::SizeChanged); |
| 71 } | 71 } |
| 72 | 72 |
| 73 LayoutSize LayoutVideo::calculateIntrinsicSize() { | 73 LayoutSize LayoutVideo::calculateIntrinsicSize() { |
| 74 HTMLVideoElement* video = videoElement(); | 74 HTMLVideoElement* video = videoElement(); |
| 75 | 75 |
| 76 // Spec text from 4.8.6 | 76 // Spec text from 4.8.6 |
| 77 // | 77 // |
| 78 // The intrinsic width of a video element's playback area is the intrinsic wid
th | 78 // The intrinsic width of a video element's playback area is the intrinsic |
| 79 // of the video resource, if that is available; otherwise it is the intrinsic | 79 // width of the video resource, if that is available; otherwise it is the |
| 80 // width of the poster frame, if that is available; otherwise it is 300 CSS pi
xels. | 80 // intrinsic width of the poster frame, if that is available; otherwise it is |
| 81 // 300 CSS pixels. |
| 81 // | 82 // |
| 82 // The intrinsic height of a video element's playback area is the intrinsic he
ight | 83 // The intrinsic height of a video element's playback area is the intrinsic |
| 83 // of the video resource, if that is available; otherwise it is the intrinsic | 84 // height of the video resource, if that is available; otherwise it is the |
| 84 // height of the poster frame, if that is available; otherwise it is 150 CSS p
ixels. | 85 // intrinsic height of the poster frame, if that is available; otherwise it is |
| 86 // 150 CSS pixels. |
| 85 WebMediaPlayer* webMediaPlayer = mediaElement()->webMediaPlayer(); | 87 WebMediaPlayer* webMediaPlayer = mediaElement()->webMediaPlayer(); |
| 86 if (webMediaPlayer && | 88 if (webMediaPlayer && |
| 87 video->getReadyState() >= HTMLVideoElement::kHaveMetadata) { | 89 video->getReadyState() >= HTMLVideoElement::kHaveMetadata) { |
| 88 IntSize size = webMediaPlayer->naturalSize(); | 90 IntSize size = webMediaPlayer->naturalSize(); |
| 89 if (!size.isEmpty()) | 91 if (!size.isEmpty()) |
| 90 return LayoutSize(size); | 92 return LayoutSize(size); |
| 91 } | 93 } |
| 92 | 94 |
| 93 if (video->shouldDisplayPosterImage() && !m_cachedImageSize.isEmpty() && | 95 if (video->shouldDisplayPosterImage() && !m_cachedImageSize.isEmpty() && |
| 94 !imageResource()->errorOccurred()) | 96 !imageResource()->errorOccurred()) |
| 95 return m_cachedImageSize; | 97 return m_cachedImageSize; |
| 96 | 98 |
| 97 // <video> in standalone media documents should not use the default 300x150 | 99 // <video> in standalone media documents should not use the default 300x150 |
| 98 // size since they also have audio-only files. By setting the intrinsic | 100 // size since they also have audio-only files. By setting the intrinsic |
| 99 // size to 300x1 the video will resize itself in these cases, and audio will | 101 // size to 300x1 the video will resize itself in these cases, and audio will |
| 100 // have the correct height (it needs to be > 0 for controls to layout properly
). | 102 // have the correct height (it needs to be > 0 for controls to layout |
| 103 // properly). |
| 101 if (video->ownerDocument() && video->ownerDocument()->isMediaDocument()) | 104 if (video->ownerDocument() && video->ownerDocument()->isMediaDocument()) |
| 102 return LayoutSize(defaultSize().width(), LayoutUnit(1)); | 105 return LayoutSize(defaultSize().width(), LayoutUnit(1)); |
| 103 | 106 |
| 104 return defaultSize(); | 107 return defaultSize(); |
| 105 } | 108 } |
| 106 | 109 |
| 107 void LayoutVideo::imageChanged(WrappedImagePtr newImage, const IntRect* rect) { | 110 void LayoutVideo::imageChanged(WrappedImagePtr newImage, const IntRect* rect) { |
| 108 LayoutMedia::imageChanged(newImage, rect); | 111 LayoutMedia::imageChanged(newImage, rect); |
| 109 | 112 |
| 110 // Cache the image intrinsic size so we can continue to use it to draw the ima
ge correctly | 113 // Cache the image intrinsic size so we can continue to use it to draw the |
| 111 // even if we know the video intrinsic size but aren't able to draw video fram
es yet | 114 // image correctly even if we know the video intrinsic size but aren't able to |
| 112 // (we don't want to scale the poster to the video size without keeping aspect
ratio). | 115 // draw video frames yet (we don't want to scale the poster to the video size |
| 116 // without keeping aspect ratio). |
| 113 if (videoElement()->shouldDisplayPosterImage()) | 117 if (videoElement()->shouldDisplayPosterImage()) |
| 114 m_cachedImageSize = intrinsicSize(); | 118 m_cachedImageSize = intrinsicSize(); |
| 115 | 119 |
| 116 // The intrinsic size is now that of the image, but in case we already had the | 120 // The intrinsic size is now that of the image, but in case we already had the |
| 117 // intrinsic size of the video we call this here to restore the video size. | 121 // intrinsic size of the video we call this here to restore the video size. |
| 118 updateIntrinsicSize(); | 122 updateIntrinsicSize(); |
| 119 } | 123 } |
| 120 | 124 |
| 121 bool LayoutVideo::shouldDisplayVideo() const { | 125 bool LayoutVideo::shouldDisplayVideo() const { |
| 122 return !videoElement()->shouldDisplayPosterImage(); | 126 return !videoElement()->shouldDisplayPosterImage(); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 LayoutUnit estimatedUsedWidth) const { | 170 LayoutUnit estimatedUsedWidth) const { |
| 167 return LayoutReplaced::computeReplacedLogicalHeight(estimatedUsedWidth); | 171 return LayoutReplaced::computeReplacedLogicalHeight(estimatedUsedWidth); |
| 168 } | 172 } |
| 169 | 173 |
| 170 LayoutUnit LayoutVideo::minimumReplacedHeight() const { | 174 LayoutUnit LayoutVideo::minimumReplacedHeight() const { |
| 171 return LayoutReplaced::minimumReplacedHeight(); | 175 return LayoutReplaced::minimumReplacedHeight(); |
| 172 } | 176 } |
| 173 | 177 |
| 174 LayoutRect LayoutVideo::replacedContentRect() const { | 178 LayoutRect LayoutVideo::replacedContentRect() const { |
| 175 if (shouldDisplayVideo()) { | 179 if (shouldDisplayVideo()) { |
| 176 // Video codecs may need to restart from an I-frame when the output is resiz
ed. | 180 // Video codecs may need to restart from an I-frame when the output is |
| 177 // Round size in advance to avoid 1px snap difference. | 181 // resized. Round size in advance to avoid 1px snap difference. |
| 178 // TODO(trchen): The way of rounding is different from LayoutPart just to ma
tch | 182 // TODO(trchen): The way of rounding is different from LayoutPart just to |
| 179 // existing behavior. This is probably a bug and We should unify it with Lay
outPart. | 183 // match existing behavior. This is probably a bug and We should unify it |
| 184 // with LayoutPart. |
| 180 return LayoutRect(pixelSnappedIntRect(computeObjectFit())); | 185 return LayoutRect(pixelSnappedIntRect(computeObjectFit())); |
| 181 } | 186 } |
| 182 // If we are displaying the poster image no pre-rounding is needed, but the si
ze of | 187 // If we are displaying the poster image no pre-rounding is needed, but the |
| 183 // the image should be used for fitting instead. | 188 // size of the image should be used for fitting instead. |
| 184 return computeObjectFit(&m_cachedImageSize); | 189 return computeObjectFit(&m_cachedImageSize); |
| 185 } | 190 } |
| 186 | 191 |
| 187 bool LayoutVideo::supportsAcceleratedRendering() const { | 192 bool LayoutVideo::supportsAcceleratedRendering() const { |
| 188 return !!mediaElement()->platformLayer(); | 193 return !!mediaElement()->platformLayer(); |
| 189 } | 194 } |
| 190 | 195 |
| 191 static const LayoutBlock* layoutObjectPlaceholder( | 196 static const LayoutBlock* layoutObjectPlaceholder( |
| 192 const LayoutObject* layoutObject) { | 197 const LayoutObject* layoutObject) { |
| 193 LayoutObject* parent = layoutObject->parent(); | 198 LayoutObject* parent = layoutObject->parent(); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 231 if (element->isFullscreen() && element->usesOverlayFullscreenVideo()) | 236 if (element->isFullscreen() && element->usesOverlayFullscreenVideo()) |
| 232 return CompositingReasonVideo; | 237 return CompositingReasonVideo; |
| 233 | 238 |
| 234 if (shouldDisplayVideo() && supportsAcceleratedRendering()) | 239 if (shouldDisplayVideo() && supportsAcceleratedRendering()) |
| 235 return CompositingReasonVideo; | 240 return CompositingReasonVideo; |
| 236 | 241 |
| 237 return CompositingReasonNone; | 242 return CompositingReasonNone; |
| 238 } | 243 } |
| 239 | 244 |
| 240 } // namespace blink | 245 } // namespace blink |
| OLD | NEW |