Bug 809273 - Let ContentHost create an EffectComponentAlpha if necessary. r=nrc

This commit is contained in:
Matt Woodrow 2013-04-22 14:40:52 +12:00
parent 861c0c7d80
commit 4041b4fc04
2 changed files with 26 additions and 6 deletions

View File

@ -188,18 +188,20 @@ struct EffectYCbCr : public TexturedEffect
struct EffectComponentAlpha : public TexturedEffect
{
EffectComponentAlpha(TextureSource *aOnWhite, TextureSource *aOnBlack)
: TexturedEffect(EFFECT_COMPONENT_ALPHA, nullptr, false, gfx::FILTER_LINEAR)
, mOnWhite(aOnWhite)
EffectComponentAlpha(TextureSource *aOnBlack,
TextureSource *aOnWhite,
gfx::Filter aFilter)
: TexturedEffect(EFFECT_COMPONENT_ALPHA, nullptr, false, aFilter)
, mOnBlack(aOnBlack)
, mOnWhite(aOnWhite)
{}
#ifdef MOZ_LAYERS_HAVE_LOG
virtual const char* Name() { return "EffectComponentAlpha"; }
#endif
TextureSource* mOnWhite;
TextureSource* mOnBlack;
TextureSource* mOnWhite;
};
struct EffectSolidColor : public Effect
@ -224,8 +226,15 @@ struct EffectChain
inline TemporaryRef<TexturedEffect>
CreateTexturedEffect(TextureHost *aTextureHost,
TextureHost *aTextureHostOnWhite,
const gfx::Filter& aFilter)
{
if (aTextureHostOnWhite) {
MOZ_ASSERT(aTextureHost->GetFormat() == gfx::FORMAT_R8G8B8X8 ||
aTextureHost->GetFormat() == gfx::FORMAT_B8G8R8X8);
return new EffectComponentAlpha(aTextureHost, aTextureHostOnWhite, aFilter);
}
RefPtr<TexturedEffect> result;
switch (aTextureHost->GetFormat()) {
case gfx::FORMAT_B8G8R8A8:
@ -253,6 +262,13 @@ CreateTexturedEffect(TextureHost *aTextureHost,
return result;
}
inline TemporaryRef<TexturedEffect>
CreateTexturedEffect(TextureHost *aTextureHost,
const gfx::Filter& aFilter)
{
return CreateTexturedEffect(aTextureHost, nullptr, aFilter);
}
} // namespace layers
} // namespace mozilla

View File

@ -32,6 +32,7 @@ ContentHostBase::DestroyFrontHost()
MOZ_ASSERT(!mTextureHost || mTextureHost->GetDeAllocator(),
"We won't be able to destroy our SurfaceDescriptor");
mTextureHost = nullptr;
mTextureHostOnWhite = nullptr;
}
void
@ -47,13 +48,16 @@ ContentHostBase::Composite(EffectChain& aEffectChain,
NS_ASSERTION(aVisibleRegion, "Requires a visible region");
AutoLockTextureHost lock(mTextureHost);
AutoLockTextureHost lockOnWhite(mTextureHostOnWhite);
if (!mTextureHost || !lock->IsValid()) {
if (!mTextureHost ||
!lock.IsValid() ||
!lockOnWhite.IsValid()) {
return;
}
RefPtr<TexturedEffect> effect =
CreateTexturedEffect(mTextureHost, aFilter);
CreateTexturedEffect(mTextureHost, mTextureHostOnWhite, aFilter);
aEffectChain.mPrimaryEffect = effect;