Changeset 295343 in webkit
- Timestamp:
- Jun 7, 2022, 6:43:49 AM (4 years ago)
- Location:
- trunk/Source
- Files:
-
- 14 edited
-
WebCore/platform/graphics/ConcreteImageBuffer.h (modified) (2 diffs)
-
WebCore/platform/graphics/ImageBuffer.cpp (modified) (2 diffs)
-
WebCore/platform/graphics/ImageBuffer.h (modified) (2 diffs)
-
WebCore/platform/graphics/ImageBufferBackend.cpp (modified) (1 diff)
-
WebCore/platform/graphics/ImageBufferBackend.h (modified) (1 diff)
-
WebCore/platform/graphics/cairo/ImageBufferCairoBackend.cpp (modified) (1 diff)
-
WebCore/platform/graphics/cairo/ImageBufferCairoBackend.h (modified) (1 diff)
-
WebCore/platform/graphics/cg/ImageBufferCGBackend.cpp (modified) (1 diff)
-
WebCore/platform/graphics/cg/ImageBufferCGBackend.h (modified) (1 diff)
-
WebKit/WebProcess/GPU/graphics/ImageBufferShareableBitmapBackend.cpp (modified) (1 diff)
-
WebKit/WebProcess/GPU/graphics/ImageBufferShareableBitmapBackend.h (modified) (1 diff)
-
WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h (modified) (2 diffs)
-
WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.cpp (modified) (1 diff)
-
WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h
r295149 r295343 141 141 } 142 142 143 RefPtr<Image> copyImage(BackingStoreCopy copyBehavior = CopyBackingStore, PreserveResolution preserveResolution = PreserveResolution::No) const override144 {145 if (auto* backend = ensureBackendCreated()) {146 const_cast<ConcreteImageBuffer&>(*this).flushDrawingContext();147 return backend->copyImage(copyBehavior, preserveResolution);148 }149 return nullptr;150 }151 152 143 RefPtr<Image> filteredImage(Filter& filter) override 153 144 { … … 198 189 flushDrawingContext(); 199 190 return backend->sinkIntoNativeImage(); 200 }201 return nullptr;202 }203 204 RefPtr<Image> sinkIntoImage(PreserveResolution preserveResolution = PreserveResolution::No) override205 {206 if (auto* backend = ensureBackendCreated()) {207 flushDrawingContext();208 return backend->sinkIntoImage(preserveResolution);209 191 } 210 192 return nullptr; -
trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp
r292557 r295343 29 29 #include "ImageBuffer.h" 30 30 31 #include "BitmapImage.h" 31 32 #include "GraphicsContext.h" 32 33 #include "HostWindow.h" … … 122 123 } 123 124 124 RefPtr<NativeImage> ImageBuffer::sinkIntoNativeImage(RefPtr<ImageBuffer> imageBuffer)125 RefPtr<NativeImage> ImageBuffer::sinkIntoNativeImage(RefPtr<ImageBuffer> source) 125 126 { 126 return imageBuffer->sinkIntoNativeImage(); 127 if (!source) 128 return nullptr; 129 return source->sinkIntoNativeImage(); 127 130 } 128 131 129 RefPtr<Image> ImageBuffer:: sinkIntoImage(RefPtr<ImageBuffer> imageBuffer, PreserveResolution preserveResolution)132 RefPtr<Image> ImageBuffer::copyImage(BackingStoreCopy copyBehavior, PreserveResolution preserveResolution) const 130 133 { 131 return imageBuffer->sinkIntoImage(preserveResolution); 134 RefPtr<NativeImage> image; 135 if (resolutionScale() == 1 || preserveResolution == PreserveResolution::Yes) 136 image = copyNativeImage(copyBehavior); 137 else { 138 auto copyBuffer = context().createImageBuffer(logicalSize(), 1.f, colorSpace()); 139 if (!copyBuffer) 140 return nullptr; 141 copyBuffer->context().drawImageBuffer(const_cast<ImageBuffer&>(*this), FloatPoint { }, CompositeOperator::Copy); 142 image = ImageBuffer::sinkIntoNativeImage(WTFMove(copyBuffer)); 143 } 144 if (!image) 145 return nullptr; 146 return BitmapImage::create(image.releaseNonNull()); 147 } 148 149 RefPtr<Image> ImageBuffer::sinkIntoImage(RefPtr<ImageBuffer> source, PreserveResolution preserveResolution) 150 { 151 if (!source) 152 return nullptr; 153 RefPtr<NativeImage> image; 154 if (source->resolutionScale() == 1 || preserveResolution == PreserveResolution::Yes) 155 image = sinkIntoNativeImage(WTFMove(source)); 156 else { 157 auto copySize = source->logicalSize(); 158 auto copyBuffer = source->context().createImageBuffer(copySize, 1.f, source->colorSpace()); 159 if (!copyBuffer) 160 return nullptr; 161 drawConsuming(WTFMove(source), copyBuffer->context(), FloatRect { { }, copySize }, FloatRect { 0, 0, -1, -1 }, CompositeOperator::Copy); 162 image = ImageBuffer::sinkIntoNativeImage(WTFMove(copyBuffer)); 163 } 164 if (!image) 165 return nullptr; 166 return BitmapImage::create(image.releaseNonNull()); 132 167 } 133 168 -
trunk/Source/WebCore/platform/graphics/ImageBuffer.h
r295149 r295343 128 128 129 129 virtual RefPtr<NativeImage> copyNativeImage(BackingStoreCopy = CopyBackingStore) const = 0; 130 virtual RefPtr<Image> copyImage(BackingStoreCopy = CopyBackingStore, PreserveResolution = PreserveResolution::No) const = 0;130 WEBCORE_EXPORT RefPtr<Image> copyImage(BackingStoreCopy = CopyBackingStore, PreserveResolution = PreserveResolution::No) const; 131 131 virtual RefPtr<Image> filteredImage(Filter&) = 0; 132 132 … … 163 163 164 164 virtual RefPtr<NativeImage> sinkIntoNativeImage() = 0; 165 virtual RefPtr<Image> sinkIntoImage(PreserveResolution = PreserveResolution::No) = 0;166 165 virtual void drawConsuming(GraphicsContext&, const FloatRect& destRect, const FloatRect& srcRect, const ImagePaintingOptions&) = 0; 167 166 }; -
trunk/Source/WebCore/platform/graphics/ImageBufferBackend.cpp
r295227 r295343 59 59 { 60 60 return copyNativeImage(DontCopyBackingStore); 61 }62 63 RefPtr<Image> ImageBufferBackend::sinkIntoImage(PreserveResolution preserveResolution)64 {65 return copyImage(DontCopyBackingStore, preserveResolution);66 61 } 67 62 -
trunk/Source/WebCore/platform/graphics/ImageBufferBackend.h
r295149 r295343 112 112 virtual void finalizeDrawIntoContext(GraphicsContext&) { } 113 113 virtual RefPtr<NativeImage> copyNativeImage(BackingStoreCopy) const = 0; 114 virtual RefPtr<Image> copyImage(BackingStoreCopy, PreserveResolution) const = 0;115 114 116 115 WEBCORE_EXPORT virtual RefPtr<NativeImage> sinkIntoNativeImage(); 117 WEBCORE_EXPORT virtual RefPtr<Image> sinkIntoImage(PreserveResolution);118 116 119 117 virtual void clipToMask(GraphicsContext&, const FloatRect&) { } -
trunk/Source/WebCore/platform/graphics/cairo/ImageBufferCairoBackend.cpp
r295216 r295343 45 45 46 46 namespace WebCore { 47 48 RefPtr<Image> ImageBufferCairoBackend::copyImage(BackingStoreCopy copyBehavior, PreserveResolution) const49 {50 // BitmapImage will release the passed in surface on destruction51 return BitmapImage::create(copyNativeImage(copyBehavior));52 }53 47 54 48 void ImageBufferCairoBackend::clipToMask(GraphicsContext& destContext, const FloatRect& destRect) -
trunk/Source/WebCore/platform/graphics/cairo/ImageBufferCairoBackend.h
r294536 r295343 38 38 class ImageBufferCairoBackend : public ImageBufferBackend { 39 39 public: 40 RefPtr<Image> copyImage(BackingStoreCopy = CopyBackingStore, PreserveResolution = PreserveResolution::No) const override;41 42 40 void clipToMask(GraphicsContext&, const FloatRect& destRect) override; 43 41 -
trunk/Source/WebCore/platform/graphics/cg/ImageBufferCGBackend.cpp
r295227 r295343 91 91 return sRGBColorSpaceRef(); 92 92 return imageBufferColorSpace.platformColorSpace(); 93 }94 95 static RefPtr<Image> createBitmapImageAfterScalingIfNeeded(RefPtr<NativeImage>&& image, const IntSize& logicalSize, const IntSize& backendSize, float resolutionScale, PreserveResolution preserveResolution)96 {97 if (!image)98 return nullptr;99 100 if (resolutionScale == 1 || preserveResolution == PreserveResolution::Yes)101 image = NativeImage::create(createCroppedImageIfNecessary(image->platformImage().get(), backendSize));102 else {103 auto context = adoptCF(CGBitmapContextCreate(0, logicalSize.width(), logicalSize.height(), 8, 4 * logicalSize.width(), colorSpaceForBitmap(image->colorSpace()), static_cast<uint32_t>(kCGImageAlphaPremultipliedFirst) | static_cast<uint32_t>(kCGBitmapByteOrder32Host)));104 CGContextSetBlendMode(context.get(), kCGBlendModeCopy);105 CGContextClipToRect(context.get(), FloatRect(FloatPoint::zero(), logicalSize));106 FloatSize imageSizeInUserSpace = logicalSize;107 CGContextDrawImage(context.get(), FloatRect(FloatPoint::zero(), imageSizeInUserSpace), image->platformImage().get());108 image = NativeImage::create(adoptCF(CGBitmapContextCreateImage(context.get())));109 }110 111 if (!image)112 return nullptr;113 114 return BitmapImage::create(WTFMove(image));115 }116 117 RefPtr<Image> ImageBufferCGBackend::copyImage(BackingStoreCopy copyBehavior, PreserveResolution preserveResolution) const118 {119 RefPtr<NativeImage> image;120 if (resolutionScale() == 1 || preserveResolution == PreserveResolution::Yes)121 image = copyNativeImage(copyBehavior);122 else123 image = copyNativeImage(DontCopyBackingStore);124 return createBitmapImageAfterScalingIfNeeded(WTFMove(image), logicalSize(), backendSize(), resolutionScale(), preserveResolution);125 }126 127 RefPtr<Image> ImageBufferCGBackend::sinkIntoImage(PreserveResolution preserveResolution)128 {129 // Get the backend size before sinking the it into a NativeImage. sinkIntoNativeImage() sets the IOSurface to null if it's an accelerated backend.130 auto backendSize = this->backendSize();131 return createBitmapImageAfterScalingIfNeeded(sinkIntoNativeImage(), logicalSize(), backendSize, resolutionScale(), preserveResolution);132 93 } 133 94 -
trunk/Source/WebCore/platform/graphics/cg/ImageBufferCGBackend.h
r294536 r295343 44 44 using ImageBufferBackend::ImageBufferBackend; 45 45 46 RefPtr<Image> copyImage(BackingStoreCopy = CopyBackingStore, PreserveResolution = PreserveResolution::No) const override;47 RefPtr<Image> sinkIntoImage(PreserveResolution) override;48 49 46 void clipToMask(GraphicsContext&, const FloatRect& destRect) override; 50 47 -
trunk/Source/WebKit/WebProcess/GPU/graphics/ImageBufferShareableBitmapBackend.cpp
r295149 r295343 154 154 } 155 155 156 RefPtr<Image> ImageBufferShareableBitmapBackend::copyImage(BackingStoreCopy, PreserveResolution) const157 {158 return m_bitmap->createImage();159 }160 161 156 RefPtr<PixelBuffer> ImageBufferShareableBitmapBackend::getPixelBuffer(const PixelBufferFormat& outputFormat, const IntRect& srcRect, const ImageBufferAllocator& allocator) const 162 157 { -
trunk/Source/WebKit/WebProcess/GPU/graphics/ImageBufferShareableBitmapBackend.h
r295149 r295343 64 64 65 65 RefPtr<WebCore::NativeImage> copyNativeImage(WebCore::BackingStoreCopy = WebCore::CopyBackingStore) const final; 66 RefPtr<WebCore::Image> copyImage(WebCore::BackingStoreCopy = WebCore::CopyBackingStore, WebCore::PreserveResolution = WebCore::PreserveResolution::No) const final;67 66 68 67 RefPtr<WebCore::PixelBuffer> getPixelBuffer(const WebCore::PixelBufferFormat& outputFormat, const WebCore::IntRect&, const WebCore::ImageBufferAllocator&) const final; -
trunk/Source/WebKit/WebProcess/GPU/graphics/RemoteImageBufferProxy.h
r295227 r295343 196 196 } 197 197 198 RefPtr<WebCore::Image> copyImage(WebCore::BackingStoreCopy copyBehavior = WebCore::CopyBackingStore, WebCore::PreserveResolution preserveResolution = WebCore::PreserveResolution::No) const final199 {200 if (UNLIKELY(!m_remoteRenderingBackendProxy))201 return { };202 203 if (canMapBackingStore())204 return BaseConcreteImageBuffer::copyImage(copyBehavior, preserveResolution);205 206 const_cast<RemoteImageBufferProxy*>(this)->flushDrawingContext();207 auto bitmap = m_remoteRenderingBackendProxy->getShareableBitmap(m_renderingResourceIdentifier, preserveResolution);208 if (!bitmap)209 return { };210 return bitmap->createImage();211 }212 213 198 void drawConsuming(WebCore::GraphicsContext& destContext, const WebCore::FloatRect& destRect, const WebCore::FloatRect& srcRect, const WebCore::ImagePaintingOptions& options) final 214 199 { … … 220 205 { 221 206 return copyNativeImage(); 222 }223 224 RefPtr<WebCore::Image> sinkIntoImage(WebCore::PreserveResolution preserveResolution = WebCore::PreserveResolution::No) final225 {226 return copyImage(WebCore::BackingStoreCopy::CopyBackingStore, preserveResolution);227 207 } 228 208 -
trunk/Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.cpp
r295149 r295343 113 113 } 114 114 115 RefPtr<Image> ImageBufferRemoteIOSurfaceBackend::copyImage(BackingStoreCopy, PreserveResolution) const116 {117 RELEASE_ASSERT_NOT_REACHED();118 return { };119 }120 121 115 String ImageBufferRemoteIOSurfaceBackend::toDataURL(const String&, std::optional<double>, PreserveResolution) const 122 116 { -
trunk/Source/WebKit/WebProcess/GPU/graphics/cocoa/ImageBufferRemoteIOSurfaceBackend.h
r295149 r295343 61 61 WebCore::IntSize backendSize() const final; 62 62 RefPtr<WebCore::NativeImage> copyNativeImage(WebCore::BackingStoreCopy) const final; 63 RefPtr<WebCore::Image> copyImage(WebCore::BackingStoreCopy, WebCore::PreserveResolution) const final;64 63 String toDataURL(const String& mimeType, std::optional<double> quality, WebCore::PreserveResolution) const final; 65 64 Vector<uint8_t> toData(const String& mimeType, std::optional<double> quality) const final;
Note:
See TracChangeset
for help on using the changeset viewer.