mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
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:
parent
13a435915f
commit
406499dd53
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user