From 406499dd53c1c552c0c6e6efa07dddb3570080d0 Mon Sep 17 00:00:00 2001 From: Matt Woodrow Date: Fri, 22 Jun 2018 11:35:49 +1200 Subject: [PATCH] Bug 1372458 - Fold opacity into filter drawing rather than using a temporary surface. r=mstange MozReview-Commit-ID: 6ByhxshY3uO --HG-- extra : rebase_source : 7c0add57b0de49ede96ddb46f5dfd0b9f2cadb3c --- layout/svg/nsFilterInstance.cpp | 9 +++++---- layout/svg/nsFilterInstance.h | 5 +++-- layout/svg/nsSVGIntegrationUtils.cpp | 11 +---------- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/layout/svg/nsFilterInstance.cpp b/layout/svg/nsFilterInstance.cpp index 51202c689be4..daf816e929bf 100644 --- a/layout/svg/nsFilterInstance.cpp +++ b/layout/svg/nsFilterInstance.cpp @@ -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 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 diff --git a/layout/svg/nsFilterInstance.h b/layout/svg/nsFilterInstance.h index b38e7a334e12..3a26dd7988e0 100644 --- a/layout/svg/nsFilterInstance.h +++ b/layout/svg/nsFilterInstance.h @@ -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>& aOutAdditionalImages) { diff --git a/layout/svg/nsSVGIntegrationUtils.cpp b/layout/svg/nsSVGIntegrationUtils.cpp index d2168eeec7f9..c3337b5d6190 100644 --- a/layout/svg/nsSVGIntegrationUtils.cpp +++ b/layout/svg/nsSVGIntegrationUtils.cpp @@ -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 {