Chromium Code Reviews| 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 "core/offscreencanvas/OffscreenCanvas.h" | 10 #include "core/offscreencanvas/OffscreenCanvas.h" |
| (...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 584 surface->getCanvas()->drawImage(skImage, 0, 0); | 584 surface->getCanvas()->drawImage(skImage, 0, 0); |
| 585 m_image = StaticBitmapImage::create(surface->makeImageSnapshot()); | 585 m_image = StaticBitmapImage::create(surface->makeImageSnapshot()); |
| 586 } | 586 } |
| 587 if (!m_image) | 587 if (!m_image) |
| 588 return; | 588 return; |
| 589 m_image->setOriginClean( | 589 m_image->setOriginClean( |
| 590 !image->wouldTaintOrigin(document->getSecurityOrigin())); | 590 !image->wouldTaintOrigin(document->getSecurityOrigin())); |
| 591 m_image->setPremultiplied(parsedOptions.premultiplyAlpha); | 591 m_image->setPremultiplied(parsedOptions.premultiplyAlpha); |
| 592 } | 592 } |
| 593 | 593 |
| 594 ImageBitmap::ImageBitmap(SVGImageElement* image, | |
| 595 Optional<IntRect> cropRect, | |
| 596 Document* document, | |
| 597 const ImageBitmapOptions& options) { | |
| 598 RefPtr<Image> input = image->cachedImage()->getImage(); | |
| 599 ParsedOptions parsedOptions = | |
| 600 parseOptions(options, cropRect, image->bitmapSourceSize()); | |
|
fs
2017/04/06 16:48:12
Given all the interfaces that's defined for this,
fserb
2017/04/06 20:06:16
fixed
| |
| 601 if (dstBufferSizeHasOverflow(parsedOptions)) | |
| 602 return; | |
| 603 | |
| 604 if (options.colorSpaceConversion() == kImageBitmapOptionNone) { | |
| 605 m_image = cropImageAndApplyColorSpaceConversion( | |
| 606 input.get(), parsedOptions, PremultiplyAlpha, ColorBehavior::ignore()); | |
| 607 } else { | |
| 608 m_image = cropImageAndApplyColorSpaceConversion( | |
| 609 input.get(), parsedOptions, PremultiplyAlpha, | |
| 610 ColorBehavior::transformToGlobalTarget()); | |
| 611 } | |
| 612 | |
| 613 if (!m_image) | |
| 614 return; | |
| 615 // In the case where the source image is lazy-decoded, m_image may not be in | |
| 616 // a decoded state, we trigger it here. | |
| 617 sk_sp<SkImage> skImage = m_image->imageForCurrentFrame(); | |
| 618 SkPixmap pixmap; | |
| 619 if (!skImage->isTextureBacked() && !skImage->peekPixels(&pixmap)) { | |
| 620 SkImageInfo imageInfo = SkImageInfo::Make( | |
| 621 skImage->width(), skImage->height(), parsedOptions.dstColorType, | |
| 622 kPremul_SkAlphaType, parsedOptions.dstColorSpace); | |
| 623 sk_sp<SkSurface> surface = SkSurface::MakeRaster(imageInfo); | |
| 624 surface->getCanvas()->drawImage(skImage, 0, 0); | |
| 625 m_image = StaticBitmapImage::create(surface->makeImageSnapshot()); | |
| 626 } | |
| 627 if (!m_image) | |
| 628 return; | |
| 629 m_image->setOriginClean( | |
| 630 !image->wouldTaintOrigin(document->getSecurityOrigin())); | |
| 631 m_image->setPremultiplied(parsedOptions.premultiplyAlpha); | |
| 632 } | |
| 633 | |
| 594 ImageBitmap::ImageBitmap(HTMLVideoElement* video, | 634 ImageBitmap::ImageBitmap(HTMLVideoElement* video, |
| 595 Optional<IntRect> cropRect, | 635 Optional<IntRect> cropRect, |
| 596 Document* document, | 636 Document* document, |
| 597 const ImageBitmapOptions& options) { | 637 const ImageBitmapOptions& options) { |
| 598 IntSize playerSize; | 638 IntSize playerSize; |
| 599 if (video->webMediaPlayer()) | 639 if (video->webMediaPlayer()) |
| 600 playerSize = video->webMediaPlayer()->naturalSize(); | 640 playerSize = video->webMediaPlayer()->naturalSize(); |
| 601 ParsedOptions parsedOptions = | 641 ParsedOptions parsedOptions = |
| 602 parseOptions(options, cropRect, video->bitmapSourceSize()); | 642 parseOptions(options, cropRect, video->bitmapSourceSize()); |
| 603 if (dstBufferSizeHasOverflow(parsedOptions)) | 643 if (dstBufferSizeHasOverflow(parsedOptions)) |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 983 | 1023 |
| 984 ImageBitmap::~ImageBitmap() {} | 1024 ImageBitmap::~ImageBitmap() {} |
| 985 | 1025 |
| 986 ImageBitmap* ImageBitmap::create(HTMLImageElement* image, | 1026 ImageBitmap* ImageBitmap::create(HTMLImageElement* image, |
| 987 Optional<IntRect> cropRect, | 1027 Optional<IntRect> cropRect, |
| 988 Document* document, | 1028 Document* document, |
| 989 const ImageBitmapOptions& options) { | 1029 const ImageBitmapOptions& options) { |
| 990 return new ImageBitmap(image, cropRect, document, options); | 1030 return new ImageBitmap(image, cropRect, document, options); |
| 991 } | 1031 } |
| 992 | 1032 |
| 1033 ImageBitmap* ImageBitmap::create(SVGImageElement* image, | |
| 1034 Optional<IntRect> cropRect, | |
| 1035 Document* document, | |
| 1036 const ImageBitmapOptions& options) { | |
| 1037 return new ImageBitmap(image, cropRect, document, options); | |
| 1038 } | |
| 1039 | |
| 993 ImageBitmap* ImageBitmap::create(HTMLVideoElement* video, | 1040 ImageBitmap* ImageBitmap::create(HTMLVideoElement* video, |
| 994 Optional<IntRect> cropRect, | 1041 Optional<IntRect> cropRect, |
| 995 Document* document, | 1042 Document* document, |
| 996 const ImageBitmapOptions& options) { | 1043 const ImageBitmapOptions& options) { |
| 997 return new ImageBitmap(video, cropRect, document, options); | 1044 return new ImageBitmap(video, cropRect, document, options); |
| 998 } | 1045 } |
| 999 | 1046 |
| 1000 ImageBitmap* ImageBitmap::create(HTMLCanvasElement* canvas, | 1047 ImageBitmap* ImageBitmap::create(HTMLCanvasElement* canvas, |
| 1001 Optional<IntRect> cropRect, | 1048 Optional<IntRect> cropRect, |
| 1002 const ImageBitmapOptions& options) { | 1049 const ImageBitmapOptions& options) { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1125 void ImageBitmap::adjustDrawRects(FloatRect* srcRect, | 1172 void ImageBitmap::adjustDrawRects(FloatRect* srcRect, |
| 1126 FloatRect* dstRect) const {} | 1173 FloatRect* dstRect) const {} |
| 1127 | 1174 |
| 1128 FloatSize ImageBitmap::elementSize(const FloatSize&) const { | 1175 FloatSize ImageBitmap::elementSize(const FloatSize&) const { |
| 1129 return FloatSize(width(), height()); | 1176 return FloatSize(width(), height()); |
| 1130 } | 1177 } |
| 1131 | 1178 |
| 1132 DEFINE_TRACE(ImageBitmap) {} | 1179 DEFINE_TRACE(ImageBitmap) {} |
| 1133 | 1180 |
| 1134 } // namespace blink | 1181 } // namespace blink |
| OLD | NEW |