Index: Source/core/rendering/RenderVideo.cpp |
diff --git a/Source/core/rendering/RenderVideo.cpp b/Source/core/rendering/RenderVideo.cpp |
index 580bbf302796b864e0e5642b9d9f041d24372456..ace52f641b48adee7a90bef7aeaf73aacad07285 100644 |
--- a/Source/core/rendering/RenderVideo.cpp |
+++ b/Source/core/rendering/RenderVideo.cpp |
@@ -140,35 +140,11 @@ void RenderVideo::imageChanged(WrappedImagePtr newImage, const IntRect* rect) |
IntRect RenderVideo::videoBox() const |
{ |
- if (m_cachedImageSize.isEmpty() && videoElement()->shouldDisplayPosterImage()) |
- return IntRect(); |
- |
- LayoutSize elementSize; |
+ const LayoutSize* overriddenIntrinsicSize = 0; |
if (videoElement()->shouldDisplayPosterImage()) |
- elementSize = m_cachedImageSize; |
- else |
- elementSize = intrinsicSize(); |
- |
- IntRect contentRect = pixelSnappedIntRect(contentBoxRect()); |
- if (elementSize.isEmpty() || contentRect.isEmpty()) |
- return IntRect(); |
- |
- LayoutRect renderBox = contentRect; |
- LayoutUnit ratio = renderBox.width() * elementSize.height() - renderBox.height() * elementSize.width(); |
- if (ratio > 0) { |
- LayoutUnit newWidth = renderBox.height() * elementSize.width() / elementSize.height(); |
- // Just fill the whole area if the difference is one pixel or less (in both sides) |
- if (renderBox.width() - newWidth > 2) |
- renderBox.setWidth(newWidth); |
- renderBox.move((contentRect.width() - renderBox.width()) / 2, 0); |
- } else if (ratio < 0) { |
- LayoutUnit newHeight = renderBox.width() * elementSize.height() / elementSize.width(); |
- if (renderBox.height() - newHeight > 2) |
- renderBox.setHeight(newHeight); |
- renderBox.move(0, (contentRect.height() - renderBox.height()) / 2); |
- } |
+ overriddenIntrinsicSize = &m_cachedImageSize; |
- return pixelSnappedIntRect(renderBox); |
+ return pixelSnappedIntRect(replacedContentRect(overriddenIntrinsicSize)); |
} |
bool RenderVideo::shouldDisplayVideo() const |
@@ -202,12 +178,24 @@ void RenderVideo::paintReplaced(PaintInfo& paintInfo, const LayoutPoint& paintOf |
if (page && paintInfo.phase == PaintPhaseForeground) |
page->addRelevantRepaintedObject(this, rect); |
+ LayoutRect contentRect = contentBoxRect(); |
+ contentRect.moveBy(paintOffset); |
+ GraphicsContext* context = paintInfo.context; |
+ bool clip = !contentRect.contains(rect); |
+ if (clip) { |
+ context->save(); |
+ context->clip(contentRect); |
+ } |
+ |
if (displayingPoster) |
- paintIntoRect(paintInfo.context, rect); |
+ paintIntoRect(context, rect); |
else if (document()->view() && document()->view()->paintBehavior() & PaintBehaviorFlattenCompositingLayers) |
- mediaPlayer->paintCurrentFrameInContext(paintInfo.context, pixelSnappedIntRect(rect)); |
+ mediaPlayer->paintCurrentFrameInContext(context, pixelSnappedIntRect(rect)); |
else |
- mediaPlayer->paint(paintInfo.context, pixelSnappedIntRect(rect)); |
+ mediaPlayer->paint(context, pixelSnappedIntRect(rect)); |
+ |
+ if (clip) |
+ context->restore(); |
} |
void RenderVideo::layout() |