1/* 2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27 28#if ENABLE(VIDEO) 29#include "RenderMedia.h" 30 31#include "HTMLMediaElement.h" 32#include "RenderFlowThread.h" 33#include "RenderView.h" 34#include <wtf/StackStats.h> 35 36namespace WebCore { 37 38RenderMedia::RenderMedia(HTMLMediaElement* video) 39 : RenderImage(video) 40{ 41 setImageResource(RenderImageResource::create()); 42} 43 44RenderMedia::RenderMedia(HTMLMediaElement* video, const IntSize& intrinsicSize) 45 : RenderImage(video) 46{ 47 setImageResource(RenderImageResource::create()); 48 setIntrinsicSize(intrinsicSize); 49} 50 51RenderMedia::~RenderMedia() 52{ 53} 54 55HTMLMediaElement* RenderMedia::mediaElement() const 56{ 57 return toMediaElement(node()); 58} 59 60void RenderMedia::layout() 61{ 62 StackStats::LayoutCheckPoint layoutCheckPoint; 63 LayoutSize oldSize = contentBoxRect().size(); 64 65 RenderImage::layout(); 66 67 RenderBox* controlsRenderer = toRenderBox(m_children.firstChild()); 68 if (!controlsRenderer) 69 return; 70 71 bool controlsNeedLayout = controlsRenderer->needsLayout(); 72 // If the region chain has changed we also need to relayout the controls to update the region box info. 73 // FIXME: We can do better once we compute region box info for RenderReplaced, not only for RenderBlock. 74 const RenderFlowThread* flowThread = flowThreadContainingBlock(); 75 if (flowThread && !controlsNeedLayout) { 76 if (flowThread->pageLogicalSizeChanged()) 77 controlsNeedLayout = true; 78 } 79 80 LayoutSize newSize = contentBoxRect().size(); 81 if (newSize == oldSize && !controlsNeedLayout) 82 return; 83 84 // When calling layout() on a child node, a parent must either push a LayoutStateMaintainter, or 85 // instantiate LayoutStateDisabler. Since using a LayoutStateMaintainer is slightly more efficient, 86 // and this method will be called many times per second during playback, use a LayoutStateMaintainer: 87 LayoutStateMaintainer statePusher(view(), this, locationOffset(), hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMode()); 88 89 controlsRenderer->setLocation(LayoutPoint(borderLeft(), borderTop()) + LayoutSize(paddingLeft(), paddingTop())); 90 controlsRenderer->style()->setHeight(Length(newSize.height(), Fixed)); 91 controlsRenderer->style()->setWidth(Length(newSize.width(), Fixed)); 92 controlsRenderer->setNeedsLayout(true, MarkOnlyThis); 93 controlsRenderer->layout(); 94 setChildNeedsLayout(false); 95 96 statePusher.pop(); 97} 98 99void RenderMedia::paintReplaced(PaintInfo&, const LayoutPoint&) 100{ 101} 102 103} // namespace WebCore 104 105#endif 106