Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/gfx/layers/basic/BasicImageLayer.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 "BasicLayersImpl.h"            // for FillRectWithMask, etc
8
#include "ImageContainer.h"             // for AutoLockImage, etc
9
#include "ImageLayers.h"                // for ImageLayer
10
#include "Layers.h"                     // for Layer (ptr only), etc
11
#include "basic/BasicImplData.h"        // for BasicImplData
12
#include "basic/BasicLayers.h"          // for BasicLayerManager
13
#include "mozilla/mozalloc.h"           // for operator new
14
#include "nsCOMPtr.h"                   // for already_AddRefed
15
#include "nsDebug.h"                    // for NS_ASSERTION
16
#include "nsISupportsImpl.h"            // for gfxPattern::Release, etc
17
#include "nsRect.h"                     // for mozilla::gfx::IntRect
18
#include "nsRegion.h"                   // for nsIntRegion
19
#include "mozilla/gfx/Point.h"          // for IntSize
20
21
using namespace mozilla::gfx;
22
23
namespace mozilla {
24
namespace layers {
25
26
class BasicImageLayer : public ImageLayer, public BasicImplData {
27
public:
28
  explicit BasicImageLayer(BasicLayerManager* aLayerManager) :
29
    ImageLayer(aLayerManager, static_cast<BasicImplData*>(this)),
30
    mSize(-1, -1)
31
0
  {
32
0
    MOZ_COUNT_CTOR(BasicImageLayer);
33
0
  }
34
protected:
35
  ~BasicImageLayer() override
36
0
  {
37
0
    MOZ_COUNT_DTOR(BasicImageLayer);
38
0
  }
39
40
public:
41
  void SetVisibleRegion(const LayerIntRegion& aRegion) override
42
0
  {
43
0
    NS_ASSERTION(BasicManager()->InConstruction(),
44
0
                 "Can only set properties in construction phase");
45
0
    ImageLayer::SetVisibleRegion(aRegion);
46
0
  }
47
48
  void Paint(DrawTarget* aDT,
49
             const gfx::Point& aDeviceOffset,
50
             Layer* aMaskLayer) override;
51
52
  already_AddRefed<SourceSurface> GetAsSourceSurface() override;
53
54
protected:
55
  BasicLayerManager* BasicManager()
56
0
  {
57
0
    return static_cast<BasicLayerManager*>(mManager);
58
0
  }
59
60
  gfx::IntSize mSize;
61
};
62
63
void
64
BasicImageLayer::Paint(DrawTarget* aDT,
65
                       const gfx::Point& aDeviceOffset,
66
                       Layer* aMaskLayer)
67
0
{
68
0
  if (IsHidden() || !mContainer) {
69
0
    return;
70
0
  }
71
0
72
0
  RefPtr<ImageFactory> originalIF = mContainer->GetImageFactory();
73
0
  mContainer->SetImageFactory(mManager->IsCompositingCheap() ? nullptr : BasicManager()->GetImageFactory());
74
0
75
0
  AutoLockImage autoLock(mContainer);
76
0
  Image *image = autoLock.GetImage(BasicManager()->GetCompositionTime());
77
0
  if (!image) {
78
0
    mContainer->SetImageFactory(originalIF);
79
0
    return;
80
0
  }
81
0
  RefPtr<gfx::SourceSurface> surface = image->GetAsSourceSurface();
82
0
  if (!surface || !surface->IsValid()) {
83
0
    mContainer->SetImageFactory(originalIF);
84
0
    return;
85
0
  }
86
0
87
0
  gfx::IntSize size = mSize = surface->GetSize();
88
0
  FillRectWithMask(aDT, aDeviceOffset, Rect(0, 0, size.width, size.height),
89
0
                   surface, mSamplingFilter,
90
0
                   DrawOptions(GetEffectiveOpacity(), GetEffectiveOperator(this)),
91
0
                   aMaskLayer);
92
0
93
0
  mContainer->SetImageFactory(originalIF);
94
0
}
95
96
already_AddRefed<SourceSurface>
97
BasicImageLayer::GetAsSourceSurface()
98
0
{
99
0
  if (!mContainer) {
100
0
    return nullptr;
101
0
  }
102
0
103
0
  AutoLockImage lockImage(mContainer);
104
0
  Image* image = lockImage.GetImage();
105
0
  if (!image) {
106
0
    return nullptr;
107
0
  }
108
0
  return image->GetAsSourceSurface();
109
0
}
110
111
already_AddRefed<ImageLayer>
112
BasicLayerManager::CreateImageLayer()
113
0
{
114
0
  NS_ASSERTION(InConstruction(), "Only allowed in construction phase");
115
0
  RefPtr<ImageLayer> layer = new BasicImageLayer(this);
116
0
  return layer.forget();
117
0
}
118
119
} // namespace layers
120
} // namespace mozilla