Bug 1228280 - Part 6. Single SVG mask optimization; draft
authorCJKu <cku@mozilla.com>
Thu, 19 May 2016 12:41:33 +0800
changeset 368601 3d9fe359b297220b5e762c91eef9aa8c55cb584a
parent 368600 4250562144d20d2494793c4bd5a2504b85c7cfcd
child 368602 cc44a2385fa4d9087d906774cea9fa1f35598ed0
push id18601
push usercku@mozilla.com
push dateThu, 19 May 2016 04:45:09 +0000
bugs1228280
milestone49.0a1
Bug 1228280 - Part 6. Single SVG mask optimization; MozReview-Commit-ID: wFfyVvZUrB
layout/svg/nsSVGIntegrationUtils.cpp
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -438,16 +438,27 @@ GenerateMaskSurface(const nsSVGIntegrati
 
   nsTArray<nsSVGMaskFrame *> svgMaskFrames = aEffectProperties.GetMaskFrames();
   MOZ_ASSERT(svgMaskFrames.Length() == svgReset->mMask.mImageCount);
 
   gfxMatrix cssPxToDevPxMatrix =
     nsSVGIntegrationUtils::GetCSSPxToDevPxMatrix(aParams.frame);
 
   gfxContext& ctx = aParams.ctx;
+
+  // There is only one mask. And that mask is a SVG mask.
+  if ((svgMaskFrames.Length() == 1) && svgMaskFrames[0]) {
+    aOutMaskSurface =
+      svgMaskFrames[0]->GetMaskForMaskedFrame(&ctx, aParams.frame,
+                                              cssPxToDevPxMatrix, aOpacity,
+                                              &aOutMaskTransform,
+                                              svgReset->mMask.mLayers[0].mMaskMode);
+    return;
+  }
+
   ctx.Save();
   ctx.SetMatrix(gfxMatrix());
   gfxRect clipExtents = ctx.GetClipExtents();
   IntRect maskSurfaceRect = RoundedOut(ToRect(clipExtents));
   ctx.Restore();
 
   // Mask composition result on CoreGraphic::A8 surface is not correct
   // when mask-mode is not add(source over). Switch to skia when CG backend