Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; 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/. */
5 :
6 : #include "mozilla/layers/StackingContextHelper.h"
7 :
8 : #include "mozilla/layers/WebRenderLayer.h"
9 : #include "UnitTransforms.h"
10 :
11 : namespace mozilla {
12 : namespace layers {
13 :
14 0 : StackingContextHelper::StackingContextHelper()
15 0 : : mBuilder(nullptr)
16 : {
17 : // mOrigin remains at 0,0
18 0 : }
19 :
20 0 : StackingContextHelper::StackingContextHelper(const StackingContextHelper& aParentSC,
21 : wr::DisplayListBuilder& aBuilder,
22 : LayerRect aBoundForSC,
23 : LayerPoint aOrigin,
24 : uint64_t aAnimationsId,
25 : float* aOpacityPtr,
26 : gfx::Matrix4x4* aTransformPtr,
27 0 : const nsTArray<WrFilterOp>& aFilters)
28 0 : : mBuilder(&aBuilder)
29 : {
30 0 : WrRect scBounds = aParentSC.ToRelativeWrRect(aBoundForSC);
31 0 : if (aTransformPtr) {
32 0 : mTransform = *aTransformPtr;
33 : }
34 :
35 0 : mBuilder->PushStackingContext(scBounds,
36 : aAnimationsId,
37 : aOpacityPtr,
38 : aTransformPtr,
39 : WrTransformStyle::Flat,
40 : // TODO: set correct blend mode.
41 0 : wr::ToWrMixBlendMode(gfx::CompositionOp::OP_OVER),
42 0 : aFilters);
43 :
44 0 : mOrigin = aOrigin;
45 0 : }
46 :
47 0 : StackingContextHelper::StackingContextHelper(const StackingContextHelper& aParentSC,
48 : wr::DisplayListBuilder& aBuilder,
49 : WebRenderLayer* aLayer,
50 : const Maybe<gfx::Matrix4x4>& aTransform,
51 0 : const nsTArray<WrFilterOp>& aFilters)
52 0 : : mBuilder(&aBuilder)
53 : {
54 0 : WrRect scBounds = aParentSC.ToRelativeWrRect(aLayer->BoundsForStackingContext());
55 0 : Layer* layer = aLayer->GetLayer();
56 0 : mTransform = aTransform.valueOr(layer->GetTransform());
57 :
58 0 : float opacity = 1.0f;
59 0 : mBuilder->PushStackingContext(scBounds, 0, &opacity,
60 0 : mTransform.IsIdentity() ? nullptr : &mTransform,
61 : WrTransformStyle::Flat,
62 0 : wr::ToWrMixBlendMode(layer->GetMixBlendMode()),
63 0 : aFilters);
64 0 : mOrigin = aLayer->Bounds().TopLeft();
65 0 : }
66 :
67 0 : StackingContextHelper::StackingContextHelper(const StackingContextHelper& aParentSC,
68 : wr::DisplayListBuilder& aBuilder,
69 : WebRenderLayer* aLayer,
70 : uint64_t aAnimationsId,
71 : float* aOpacityPtr,
72 : gfx::Matrix4x4* aTransformPtr,
73 0 : const nsTArray<WrFilterOp>& aFilters)
74 0 : : mBuilder(&aBuilder)
75 : {
76 0 : WrRect scBounds = aParentSC.ToRelativeWrRect(aLayer->BoundsForStackingContext());
77 0 : if (aTransformPtr) {
78 0 : mTransform = *aTransformPtr;
79 : }
80 :
81 0 : mBuilder->PushStackingContext(scBounds,
82 : aAnimationsId,
83 : aOpacityPtr,
84 : aTransformPtr,
85 : WrTransformStyle::Flat,
86 0 : wr::ToWrMixBlendMode(aLayer->GetLayer()->GetMixBlendMode()),
87 0 : aFilters);
88 0 : mOrigin = aLayer->Bounds().TopLeft();
89 0 : }
90 :
91 0 : StackingContextHelper::~StackingContextHelper()
92 : {
93 0 : if (mBuilder) {
94 0 : mBuilder->PopStackingContext();
95 : }
96 0 : }
97 :
98 : WrRect
99 0 : StackingContextHelper::ToRelativeWrRect(const LayerRect& aRect) const
100 : {
101 0 : return wr::ToWrRect(aRect - mOrigin);
102 : }
103 :
104 : WrRect
105 0 : StackingContextHelper::ToRelativeWrRect(const LayoutDeviceRect& aRect) const
106 : {
107 0 : return wr::ToWrRect(ViewAs<LayerPixel>(aRect, PixelCastJustification::WebRenderHasUnitResolution) - mOrigin);
108 : }
109 :
110 : WrPoint
111 0 : StackingContextHelper::ToRelativeWrPoint(const LayerPoint& aPoint) const
112 : {
113 0 : return wr::ToWrPoint(aPoint - mOrigin);
114 : }
115 :
116 : WrRect
117 0 : StackingContextHelper::ToRelativeWrRectRounded(const LayoutDeviceRect& aRect) const
118 : {
119 0 : return wr::ToWrRect(RoundedToInt(ViewAs<LayerPixel>(aRect, PixelCastJustification::WebRenderHasUnitResolution) - mOrigin));
120 : }
121 :
122 : } // namespace layers
123 : } // namespace mozilla
|