Bug 1632310 [wpt PR 23186] - Add test for computed versus resolved style., a=testonly
[gecko.git] / gfx / layers / client / ClientContainerLayer.h
blobf0331e6d16b392f8ef868a4c5dae0aaac3bf3723
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef GFX_CLIENTCONTAINERLAYER_H
8 #define GFX_CLIENTCONTAINERLAYER_H
10 #include <stdint.h> // for uint32_t
11 #include "ClientLayerManager.h" // for ClientLayerManager, etc
12 #include "Layers.h" // for Layer, ContainerLayer, etc
13 #include "nsDebug.h" // for NS_ASSERTION
14 #include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc
15 #include "nsISupportsUtils.h" // for NS_ADDREF, NS_RELEASE
16 #include "nsRegion.h" // for nsIntRegion
17 #include "nsTArray.h" // for AutoTArray
18 #include "ReadbackProcessor.h"
19 #include "ClientPaintedLayer.h"
21 namespace mozilla {
22 namespace layers {
24 class ShadowableLayer;
26 class ClientContainerLayer : public ContainerLayer, public ClientLayer {
27 public:
28 explicit ClientContainerLayer(ClientLayerManager* aManager)
29 : ContainerLayer(aManager, static_cast<ClientLayer*>(this)) {
30 MOZ_COUNT_CTOR(ClientContainerLayer);
31 mSupportsComponentAlphaChildren = true;
34 protected:
35 virtual ~ClientContainerLayer() {
36 ContainerLayer::RemoveAllChildren();
37 MOZ_COUNT_DTOR(ClientContainerLayer);
40 public:
41 void RenderLayer() override {
42 RenderMaskLayers(this);
44 DefaultComputeSupportsComponentAlphaChildren();
46 ReadbackProcessor readback;
47 readback.BuildUpdates(this);
49 nsTArray<Layer*> children = CollectChildren();
50 for (uint32_t i = 0; i < children.Length(); i++) {
51 Layer* child = children.ElementAt(i);
53 ToClientLayer(child)->RenderLayerWithReadback(&readback);
55 if (!ClientManager()->GetRepeatTransaction() &&
56 !child->GetInvalidRegion().IsEmpty()) {
57 child->Mutated();
62 void SetVisibleRegion(const LayerIntRegion& aRegion) override {
63 NS_ASSERTION(ClientManager()->InConstruction(),
64 "Can only set properties in construction phase");
65 ContainerLayer::SetVisibleRegion(aRegion);
67 bool InsertAfter(Layer* aChild, Layer* aAfter) override {
68 if (!ClientManager()->InConstruction()) {
69 NS_ERROR("Can only set properties in construction phase");
70 return false;
73 if (!ContainerLayer::InsertAfter(aChild, aAfter)) {
74 return false;
77 ClientManager()->AsShadowForwarder()->InsertAfter(
78 ClientManager()->Hold(this), ClientManager()->Hold(aChild),
79 aAfter ? ClientManager()->Hold(aAfter) : nullptr);
80 return true;
83 bool RemoveChild(Layer* aChild) override {
84 if (!ClientManager()->InConstruction()) {
85 NS_ERROR("Can only set properties in construction phase");
86 return false;
88 // hold on to aChild before we remove it!
89 ShadowableLayer* heldChild = ClientManager()->Hold(aChild);
90 if (!ContainerLayer::RemoveChild(aChild)) {
91 return false;
93 ClientManager()->AsShadowForwarder()->RemoveChild(
94 ClientManager()->Hold(this), heldChild);
95 return true;
98 bool RepositionChild(Layer* aChild, Layer* aAfter) override {
99 if (!ClientManager()->InConstruction()) {
100 NS_ERROR("Can only set properties in construction phase");
101 return false;
103 if (!ContainerLayer::RepositionChild(aChild, aAfter)) {
104 return false;
106 ClientManager()->AsShadowForwarder()->RepositionChild(
107 ClientManager()->Hold(this), ClientManager()->Hold(aChild),
108 aAfter ? ClientManager()->Hold(aAfter) : nullptr);
109 return true;
112 Layer* AsLayer() override { return this; }
113 ShadowableLayer* AsShadowableLayer() override { return this; }
115 void ComputeEffectiveTransforms(
116 const gfx::Matrix4x4& aTransformToSurface) override {
117 DefaultComputeEffectiveTransforms(aTransformToSurface);
120 void ForceIntermediateSurface() { mUseIntermediateSurface = true; }
122 void SetSupportsComponentAlphaChildren(bool aSupports) {
123 mSupportsComponentAlphaChildren = aSupports;
126 protected:
127 ClientLayerManager* ClientManager() {
128 return static_cast<ClientLayerManager*>(mManager);
132 class ClientRefLayer : public RefLayer, public ClientLayer {
133 public:
134 explicit ClientRefLayer(ClientLayerManager* aManager)
135 : RefLayer(aManager, static_cast<ClientLayer*>(this)) {
136 MOZ_COUNT_CTOR(ClientRefLayer);
139 protected:
140 MOZ_COUNTED_DTOR_OVERRIDE(ClientRefLayer)
142 public:
143 Layer* AsLayer() override { return this; }
144 ShadowableLayer* AsShadowableLayer() override { return this; }
146 void RenderLayer() override { RenderMaskLayers(this); }
148 void ComputeEffectiveTransforms(
149 const gfx::Matrix4x4& aTransformToSurface) override {
150 DefaultComputeEffectiveTransforms(aTransformToSurface);
153 private:
154 ClientLayerManager* ClientManager() {
155 return static_cast<ClientLayerManager*>(mManager);
159 } // namespace layers
160 } // namespace mozilla
162 #endif