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 16733ab689bd3d1167e15138c560bbaf4667f029..694ed0c58b08b296d90b7ee82202a9e2a2c93849 100644 |
--- a/third_party/WebKit/Source/core/frame/ImageBitmap.cpp |
+++ b/third_party/WebKit/Source/core/frame/ImageBitmap.cpp |
@@ -166,12 +166,14 @@ static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const IntRect& crop |
ImageBitmap::ImageBitmap(HTMLImageElement* image, const IntRect& cropRect, Document* document, const ImageBitmapOptions& options) |
{ |
bool flipY; |
- parseOptions(options, flipY); |
+ bool premultiplyAlpha; |
+ parseOptions(options, flipY, premultiplyAlpha); |
- m_image = cropImage(image->cachedImage()->getImage(), cropRect, flipY, m_isPremultiplied); |
+ m_image = cropImage(image->cachedImage()->getImage(), cropRect, flipY, premultiplyAlpha); |
if (!m_image) |
return; |
m_image->setOriginClean(!image->wouldTaintOrigin(document->getSecurityOrigin())); |
+ m_image->setPremultiplied(premultiplyAlpha); |
} |
ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect, Document* document, const ImageBitmapOptions& options) |
@@ -190,44 +192,49 @@ ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect, Docum |
video->paintCurrentFrame(buffer->canvas(), IntRect(dstPoint, srcRect.size()), nullptr); |
bool flipY; |
- parseOptions(options, flipY); |
+ bool premultiplyAlpha; |
+ parseOptions(options, flipY, premultiplyAlpha); |
- if (flipY || !m_isPremultiplied) { |
+ if (flipY || !premultiplyAlpha) { |
RefPtr<SkImage> skiaImage = buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown); |
if (flipY) |
skiaImage = flipSkImageVertically(skiaImage.get(), PremultiplyAlpha); |
- if (!m_isPremultiplied) |
+ if (!premultiplyAlpha) |
skiaImage = premulSkImageToUnPremul(skiaImage.get()); |
m_image = StaticBitmapImage::create(skiaImage.release()); |
} else { |
m_image = StaticBitmapImage::create(buffer->newSkImageSnapshot(PreferNoAcceleration, SnapshotReasonUnknown)); |
} |
m_image->setOriginClean(!video->wouldTaintOrigin(document->getSecurityOrigin())); |
+ m_image->setPremultiplied(premultiplyAlpha); |
} |
ImageBitmap::ImageBitmap(HTMLCanvasElement* canvas, const IntRect& cropRect, const ImageBitmapOptions& options) |
{ |
ASSERT(canvas->isPaintable()); |
bool flipY; |
- parseOptions(options, flipY); |
+ bool premultiplyAlpha; |
+ parseOptions(options, flipY, premultiplyAlpha); |
// canvas is always premultiplied, so set the last parameter to true and convert to un-premul later |
m_image = cropImage(canvas->copiedImage(BackBuffer, PreferAcceleration).get(), cropRect, flipY, true); |
if (!m_image) |
return; |
- if (!m_isPremultiplied) |
+ if (!premultiplyAlpha) |
m_image = StaticBitmapImage::create(premulSkImageToUnPremul(m_image->imageForCurrentFrame().get())); |
m_image->setOriginClean(canvas->originClean()); |
+ m_image->setPremultiplied(premultiplyAlpha); |
} |
ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect, const ImageBitmapOptions& options) |
{ |
bool flipY; |
- parseOptions(options, flipY); |
+ bool premultiplyAlpha; |
+ parseOptions(options, flipY, premultiplyAlpha); |
IntRect srcRect = intersection(cropRect, IntRect(IntPoint(), data->size())); |
// treat non-premultiplyAlpha as a special case |
- if (!m_isPremultiplied) { |
+ if (!premultiplyAlpha) { |
unsigned char* srcAddr = data->data()->data(); |
int srcHeight = data->size().height(); |
int dstHeight = cropRect.height(); |
@@ -272,6 +279,7 @@ ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect, const ImageBi |
} |
m_image = StaticBitmapImage::create(newSkImageFromRaster(info, copiedDataBuffer.release(), dstPixelBytesPerRow)); |
} |
+ m_image->setPremultiplied(premultiplyAlpha); |
return; |
} |
@@ -299,21 +307,25 @@ ImageBitmap::ImageBitmap(ImageData* data, const IntRect& cropRect, const ImageBi |
ImageBitmap::ImageBitmap(ImageBitmap* bitmap, const IntRect& cropRect, const ImageBitmapOptions& options) |
{ |
bool flipY; |
- parseOptions(options, flipY); |
- m_image = cropImage(bitmap->bitmapImage(), cropRect, flipY, m_isPremultiplied, bitmap->isPremultiplied() ? DontPremultiplyAlpha : PremultiplyAlpha); |
+ bool premultiplyAlpha; |
+ parseOptions(options, flipY, premultiplyAlpha); |
+ m_image = cropImage(bitmap->bitmapImage(), cropRect, flipY, premultiplyAlpha, bitmap->isPremultiplied() ? DontPremultiplyAlpha : PremultiplyAlpha); |
if (!m_image) |
return; |
m_image->setOriginClean(bitmap->originClean()); |
+ m_image->setPremultiplied(premultiplyAlpha); |
} |
ImageBitmap::ImageBitmap(PassRefPtr<StaticBitmapImage> image, const IntRect& cropRect, const ImageBitmapOptions& options) |
{ |
bool flipY; |
- parseOptions(options, flipY); |
- m_image = cropImage(image.get(), cropRect, flipY, m_isPremultiplied, PremultiplyAlpha); |
+ bool premultiplyAlpha; |
+ parseOptions(options, flipY, premultiplyAlpha); |
+ m_image = cropImage(image.get(), cropRect, flipY, premultiplyAlpha, PremultiplyAlpha); |
if (!m_image) |
return; |
m_image->setOriginClean(image->originClean()); |
+ m_image->setPremultiplied(premultiplyAlpha); |
} |
ImageBitmap::ImageBitmap(PassRefPtr<StaticBitmapImage> image) |
@@ -421,7 +433,7 @@ ScriptPromise ImageBitmap::createImageBitmap(ScriptState* scriptState, EventTarg |
return ImageBitmapSource::fulfillImageBitmap(scriptState, create(this, IntRect(sx, sy, sw, sh), options)); |
} |
-void ImageBitmap::parseOptions(const ImageBitmapOptions& options, bool& flipY) |
+void ImageBitmap::parseOptions(const ImageBitmapOptions& options, bool& flipY, bool& premultiplyAlpha) |
{ |
if (options.imageOrientation() == imageOrientationFlipY) { |
flipY = true; |
@@ -430,8 +442,9 @@ void ImageBitmap::parseOptions(const ImageBitmapOptions& options, bool& flipY) |
ASSERT(options.imageOrientation() == imageBitmapOptionNone); |
} |
if (options.premultiplyAlpha() == imageBitmapOptionNone) { |
- m_isPremultiplied = false; |
+ premultiplyAlpha = false; |
} else { |
+ premultiplyAlpha = true; |
ASSERT(options.premultiplyAlpha() == "default" || options.premultiplyAlpha() == "premultiply"); |
} |
} |