зеркало из https://github.com/mozilla/gecko-dev.git
94 строки
2.6 KiB
C++
94 строки
2.6 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "VideoFrameContainer.h"
|
|
|
|
#include "nsHTMLMediaElement.h"
|
|
#include "nsIFrame.h"
|
|
#include "nsDisplayList.h"
|
|
#include "nsSVGEffects.h"
|
|
|
|
using namespace mozilla::layers;
|
|
|
|
namespace mozilla {
|
|
|
|
void VideoFrameContainer::SetCurrentFrame(const gfxIntSize& aIntrinsicSize,
|
|
Image* aImage,
|
|
TimeStamp aTargetTime)
|
|
{
|
|
MutexAutoLock lock(mMutex);
|
|
|
|
if (aIntrinsicSize != mIntrinsicSize) {
|
|
mIntrinsicSize = aIntrinsicSize;
|
|
mIntrinsicSizeChanged = true;
|
|
}
|
|
|
|
gfxIntSize oldFrameSize = mImageContainer->GetCurrentSize();
|
|
TimeStamp lastPaintTime = mImageContainer->GetPaintTime();
|
|
if (!lastPaintTime.IsNull() && !mPaintTarget.IsNull()) {
|
|
mPaintDelay = lastPaintTime - mPaintTarget;
|
|
}
|
|
mImageContainer->SetCurrentImage(aImage);
|
|
gfxIntSize newFrameSize = mImageContainer->GetCurrentSize();
|
|
if (oldFrameSize != newFrameSize) {
|
|
mImageSizeChanged = true;
|
|
}
|
|
|
|
mPaintTarget = aTargetTime;
|
|
}
|
|
|
|
double VideoFrameContainer::GetFrameDelay()
|
|
{
|
|
MutexAutoLock lock(mMutex);
|
|
return mPaintDelay.ToSeconds();
|
|
}
|
|
|
|
void VideoFrameContainer::Invalidate()
|
|
{
|
|
NS_ASSERTION(NS_IsMainThread(), "Must call on main thread");
|
|
if (!mElement) {
|
|
// Element has been destroyed
|
|
return;
|
|
}
|
|
|
|
nsIFrame* frame = mElement->GetPrimaryFrame();
|
|
bool invalidateFrame = false;
|
|
|
|
{
|
|
MutexAutoLock lock(mMutex);
|
|
|
|
// Get mImageContainerSizeChanged while holding the lock.
|
|
invalidateFrame = mImageSizeChanged;
|
|
mImageSizeChanged = false;
|
|
|
|
if (mIntrinsicSizeChanged) {
|
|
mElement->UpdateMediaSize(mIntrinsicSize);
|
|
mIntrinsicSizeChanged = false;
|
|
|
|
if (frame) {
|
|
nsPresContext* presContext = frame->PresContext();
|
|
nsIPresShell *presShell = presContext->PresShell();
|
|
presShell->FrameNeedsReflow(frame,
|
|
nsIPresShell::eStyleChange,
|
|
NS_FRAME_IS_DIRTY);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (frame) {
|
|
nsRect contentRect = frame->GetContentRect() - frame->GetPosition();
|
|
if (invalidateFrame) {
|
|
frame->Invalidate(contentRect);
|
|
} else {
|
|
frame->InvalidateLayer(contentRect, nsDisplayItem::TYPE_VIDEO);
|
|
}
|
|
}
|
|
|
|
nsSVGEffects::InvalidateDirectRenderingObservers(mElement);
|
|
}
|
|
|
|
}
|