summaryrefslogtreecommitdiffstats
path: root/image/BlobSurfaceProvider.h
diff options
context:
space:
mode:
Diffstat (limited to 'image/BlobSurfaceProvider.h')
-rw-r--r--image/BlobSurfaceProvider.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/image/BlobSurfaceProvider.h b/image/BlobSurfaceProvider.h
new file mode 100644
index 0000000000..6515bb2af4
--- /dev/null
+++ b/image/BlobSurfaceProvider.h
@@ -0,0 +1,140 @@
+/* -*- 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/. */
+
+#ifndef MOZILLA_IMAGE_BLOBSURFACEPROVIDER_H_
+#define MOZILLA_IMAGE_BLOBSURFACEPROVIDER_H_
+
+#include "mozilla/Maybe.h"
+#include "mozilla/SVGImageContext.h"
+#include "mozilla/gfx/2D.h"
+#include "mozilla/layers/WebRenderLayerManager.h"
+#include "ImageRegion.h"
+#include "ISurfaceProvider.h"
+
+#include <vector>
+
+namespace mozilla {
+namespace image {
+
+class BlobImageKeyData final {
+ public:
+ BlobImageKeyData(layers::WebRenderLayerManager* aManager,
+ const wr::BlobImageKey& aBlobKey,
+ std::vector<RefPtr<gfx::ScaledFont>>&& aScaledFonts,
+ std::vector<RefPtr<gfx::SourceSurface>>&& aExternalSurfaces)
+ : mManager(aManager),
+ mBlobKey(aBlobKey),
+ mScaledFonts(std::move(aScaledFonts)),
+ mExternalSurfaces(std::move(aExternalSurfaces)),
+ mDirty(false) {}
+
+ BlobImageKeyData(BlobImageKeyData&& aOther) noexcept
+ : mManager(std::move(aOther.mManager)),
+ mBlobKey(aOther.mBlobKey),
+ mScaledFonts(std::move(aOther.mScaledFonts)),
+ mExternalSurfaces(std::move(aOther.mExternalSurfaces)),
+ mDirty(aOther.mDirty) {}
+
+ BlobImageKeyData& operator=(BlobImageKeyData&& aOther) noexcept {
+ mManager = std::move(aOther.mManager);
+ mBlobKey = aOther.mBlobKey;
+ mScaledFonts = std::move(aOther.mScaledFonts);
+ mExternalSurfaces = std::move(aOther.mExternalSurfaces);
+ mDirty = aOther.mDirty;
+ return *this;
+ }
+
+ BlobImageKeyData(const BlobImageKeyData&) = delete;
+ BlobImageKeyData& operator=(const BlobImageKeyData&) = delete;
+
+ RefPtr<layers::WebRenderLayerManager> mManager;
+ wr::BlobImageKey mBlobKey;
+ std::vector<RefPtr<gfx::ScaledFont>> mScaledFonts;
+ std::vector<RefPtr<gfx::SourceSurface>> mExternalSurfaces;
+ bool mDirty;
+};
+
+} // namespace image
+} // namespace mozilla
+
+MOZ_DECLARE_RELOCATE_USING_MOVE_CONSTRUCTOR(mozilla::image::BlobImageKeyData);
+
+namespace mozilla {
+namespace wr {
+class IpcResourceUpdateQueue;
+} // namespace wr
+
+namespace image {
+class SVGDocumentWrapper;
+
+/**
+ * An ISurfaceProvider that manages blob recordings of SVG images. Unlike the
+ * rasterized ISurfaceProviders, it only provides a recording which may be
+ * replayed in the compositor process by WebRender. It may be invalidated
+ * directly in order to reuse the resource ids and underlying buffers when the
+ * SVG image has changed (e.g. it is animated).
+ */
+class BlobSurfaceProvider final : public ISurfaceProvider {
+ public:
+ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BlobSurfaceProvider, override)
+
+ BlobSurfaceProvider(ImageKey aImageKey, const SurfaceKey& aSurfaceKey,
+ SVGDocumentWrapper* aSVGDocumentWrapper,
+ uint32_t aImageFlags);
+
+ bool IsFinished() const override { return true; }
+
+ size_t LogicalSizeInBytes() const override {
+ const gfx::IntSize& size = GetSurfaceKey().Size();
+ return size.width * size.height * sizeof(uint32_t);
+ }
+
+ nsresult UpdateKey(layers::RenderRootStateManager* aManager,
+ wr::IpcResourceUpdateQueue& aResources,
+ wr::ImageKey& aKey) override;
+
+ void InvalidateRecording() override;
+
+ void AddSizeOfExcludingThis(MallocSizeOf aMallocSizeOf,
+ const AddSizeOfCb& aCallback) override {
+ AddSizeOfCbData metadata;
+ metadata.mFinished = true;
+ metadata.mHeapBytes += mKeys.ShallowSizeOfExcludingThis(aMallocSizeOf);
+
+ gfx::SourceSurface::SizeOfInfo info;
+ info.AddType(gfx::SurfaceType::BLOB_IMAGE);
+ metadata.Accumulate(info);
+
+ aCallback(metadata);
+ }
+
+ protected:
+ DrawableFrameRef DrawableRef(size_t aFrame) override {
+ MOZ_ASSERT_UNREACHABLE("BlobSurfaceProvider::DrawableRef not supported!");
+ return DrawableFrameRef();
+ }
+ bool IsLocked() const override { return true; }
+ void SetLocked(bool) override {}
+
+ private:
+ ~BlobSurfaceProvider() override;
+
+ Maybe<BlobImageKeyData> RecordDrawing(layers::WebRenderLayerManager* aManager,
+ wr::IpcResourceUpdateQueue& aResources,
+ Maybe<wr::BlobImageKey> aBlobKey);
+
+ static void DestroyKeys(const AutoTArray<BlobImageKeyData, 1>& aKeys);
+
+ AutoTArray<BlobImageKeyData, 1> mKeys;
+
+ RefPtr<image::SVGDocumentWrapper> mSVGDocumentWrapper;
+ uint32_t mImageFlags;
+};
+
+} // namespace image
+} // namespace mozilla
+
+#endif /* MOZILLA_IMAGE_BLOBSURFACEPROVIDER_H_ */