Bug 1359842 - Do some cleanup of GetWrRelBounds. r?nical draft
authorKartikaya Gupta <kgupta@mozilla.com>
Wed, 26 Apr 2017 16:37:15 -0400
changeset 568966 d8a7f08fe28de3c766ec2dbba74316ce75f82bad
parent 568965 c8996739dbc29d57c4f835e15f9ce9d64fdd7a7c
child 568967 db19ac622bae8cf325ea27ad25cc785e9d76e73b
push id56034
push userkgupta@mozilla.com
push dateWed, 26 Apr 2017 20:37:45 +0000
reviewersnical
bugs1359842
milestone55.0a1
Bug 1359842 - Do some cleanup of GetWrRelBounds. r?nical This moves the bulk of the meaningful work done by GetWrRelBounds into strongly-typed helper functions. GetWrRelBounds is left as a wrapper so call sites don't need to be updated yet. Note also that the strongly-typed functions do not do any conversions from one reference point from another (e.g. by calling the RelativeToXXX functions). MozReview-Commit-ID: B3nPbOJOf9o
gfx/layers/wr/WebRenderLayer.cpp
gfx/layers/wr/WebRenderLayer.h
--- a/gfx/layers/wr/WebRenderLayer.cpp
+++ b/gfx/layers/wr/WebRenderLayer.cpp
@@ -6,16 +6,17 @@
 #include "WebRenderLayer.h"
 
 #include "gfxPrefs.h"
 #include "LayersLogging.h"
 #include "mozilla/layers/ImageClient.h"
 #include "mozilla/layers/WebRenderBridgeChild.h"
 #include "mozilla/layers/WebRenderLayerManager.h"
 #include "nsThreadUtils.h"
+#include "UnitTransforms.h"
 
 namespace mozilla {
 
 using namespace gfx;
 
 namespace layers {
 
 WebRenderLayerManager*
@@ -139,37 +140,49 @@ WebRenderLayer::GetWrClipRect(gfx::Rect&
            );
   } else {
     clip = aRect;
   }
 
   return clip;
 }
 
-gfx::Matrix4x4
-WebRenderLayer::GetWrBoundTransform()
+LayerRect
+WebRenderLayer::Bounds()
+{
+  return LayerRect(GetLayer()->GetVisibleRegion().GetBounds());
+}
+
+BoundsTransformMatrix
+WebRenderLayer::BoundsTransform()
 {
   gfx::Matrix4x4 transform = GetLayer()->GetTransform();
   transform._41 = 0.0f;
   transform._42 = 0.0f;
   transform._43 = 0.0f;
-  return transform;
+  return ViewAs<BoundsTransformMatrix>(transform);
+}
+
+LayerRect
+WebRenderLayer::BoundsForStackingContext()
+{
+  LayerRect bounds = Bounds();
+  BoundsTransformMatrix transform = BoundsTransform();
+  if (!transform.IsIdentity()) {
+    // WR will only apply the 'translate' of the transform, so we need to do the scale/rotation manually.
+    bounds.MoveTo(transform.TransformPoint(bounds.TopLeft()));
+  }
+
+  return bounds;
 }
 
 gfx::Rect
 WebRenderLayer::GetWrRelBounds()
 {
-  gfx::Rect bounds = IntRectToRect(GetLayer()->GetVisibleRegion().GetBounds().ToUnknownRect());
-  gfx::Matrix4x4 transform = GetWrBoundTransform();
-  if (!transform.IsIdentity()) {
-    // WR will only apply the 'translate' of the transform, so we need to do the scale/rotation manually.
-    bounds.MoveTo(transform.TransformPoint(bounds.TopLeft()));
-  }
-
-  return RelativeToParent(bounds);
+  return RelativeToParent(BoundsForStackingContext().ToUnknownRect());
 }
 
 Maybe<wr::ImageKey>
 WebRenderLayer::UpdateImageKey(ImageClientSingle* aImageClient,
                                ImageContainer* aContainer,
                                Maybe<wr::ImageKey>& aOldKey,
                                wr::ExternalImageId& aExternalImageId)
 {
--- a/gfx/layers/wr/WebRenderLayer.h
+++ b/gfx/layers/wr/WebRenderLayer.h
@@ -12,16 +12,18 @@
 
 namespace mozilla {
 namespace layers {
 
 class ImageClientSingle;
 class WebRenderBridgeChild;
 class WebRenderLayerManager;
 
+typedef gfx::Matrix4x4Typed<LayerPixel, LayerPixel> BoundsTransformMatrix;
+
 class WebRenderLayer
 {
 public:
   virtual Layer* GetLayer() = 0;
   virtual void RenderLayer(wr::DisplayListBuilder& aBuilder) = 0;
   virtual Maybe<WrImageMask> RenderMaskLayer(const gfx::Matrix4x4& aTransform)
   {
     MOZ_ASSERT(false);
@@ -47,20 +49,23 @@ public:
   gfx::Rect RelativeToVisible(gfx::Rect aRect);
   gfx::Rect RelativeToTransformedVisible(gfx::Rect aRect);
   gfx::Rect ParentStackingContextBounds();
   gfx::Rect RelativeToParent(gfx::Rect aRect);
   gfx::Rect VisibleBoundsRelativeToParent();
   gfx::Point GetOffsetToParent();
   gfx::Rect TransformedVisibleBoundsRelativeToParent();
 protected:
+  LayerRect Bounds();
+  BoundsTransformMatrix BoundsTransform();
+  LayerRect BoundsForStackingContext();
+
   gfx::Rect GetWrBoundsRect();
   gfx::Rect GetWrRelBounds();
   gfx::Rect GetWrClipRect(gfx::Rect& aRect);
-  gfx::Matrix4x4 GetWrBoundTransform();
   void DumpLayerInfo(const char* aLayerType, gfx::Rect& aRect);
   Maybe<WrImageMask> BuildWrMaskLayer(bool aUnapplyLayerTransform);
 };
 
 } // namespace layers
 } // namespace mozilla
 
 #endif /* GFX_WEBRENDERLAYER_H */