Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/layers/client/ClientImageLayer.cpp
Line
Count
Source (jump to first uncovered line)
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/. */
6
7
#include "ClientLayerManager.h"         // for ClientLayerManager, etc
8
#include "ImageContainer.h"             // for AutoLockImage, etc
9
#include "ImageLayers.h"                // for ImageLayer
10
#include "mozilla/Attributes.h"         // for override
11
#include "mozilla/RefPtr.h"             // for RefPtr
12
#include "mozilla/layers/CompositorTypes.h"
13
#include "mozilla/layers/ImageClient.h"  // for ImageClient, etc
14
#include "mozilla/layers/LayersMessages.h"  // for ImageLayerAttributes, etc
15
#include "mozilla/mozalloc.h"           // for operator delete, etc
16
#include "nsCOMPtr.h"                   // for already_AddRefed
17
#include "nsDebug.h"                    // for NS_ASSERTION
18
#include "nsISupportsImpl.h"            // for Layer::AddRef, etc
19
#include "nsRegion.h"                   // for nsIntRegion
20
21
namespace mozilla {
22
namespace layers {
23
24
using namespace mozilla::gfx;
25
26
class ClientImageLayer : public ImageLayer,
27
                         public ClientLayer {
28
public:
29
  explicit ClientImageLayer(ClientLayerManager* aLayerManager)
30
    : ImageLayer(aLayerManager, static_cast<ClientLayer*>(this))
31
    , mImageClientTypeContainer(CompositableType::UNKNOWN)
32
0
  {
33
0
    MOZ_COUNT_CTOR(ClientImageLayer);
34
0
  }
35
36
protected:
37
  virtual ~ClientImageLayer()
38
0
  {
39
0
    DestroyBackBuffer();
40
0
    MOZ_COUNT_DTOR(ClientImageLayer);
41
0
  }
42
43
  virtual void SetContainer(ImageContainer* aContainer) override
44
0
  {
45
0
    ImageLayer::SetContainer(aContainer);
46
0
    mImageClientTypeContainer = CompositableType::UNKNOWN;
47
0
  }
48
49
  virtual void SetVisibleRegion(const LayerIntRegion& aRegion) override
50
0
  {
51
0
    NS_ASSERTION(ClientManager()->InConstruction(),
52
0
                 "Can only set properties in construction phase");
53
0
    ImageLayer::SetVisibleRegion(aRegion);
54
0
  }
55
56
  virtual void RenderLayer() override;
57
  
58
  virtual void ClearCachedResources() override
59
0
  {
60
0
    DestroyBackBuffer();
61
0
  }
62
63
  virtual bool SupportsAsyncUpdate() override
64
0
  {
65
0
    if (GetImageClientType() == CompositableType::IMAGE_BRIDGE) {
66
0
      return true;
67
0
    }
68
0
    return false;
69
0
  }
70
71
  virtual void HandleMemoryPressure() override
72
0
  {
73
0
    if (mImageClient) {
74
0
      mImageClient->HandleMemoryPressure();
75
0
    }
76
0
  }
77
78
  virtual void FillSpecificAttributes(SpecificLayerAttributes& aAttrs) override
79
0
  {
80
0
    aAttrs = ImageLayerAttributes(mSamplingFilter, mScaleToSize, mScaleMode);
81
0
  }
82
83
0
  virtual Layer* AsLayer() override { return this; }
84
0
  virtual ShadowableLayer* AsShadowableLayer() override { return this; }
85
86
  virtual void Disconnect() override
87
0
  {
88
0
    DestroyBackBuffer();
89
0
  }
90
91
  void DestroyBackBuffer()
92
0
  {
93
0
    if (mImageClient) {
94
0
      mImageClient->SetLayer(nullptr);
95
0
      mImageClient->OnDetach();
96
0
      mImageClient = nullptr;
97
0
    }
98
0
  }
99
100
  virtual CompositableClient* GetCompositableClient() override
101
0
  {
102
0
    return mImageClient;
103
0
  }
104
105
protected:
106
  ClientLayerManager* ClientManager()
107
0
  {
108
0
    return static_cast<ClientLayerManager*>(mManager);
109
0
  }
110
111
  CompositableType GetImageClientType()
112
0
  {
113
0
    if (mImageClientTypeContainer != CompositableType::UNKNOWN) {
114
0
      return mImageClientTypeContainer;
115
0
    }
116
0
117
0
    if (mContainer->IsAsync()) {
118
0
      mImageClientTypeContainer = CompositableType::IMAGE_BRIDGE;
119
0
      return mImageClientTypeContainer;
120
0
    }
121
0
122
0
    AutoLockImage autoLock(mContainer);
123
0
124
0
    mImageClientTypeContainer = autoLock.HasImage()
125
0
        ? CompositableType::IMAGE : CompositableType::UNKNOWN;
126
0
    return mImageClientTypeContainer;
127
0
  }
128
129
  RefPtr<ImageClient> mImageClient;
130
  CompositableType mImageClientTypeContainer;
131
};
132
133
void
134
ClientImageLayer::RenderLayer()
135
0
{
136
0
  RenderMaskLayers(this);
137
0
138
0
  if (!mContainer) {
139
0
     return;
140
0
  }
141
0
142
0
  if (!mImageClient ||
143
0
      !mImageClient->UpdateImage(mContainer, GetContentFlags())) {
144
0
    CompositableType type = GetImageClientType();
145
0
    if (type == CompositableType::UNKNOWN) {
146
0
      return;
147
0
    }
148
0
    TextureFlags flags = TextureFlags::DEFAULT;
149
0
    mImageClient = ImageClient::CreateImageClient(type,
150
0
                                                  ClientManager()->AsShadowForwarder(),
151
0
                                                  flags);
152
0
    if (!mImageClient) {
153
0
      return;
154
0
    }
155
0
    mImageClient->SetLayer(this);
156
0
    if (HasShadow() && !mContainer->IsAsync()) {
157
0
      mImageClient->Connect();
158
0
      ClientManager()->AsShadowForwarder()->Attach(mImageClient, this);
159
0
    }
160
0
    if (!mImageClient->UpdateImage(mContainer, GetContentFlags())) {
161
0
      return;
162
0
    }
163
0
  }
164
0
  ClientManager()->Hold(this);
165
0
}
166
167
already_AddRefed<ImageLayer>
168
ClientLayerManager::CreateImageLayer()
169
0
{
170
0
  NS_ASSERTION(InConstruction(), "Only allowed in construction phase");
171
0
  RefPtr<ClientImageLayer> layer =
172
0
    new ClientImageLayer(this);
173
0
  CREATE_SHADOW(Image);
174
0
  return layer.forget();
175
0
}
176
177
} // namespace layers
178
} // namespace mozilla