void ShadowCanvasLayerOGL::Swap(const CanvasSurface& aNewFront, bool needYFlip, CanvasSurface* aNewBack) { if (mDestroyed) { *aNewBack = aNewFront; return; } if (nsRefPtr<TextureImage> texImage = ShadowLayerManager::OpenDescriptorForDirectTexturing( gl(), aNewFront.get_SurfaceDescriptor(), LOCAL_GL_CLAMP_TO_EDGE)) { if (mTexImage && (mTexImage->GetSize() != texImage->GetSize() || mTexImage->GetContentType() != texImage->GetContentType())) { mTexImage = nullptr; DestroyFrontBuffer(); } mTexImage = texImage; *aNewBack = IsSurfaceDescriptorValid(mFrontBufferDescriptor) ? CanvasSurface(mFrontBufferDescriptor) : CanvasSurface(null_t()); mFrontBufferDescriptor = aNewFront; mNeedsYFlip = needYFlip; } else if (IsValidSharedTexDescriptor(aNewFront)) { MakeTextureIfNeeded(gl(), mTexture); if (!IsValidSharedTexDescriptor(mFrontBufferDescriptor)) { mFrontBufferDescriptor = SharedTextureDescriptor(GLContext::SameProcess, 0, nsIntSize(0, 0), false); } *aNewBack = mFrontBufferDescriptor; mFrontBufferDescriptor = aNewFront; mNeedsYFlip = needYFlip; } else { AutoOpenSurface autoSurf(OPEN_READ_ONLY, aNewFront); gfxIntSize sz = autoSurf.Size(); if (!mTexImage || mTexImage->GetSize() != sz || mTexImage->GetContentType() != autoSurf.ContentType()) { Init(aNewFront, needYFlip); } nsIntRegion updateRegion(nsIntRect(0, 0, sz.width, sz.height)); mTexImage->DirectUpdate(autoSurf.Get(), updateRegion); *aNewBack = aNewFront; } }
void ShadowCanvasLayerD3D9::Swap(const CanvasSurface& aNewFront, bool needYFlip, CanvasSurface* aNewBack) { NS_ASSERTION(aNewFront.type() == CanvasSurface::TSurfaceDescriptor, "ShadowCanvasLayerD3D9::Swap expected CanvasSurface surface"); AutoOpenSurface surf(OPEN_READ_ONLY, aNewFront); if (!mBuffer) { Init(needYFlip); } mBuffer->Upload(surf.Get(), GetVisibleRegion().GetBounds()); *aNewBack = aNewFront; }
void ShadowCanvasLayerD3D9::Swap(const CanvasSurface& aNewFront, bool needYFlip, CanvasSurface* aNewBack) { NS_ASSERTION(aNewFront.type() == CanvasSurface::TSurfaceDescriptor, "ShadowCanvasLayerD3D9::Swap expected CanvasSurface surface"); nsRefPtr<gfxASurface> surf = ShadowLayerForwarder::OpenDescriptor(aNewFront); if (!mBuffer) { Init(needYFlip); } mBuffer->Upload(surf, GetVisibleRegion().GetBounds()); *aNewBack = aNewFront; }