gfx/layers/composite/AsyncCompositionManager.h

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     2  * This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef GFX_ASYNCCOMPOSITIONMANAGER_H
     7 #define GFX_ASYNCCOMPOSITIONMANAGER_H
     9 #include "Units.h"                      // for LayerPoint, etc
    10 #include "mozilla/layers/LayerManagerComposite.h"  // for LayerManagerComposite
    11 #include "gfx3DMatrix.h"                // for gfx3DMatrix
    12 #include "mozilla/Attributes.h"         // for MOZ_DELETE, MOZ_FINAL, etc
    13 #include "mozilla/RefPtr.h"             // for RefCounted
    14 #include "mozilla/TimeStamp.h"          // for TimeStamp
    15 #include "mozilla/dom/ScreenOrientation.h"  // for ScreenOrientation
    16 #include "mozilla/gfx/BasePoint.h"      // for BasePoint
    17 #include "mozilla/layers/LayersMessages.h"  // for TargetConfig
    18 #include "nsAutoPtr.h"                  // for nsRefPtr
    19 #include "nsISupportsImpl.h"            // for LayerManager::AddRef, etc
    21 namespace mozilla {
    22 namespace layers {
    24 class AsyncPanZoomController;
    25 class Layer;
    26 class LayerManagerComposite;
    27 class AutoResolveRefLayers;
    29 // Represents (affine) transforms that are calculated from a content view.
    30 struct ViewTransform {
    31   ViewTransform(LayerPoint aTranslation = LayerPoint(),
    32                 ParentLayerToScreenScale aScale = ParentLayerToScreenScale())
    33     : mTranslation(aTranslation)
    34     , mScale(aScale)
    35   {}
    37   operator gfx3DMatrix() const
    38   {
    39     return
    40       gfx3DMatrix::Translation(mTranslation.x, mTranslation.y, 0) *
    41       gfx3DMatrix::ScalingMatrix(mScale.scale, mScale.scale, 1);
    42   }
    44   bool operator==(const ViewTransform& rhs) const {
    45     return mTranslation == rhs.mTranslation && mScale == rhs.mScale;
    46   }
    48   bool operator!=(const ViewTransform& rhs) const {
    49     return !(*this == rhs);
    50   }
    52   LayerPoint mTranslation;
    53   ParentLayerToScreenScale mScale;
    54 };
    56 /**
    57  * Manage async composition effects. This class is only used with OMTC and only
    58  * lives on the compositor thread. It is a layer on top of the layer manager
    59  * (LayerManagerComposite) which deals with elements of composition which are
    60  * usually dealt with by dom or layout when main thread rendering, but which can
    61  * short circuit that stuff to directly affect layers as they are composited,
    62  * for example, off-main thread animation, async video, async pan/zoom.
    63  */
    64 class AsyncCompositionManager MOZ_FINAL
    65 {
    66   friend class AutoResolveRefLayers;
    67 public:
    68   NS_INLINE_DECL_REFCOUNTING(AsyncCompositionManager)
    70   AsyncCompositionManager(LayerManagerComposite* aManager)
    71     : mLayerManager(aManager)
    72     , mIsFirstPaint(false)
    73     , mLayersUpdated(false)
    74     , mReadyForCompose(true)
    75   {
    76   }
    77   ~AsyncCompositionManager()
    78   {
    79   }
    81   /**
    82    * This forces the is-first-paint flag to true. This is intended to
    83    * be called by the widget code when it loses its viewport information
    84    * (or for whatever reason wants to refresh the viewport information).
    85    * The information refresh happens because the compositor will call
    86    * SetFirstPaintViewport on the next frame of composition.
    87    */
    88   void ForceIsFirstPaint() { mIsFirstPaint = true; }
    90   // Sample transforms for layer trees.  Return true to request
    91   // another animation frame.
    92   bool TransformShadowTree(TimeStamp aCurrentFrame);
    94   // Calculates the correct rotation and applies the transform to
    95   // our layer manager
    96   void ComputeRotation();
    98   // Call after updating our layer tree.
    99   void Updated(bool isFirstPaint, const TargetConfig& aTargetConfig)
   100   {
   101     mIsFirstPaint |= isFirstPaint;
   102     mLayersUpdated = true;
   103     mTargetConfig = aTargetConfig;
   104   }
   106   bool RequiresReorientation(mozilla::dom::ScreenOrientation aOrientation)
   107   {
   108     return mTargetConfig.orientation() != aOrientation;
   109   }
   111   // True if the underlying layer tree is ready to be composited.
   112   bool ReadyForCompose() { return mReadyForCompose; }
   114   // Returns true if the next composition will be the first for a
   115   // particular document.
   116   bool IsFirstPaint() { return mIsFirstPaint; }
   118 private:
   119   void TransformScrollableLayer(Layer* aLayer);
   120   // Return true if an AsyncPanZoomController content transform was
   121   // applied for |aLayer|.  *aWantNextFrame is set to true if the
   122   // controller wants another animation frame.
   123   bool ApplyAsyncContentTransformToTree(TimeStamp aCurrentFrame, Layer* aLayer,
   124                                         bool* aWantNextFrame);
   125   /**
   126    * Update the shadow transform for aLayer assuming that is a scrollbar,
   127    * so that it stays in sync with the content that is being scrolled by APZ.
   128    */
   129   void ApplyAsyncTransformToScrollbar(TimeStamp aCurrentFrame, ContainerLayer* aLayer);
   131   void SetFirstPaintViewport(const LayerIntPoint& aOffset,
   132                              const CSSToLayerScale& aZoom,
   133                              const CSSRect& aCssPageRect);
   134   void SetPageRect(const CSSRect& aCssPageRect);
   135   void SyncViewportInfo(const LayerIntRect& aDisplayPort,
   136                         const CSSToLayerScale& aDisplayResolution,
   137                         bool aLayersUpdated,
   138                         ScreenPoint& aScrollOffset,
   139                         CSSToScreenScale& aScale,
   140                         LayerMargin& aFixedLayerMargins,
   141                         ScreenPoint& aOffset);
   142   void SyncFrameMetrics(const ScreenPoint& aScrollOffset,
   143                         float aZoom,
   144                         const CSSRect& aCssPageRect,
   145                         bool aLayersUpdated,
   146                         const CSSRect& aDisplayPort,
   147                         const CSSToLayerScale& aDisplayResolution,
   148                         bool aIsFirstPaint,
   149                         LayerMargin& aFixedLayerMargins,
   150                         ScreenPoint& aOffset);
   152   /**
   153    * Adds a translation to the transform of any fixed position (whose parent
   154    * layer is not fixed) or sticky position layer descendant of
   155    * aTransformedSubtreeRoot. The translation is chosen so that the layer's
   156    * anchor point relative to aTransformedSubtreeRoot's parent layer is the same
   157    * as it was when aTransformedSubtreeRoot's GetLocalTransform() was
   158    * aPreviousTransformForRoot. For sticky position layers, the translation is
   159    * further intersected with the layer's sticky scroll ranges.
   160    * This function will also adjust layers so that the given content document
   161    * fixed position margins will be respected during asynchronous panning and
   162    * zooming.
   163    */
   164   void AlignFixedAndStickyLayers(Layer* aLayer, Layer* aTransformedSubtreeRoot,
   165                                  const gfx::Matrix4x4& aPreviousTransformForRoot,
   166                                  const LayerMargin& aFixedLayerMargins);
   168   /**
   169    * DRAWING PHASE ONLY
   170    *
   171    * For reach RefLayer in our layer tree, look up its referent and connect it
   172    * to the layer tree, if found.
   173    */
   174   void ResolveRefLayers();
   175   /**
   176    * Detaches all referents resolved by ResolveRefLayers.
   177    * Assumes that mLayerManager->GetRoot() and mTargetConfig have not changed
   178    * since ResolveRefLayers was called.
   179    */
   180   void DetachRefLayers();
   182   TargetConfig mTargetConfig;
   183   CSSRect mContentRect;
   185   nsRefPtr<LayerManagerComposite> mLayerManager;
   186   // When this flag is set, the next composition will be the first for a
   187   // particular document (i.e. the document displayed on the screen will change).
   188   // This happens when loading a new page or switching tabs. We notify the
   189   // front-end (e.g. Java on Android) about this so that it take the new page
   190   // size and zoom into account when providing us with the next view transform.
   191   bool mIsFirstPaint;
   193   // This flag is set during a layers update, so that the first composition
   194   // after a layers update has it set. It is cleared after that first composition.
   195   bool mLayersUpdated;
   197   bool mReadyForCompose;
   198 };
   200 class MOZ_STACK_CLASS AutoResolveRefLayers {
   201 public:
   202   AutoResolveRefLayers(AsyncCompositionManager* aManager) : mManager(aManager)
   203   {
   204     if (mManager) {
   205       mManager->ResolveRefLayers();
   206     }
   207   }
   209   ~AutoResolveRefLayers()
   210   {
   211     if (mManager) {
   212       mManager->DetachRefLayers();
   213     }
   214   }
   216 private:
   217   AsyncCompositionManager* mManager;
   219   AutoResolveRefLayers(const AutoResolveRefLayers&) MOZ_DELETE;
   220   AutoResolveRefLayers& operator=(const AutoResolveRefLayers&) MOZ_DELETE;
   221 };
   223 } // layers
   224 } // mozilla
   226 #endif

mercurial