summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc390
1 files changed, 189 insertions, 201 deletions
diff --git a/chromium/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc b/chromium/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
index badef2c51ad..234ae964ad1 100644
--- a/chromium/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
+++ b/chromium/third_party/blink/renderer/core/imagebitmap/image_bitmap.cc
@@ -11,6 +11,7 @@
#include "base/numerics/checked_math.h"
#include "base/numerics/clamped_math.h"
#include "base/single_thread_task_runner.h"
+#include "gpu/command_buffer/client/shared_image_interface.h"
#include "third_party/blink/renderer/core/dom/dom_exception.h"
#include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h"
#include "third_party/blink/renderer/core/html/canvas/image_data.h"
@@ -21,6 +22,7 @@
#include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h"
#include "third_party/blink/renderer/platform/graphics/skia/skia_utils.h"
#include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h"
+#include "third_party/blink/renderer/platform/heap/heap.h"
#include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
#include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h"
@@ -49,15 +51,6 @@ constexpr const char* kRec2020ImageBitmapColorSpaceConversion = "rec2020";
namespace {
-scoped_refptr<StaticBitmapImage> CreateImage(
- sk_sp<SkImage> skia_image,
- base::WeakPtr<WebGraphicsContext3DProviderWrapper> context) {
- if (skia_image->isTextureBacked()) {
- return AcceleratedStaticBitmapImage::CreateFromSkImage(skia_image, context);
- }
- return UnacceleratedStaticBitmapImage::Create(skia_image);
-}
-
// The following two functions are helpers used in cropImage
static inline IntRect NormalizeRect(const IntRect& rect) {
int x = rect.X();
@@ -194,7 +187,7 @@ bool DstBufferSizeHasOverflow(const ImageBitmap::ParsedOptions& options) {
return false;
}
-SkImageInfo GetSkImageInfo(const scoped_refptr<StaticBitmapImage>& input) {
+SkImageInfo GetSkImageInfo(const scoped_refptr<Image>& input) {
auto image = input->PaintImageForCurrentFrame().GetSkImage();
return SkImageInfo::Make(image->width(), image->height(), image->colorType(),
image->alphaType(), image->refColorSpace());
@@ -235,10 +228,40 @@ static inline bool ShouldAvoidPremul(
return options.source_is_unpremul && !options.premultiply_alpha;
}
+std::unique_ptr<CanvasResourceProvider> CreateProvider(
+ base::WeakPtr<WebGraphicsContext3DProviderWrapper> context_provider,
+ const SkImageInfo& info,
+ const scoped_refptr<StaticBitmapImage>& source_image,
+ bool fallback_to_software) {
+ IntSize size(info.width(), info.height());
+ CanvasColorParams color_params(info);
+
+ if (context_provider) {
+ uint32_t usage_flags =
+ context_provider->ContextProvider()
+ ->SharedImageInterface()
+ ->UsageForMailbox(source_image->GetMailboxHolder().mailbox);
+ auto resource_provider = CanvasResourceProvider::CreateSharedImageProvider(
+ size, context_provider, kLow_SkFilterQuality, color_params,
+ source_image->IsOriginTopLeft(),
+ CanvasResourceProvider::RasterMode::kGPU, usage_flags);
+ if (resource_provider)
+ return resource_provider;
+
+ if (!fallback_to_software)
+ return nullptr;
+ }
+
+ return CanvasResourceProvider::CreateBitmapProvider(
+ size, kLow_SkFilterQuality, color_params);
+}
+
scoped_refptr<StaticBitmapImage> FlipImageVertically(
scoped_refptr<StaticBitmapImage> input,
const ImageBitmap::ParsedOptions& parsed_options) {
sk_sp<SkImage> image = input->PaintImageForCurrentFrame().GetSkImage();
+ if (!image)
+ return nullptr;
if (ShouldAvoidPremul(parsed_options)) {
// Unpremul code path results in a GPU readback if |input| is texture
@@ -271,34 +294,29 @@ scoped_refptr<StaticBitmapImage> FlipImageVertically(
&writable_pixels[top_last_element],
&writable_pixels[bottom_first_element]);
}
- return StaticBitmapImage::Create(std::move(image_pixels), info);
+ return StaticBitmapImage::Create(std::move(image_pixels), info,
+ input->CurrentFrameOrientation());
}
// Since we are allowed to premul the input image if needed, we can use Skia
// to flip the image by drawing it on a surface. If the image is premul, we
// can use both accelerated and software surfaces. If the image is unpremul,
// we have to use software surfaces.
- sk_sp<SkSurface> surface = nullptr;
- if (image->isTextureBacked() && image->alphaType() == kPremul_SkAlphaType) {
- GrContext* context =
- input->ContextProviderWrapper()->ContextProvider()->GetGrContext();
- if (context) {
- surface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo,
- GetSkImageInfo(input));
- }
- }
- if (!surface)
- surface = SkSurface::MakeRaster(GetSkImageInfo(input));
- if (!surface)
+ bool use_accelerated =
+ image->isTextureBacked() && image->alphaType() == kPremul_SkAlphaType;
+ auto resource_provider = CreateProvider(
+ use_accelerated ? input->ContextProviderWrapper() : nullptr,
+ GetSkImageInfo(input), input, true /* fallback_to_software */);
+ if (!resource_provider)
return nullptr;
- SkCanvas* canvas = surface->getCanvas();
+
+ auto* canvas = resource_provider->Canvas();
canvas->scale(1, -1);
canvas->translate(0, -input->height());
- SkPaint paint;
+ cc::PaintFlags paint;
paint.setBlendMode(SkBlendMode::kSrc);
- canvas->drawImage(image.get(), 0, 0, &paint);
- return CreateImage(surface->makeImageSnapshot(),
- input->ContextProviderWrapper());
+ canvas->drawImage(input->PaintImageForCurrentFrame(), 0, 0, &paint);
+ return resource_provider->Snapshot(input->CurrentFrameOrientation());
}
scoped_refptr<StaticBitmapImage> GetImageWithAlphaDisposition(
@@ -318,22 +336,17 @@ scoped_refptr<StaticBitmapImage> GetImageWithAlphaDisposition(
// To premul, draw the unpremul image on a surface to avoid GPU read back if
// image is texture backed.
if (alpha_type == kPremul_SkAlphaType) {
- sk_sp<SkSurface> surface = nullptr;
- if (image->IsTextureBacked()) {
- GrContext* context =
- image->ContextProviderWrapper()->ContextProvider()->GetGrContext();
- if (context)
- surface = SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, info);
- }
- if (!surface)
- surface = SkSurface::MakeRaster(info);
- if (!surface)
+ auto resource_provider = CreateProvider(
+ image->IsTextureBacked() ? image->ContextProviderWrapper() : nullptr,
+ info, image, true /* fallback_to_software */);
+ if (!resource_provider)
return nullptr;
- SkPaint paint;
+
+ cc::PaintFlags paint;
paint.setBlendMode(SkBlendMode::kSrc);
- surface->getCanvas()->drawImage(skia_image.get(), 0, 0, &paint);
- return CreateImage(surface->makeImageSnapshot(),
- image->ContextProviderWrapper());
+ resource_provider->Canvas()->drawImage(image->PaintImageForCurrentFrame(),
+ 0, 0, &paint);
+ return resource_provider->Snapshot(image->CurrentFrameOrientation());
}
// To unpremul, read back the pixels.
@@ -350,7 +363,8 @@ scoped_refptr<StaticBitmapImage> GetImageWithAlphaDisposition(
bool read_successful =
skia_image->readPixels(info, writable_pixels, image_row_bytes, 0, 0);
DCHECK(read_successful);
- return StaticBitmapImage::Create(std::move(dst_pixels), info);
+ return StaticBitmapImage::Create(std::move(dst_pixels), info,
+ image->CurrentFrameOrientation());
}
scoped_refptr<StaticBitmapImage> ScaleImage(
@@ -359,64 +373,62 @@ scoped_refptr<StaticBitmapImage> ScaleImage(
auto sk_image = image->PaintImageForCurrentFrame().GetSkImage();
auto image_info = GetSkImageInfo(image).makeWH(parsed_options.resize_width,
parsed_options.resize_height);
- sk_sp<SkSurface> surface = nullptr;
- sk_sp<SkImage> resized_sk_image = nullptr;
// Try to avoid GPU read back by drawing accelerated premul image on an
// accelerated surface.
if (!ShouldAvoidPremul(parsed_options) && image->IsTextureBacked() &&
sk_image->alphaType() == kPremul_SkAlphaType) {
- GrContext* context =
- image->ContextProviderWrapper()->ContextProvider()->GetGrContext();
- if (context) {
- surface =
- SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, image_info);
- }
- if (surface) {
- SkPaint paint;
+ auto resource_provider =
+ CreateProvider(image->ContextProviderWrapper(), image_info, image,
+ false /* fallback_to_software */);
+ if (resource_provider) {
+ cc::PaintFlags paint;
paint.setFilterQuality(parsed_options.resize_quality);
- surface->getCanvas()->drawImageRect(
- sk_image.get(),
+ resource_provider->Canvas()->drawImageRect(
+ image->PaintImageForCurrentFrame(),
+ SkRect::MakeWH(sk_image->width(), sk_image->height()),
SkRect::MakeWH(parsed_options.resize_width,
parsed_options.resize_height),
- &paint);
- resized_sk_image = surface->makeImageSnapshot();
+ &paint, cc::PaintCanvas::kStrict_SrcRectConstraint);
+ return resource_provider->Snapshot(image->CurrentFrameOrientation());
}
}
- if (!surface) {
- // Avoid sRGB transfer function by setting the color space to nullptr.
- if (image_info.colorSpace()->isSRGB())
- image_info = image_info.makeColorSpace(nullptr);
-
- sk_sp<SkData> image_pixels =
- TryAllocateSkData(image_info.computeMinByteSize());
- if (!image_pixels) {
- return nullptr;
- }
+ // Avoid sRGB transfer function by setting the color space to nullptr.
+ if (image_info.colorSpace()->isSRGB())
+ image_info = image_info.makeColorSpace(nullptr);
- SkPixmap resized_pixmap(image_info, image_pixels->data(),
- image_info.minRowBytes());
- sk_image->scalePixels(resized_pixmap, parsed_options.resize_quality);
- // Tag the resized Pixmap with the correct color space.
- resized_pixmap.setColorSpace(GetSkImageInfo(image).refColorSpace());
-
- resized_sk_image =
- SkImage::MakeRasterData(resized_pixmap.info(), std::move(image_pixels),
- resized_pixmap.rowBytes());
+ sk_sp<SkData> image_pixels =
+ TryAllocateSkData(image_info.computeMinByteSize());
+ if (!image_pixels) {
+ return nullptr;
}
+ SkPixmap resized_pixmap(image_info, image_pixels->data(),
+ image_info.minRowBytes());
+ sk_image->scalePixels(resized_pixmap, parsed_options.resize_quality);
+ // Tag the resized Pixmap with the correct color space.
+ resized_pixmap.setColorSpace(GetSkImageInfo(image).refColorSpace());
+
+ auto resized_sk_image =
+ SkImage::MakeRasterData(resized_pixmap.info(), std::move(image_pixels),
+ resized_pixmap.rowBytes());
if (!resized_sk_image)
return nullptr;
- return CreateImage(resized_sk_image, image->ContextProviderWrapper());
+ return UnacceleratedStaticBitmapImage::Create(
+ resized_sk_image, image->CurrentFrameOrientation());
}
scoped_refptr<StaticBitmapImage> ApplyColorSpaceConversion(
scoped_refptr<StaticBitmapImage>&& image,
ImageBitmap::ParsedOptions& options) {
sk_sp<SkColorSpace> color_space = options.color_params.GetSkColorSpace();
- SkColorType color_type = kN32_SkColorType;
+ SkColorType color_type =
+ image->IsTextureBacked() ? kRGBA_8888_SkColorType : kN32_SkColorType;
sk_sp<SkImage> sk_image = image->PaintImageForCurrentFrame().GetSkImage();
+ if (!sk_image)
+ return nullptr;
+
// If we should preserve color precision, don't lose it in color space
// conversion.
if (options.pixel_format == kImageBitmapPixelFormat_Default &&
@@ -466,9 +478,11 @@ scoped_refptr<StaticBitmapImage> GetImageWithPixelFormat(
}
static scoped_refptr<StaticBitmapImage> CropImageAndApplyColorSpaceConversion(
- scoped_refptr<Image>&& image,
+ scoped_refptr<StaticBitmapImage>&& image,
ImageBitmap::ParsedOptions& parsed_options) {
DCHECK(image);
+ DCHECK(!image->Data());
+
IntRect img_rect(IntPoint(), IntSize(image->width(), image->height()));
const IntRect src_rect = Intersection(img_rect, parsed_options.crop_rect);
@@ -477,44 +491,34 @@ static scoped_refptr<StaticBitmapImage> CropImageAndApplyColorSpaceConversion(
if (src_rect.IsEmpty())
return MakeBlankImage(parsed_options);
- sk_sp<SkImage> skia_image = image->PaintImageForCurrentFrame().GetSkImage();
- // Attempt to get raw unpremultiplied image data, executed only when
- // skia_image is premultiplied.
- if (!skia_image->isOpaque() && image->Data() &&
- skia_image->alphaType() == kPremul_SkAlphaType) {
- const bool data_complete = true;
- std::unique_ptr<ImageDecoder> decoder(ImageDecoder::Create(
- image->Data(), data_complete,
- parsed_options.premultiply_alpha ? ImageDecoder::kAlphaPremultiplied
- : ImageDecoder::kAlphaNotPremultiplied,
- ImageDecoder::kDefaultBitDepth,
- parsed_options.has_color_space_conversion ? ColorBehavior::Tag()
- : ColorBehavior::Ignore()));
- if (!decoder)
- return nullptr;
- skia_image = ImageBitmap::GetSkImageFromDecoder(std::move(decoder));
- if (!skia_image)
- return nullptr;
-
- // In the case where the source image is lazy-decoded, image_ may not be in
- // a decoded state, we trigger it here.
- SkPixmap pixmap;
- if (!skia_image->isTextureBacked() && !skia_image->peekPixels(&pixmap)) {
- sk_sp<SkSurface> surface = SkSurface::MakeRaster(
- GetSkImageInfo(UnacceleratedStaticBitmapImage::Create(skia_image)));
- SkPaint paint;
- paint.setBlendMode(SkBlendMode::kSrc);
- surface->getCanvas()->drawImage(skia_image.get(), 0, 0, &paint);
- skia_image = surface->makeImageSnapshot();
+ scoped_refptr<StaticBitmapImage> result = image;
+ if (src_rect != img_rect) {
+ auto paint_image = result->PaintImageForCurrentFrame();
+ if (result->IsTextureBacked()) {
+ auto image_info = paint_image.GetSkImage()->imageInfo().makeWH(
+ src_rect.Width(), src_rect.Height());
+ auto resource_provider =
+ CreateProvider(image->ContextProviderWrapper(), image_info, result,
+ true /* fallback_to_software*/);
+ if (!resource_provider)
+ return nullptr;
+ cc::PaintFlags paint;
+ resource_provider->Canvas()->drawImageRect(
+ paint_image,
+ SkRect::MakeXYWH(src_rect.X(), src_rect.Y(), src_rect.Width(),
+ src_rect.Height()),
+ SkRect::MakeWH(src_rect.Width(), src_rect.Height()), &paint,
+ cc::PaintCanvas::kStrict_SrcRectConstraint);
+ result = resource_provider->Snapshot(image->CurrentFrameOrientation());
+ } else {
+ result = UnacceleratedStaticBitmapImage::Create(
+ cc::PaintImageBuilder::WithCopy(std::move(paint_image))
+ .make_subset(src_rect)
+ .TakePaintImage(),
+ image->CurrentFrameOrientation());
}
}
- if (src_rect != img_rect)
- skia_image = skia_image->makeSubset(src_rect);
-
- scoped_refptr<StaticBitmapImage> result =
- CreateImage(skia_image, image->ContextProviderWrapper());
-
// down-scaling has higher priority than other tasks, up-scaling has lower.
bool down_scaling =
parsed_options.should_scale_input &&
@@ -581,6 +585,8 @@ ImageBitmap::ImageBitmap(ImageElementBase* image,
Document* document,
const ImageBitmapOptions* options) {
scoped_refptr<Image> input = image->CachedImage()->GetImage();
+ DCHECK(!input->IsTextureBacked());
+
ParsedOptions parsed_options =
ParseOptions(options, crop_rect, image->BitmapSourceSize());
parsed_options.source_is_unpremul =
@@ -589,8 +595,55 @@ ImageBitmap::ImageBitmap(ImageElementBase* image,
if (DstBufferSizeHasOverflow(parsed_options))
return;
- image_ =
- CropImageAndApplyColorSpaceConversion(std::move(input), parsed_options);
+ cc::PaintImage paint_image = input->PaintImageForCurrentFrame();
+ if (!paint_image)
+ return;
+
+ DCHECK(!paint_image.IsTextureBacked());
+ if (input->IsBitmapImage()) {
+ // A BitmapImage indicates that this is a coded backed image.
+ if (!input->Data())
+ return;
+
+ DCHECK(paint_image.IsLazyGenerated());
+ const bool data_complete = true;
+ std::unique_ptr<ImageDecoder> decoder(ImageDecoder::Create(
+ input->Data(), data_complete,
+ parsed_options.premultiply_alpha ? ImageDecoder::kAlphaPremultiplied
+ : ImageDecoder::kAlphaNotPremultiplied,
+ ImageDecoder::kDefaultBitDepth,
+ parsed_options.has_color_space_conversion ? ColorBehavior::Tag()
+ : ColorBehavior::Ignore(),
+ ImageDecoder::OverrideAllowDecodeToYuv::kDeny));
+ auto skia_image = ImageBitmap::GetSkImageFromDecoder(std::move(decoder));
+ if (!skia_image)
+ return;
+
+ paint_image = PaintImageBuilder::WithDefault()
+ .set_id(paint_image.stable_id())
+ .set_image(std::move(skia_image),
+ paint_image.GetContentIdForFrame(0u))
+ .TakePaintImage();
+ } else if (paint_image.IsLazyGenerated()) {
+ // Other Image types can still produce lazy generated images (for example
+ // SVGs).
+ SkBitmap bitmap;
+ SkImageInfo image_info = GetSkImageInfo(input);
+ bitmap.allocPixels(image_info, image_info.minRowBytes());
+ if (!paint_image.GetSkImage()->readPixels(bitmap.pixmap(), 0, 0))
+ return;
+
+ paint_image = PaintImageBuilder::WithDefault()
+ .set_id(paint_image.stable_id())
+ .set_image(SkImage::MakeFromBitmap(bitmap),
+ paint_image.GetContentIdForFrame(0u))
+ .TakePaintImage();
+ }
+
+ auto static_input = UnacceleratedStaticBitmapImage::Create(
+ std::move(paint_image), input->CurrentFrameOrientation());
+ image_ = CropImageAndApplyColorSpaceConversion(std::move(static_input),
+ parsed_options);
if (!image_)
return;
@@ -609,16 +662,11 @@ ImageBitmap::ImageBitmap(HTMLVideoElement* video,
// TODO(fserb): this shouldn't be software?
std::unique_ptr<CanvasResourceProvider> resource_provider =
- CanvasResourceProvider::Create(
+ CanvasResourceProvider::CreateBitmapProvider(
IntSize(video->videoWidth(), video->videoHeight()),
- CanvasResourceProvider::ResourceUsage::kSoftwareResourceUsage,
- nullptr, // context_provider_wrapper
- 0, // msaa_sample_count
kLow_SkFilterQuality,
- CanvasColorParams(), // TODO: set color space here to avoid clamping
- CanvasResourceProvider::kDefaultPresentationMode,
- nullptr, // canvas_resource_dispatcher
- IsAccelerated()); // is_origin_top_left
+ CanvasColorParams()); // TODO: set color space here to avoid clamping
+
if (!resource_provider)
return;
@@ -627,7 +675,8 @@ ImageBitmap::ImageBitmap(HTMLVideoElement* video,
IntRect(IntPoint(), IntSize(video->videoWidth(), video->videoHeight())),
nullptr);
scoped_refptr<StaticBitmapImage> input = resource_provider->Snapshot();
- image_ = CropImageAndApplyColorSpaceConversion(input, parsed_options);
+ image_ =
+ CropImageAndApplyColorSpaceConversion(std::move(input), parsed_options);
if (!image_)
return;
@@ -643,7 +692,7 @@ ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas,
&status, kPreferAcceleration, FloatSize());
if (status != kNormalSourceImageStatus)
return;
- DCHECK(image_input->IsStaticBitmapImage());
+ DCHECK(IsA<StaticBitmapImage>(image_input.get()));
scoped_refptr<StaticBitmapImage> input =
static_cast<StaticBitmapImage*>(image_input.get());
@@ -667,7 +716,7 @@ ImageBitmap::ImageBitmap(OffscreenCanvas* offscreen_canvas,
SourceImageStatus status;
scoped_refptr<Image> raw_input = offscreen_canvas->GetSourceImageForCanvas(
&status, kPreferNoAcceleration, FloatSize(offscreen_canvas->Size()));
- DCHECK(raw_input->IsStaticBitmapImage());
+ DCHECK(IsA<StaticBitmapImage>(raw_input.get()));
scoped_refptr<StaticBitmapImage> input =
static_cast<StaticBitmapImage*>(raw_input.get());
raw_input = nullptr;
@@ -870,67 +919,6 @@ ImageBitmap::~ImageBitmap() {
-memory_usage_);
}
-ImageBitmap* ImageBitmap::Create(ImageElementBase* image,
- base::Optional<IntRect> crop_rect,
- Document* document,
- const ImageBitmapOptions* options) {
- return MakeGarbageCollected<ImageBitmap>(image, crop_rect, document, options);
-}
-
-ImageBitmap* ImageBitmap::Create(HTMLVideoElement* video,
- base::Optional<IntRect> crop_rect,
- Document* document,
- const ImageBitmapOptions* options) {
- return MakeGarbageCollected<ImageBitmap>(video, crop_rect, document, options);
-}
-
-ImageBitmap* ImageBitmap::Create(HTMLCanvasElement* canvas,
- base::Optional<IntRect> crop_rect,
- const ImageBitmapOptions* options) {
- return MakeGarbageCollected<ImageBitmap>(canvas, crop_rect, options);
-}
-
-ImageBitmap* ImageBitmap::Create(OffscreenCanvas* offscreen_canvas,
- base::Optional<IntRect> crop_rect,
- const ImageBitmapOptions* options) {
- return MakeGarbageCollected<ImageBitmap>(offscreen_canvas, crop_rect,
- options);
-}
-
-ImageBitmap* ImageBitmap::Create(ImageData* data,
- base::Optional<IntRect> crop_rect,
- const ImageBitmapOptions* options) {
- return MakeGarbageCollected<ImageBitmap>(data, crop_rect, options);
-}
-
-ImageBitmap* ImageBitmap::Create(ImageBitmap* bitmap,
- base::Optional<IntRect> crop_rect,
- const ImageBitmapOptions* options) {
- return MakeGarbageCollected<ImageBitmap>(bitmap, crop_rect, options);
-}
-
-ImageBitmap* ImageBitmap::Create(scoped_refptr<StaticBitmapImage> image,
- base::Optional<IntRect> crop_rect,
- const ImageBitmapOptions* options) {
- return MakeGarbageCollected<ImageBitmap>(std::move(image), crop_rect,
- options);
-}
-
-ImageBitmap* ImageBitmap::Create(scoped_refptr<StaticBitmapImage> image) {
- return MakeGarbageCollected<ImageBitmap>(std::move(image));
-}
-
-ImageBitmap* ImageBitmap::Create(const void* pixel_data,
- uint32_t width,
- uint32_t height,
- bool is_image_bitmap_premultiplied,
- bool is_image_bitmap_origin_clean,
- const CanvasColorParams& color_params) {
- return MakeGarbageCollected<ImageBitmap>(
- pixel_data, width, height, is_image_bitmap_premultiplied,
- is_image_bitmap_origin_clean, color_params);
-}
-
void ImageBitmap::ResolvePromiseOnOriginalThread(
ScriptPromiseResolver* resolver,
bool origin_clean,
@@ -1052,7 +1040,7 @@ void ImageBitmap::close() {
// static
ImageBitmap* ImageBitmap::Take(ScriptPromiseResolver*, sk_sp<SkImage> image) {
- return ImageBitmap::Create(
+ return MakeGarbageCollected<ImageBitmap>(
UnacceleratedStaticBitmapImage::Create(std::move(image)));
}
@@ -1094,7 +1082,7 @@ unsigned ImageBitmap::height() const {
}
bool ImageBitmap::IsAccelerated() const {
- return image_ && (image_->IsTextureBacked() || image_->HasMailbox());
+ return image_ && image_->IsTextureBacked();
}
IntSize ImageBitmap::Size() const {
@@ -1105,13 +1093,14 @@ IntSize ImageBitmap::Size() const {
return IntSize(image_->width(), image_->height());
}
-ScriptPromise ImageBitmap::CreateImageBitmap(
- ScriptState* script_state,
- EventTarget& event_target,
- base::Optional<IntRect> crop_rect,
- const ImageBitmapOptions* options) {
+ScriptPromise ImageBitmap::CreateImageBitmap(ScriptState* script_state,
+ EventTarget& event_target,
+ base::Optional<IntRect> crop_rect,
+ const ImageBitmapOptions* options,
+ ExceptionState& exception_state) {
return ImageBitmapSource::FulfillImageBitmap(
- script_state, Create(this, crop_rect, options));
+ script_state, MakeGarbageCollected<ImageBitmap>(this, crop_rect, options),
+ exception_state);
}
scoped_refptr<Image> ImageBitmap::GetSourceImageForCanvas(
@@ -1128,11 +1117,10 @@ scoped_refptr<Image> ImageBitmap::GetSourceImageForCanvas(
return GetImageWithAlphaDisposition(std::move(image_), kPremultiplyAlpha);
}
-void ImageBitmap::AdjustDrawRects(FloatRect* src_rect,
- FloatRect* dst_rect) const {}
-
-FloatSize ImageBitmap::ElementSize(const FloatSize&) const {
- return FloatSize(width(), height());
+FloatSize ImageBitmap::ElementSize(
+ const FloatSize&,
+ const RespectImageOrientationEnum respect_orientation) const {
+ return FloatSize(image_->Size(respect_orientation));
}
} // namespace blink