Bug 1372458 - Fold opacity into filter drawing rather than using a temporary surface. r=mstange

MozReview-Commit-ID: 6ByhxshY3uO

--HG--
extra : rebase_source : 7c0add57b0de49ede96ddb46f5dfd0b9f2cadb3c
This commit is contained in:
Matt Woodrow 2018-06-22 11:35:49 +12:00
parent 13a435915f
commit 406499dd53
3 changed files with 9 additions and 16 deletions

View File

@ -65,7 +65,8 @@ nsFilterInstance::PaintFilteredFrame(nsIFrame *aFilteredFrame,
gfxContext* aCtx,
nsSVGFilterPaintCallback *aPaintCallback,
const nsRegion *aDirtyArea,
imgDrawingParams& aImgParams)
imgDrawingParams& aImgParams,
float aOpacity)
{
auto& filterChain = aFilteredFrame->StyleEffects()->mFilters;
UniquePtr<UserSpaceMetrics> metrics = UserSpaceMetricsForFrame(aFilteredFrame);
@ -97,7 +98,7 @@ nsFilterInstance::PaintFilteredFrame(nsIFrame *aFilteredFrame,
aPaintCallback, scaleMatrixInDevUnits,
aDirtyArea, nullptr, nullptr, nullptr);
if (instance.IsInitialized()) {
instance.Render(aCtx, aImgParams);
instance.Render(aCtx, aImgParams, aOpacity);
}
}
@ -493,7 +494,7 @@ nsFilterInstance::BuildSourceImage(DrawTarget *aDest, imgDrawingParams& aImgPara
}
void
nsFilterInstance::Render(gfxContext* aCtx, imgDrawingParams& aImgParams)
nsFilterInstance::Render(gfxContext* aCtx, imgDrawingParams& aImgParams, float aOpacity)
{
MOZ_ASSERT(mTargetFrame, "Need a frame for rendering");
@ -521,7 +522,7 @@ nsFilterInstance::Render(gfxContext* aCtx, imgDrawingParams& aImgParams)
mSourceGraphic.mSourceSurface, mSourceGraphic.mSurfaceRect,
mFillPaint.mSourceSurface, mFillPaint.mSurfaceRect,
mStrokePaint.mSourceSurface, mStrokePaint.mSurfaceRect,
mInputImages, Point(0, 0));
mInputImages, Point(0, 0), DrawOptions(aOpacity));
}
nsRegion

View File

@ -88,7 +88,8 @@ public:
gfxContext* aCtx,
nsSVGFilterPaintCallback *aPaintCallback,
const nsRegion* aDirtyArea,
imgDrawingParams& aImgParams);
imgDrawingParams& aImgParams,
float aOpacity = 1.0f);
/**
* Returns the post-filter area that could be dirtied when the given
@ -168,7 +169,7 @@ private:
* by passing it as the aPostFilterDirtyRegion argument to the
* nsFilterInstance constructor.
*/
void Render(gfxContext* aCtx, imgDrawingParams& aImgParams);
void Render(gfxContext* aCtx, imgDrawingParams& aImgParams, float aOpacity = 1.0f);
const FilterDescription& ExtractDescriptionAndAdditionalImages(nsTArray<RefPtr<SourceSurface>>& aOutAdditionalImages)
{

View File

@ -1084,22 +1084,13 @@ nsSVGIntegrationUtils::PaintFilter(const PaintFramesParams& aParams)
gfxContextAutoSaveRestore autoSR(&context);
EffectOffsets offsets = MoveContextOriginToUserSpace(firstFrame, aParams);
if (opacity != 1.0f) {
context.PushGroupForBlendBack(gfxContentType::COLOR_ALPHA, opacity,
nullptr, Matrix());
}
/* Paint the child and apply filters */
RegularFramePaintCallback callback(aParams.builder, aParams.layerManager,
offsets.offsetToUserSpaceInDevPx);
nsRegion dirtyRegion = aParams.dirtyRect - offsets.offsetToBoundingBox;
nsFilterInstance::PaintFilteredFrame(frame, &context, &callback,
&dirtyRegion, aParams.imgParams);
if (opacity != 1.0f) {
context.PopGroupAndBlend();
}
&dirtyRegion, aParams.imgParams, opacity);
}
class PaintFrameCallback : public gfxDrawingCallback {