ImageBufferShareableBitmapBackend.cpp [plain text]
#include "config.h"
#include "ImageBufferShareableBitmapBackend.h"
#if ENABLE(GPU_PROCESS)
#include "ShareableBitmap.h"
#include <WebCore/GraphicsContext.h>
#include <WebCore/ImageData.h>
#include <wtf/IsoMallocInlines.h>
#include <wtf/StdLibExtras.h>
#if PLATFORM(COCOA)
#include <WebCore/GraphicsContextCG.h>
#endif
namespace WebKit {
using namespace WebCore;
WTF_MAKE_ISO_ALLOCATED_IMPL(ImageBufferShareableBitmapBackend);
std::unique_ptr<ImageBufferShareableBitmapBackend> ImageBufferShareableBitmapBackend::create(const Parameters& parameters, const HostWindow*)
{
ASSERT(parameters.pixelFormat == PixelFormat::BGRA8);
IntSize backendSize = calculateBackendSize(parameters.logicalSize, parameters.resolutionScale);
if (backendSize.isEmpty())
return nullptr;
ShareableBitmap::Configuration configuration;
#if PLATFORM(COCOA)
configuration.colorSpace = { cachedCGColorSpace(parameters.colorSpace) };
#endif
auto bitmap = ShareableBitmap::createShareable(backendSize, configuration);
if (!bitmap)
return nullptr;
auto context = bitmap->createGraphicsContext();
if (!context)
return nullptr;
return makeUnique<ImageBufferShareableBitmapBackend>(parameters, WTFMove(bitmap), WTFMove(context));
}
std::unique_ptr<ImageBufferShareableBitmapBackend> ImageBufferShareableBitmapBackend::create(const Parameters& parameters, ImageBufferBackendHandle handle)
{
if (!WTF::holds_alternative<ShareableBitmap::Handle>(handle)) {
ASSERT_NOT_REACHED();
return nullptr;
}
auto bitmap = ShareableBitmap::create(WTFMove(WTF::get<ShareableBitmap::Handle>(handle)));
if (!bitmap)
return nullptr;
auto context = bitmap->createGraphicsContext();
if (!context)
return nullptr;
return makeUnique<ImageBufferShareableBitmapBackend>(parameters, WTFMove(bitmap), WTFMove(context));
}
ImageBufferShareableBitmapBackend::ImageBufferShareableBitmapBackend(const Parameters& parameters, RefPtr<ShareableBitmap>&& bitmap, std::unique_ptr<GraphicsContext>&& context)
: PlatformImageBufferBackend(parameters)
, m_bitmap(WTFMove(bitmap))
, m_context(WTFMove(context))
{
}
ImageBufferBackendHandle ImageBufferShareableBitmapBackend::createImageBufferBackendHandle() const
{
ShareableBitmap::Handle handle;
m_bitmap->createHandle(handle);
return ImageBufferBackendHandle(WTFMove(handle));
}
IntSize ImageBufferShareableBitmapBackend::backendSize() const
{
return m_bitmap->size();
}
RefPtr<NativeImage> ImageBufferShareableBitmapBackend::copyNativeImage(BackingStoreCopy) const
{
return NativeImage::create(m_bitmap->createPlatformImage());
}
RefPtr<Image> ImageBufferShareableBitmapBackend::copyImage(BackingStoreCopy, PreserveResolution) const
{
return m_bitmap->createImage();
}
Vector<uint8_t> ImageBufferShareableBitmapBackend::toBGRAData() const
{
return ImageBufferBackend::toBGRAData(m_bitmap->data());
}
RefPtr<ImageData> ImageBufferShareableBitmapBackend::getImageData(AlphaPremultiplication outputFormat, const IntRect& srcRect) const
{
return ImageBufferBackend::getImageData(outputFormat, srcRect, m_bitmap->data());
}
void ImageBufferShareableBitmapBackend::putImageData(AlphaPremultiplication inputFormat, const ImageData& imageData, const IntRect& srcRect, const IntPoint& destPoint, WebCore::AlphaPremultiplication destFormat)
{
ImageBufferBackend::putImageData(inputFormat, imageData, srcRect, destPoint, destFormat, m_bitmap->data());
}
}
#endif // ENABLE(GPU_PROCESS)