summaryrefslogtreecommitdiffstats
path: root/gfx/layers/basic/BasicImageLayer.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--gfx/layers/basic/BasicImageLayer.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/gfx/layers/basic/BasicImageLayer.cpp b/gfx/layers/basic/BasicImageLayer.cpp
new file mode 100644
index 0000000000..d1b392154f
--- /dev/null
+++ b/gfx/layers/basic/BasicImageLayer.cpp
@@ -0,0 +1,108 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "BasicLayersImpl.h" // for FillRectWithMask, etc
+#include "ImageContainer.h" // for AutoLockImage, etc
+#include "ImageLayers.h" // for ImageLayer
+#include "Layers.h" // for Layer (ptr only), etc
+#include "basic/BasicImplData.h" // for BasicImplData
+#include "basic/BasicLayers.h" // for BasicLayerManager
+#include "mozilla/mozalloc.h" // for operator new
+#include "nsCOMPtr.h" // for already_AddRefed
+#include "nsDebug.h" // for NS_ASSERTION
+#include "nsISupportsImpl.h" // for gfxPattern::Release, etc
+#include "nsRect.h" // for mozilla::gfx::IntRect
+#include "nsRegion.h" // for nsIntRegion
+#include "mozilla/gfx/Point.h" // for IntSize
+
+using namespace mozilla::gfx;
+
+namespace mozilla::layers {
+
+class BasicImageLayer : public ImageLayer, public BasicImplData {
+ public:
+ explicit BasicImageLayer(BasicLayerManager* aLayerManager)
+ : ImageLayer(aLayerManager, static_cast<BasicImplData*>(this)),
+ mSize(-1, -1) {
+ MOZ_COUNT_CTOR(BasicImageLayer);
+ }
+
+ protected:
+ MOZ_COUNTED_DTOR_OVERRIDE(BasicImageLayer)
+
+ public:
+ void SetVisibleRegion(const LayerIntRegion& aRegion) override {
+ NS_ASSERTION(BasicManager()->InConstruction(),
+ "Can only set properties in construction phase");
+ ImageLayer::SetVisibleRegion(aRegion);
+ }
+
+ void Paint(DrawTarget* aDT, const gfx::Point& aDeviceOffset,
+ Layer* aMaskLayer) override;
+
+ already_AddRefed<SourceSurface> GetAsSourceSurface() override;
+
+ protected:
+ BasicLayerManager* BasicManager() {
+ return static_cast<BasicLayerManager*>(mManager);
+ }
+
+ gfx::IntSize mSize;
+};
+
+void BasicImageLayer::Paint(DrawTarget* aDT, const gfx::Point& aDeviceOffset,
+ Layer* aMaskLayer) {
+ if (IsHidden() || !mContainer) {
+ return;
+ }
+
+ RefPtr<ImageFactory> originalIF = mContainer->GetImageFactory();
+ mContainer->SetImageFactory(mManager->IsCompositingCheap()
+ ? nullptr
+ : BasicManager()->GetImageFactory());
+
+ AutoLockImage autoLock(mContainer);
+ Image* image = autoLock.GetImage(BasicManager()->GetCompositionTime());
+ if (!image) {
+ mContainer->SetImageFactory(originalIF);
+ return;
+ }
+ RefPtr<gfx::SourceSurface> surface = image->GetAsSourceSurface();
+ if (!surface || !surface->IsValid()) {
+ mContainer->SetImageFactory(originalIF);
+ return;
+ }
+
+ gfx::IntSize size = mSize = surface->GetSize();
+ FillRectWithMask(
+ aDT, aDeviceOffset, Rect(0, 0, size.width, size.height), surface,
+ mSamplingFilter,
+ DrawOptions(GetEffectiveOpacity(), GetEffectiveOperator(this)),
+ aMaskLayer);
+
+ mContainer->SetImageFactory(originalIF);
+}
+
+already_AddRefed<SourceSurface> BasicImageLayer::GetAsSourceSurface() {
+ if (!mContainer) {
+ return nullptr;
+ }
+
+ AutoLockImage lockImage(mContainer);
+ Image* image = lockImage.GetImage();
+ if (!image) {
+ return nullptr;
+ }
+ return image->GetAsSourceSurface();
+}
+
+already_AddRefed<ImageLayer> BasicLayerManager::CreateImageLayer() {
+ NS_ASSERTION(InConstruction(), "Only allowed in construction phase");
+ RefPtr<ImageLayer> layer = new BasicImageLayer(this);
+ return layer.forget();
+}
+
+} // namespace mozilla::layers