Bug 671639 - Part 2: Double buffer using a single CARenderer. r=matt.woodrow

This commit is contained in:
Benoit Girard 2011-11-16 11:38:50 +13:00
Родитель c4287eb0c5
Коммит 73c53b9b7a
2 изменённых файлов: 32 добавлений и 34 удалений

Просмотреть файл

@ -94,8 +94,7 @@ public:
private:
void *mCALayer;
nsRefPtr<nsCARenderer> mFrontRenderer;
nsRefPtr<nsCARenderer> mBackRenderer;
nsRefPtr<nsCARenderer> mCARenderer;
nsRefPtr<nsIOSurface> mFrontSurface;
nsRefPtr<nsIOSurface> mBackSurface;
};

Просмотреть файл

@ -345,67 +345,66 @@ bool nsDoubleBufferCARenderer::InitFrontSurface(size_t aWidth, size_t aHeight,
mFrontSurface = nsIOSurface::CreateIOSurface(aWidth, aHeight);
if (!mFrontSurface) {
mCARenderer = nsnull;
return false;
}
mFrontRenderer = new nsCARenderer();
if (!mFrontRenderer) {
mFrontSurface = nsnull;
return false;
}
if (!mCARenderer) {
mCARenderer = new nsCARenderer();
if (!mCARenderer) {
mFrontSurface = nsnull;
return false;
}
nsRefPtr<nsIOSurface> ioSurface = nsIOSurface::LookupSurface(mFrontSurface->GetIOSurfaceID());
if (!ioSurface) {
mFrontRenderer = nsnull;
mFrontSurface = nsnull;
return false;
}
mCARenderer->AttachIOSurface(mFrontSurface);
mFrontRenderer->AttachIOSurface(ioSurface);
nsresult result = mFrontRenderer->SetupRenderer(mCALayer,
ioSurface->GetWidth(),
ioSurface->GetHeight(),
nsresult result = mCARenderer->SetupRenderer(mCALayer,
mFrontSurface->GetWidth(),
mFrontSurface->GetHeight(),
aAllowOfflineRenderer);
return result == NS_OK;
if (result != NS_OK) {
mCARenderer = nsnull;
mFrontSurface = nsnull;
return false;
}
} else {
mCARenderer->AttachIOSurface(mFrontSurface);
}
return true;
}
void nsDoubleBufferCARenderer::Render() {
if (!HasFrontSurface()) {
if (!HasFrontSurface() || !mCARenderer) {
return;
}
mFrontRenderer->Render(GetFrontSurfaceWidth(), GetFrontSurfaceHeight(), nsnull);
mCARenderer->Render(GetFrontSurfaceWidth(), GetFrontSurfaceHeight(), nsnull);
}
void nsDoubleBufferCARenderer::SwapSurfaces() {
if (mFrontRenderer) {
mFrontRenderer->DettachCALayer();
}
nsRefPtr<nsCARenderer> prevFrontRenderer = mFrontRenderer;
nsRefPtr<nsIOSurface> prevFrontSurface = mFrontSurface;
mFrontRenderer = mBackRenderer;
mFrontSurface = mBackSurface;
mBackRenderer = prevFrontRenderer;
mBackSurface = prevFrontSurface;
if (mFrontRenderer) {
mFrontRenderer->AttachCALayer(mCALayer);
if (mFrontSurface) {
mCARenderer->AttachIOSurface(mFrontSurface);
}
}
void nsDoubleBufferCARenderer::ClearFrontSurface() {
mFrontRenderer = nsnull;
mFrontSurface = nsnull;
if (!mFrontSurface && !mBackSurface) {
mCARenderer = nsnull;
}
}
void nsDoubleBufferCARenderer::ClearBackSurface() {
mBackRenderer = nsnull;
mBackSurface = nsnull;
if (!mFrontSurface && !mBackSurface) {
mCARenderer = nsnull;
}
}
} //PluginUtilsOSX