Bug 1224207 - Part 2. Fine tune RegularFramePaintCallback.
1. Pass offset in device pixel unit instead of app unit.
2. Keep old context of the basic manager before replacing.
MozReview-Commit-ID: IoYFTU35aw6
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -398,42 +398,40 @@ nsSVGIntegrationUtils::HitTestFrameForEf
return nsSVGUtils::HitTestClip(firstFrame, userSpacePt);
}
class RegularFramePaintCallback : public nsSVGFilterPaintCallback
{
public:
RegularFramePaintCallback(nsDisplayListBuilder* aBuilder,
LayerManager* aManager,
- const nsPoint& aOffset)
+ const gfxPoint& aUserSpaceToFrameSpaceOffset)
: mBuilder(aBuilder), mLayerManager(aManager),
- mOffset(aOffset) {}
+ mUserSpaceToFrameSpaceOffset(aUserSpaceToFrameSpaceOffset) {}
virtual DrawResult Paint(gfxContext& aContext, nsIFrame *aTarget,
const gfxMatrix& aTransform,
const nsIntRect* aDirtyRect) override
{
BasicLayerManager* basic = mLayerManager->AsBasicLayerManager();
+ RefPtr<gfxContext> oldCtx = basic->GetTarget();
basic->SetTarget(&aContext);
- gfxPoint devPixelOffset =
- nsLayoutUtils::PointToGfxPoint(-mOffset,
- aTarget->PresContext()->AppUnitsPerDevPixel());
-
gfxContextMatrixAutoSaveRestore autoSR(&aContext);
- aContext.SetMatrix(aContext.CurrentMatrix().Translate(devPixelOffset));
+ aContext.SetMatrix(aContext.CurrentMatrix().Translate(-mUserSpaceToFrameSpaceOffset));
mLayerManager->EndTransaction(FrameLayerBuilder::DrawPaintedLayer, mBuilder);
+ basic->SetTarget(oldCtx);
return DrawResult::SUCCESS;
}
private:
nsDisplayListBuilder* mBuilder;
LayerManager* mLayerManager;
- nsPoint mOffset;
+ gfxPoint mUserSpaceToFrameSpaceOffset;
};
typedef nsSVGIntegrationUtils::PaintFramesParams PaintFramesParams;
/**
* Paint css-positioned-mask onto a given target(aMaskDT).
*/
static DrawResult
@@ -1118,17 +1116,17 @@ nsSVGIntegrationUtils::PaintFilter(const
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.offsetToUserSpace);
+ offsets.offsetToUserSpaceInDevPx);
nsRegion dirtyRegion = aParams.dirtyRect - offsets.offsetToBoundingBox;
gfxMatrix tm = nsSVGIntegrationUtils::GetCSSPxToDevPxMatrix(frame);
DrawResult result =
nsFilterInstance::PaintFilteredFrame(frame, context.GetDrawTarget(),
tm, &callback, &dirtyRegion);
if (opacity != 1.0f) {
context.PopGroupAndBlend();