gecko-dev/image/SourceSurfaceBlobImage.h
Sandor Molnar f5bbecdcc2 Backed out 13 changesets (bug 1711061) on devs request. CLOSED TREE
Backed out changeset c4f073f7e3a3 (bug 1711061)
Backed out changeset aced4b672fb4 (bug 1711061)
Backed out changeset 3687e798f665 (bug 1711061)
Backed out changeset 7b471990ea86 (bug 1711061)
Backed out changeset 1014a95f540e (bug 1711061)
Backed out changeset a37b3091281d (bug 1711061)
Backed out changeset 96a0ef35881b (bug 1711061)
Backed out changeset 38890cc266fb (bug 1711061)
Backed out changeset be73004c0850 (bug 1711061)
Backed out changeset b964576ae53d (bug 1711061)
Backed out changeset d453c5219255 (bug 1711061)
Backed out changeset 0145b538175b (bug 1711061)
Backed out changeset 41ba2e2a2d13 (bug 1711061)
2021-10-29 00:36:30 +03:00

133 lines
4.5 KiB
C++

/* -*- 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_SOURCESURFACEBLOBIMAGE_H_
#define MOZILLA_IMAGE_SOURCESURFACEBLOBIMAGE_H_
#include "mozilla/Maybe.h"
#include "mozilla/SVGImageContext.h"
#include "mozilla/gfx/2D.h"
#include "mozilla/layers/WebRenderLayerManager.h"
#include "ImageRegion.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;
/**
* This class is used to wrap blob recordings stored in ImageContainers, used
* by SVG images. Unlike rasterized images stored in SourceSurfaceSharedData,
* each SourceSurfaceBlobImage can only be used by one WebRenderLayerManager
* because the recording is tied to a particular instance.
*/
class SourceSurfaceBlobImage final : public gfx::SourceSurface {
public:
MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(SourceSurfaceBlobImage, override)
SourceSurfaceBlobImage(SVGDocumentWrapper* aSVGDocumentWrapper,
const Maybe<SVGImageContext>& aSVGContext,
const Maybe<ImageIntRegion>& aRegion,
const gfx::IntSize& aSize, uint32_t aWhichFrame,
uint32_t aImageFlags);
Maybe<wr::BlobImageKey> UpdateKey(layers::WebRenderLayerManager* aManager,
wr::IpcResourceUpdateQueue& aResources);
void MarkDirty();
gfx::SurfaceType GetType() const override {
return gfx::SurfaceType::BLOB_IMAGE;
}
gfx::IntSize GetSize() const override { return mSize; }
gfx::SurfaceFormat GetFormat() const override {
return gfx::SurfaceFormat::OS_RGBA;
}
already_AddRefed<gfx::DataSourceSurface> GetDataSurface() override {
return nullptr;
}
void SizeOfExcludingThis(MallocSizeOf aMallocSizeOf,
SizeOfInfo& aInfo) const override {
aInfo.AddType(gfx::SurfaceType::BLOB_IMAGE);
aInfo.mHeapBytes += mKeys.ShallowSizeOfExcludingThis(aMallocSizeOf);
}
private:
~SourceSurfaceBlobImage() 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;
Maybe<SVGImageContext> mSVGContext;
Maybe<ImageIntRegion> mRegion;
gfx::IntSize mSize;
uint32_t mWhichFrame;
uint32_t mImageFlags;
};
} // namespace image
} // namespace mozilla
#endif /* MOZILLA_IMAGE_SOURCESURFACEBLOBIMAGE_H_ */