Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(307)

Unified Diff: third_party/WebKit/Source/core/frame/ImageBitmap.cpp

Issue 2182583002: Change implementation of resize ImageBitmap to meet specs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-resize.html ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/frame/ImageBitmap.cpp
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
index d614506a5ab4cdfd4d50a589b35002bd0e239507..a17c1ccfffdd8a6990a6191e00b3596035b4108f 100644
--- a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
+++ b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp
@@ -65,25 +65,25 @@ ParsedOptions parseOptions(const ImageBitmapOptions& options, Optional<IntRect>
int sourceWidth = sourceSize.width();
int sourceHeight = sourceSize.height();
+ if (!cropRect) {
+ parsedOptions.cropRect = IntRect(0, 0, sourceWidth, sourceHeight);
+ } else {
+ parsedOptions.cropRect = normalizeRect(*cropRect);
+ }
if (!options.hasResizeWidth() && !options.hasResizeHeight()) {
- parsedOptions.resizeWidth = sourceWidth;
- parsedOptions.resizeHeight = sourceHeight;
+ parsedOptions.resizeWidth = parsedOptions.cropRect.width();
+ parsedOptions.resizeHeight = parsedOptions.cropRect.height();
} else if (options.hasResizeWidth() && options.hasResizeHeight()) {
parsedOptions.resizeWidth = options.resizeWidth();
parsedOptions.resizeHeight = options.resizeHeight();
} else if (options.hasResizeWidth() && !options.hasResizeHeight()) {
parsedOptions.resizeWidth = options.resizeWidth();
- parsedOptions.resizeHeight = ceil(static_cast<float>(options.resizeWidth()) / sourceWidth * sourceHeight);
+ parsedOptions.resizeHeight = ceil(static_cast<float>(options.resizeWidth()) / parsedOptions.cropRect.width() * parsedOptions.cropRect.height());
} else {
parsedOptions.resizeHeight = options.resizeHeight();
- parsedOptions.resizeWidth = ceil(static_cast<float>(options.resizeHeight()) / sourceHeight * sourceWidth);
- }
- if (!cropRect) {
- parsedOptions.cropRect = IntRect(0, 0, parsedOptions.resizeWidth, parsedOptions.resizeHeight);
- } else {
- parsedOptions.cropRect = normalizeRect(*cropRect);
+ parsedOptions.resizeWidth = ceil(static_cast<float>(options.resizeHeight()) / parsedOptions.cropRect.height() * parsedOptions.cropRect.width());
}
- if (static_cast<int>(parsedOptions.resizeWidth) == sourceWidth && static_cast<int>(parsedOptions.resizeHeight) == sourceHeight) {
+ if (static_cast<int>(parsedOptions.resizeWidth) == parsedOptions.cropRect.width() && static_cast<int>(parsedOptions.resizeHeight) == parsedOptions.cropRect.height()) {
parsedOptions.shouldScaleInput = false;
return parsedOptions;
}
@@ -212,9 +212,9 @@ static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const ParsedOptions
// In the case when cropRect doesn't intersect the source image and it requires a umpremul image
// We immediately return a transparent black image with cropRect.size()
if (srcRect.isEmpty() && !parsedOptions.premultiplyAlpha) {
- SkImageInfo info = SkImageInfo::Make(parsedOptions.cropRect.width(), parsedOptions.cropRect.height(), kN32_SkColorType, kUnpremul_SkAlphaType);
- std::unique_ptr<uint8_t[]> dstPixels = wrapArrayUnique(new uint8_t[parsedOptions.cropRect.width() * parsedOptions.cropRect.height() * info.bytesPerPixel()]());
- return StaticBitmapImage::create(newSkImageFromRaster(info, std::move(dstPixels), parsedOptions.cropRect.width() * info.bytesPerPixel()));
+ SkImageInfo info = SkImageInfo::Make(parsedOptions.resizeWidth, parsedOptions.resizeHeight, kN32_SkColorType, kUnpremul_SkAlphaType);
+ std::unique_ptr<uint8_t[]> dstPixels = wrapArrayUnique(new uint8_t[info.width() * info.height() * info.bytesPerPixel()]());
+ return StaticBitmapImage::create(newSkImageFromRaster(info, std::move(dstPixels), info.width() * info.bytesPerPixel()));
}
RefPtr<SkImage> skiaImage = image->imageForCurrentFrame();
@@ -231,7 +231,7 @@ static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const ParsedOptions
return nullptr;
}
- if (parsedOptions.cropRect == srcRect) {
+ if (parsedOptions.cropRect == srcRect && !parsedOptions.shouldScaleInput) {
RefPtr<SkImage> croppedSkImage = fromSkSp(skiaImage->makeSubset(srcRect));
if (parsedOptions.flipY)
return StaticBitmapImage::create(flipSkImageVertically(croppedSkImage.get(), parsedOptions.premultiplyAlpha ? PremultiplyAlpha : DontPremultiplyAlpha));
@@ -243,7 +243,7 @@ static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const ParsedOptions
return StaticBitmapImage::create(croppedSkImage.release());
}
- sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(parsedOptions.cropRect.width(), parsedOptions.cropRect.height());
+ sk_sp<SkSurface> surface = SkSurface::MakeRasterN32Premul(parsedOptions.resizeWidth, parsedOptions.resizeHeight);
if (!surface)
return nullptr;
if (srcRect.isEmpty())
@@ -260,10 +260,11 @@ static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const ParsedOptions
surface->getCanvas()->scale(1, -1);
}
if (parsedOptions.shouldScaleInput) {
- SkRect drawDstRect = SkRect::MakeXYWH(dstLeft, dstTop, parsedOptions.resizeWidth, parsedOptions.resizeHeight);
+ SkRect drawSrcRect = SkRect::MakeXYWH(parsedOptions.cropRect.x(), parsedOptions.cropRect.y(), parsedOptions.cropRect.width(), parsedOptions.cropRect.height());
+ SkRect drawDstRect = SkRect::MakeXYWH(0, 0, parsedOptions.resizeWidth, parsedOptions.resizeHeight);
SkPaint paint;
paint.setFilterQuality(parsedOptions.resizeQuality);
- surface->getCanvas()->drawImageRect(skiaImage.get(), drawDstRect, &paint);
+ surface->getCanvas()->drawImageRect(skiaImage.get(), drawSrcRect, drawDstRect, &paint);
} else {
surface->getCanvas()->drawImage(skiaImage.get(), dstLeft, dstTop);
}
« no previous file with comments | « third_party/WebKit/LayoutTests/fast/canvas/canvas-createImageBitmap-resize.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698