/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 |