⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rendervideo.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * Copyright (C) 2007 Apple Inc.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#include "config.h"#if ENABLE(VIDEO)#include "RenderVideo.h"#include "Document.h"#include "FrameView.h"#include "GraphicsContext.h"#include "HTMLNames.h"#include "HTMLVideoElement.h"#include "MediaPlayer.h"using namespace std;namespace WebCore {using namespace HTMLNames;RenderVideo::RenderVideo(HTMLMediaElement* video)    : RenderMedia(video, video->player() ? video->player()->naturalSize() : IntSize(300, 150)){}RenderVideo::~RenderVideo(){    if (MediaPlayer* p = player()) {        p->setVisible(false);        p->setFrameView(0);    }}    void RenderVideo::videoSizeChanged(){    if (!player())        return;    IntSize size = player()->naturalSize();    if (!size.isEmpty() && size != intrinsicSize()) {        setIntrinsicSize(size);        setPrefWidthsDirty(true);        setNeedsLayout(true);    }}IntRect RenderVideo::videoBox() const {    IntRect contentRect = contentBoxRect();        if (intrinsicSize().isEmpty() || contentRect.isEmpty())        return IntRect();    IntRect resultRect = contentRect;    int ratio = contentRect.width() * intrinsicSize().height() - contentRect.height() * intrinsicSize().width();    if (ratio > 0) {        int newWidth = contentRect.height() * intrinsicSize().width() / intrinsicSize().height();        // Just fill the whole area if the difference is one pixel or less (in both sides)        if (resultRect.width() - newWidth > 2)            resultRect.setWidth(newWidth);        resultRect.move((contentRect.width() - resultRect.width()) / 2, 0);    } else if (ratio < 0) {        int newHeight = contentRect.width() * intrinsicSize().height() / intrinsicSize().width();        if (resultRect.height() - newHeight > 2)            resultRect.setHeight(newHeight);        resultRect.move(0, (contentRect.height() - resultRect.height()) / 2);    }    return resultRect;}    void RenderVideo::paintReplaced(PaintInfo& paintInfo, int tx, int ty){    MediaPlayer* mediaPlayer = player();    if (!mediaPlayer)        return;    updatePlayer();    IntRect rect = videoBox();    if (rect.isEmpty())        return;    rect.move(tx, ty);    mediaPlayer->paint(paintInfo.context, rect);}void RenderVideo::layout(){    RenderMedia::layout();    updatePlayer();}    void RenderVideo::updateFromElement(){    RenderMedia::updateFromElement();    updatePlayer();}void RenderVideo::updatePlayer(){    MediaPlayer* mediaPlayer = player();    if (!mediaPlayer)        return;    if (!mediaElement()->inActiveDocument()) {        mediaPlayer->setVisible(false);        return;    }        IntRect videoBounds = videoBox();     mediaPlayer->setFrameView(document()->view());    mediaPlayer->setSize(IntSize(videoBounds.width(), videoBounds.height()));    mediaPlayer->setVisible(true);}bool RenderVideo::isWidthSpecified() const{    switch (style()->width().type()) {        case Fixed:        case Percent:            return true;        case Auto:        case Relative: // FIXME: Shouldn't this case return true? It doesn't for images.        case Static:        case Intrinsic:        case MinIntrinsic:            return false;    }    ASSERT(false);    return false;}bool RenderVideo::isHeightSpecified() const{    switch (style()->height().type()) {        case Fixed:        case Percent:            return true;        case Auto:        case Relative: // FIXME: Shouldn't this case return true? It doesn't for images.        case Static:        case Intrinsic:        case MinIntrinsic:            return false;    }    ASSERT(false);    return false;}int RenderVideo::calcReplacedWidth(bool includeMaxWidth) const{    int width;    if (isWidthSpecified())        width = calcReplacedWidthUsing(style()->width());    else        width = calcAspectRatioWidth() * style()->effectiveZoom();    int minW = calcReplacedWidthUsing(style()->minWidth());    int maxW = !includeMaxWidth || style()->maxWidth().isUndefined() ? width : calcReplacedWidthUsing(style()->maxWidth());    return max(minW, min(width, maxW));}int RenderVideo::calcReplacedHeight() const{    int height;    if (isHeightSpecified())        height = calcReplacedHeightUsing(style()->height());    else        height = calcAspectRatioHeight() * style()->effectiveZoom();    int minH = calcReplacedHeightUsing(style()->minHeight());    int maxH = style()->maxHeight().isUndefined() ? height : calcReplacedHeightUsing(style()->maxHeight());    return max(minH, min(height, maxH));}int RenderVideo::calcAspectRatioWidth() const{    int intrinsicWidth = intrinsicSize().width();    int intrinsicHeight = intrinsicSize().height();    if (!intrinsicHeight)        return 0;    return RenderBox::calcReplacedHeight() * intrinsicWidth / intrinsicHeight;}int RenderVideo::calcAspectRatioHeight() const{    int intrinsicWidth = intrinsicSize().width();    int intrinsicHeight = intrinsicSize().height();    if (!intrinsicWidth)        return 0;    return RenderBox::calcReplacedWidth() * intrinsicHeight / intrinsicWidth;}void RenderVideo::calcPrefWidths(){    ASSERT(prefWidthsDirty());    int paddingAndBorders = paddingLeft() + paddingRight() + borderLeft() + borderRight();    m_maxPrefWidth = calcReplacedWidth(false) + paddingAndBorders;    if (style()->maxWidth().isFixed() && style()->maxWidth().value() != undefinedLength)        m_maxPrefWidth = min(m_maxPrefWidth, style()->maxWidth().value() + (style()->boxSizing() == CONTENT_BOX ? paddingAndBorders : 0));    if (style()->width().isPercent() || style()->height().isPercent() ||         style()->maxWidth().isPercent() || style()->maxHeight().isPercent() ||        style()->minWidth().isPercent() || style()->minHeight().isPercent())        m_minPrefWidth = 0;    else        m_minPrefWidth = m_maxPrefWidth;    setPrefWidthsDirty(false);}} // namespace WebCore#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -