| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/frame/ImageBitmap.h" | 5 #include "core/frame/ImageBitmap.h" |
| 6 | 6 |
| 7 #include "core/html/HTMLCanvasElement.h" | 7 #include "core/html/HTMLCanvasElement.h" |
| 8 #include "core/html/HTMLVideoElement.h" | 8 #include "core/html/HTMLVideoElement.h" |
| 9 #include "core/html/ImageData.h" | 9 #include "core/html/ImageData.h" |
| 10 #include "platform/image-decoders/ImageDecoder.h" | 10 #include "platform/image-decoders/ImageDecoder.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 return newSkImageFromRaster(info, imagePixels.release(), imageRowBytes); | 82 return newSkImageFromRaster(info, imagePixels.release(), imageRowBytes); |
| 83 } | 83 } |
| 84 | 84 |
| 85 static PassRefPtr<SkImage> premulSkImageToUnPremul(SkImage* input) | 85 static PassRefPtr<SkImage> premulSkImageToUnPremul(SkImage* input) |
| 86 { | 86 { |
| 87 SkImageInfo info = SkImageInfo::Make(input->width(), input->height(), kN32_S
kColorType, kUnpremul_SkAlphaType); | 87 SkImageInfo info = SkImageInfo::Make(input->width(), input->height(), kN32_S
kColorType, kUnpremul_SkAlphaType); |
| 88 OwnPtr<uint8_t[]> dstPixels = copySkImageData(input, info); | 88 OwnPtr<uint8_t[]> dstPixels = copySkImageData(input, info); |
| 89 return newSkImageFromRaster(info, dstPixels.release(), input->width() * info
.bytesPerPixel()); | 89 return newSkImageFromRaster(info, dstPixels.release(), input->width() * info
.bytesPerPixel()); |
| 90 } | 90 } |
| 91 | 91 |
| 92 PassRefPtr<SkImage> ImageBitmap::getSkImageFromDecoder(PassOwnPtr<ImageDecoder>
decoder) |
| 93 { |
| 94 if (!decoder->frameCount()) |
| 95 return nullptr; |
| 96 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 97 if (!frame || frame->status() != ImageFrame::FrameComplete) |
| 98 return nullptr; |
| 99 SkBitmap bitmap = frame->bitmap(); |
| 100 if (!frameIsValid(bitmap)) |
| 101 return nullptr; |
| 102 return adoptRef(SkImage::NewFromBitmap(bitmap)); |
| 103 } |
| 104 |
| 92 static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const IntRect& crop
Rect, bool flipY, bool premultiplyAlpha, bool isBitmapPremultiplied = true) | 105 static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const IntRect& crop
Rect, bool flipY, bool premultiplyAlpha, bool isBitmapPremultiplied = true) |
| 93 { | 106 { |
| 94 ASSERT(image); | 107 ASSERT(image); |
| 95 | 108 |
| 96 IntRect imgRect(IntPoint(), IntSize(image->width(), image->height())); | 109 IntRect imgRect(IntPoint(), IntSize(image->width(), image->height())); |
| 97 const IntRect srcRect = intersection(imgRect, cropRect); | 110 const IntRect srcRect = intersection(imgRect, cropRect); |
| 98 | 111 |
| 99 // In the case when cropRect doesn't intersect the source image and it requi
res a umpremul image | 112 // In the case when cropRect doesn't intersect the source image and it requi
res a umpremul image |
| 100 // We immediately return a transparent black image with cropRect.size() | 113 // We immediately return a transparent black image with cropRect.size() |
| 101 if (srcRect.isEmpty() && !premultiplyAlpha) { | 114 if (srcRect.isEmpty() && !premultiplyAlpha) { |
| 102 SkImageInfo info = SkImageInfo::Make(cropRect.width(), cropRect.height()
, kN32_SkColorType, kUnpremul_SkAlphaType); | 115 SkImageInfo info = SkImageInfo::Make(cropRect.width(), cropRect.height()
, kN32_SkColorType, kUnpremul_SkAlphaType); |
| 103 OwnPtr<uint8_t[]> dstPixels = adoptArrayPtr(new uint8_t[cropRect.width()
* cropRect.height() * info.bytesPerPixel()]()); | 116 OwnPtr<uint8_t[]> dstPixels = adoptArrayPtr(new uint8_t[cropRect.width()
* cropRect.height() * info.bytesPerPixel()]()); |
| 104 return StaticBitmapImage::create(newSkImageFromRaster(info, dstPixels.re
lease(), cropRect.width() * info.bytesPerPixel())); | 117 return StaticBitmapImage::create(newSkImageFromRaster(info, dstPixels.re
lease(), cropRect.width() * info.bytesPerPixel())); |
| 105 } | 118 } |
| 106 | 119 |
| 107 RefPtr<SkImage> skiaImage = image->imageForCurrentFrame(); | 120 RefPtr<SkImage> skiaImage = image->imageForCurrentFrame(); |
| 108 // Attempt to get raw unpremultiplied image data, executed only when skiaIma
ge is premultiplied. | 121 // Attempt to get raw unpremultiplied image data, executed only when skiaIma
ge is premultiplied. |
| 109 if (((!premultiplyAlpha && !skiaImage->isOpaque()) || !skiaImage) && image->
data() && isBitmapPremultiplied) { | 122 if (((!premultiplyAlpha && !skiaImage->isOpaque()) || !skiaImage) && image->
data() && isBitmapPremultiplied) { |
| 110 // TODO(xidachen): GammaAndColorProfileApplied needs to be changed when
working on color-space conversion | 123 // TODO(xidachen): GammaAndColorProfileApplied needs to be changed when
working on color-space conversion |
| 111 OwnPtr<ImageDecoder> decoder(ImageDecoder::create( | 124 OwnPtr<ImageDecoder> decoder(ImageDecoder::create( |
| 112 *(image->data()), ImageDecoder::AlphaNotPremultiplied, | 125 *(image->data()), ImageDecoder::AlphaNotPremultiplied, |
| 113 ImageDecoder::GammaAndColorProfileApplied)); | 126 ImageDecoder::GammaAndColorProfileApplied)); |
| 114 if (!decoder) | 127 if (!decoder) |
| 115 return nullptr; | 128 return nullptr; |
| 116 decoder->setData(image->data(), true); | 129 decoder->setData(image->data(), true); |
| 117 if (!decoder->frameCount()) | 130 skiaImage = ImageBitmap::getSkImageFromDecoder(decoder.release()); |
| 131 if (!skiaImage) |
| 118 return nullptr; | 132 return nullptr; |
| 119 ImageFrame* frame = decoder->frameBufferAtIndex(0); | |
| 120 if (!frame || frame->status() != ImageFrame::FrameComplete) | |
| 121 return nullptr; | |
| 122 SkBitmap bitmap = frame->bitmap(); | |
| 123 if (!frameIsValid(bitmap)) | |
| 124 return nullptr; | |
| 125 skiaImage = adoptRef(SkImage::NewFromBitmap(bitmap)); | |
| 126 } | 133 } |
| 127 | 134 |
| 128 if (cropRect == srcRect) { | 135 if (cropRect == srcRect) { |
| 129 if (flipY) | 136 if (flipY) |
| 130 return StaticBitmapImage::create(flipSkImageVertically(skiaImage->ne
wSubset(srcRect))); | 137 return StaticBitmapImage::create(flipSkImageVertically(skiaImage->ne
wSubset(srcRect))); |
| 131 return StaticBitmapImage::create(adoptRef(skiaImage->newSubset(srcRect))
); | 138 return StaticBitmapImage::create(adoptRef(skiaImage->newSubset(srcRect))
); |
| 132 } | 139 } |
| 133 | 140 |
| 134 RefPtr<SkSurface> surface = adoptRef(SkSurface::NewRasterN32Premul(cropRect.
width(), cropRect.height())); | 141 RefPtr<SkSurface> surface = adoptRef(SkSurface::NewRasterN32Premul(cropRect.
width(), cropRect.height())); |
| 135 if (!surface) | 142 if (!surface) |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 FloatSize ImageBitmap::elementSize() const | 446 FloatSize ImageBitmap::elementSize() const |
| 440 { | 447 { |
| 441 return FloatSize(width(), height()); | 448 return FloatSize(width(), height()); |
| 442 } | 449 } |
| 443 | 450 |
| 444 DEFINE_TRACE(ImageBitmap) | 451 DEFINE_TRACE(ImageBitmap) |
| 445 { | 452 { |
| 446 } | 453 } |
| 447 | 454 |
| 448 } // namespace blink | 455 } // namespace blink |
| OLD | NEW |