From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- image/DecodedSurfaceProvider.h | 93 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 image/DecodedSurfaceProvider.h (limited to 'image/DecodedSurfaceProvider.h') diff --git a/image/DecodedSurfaceProvider.h b/image/DecodedSurfaceProvider.h new file mode 100644 index 0000000000..07e722daa6 --- /dev/null +++ b/image/DecodedSurfaceProvider.h @@ -0,0 +1,93 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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/. */ + +/** + * An ISurfaceProvider implemented for single-frame decoded surfaces. + */ + +#ifndef mozilla_image_DecodedSurfaceProvider_h +#define mozilla_image_DecodedSurfaceProvider_h + +#include "IDecodingTask.h" +#include "ISurfaceProvider.h" +#include "SurfaceCache.h" + +namespace mozilla { +namespace image { + +/** + * An ISurfaceProvider that manages the decoding of a single-frame image and + * stores the resulting surface. + */ +class DecodedSurfaceProvider final : public ISurfaceProvider, + public IDecodingTask { + public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DecodedSurfaceProvider, override) + + DecodedSurfaceProvider(NotNull aImage, + const SurfaceKey& aSurfaceKey, + NotNull aDecoder); + + ////////////////////////////////////////////////////////////////////////////// + // ISurfaceProvider implementation. + ////////////////////////////////////////////////////////////////////////////// + + public: + bool IsFinished() const override; + size_t LogicalSizeInBytes() const override; + + protected: + DrawableFrameRef DrawableRef(size_t aFrame) override; + bool IsLocked() const override { return bool(mLockRef); } + void SetLocked(bool aLocked) override; + + ////////////////////////////////////////////////////////////////////////////// + // IDecodingTask implementation. + ////////////////////////////////////////////////////////////////////////////// + + public: + void Run() override; + bool ShouldPreferSyncRun() const override; + + // Full decodes are low priority compared to metadata decodes because they + // don't block layout or page load. + TaskPriority Priority() const override { return TaskPriority::eLow; } + + ////////////////////////////////////////////////////////////////////////////// + // WebRenderImageProvider implementation. + ////////////////////////////////////////////////////////////////////////////// + + public: + nsresult UpdateKey(layers::RenderRootStateManager* aManager, + wr::IpcResourceUpdateQueue& aResources, + wr::ImageKey& aKey) override; + + private: + virtual ~DecodedSurfaceProvider(); + + void DropImageReference(); + void CheckForNewSurface(); + void FinishDecoding(); + + /// The image associated with our decoder. Dropped after decoding. + RefPtr mImage; + + /// Mutex protecting access to mDecoder. + Mutex mMutex MOZ_UNANNOTATED; + + /// The decoder that will generate our surface. Dropped after decoding. + RefPtr mDecoder; + + /// Our surface. Initially null until it's generated by the decoder. + RefPtr mSurface; + + /// A drawable reference to our service; used for locking. + DrawableFrameRef mLockRef; +}; + +} // namespace image +} // namespace mozilla + +#endif // mozilla_image_DecodedSurfaceProvider_h -- cgit v1.2.3