| 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/graphics/skia/SkiaUtils.h" | 10 #include "platform/graphics/skia/SkiaUtils.h" |
| 11 #include "platform/image-decoders/ImageDecoder.h" | 11 #include "platform/image-decoders/ImageDecoder.h" |
| 12 #include "third_party/skia/include/core/SkCanvas.h" | 12 #include "third_party/skia/include/core/SkCanvas.h" |
| 13 #include "third_party/skia/include/core/SkSurface.h" | 13 #include "third_party/skia/include/core/SkSurface.h" |
| 14 #include "wtf/PtrUtil.h" | |
| 15 #include "wtf/RefPtr.h" | 14 #include "wtf/RefPtr.h" |
| 16 #include <memory> | |
| 17 | 15 |
| 18 namespace blink { | 16 namespace blink { |
| 19 | 17 |
| 20 static const char* imageOrientationFlipY = "flipY"; | 18 static const char* imageOrientationFlipY = "flipY"; |
| 21 static const char* imageBitmapOptionNone = "none"; | 19 static const char* imageBitmapOptionNone = "none"; |
| 22 | 20 |
| 23 // The following two functions are helpers used in cropImage | 21 // The following two functions are helpers used in cropImage |
| 24 static inline IntRect normalizeRect(const IntRect& rect) | 22 static inline IntRect normalizeRect(const IntRect& rect) |
| 25 { | 23 { |
| 26 return IntRect(std::min(rect.x(), rect.maxX()), | 24 return IntRect(std::min(rect.x(), rect.maxX()), |
| 27 std::min(rect.y(), rect.maxY()), | 25 std::min(rect.y(), rect.maxY()), |
| 28 std::max(rect.width(), -rect.width()), | 26 std::max(rect.width(), -rect.width()), |
| 29 std::max(rect.height(), -rect.height())); | 27 std::max(rect.height(), -rect.height())); |
| 30 } | 28 } |
| 31 | 29 |
| 32 static bool frameIsValid(const SkBitmap& frameBitmap) | 30 static bool frameIsValid(const SkBitmap& frameBitmap) |
| 33 { | 31 { |
| 34 ASSERT(!frameBitmap.isNull() && !frameBitmap.empty() && frameBitmap.isImmuta
ble()); | 32 ASSERT(!frameBitmap.isNull() && !frameBitmap.empty() && frameBitmap.isImmuta
ble()); |
| 35 return frameBitmap.colorType() == kN32_SkColorType; | 33 return frameBitmap.colorType() == kN32_SkColorType; |
| 36 } | 34 } |
| 37 | 35 |
| 38 static std::unique_ptr<uint8_t[]> copySkImageData(SkImage* input, const SkImageI
nfo& info) | 36 static PassOwnPtr<uint8_t[]> copySkImageData(SkImage* input, const SkImageInfo&
info) |
| 39 { | 37 { |
| 40 std::unique_ptr<uint8_t[]> dstPixels = wrapArrayUnique(new uint8_t[input->wi
dth() * input->height() * info.bytesPerPixel()]); | 38 OwnPtr<uint8_t[]> dstPixels = adoptArrayPtr(new uint8_t[input->width() * inp
ut->height() * info.bytesPerPixel()]); |
| 41 input->readPixels(info, dstPixels.get(), input->width() * info.bytesPerPixel
(), 0, 0); | 39 input->readPixels(info, dstPixels.get(), input->width() * info.bytesPerPixel
(), 0, 0); |
| 42 return dstPixels; | 40 return dstPixels; |
| 43 } | 41 } |
| 44 | 42 |
| 45 static PassRefPtr<SkImage> newSkImageFromRaster(const SkImageInfo& info, std::un
ique_ptr<uint8_t[]> imagePixels, int imageRowBytes) | 43 static PassRefPtr<SkImage> newSkImageFromRaster(const SkImageInfo& info, PassOwn
Ptr<uint8_t[]> imagePixels, int imageRowBytes) |
| 46 { | 44 { |
| 47 return fromSkSp(SkImage::MakeFromRaster(SkPixmap(info, imagePixels.release()
, imageRowBytes), | 45 return fromSkSp(SkImage::MakeFromRaster(SkPixmap(info, imagePixels.leakPtr()
, imageRowBytes), |
| 48 [](const void* pixels, void*) | 46 [](const void* pixels, void*) |
| 49 { | 47 { |
| 50 delete[] static_cast<const uint8_t*>(pixels); | 48 delete[] static_cast<const uint8_t*>(pixels); |
| 51 }, nullptr)); | 49 }, nullptr)); |
| 52 } | 50 } |
| 53 | 51 |
| 54 static void swizzleImageData(unsigned char* srcAddr, int height, int bytesPerRow
, bool flipY) | 52 static void swizzleImageData(unsigned char* srcAddr, int height, int bytesPerRow
, bool flipY) |
| 55 { | 53 { |
| 56 if (flipY) { | 54 if (flipY) { |
| 57 for (int i = 0; i < height / 2; i++) { | 55 for (int i = 0; i < height / 2; i++) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 69 std::swap(srcAddr[i], srcAddr[i + 2]); | 67 std::swap(srcAddr[i], srcAddr[i + 2]); |
| 70 } | 68 } |
| 71 } | 69 } |
| 72 | 70 |
| 73 static PassRefPtr<SkImage> flipSkImageVertically(SkImage* input, AlphaDispositio
n alphaOp) | 71 static PassRefPtr<SkImage> flipSkImageVertically(SkImage* input, AlphaDispositio
n alphaOp) |
| 74 { | 72 { |
| 75 int width = input->width(); | 73 int width = input->width(); |
| 76 int height = input->height(); | 74 int height = input->height(); |
| 77 SkImageInfo info = SkImageInfo::MakeN32(width, height, (alphaOp == Premultip
lyAlpha) ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); | 75 SkImageInfo info = SkImageInfo::MakeN32(width, height, (alphaOp == Premultip
lyAlpha) ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); |
| 78 int imageRowBytes = width * info.bytesPerPixel(); | 76 int imageRowBytes = width * info.bytesPerPixel(); |
| 79 std::unique_ptr<uint8_t[]> imagePixels = copySkImageData(input, info); | 77 OwnPtr<uint8_t[]> imagePixels = copySkImageData(input, info); |
| 80 for (int i = 0; i < height / 2; i++) { | 78 for (int i = 0; i < height / 2; i++) { |
| 81 int topFirstElement = i * imageRowBytes; | 79 int topFirstElement = i * imageRowBytes; |
| 82 int topLastElement = (i + 1) * imageRowBytes; | 80 int topLastElement = (i + 1) * imageRowBytes; |
| 83 int bottomFirstElement = (height - 1 - i) * imageRowBytes; | 81 int bottomFirstElement = (height - 1 - i) * imageRowBytes; |
| 84 std::swap_ranges(imagePixels.get() + topFirstElement, imagePixels.get()
+ topLastElement, imagePixels.get() + bottomFirstElement); | 82 std::swap_ranges(imagePixels.get() + topFirstElement, imagePixels.get()
+ topLastElement, imagePixels.get() + bottomFirstElement); |
| 85 } | 83 } |
| 86 return newSkImageFromRaster(info, std::move(imagePixels), imageRowBytes); | 84 return newSkImageFromRaster(info, std::move(imagePixels), imageRowBytes); |
| 87 } | 85 } |
| 88 | 86 |
| 89 static PassRefPtr<SkImage> premulSkImageToUnPremul(SkImage* input) | 87 static PassRefPtr<SkImage> premulSkImageToUnPremul(SkImage* input) |
| 90 { | 88 { |
| 91 SkImageInfo info = SkImageInfo::Make(input->width(), input->height(), kN32_S
kColorType, kUnpremul_SkAlphaType); | 89 SkImageInfo info = SkImageInfo::Make(input->width(), input->height(), kN32_S
kColorType, kUnpremul_SkAlphaType); |
| 92 std::unique_ptr<uint8_t[]> dstPixels = copySkImageData(input, info); | 90 OwnPtr<uint8_t[]> dstPixels = copySkImageData(input, info); |
| 93 return newSkImageFromRaster(info, std::move(dstPixels), input->width() * inf
o.bytesPerPixel()); | 91 return newSkImageFromRaster(info, std::move(dstPixels), input->width() * inf
o.bytesPerPixel()); |
| 94 } | 92 } |
| 95 | 93 |
| 96 static PassRefPtr<SkImage> unPremulSkImageToPremul(SkImage* input) | 94 static PassRefPtr<SkImage> unPremulSkImageToPremul(SkImage* input) |
| 97 { | 95 { |
| 98 SkImageInfo info = SkImageInfo::Make(input->width(), input->height(), kN32_S
kColorType, kPremul_SkAlphaType); | 96 SkImageInfo info = SkImageInfo::Make(input->width(), input->height(), kN32_S
kColorType, kPremul_SkAlphaType); |
| 99 std::unique_ptr<uint8_t[]> dstPixels = copySkImageData(input, info); | 97 OwnPtr<uint8_t[]> dstPixels = copySkImageData(input, info); |
| 100 return newSkImageFromRaster(info, std::move(dstPixels), input->width() * inf
o.bytesPerPixel()); | 98 return newSkImageFromRaster(info, std::move(dstPixels), input->width() * inf
o.bytesPerPixel()); |
| 101 } | 99 } |
| 102 | 100 |
| 103 PassRefPtr<SkImage> ImageBitmap::getSkImageFromDecoder(std::unique_ptr<ImageDeco
der> decoder) | 101 PassRefPtr<SkImage> ImageBitmap::getSkImageFromDecoder(PassOwnPtr<ImageDecoder>
decoder) |
| 104 { | 102 { |
| 105 if (!decoder->frameCount()) | 103 if (!decoder->frameCount()) |
| 106 return nullptr; | 104 return nullptr; |
| 107 ImageFrame* frame = decoder->frameBufferAtIndex(0); | 105 ImageFrame* frame = decoder->frameBufferAtIndex(0); |
| 108 if (!frame || frame->getStatus() != ImageFrame::FrameComplete) | 106 if (!frame || frame->getStatus() != ImageFrame::FrameComplete) |
| 109 return nullptr; | 107 return nullptr; |
| 110 SkBitmap bitmap = frame->bitmap(); | 108 SkBitmap bitmap = frame->bitmap(); |
| 111 if (!frameIsValid(bitmap)) | 109 if (!frameIsValid(bitmap)) |
| 112 return nullptr; | 110 return nullptr; |
| 113 return fromSkSp(SkImage::MakeFromBitmap(bitmap)); | 111 return fromSkSp(SkImage::MakeFromBitmap(bitmap)); |
| 114 } | 112 } |
| 115 | 113 |
| 116 // The parameter imageFormat indicates whether the first parameter "image" is un
premultiplied or not. | 114 // The parameter imageFormat indicates whether the first parameter "image" is un
premultiplied or not. |
| 117 // imageFormat = PremultiplyAlpha means the image is in premuliplied format | 115 // imageFormat = PremultiplyAlpha means the image is in premuliplied format |
| 118 // For example, if the image is already in unpremultiplied format and we want th
e created ImageBitmap | 116 // For example, if the image is already in unpremultiplied format and we want th
e created ImageBitmap |
| 119 // in the same format, then we don't need to use the ImageDecoder to decode the
image. | 117 // in the same format, then we don't need to use the ImageDecoder to decode the
image. |
| 120 static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const IntRect& crop
Rect, bool flipY, bool premultiplyAlpha, AlphaDisposition imageFormat = Premulti
plyAlpha, ImageDecoder::GammaAndColorProfileOption colorSpaceOp = ImageDecoder::
GammaAndColorProfileApplied) | 118 static PassRefPtr<StaticBitmapImage> cropImage(Image* image, const IntRect& crop
Rect, bool flipY, bool premultiplyAlpha, AlphaDisposition imageFormat = Premulti
plyAlpha, ImageDecoder::GammaAndColorProfileOption colorSpaceOp = ImageDecoder::
GammaAndColorProfileApplied) |
| 121 { | 119 { |
| 122 ASSERT(image); | 120 ASSERT(image); |
| 123 | 121 |
| 124 IntRect imgRect(IntPoint(), IntSize(image->width(), image->height())); | 122 IntRect imgRect(IntPoint(), IntSize(image->width(), image->height())); |
| 125 const IntRect srcRect = intersection(imgRect, cropRect); | 123 const IntRect srcRect = intersection(imgRect, cropRect); |
| 126 | 124 |
| 127 // In the case when cropRect doesn't intersect the source image and it requi
res a umpremul image | 125 // In the case when cropRect doesn't intersect the source image and it requi
res a umpremul image |
| 128 // We immediately return a transparent black image with cropRect.size() | 126 // We immediately return a transparent black image with cropRect.size() |
| 129 if (srcRect.isEmpty() && !premultiplyAlpha) { | 127 if (srcRect.isEmpty() && !premultiplyAlpha) { |
| 130 SkImageInfo info = SkImageInfo::Make(cropRect.width(), cropRect.height()
, kN32_SkColorType, kUnpremul_SkAlphaType); | 128 SkImageInfo info = SkImageInfo::Make(cropRect.width(), cropRect.height()
, kN32_SkColorType, kUnpremul_SkAlphaType); |
| 131 std::unique_ptr<uint8_t[]> dstPixels = wrapArrayUnique(new uint8_t[cropR
ect.width() * cropRect.height() * info.bytesPerPixel()]()); | 129 OwnPtr<uint8_t[]> dstPixels = adoptArrayPtr(new uint8_t[cropRect.width()
* cropRect.height() * info.bytesPerPixel()]()); |
| 132 return StaticBitmapImage::create(newSkImageFromRaster(info, std::move(ds
tPixels), cropRect.width() * info.bytesPerPixel())); | 130 return StaticBitmapImage::create(newSkImageFromRaster(info, std::move(ds
tPixels), cropRect.width() * info.bytesPerPixel())); |
| 133 } | 131 } |
| 134 | 132 |
| 135 RefPtr<SkImage> skiaImage = image->imageForCurrentFrame(); | 133 RefPtr<SkImage> skiaImage = image->imageForCurrentFrame(); |
| 136 // Attempt to get raw unpremultiplied image data, executed only when skiaIma
ge is premultiplied. | 134 // Attempt to get raw unpremultiplied image data, executed only when skiaIma
ge is premultiplied. |
| 137 if ((((!premultiplyAlpha && !skiaImage->isOpaque()) || !skiaImage) && image-
>data() && imageFormat == PremultiplyAlpha) || colorSpaceOp == ImageDecoder::Gam
maAndColorProfileIgnored) { | 135 if ((((!premultiplyAlpha && !skiaImage->isOpaque()) || !skiaImage) && image-
>data() && imageFormat == PremultiplyAlpha) || colorSpaceOp == ImageDecoder::Gam
maAndColorProfileIgnored) { |
| 138 std::unique_ptr<ImageDecoder> decoder(ImageDecoder::create(*(image->data
()), | 136 OwnPtr<ImageDecoder> decoder(ImageDecoder::create(*(image->data()), |
| 139 premultiplyAlpha ? ImageDecoder::AlphaPremultiplied : ImageDecoder::
AlphaNotPremultiplied, | 137 premultiplyAlpha ? ImageDecoder::AlphaPremultiplied : ImageDecoder::
AlphaNotPremultiplied, |
| 140 colorSpaceOp)); | 138 colorSpaceOp)); |
| 141 if (!decoder) | 139 if (!decoder) |
| 142 return nullptr; | 140 return nullptr; |
| 143 decoder->setData(image->data(), true); | 141 decoder->setData(image->data(), true); |
| 144 skiaImage = ImageBitmap::getSkImageFromDecoder(std::move(decoder)); | 142 skiaImage = ImageBitmap::getSkImageFromDecoder(std::move(decoder)); |
| 145 if (!skiaImage) | 143 if (!skiaImage) |
| 146 return nullptr; | 144 return nullptr; |
| 147 } | 145 } |
| 148 | 146 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 } | 207 } |
| 210 | 208 |
| 211 ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect, Docum
ent* document, const ImageBitmapOptions& options) | 209 ImageBitmap::ImageBitmap(HTMLVideoElement* video, const IntRect& cropRect, Docum
ent* document, const ImageBitmapOptions& options) |
| 212 { | 210 { |
| 213 IntSize playerSize; | 211 IntSize playerSize; |
| 214 if (video->webMediaPlayer()) | 212 if (video->webMediaPlayer()) |
| 215 playerSize = video->webMediaPlayer()->naturalSize(); | 213 playerSize = video->webMediaPlayer()->naturalSize(); |
| 216 | 214 |
| 217 IntRect videoRect = IntRect(IntPoint(), playerSize); | 215 IntRect videoRect = IntRect(IntPoint(), playerSize); |
| 218 IntRect srcRect = intersection(cropRect, videoRect); | 216 IntRect srcRect = intersection(cropRect, videoRect); |
| 219 std::unique_ptr<ImageBuffer> buffer = ImageBuffer::create(cropRect.size(), N
onOpaque, DoNotInitializeImagePixels); | 217 OwnPtr<ImageBuffer> buffer = ImageBuffer::create(cropRect.size(), NonOpaque,
DoNotInitializeImagePixels); |
| 220 if (!buffer) | 218 if (!buffer) |
| 221 return; | 219 return; |
| 222 | 220 |
| 223 IntPoint dstPoint = IntPoint(std::max(0, -cropRect.x()), std::max(0, -cropRe
ct.y())); | 221 IntPoint dstPoint = IntPoint(std::max(0, -cropRect.x()), std::max(0, -cropRe
ct.y())); |
| 224 video->paintCurrentFrame(buffer->canvas(), IntRect(dstPoint, srcRect.size())
, nullptr); | 222 video->paintCurrentFrame(buffer->canvas(), IntRect(dstPoint, srcRect.size())
, nullptr); |
| 225 | 223 |
| 226 bool flipY; | 224 bool flipY; |
| 227 bool premultiplyAlpha; | 225 bool premultiplyAlpha; |
| 228 parseOptions(options, flipY, premultiplyAlpha); | 226 parseOptions(options, flipY, premultiplyAlpha); |
| 229 | 227 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 else | 276 else |
| 279 info = SkImageInfo::Make(cropRect.width(), dstHeight, kBGRA_8888_SkC
olorType, kPremul_SkAlphaType); | 277 info = SkImageInfo::Make(cropRect.width(), dstHeight, kBGRA_8888_SkC
olorType, kPremul_SkAlphaType); |
| 280 int srcPixelBytesPerRow = info.bytesPerPixel() * data->size().width(); | 278 int srcPixelBytesPerRow = info.bytesPerPixel() * data->size().width(); |
| 281 int dstPixelBytesPerRow = info.bytesPerPixel() * cropRect.width(); | 279 int dstPixelBytesPerRow = info.bytesPerPixel() * cropRect.width(); |
| 282 if (cropRect == IntRect(IntPoint(), data->size())) { | 280 if (cropRect == IntRect(IntPoint(), data->size())) { |
| 283 swizzleImageData(srcAddr, srcHeight, srcPixelBytesPerRow, flipY); | 281 swizzleImageData(srcAddr, srcHeight, srcPixelBytesPerRow, flipY); |
| 284 m_image = StaticBitmapImage::create(fromSkSp(SkImage::MakeRasterCopy
(SkPixmap(info, srcAddr, dstPixelBytesPerRow)))); | 282 m_image = StaticBitmapImage::create(fromSkSp(SkImage::MakeRasterCopy
(SkPixmap(info, srcAddr, dstPixelBytesPerRow)))); |
| 285 // restore the original ImageData | 283 // restore the original ImageData |
| 286 swizzleImageData(srcAddr, srcHeight, srcPixelBytesPerRow, flipY); | 284 swizzleImageData(srcAddr, srcHeight, srcPixelBytesPerRow, flipY); |
| 287 } else { | 285 } else { |
| 288 std::unique_ptr<uint8_t[]> copiedDataBuffer = wrapArrayUnique(new ui
nt8_t[dstHeight * dstPixelBytesPerRow]()); | 286 OwnPtr<uint8_t[]> copiedDataBuffer = adoptArrayPtr(new uint8_t[dstHe
ight * dstPixelBytesPerRow]()); |
| 289 if (!srcRect.isEmpty()) { | 287 if (!srcRect.isEmpty()) { |
| 290 IntPoint srcPoint = IntPoint((cropRect.x() > 0) ? cropRect.x() :
0, (cropRect.y() > 0) ? cropRect.y() : 0); | 288 IntPoint srcPoint = IntPoint((cropRect.x() > 0) ? cropRect.x() :
0, (cropRect.y() > 0) ? cropRect.y() : 0); |
| 291 IntPoint dstPoint = IntPoint((cropRect.x() >= 0) ? 0 : -cropRect
.x(), (cropRect.y() >= 0) ? 0 : -cropRect.y()); | 289 IntPoint dstPoint = IntPoint((cropRect.x() >= 0) ? 0 : -cropRect
.x(), (cropRect.y() >= 0) ? 0 : -cropRect.y()); |
| 292 int copyHeight = srcHeight - srcPoint.y(); | 290 int copyHeight = srcHeight - srcPoint.y(); |
| 293 if (cropRect.height() < copyHeight) | 291 if (cropRect.height() < copyHeight) |
| 294 copyHeight = cropRect.height(); | 292 copyHeight = cropRect.height(); |
| 295 int copyWidth = data->size().width() - srcPoint.x(); | 293 int copyWidth = data->size().width() - srcPoint.x(); |
| 296 if (cropRect.width() < copyWidth) | 294 if (cropRect.width() < copyWidth) |
| 297 copyWidth = cropRect.width(); | 295 copyWidth = cropRect.width(); |
| 298 for (int i = 0; i < copyHeight; i++) { | 296 for (int i = 0; i < copyHeight; i++) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 312 copiedDataBuffer[dstStartCopyPosition + j] = srcAddr
[srcStartCopyPosition + j]; | 310 copiedDataBuffer[dstStartCopyPosition + j] = srcAddr
[srcStartCopyPosition + j]; |
| 313 } | 311 } |
| 314 } | 312 } |
| 315 } | 313 } |
| 316 m_image = StaticBitmapImage::create(newSkImageFromRaster(info, std::
move(copiedDataBuffer), dstPixelBytesPerRow)); | 314 m_image = StaticBitmapImage::create(newSkImageFromRaster(info, std::
move(copiedDataBuffer), dstPixelBytesPerRow)); |
| 317 } | 315 } |
| 318 m_image->setPremultiplied(premultiplyAlpha); | 316 m_image->setPremultiplied(premultiplyAlpha); |
| 319 return; | 317 return; |
| 320 } | 318 } |
| 321 | 319 |
| 322 std::unique_ptr<ImageBuffer> buffer = ImageBuffer::create(cropRect.size(), N
onOpaque, DoNotInitializeImagePixels); | 320 OwnPtr<ImageBuffer> buffer = ImageBuffer::create(cropRect.size(), NonOpaque,
DoNotInitializeImagePixels); |
| 323 if (!buffer) | 321 if (!buffer) |
| 324 return; | 322 return; |
| 325 | 323 |
| 326 if (srcRect.isEmpty()) { | 324 if (srcRect.isEmpty()) { |
| 327 m_image = StaticBitmapImage::create(buffer->newSkImageSnapshot(PreferNoA
cceleration, SnapshotReasonUnknown)); | 325 m_image = StaticBitmapImage::create(buffer->newSkImageSnapshot(PreferNoA
cceleration, SnapshotReasonUnknown)); |
| 328 return; | 326 return; |
| 329 } | 327 } |
| 330 | 328 |
| 331 IntPoint dstPoint = IntPoint(std::min(0, -cropRect.x()), std::min(0, -cropRe
ct.y())); | 329 IntPoint dstPoint = IntPoint(std::min(0, -cropRect.x()), std::min(0, -cropRe
ct.y())); |
| 332 if (cropRect.x() < 0) | 330 if (cropRect.x() < 0) |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 m_image.clear(); | 436 m_image.clear(); |
| 439 m_isNeutered = true; | 437 m_isNeutered = true; |
| 440 } | 438 } |
| 441 | 439 |
| 442 // static | 440 // static |
| 443 ImageBitmap* ImageBitmap::take(ScriptPromiseResolver*, sk_sp<SkImage> image) | 441 ImageBitmap* ImageBitmap::take(ScriptPromiseResolver*, sk_sp<SkImage> image) |
| 444 { | 442 { |
| 445 return ImageBitmap::create(StaticBitmapImage::create(fromSkSp(image))); | 443 return ImageBitmap::create(StaticBitmapImage::create(fromSkSp(image))); |
| 446 } | 444 } |
| 447 | 445 |
| 448 std::unique_ptr<uint8_t[]> ImageBitmap::copyBitmapData(AlphaDisposition alphaOp) | 446 PassOwnPtr<uint8_t[]> ImageBitmap::copyBitmapData(AlphaDisposition alphaOp) |
| 449 { | 447 { |
| 450 SkImageInfo info = SkImageInfo::Make(width(), height(), kRGBA_8888_SkColorTy
pe, (alphaOp == PremultiplyAlpha) ? kPremul_SkAlphaType : kUnpremul_SkAlphaType)
; | 448 SkImageInfo info = SkImageInfo::Make(width(), height(), kRGBA_8888_SkColorTy
pe, (alphaOp == PremultiplyAlpha) ? kPremul_SkAlphaType : kUnpremul_SkAlphaType)
; |
| 451 std::unique_ptr<uint8_t[]> dstPixels = copySkImageData(m_image->imageForCurr
entFrame().get(), info); | 449 OwnPtr<uint8_t[]> dstPixels = copySkImageData(m_image->imageForCurrentFrame(
).get(), info); |
| 452 return dstPixels; | 450 return dstPixels; |
| 453 } | 451 } |
| 454 | 452 |
| 455 unsigned long ImageBitmap::width() const | 453 unsigned long ImageBitmap::width() const |
| 456 { | 454 { |
| 457 if (!m_image) | 455 if (!m_image) |
| 458 return 0; | 456 return 0; |
| 459 ASSERT(m_image->width() > 0); | 457 ASSERT(m_image->width() > 0); |
| 460 return m_image->width(); | 458 return m_image->width(); |
| 461 } | 459 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 514 FloatSize ImageBitmap::elementSize(const FloatSize&) const | 512 FloatSize ImageBitmap::elementSize(const FloatSize&) const |
| 515 { | 513 { |
| 516 return FloatSize(width(), height()); | 514 return FloatSize(width(), height()); |
| 517 } | 515 } |
| 518 | 516 |
| 519 DEFINE_TRACE(ImageBitmap) | 517 DEFINE_TRACE(ImageBitmap) |
| 520 { | 518 { |
| 521 } | 519 } |
| 522 | 520 |
| 523 } // namespace blink | 521 } // namespace blink |
| OLD | NEW |