Chromium Code Reviews| Index: third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.cpp |
| diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..3c5c26c4e67a8c7e96dfb3335f3606c5eee11134 |
| --- /dev/null |
| +++ b/third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.cpp |
| @@ -0,0 +1,126 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "core/html/canvas/CanvasImageElementSource.h" |
| + |
| +#include "core/html/HTMLImageLoader.h" |
|
fs
2017/03/07 22:01:24
Nit: using core/loader/ImageLoader.h would suffice
fserb
2017/03/21 19:15:22
done.
|
| +#include "core/layout/LayoutObject.h" |
| +#include "core/svg/graphics/SVGImageForContainer.h" |
| + |
| +namespace blink { |
| + |
| +ImageResourceContent* CanvasImageElementSource::cachedImage() const { |
| + return imageLoader().image(); |
| +} |
| + |
| +const Element* CanvasImageElementSource::element() const { |
| + return imageLoader().element(); |
| +} |
| + |
| +bool CanvasImageElementSource::isSVGSource() const { |
| + return cachedImage() && cachedImage()->getImage()->isSVGImage(); |
| +} |
| + |
| +PassRefPtr<Image> CanvasImageElementSource::getSourceImageForCanvas( |
| + SourceImageStatus* status, |
| + AccelerationHint, |
| + SnapshotReason, |
| + const FloatSize& defaultObjectSize) const { |
| + if (!imageLoader().imageComplete() || !cachedImage()) { |
| + *status = IncompleteSourceImageStatus; |
| + return nullptr; |
| + } |
| + |
| + if (cachedImage()->errorOccurred()) { |
| + *status = UndecodableSourceImageStatus; |
| + return nullptr; |
| + } |
| + |
| + RefPtr<Image> sourceImage; |
| + if (cachedImage()->getImage()->isSVGImage()) { |
| + UseCounter::count(element()->document(), UseCounter::SVGInCanvas2D); |
| + SVGImage* svgImage = toSVGImage(cachedImage()->getImage()); |
| + IntSize imageSize = |
| + roundedIntSize(svgImage->concreteObjectSize(defaultObjectSize)); |
| + sourceImage = SVGImageForContainer::create( |
| + svgImage, imageSize, 1, |
| + element()->document().completeURL(element()->imageSourceURL())); |
| + } else { |
| + sourceImage = cachedImage()->getImage(); |
| + } |
| + |
| + *status = NormalSourceImageStatus; |
| + return sourceImage->imageForDefaultFrame(); |
| +} |
| + |
| +bool CanvasImageElementSource::wouldTaintOrigin( |
| + SecurityOrigin* destinationSecurityOrigin) const { |
| + return cachedImage() && |
| + !cachedImage()->isAccessAllowed(destinationSecurityOrigin); |
| +} |
| + |
| +FloatSize CanvasImageElementSource::elementSize( |
| + const FloatSize& defaultObjectSize) const { |
| + ImageResourceContent* image = cachedImage(); |
| + if (!image) |
| + return FloatSize(); |
| + |
| + if (image->getImage() && image->getImage()->isSVGImage()) { |
| + return toSVGImage(cachedImage()->getImage()) |
| + ->concreteObjectSize(defaultObjectSize); |
| + } |
| + |
| + return FloatSize(image->imageSize( |
| + LayoutObject::shouldRespectImageOrientation(element()->layoutObject()), |
| + 1.0f)); |
| +} |
| + |
| +FloatSize CanvasImageElementSource::defaultDestinationSize( |
| + const FloatSize& defaultObjectSize) const { |
| + ImageResourceContent* image = cachedImage(); |
| + if (!image) |
| + return FloatSize(); |
| + |
| + if (image->getImage() && image->getImage()->isSVGImage()) { |
| + return toSVGImage(cachedImage()->getImage()) |
| + ->concreteObjectSize(defaultObjectSize); |
| + } |
| + |
| + LayoutSize size; |
| + size = image->imageSize( |
| + LayoutObject::shouldRespectImageOrientation(element()->layoutObject()), |
| + 1.0f); |
| + return FloatSize(size); |
| +} |
| + |
| +bool CanvasImageElementSource::isAccelerated() const { |
| + return false; |
| +} |
| + |
| +const KURL& CanvasImageElementSource::sourceURL() const { |
| + return cachedImage()->response().url(); |
| +} |
| + |
| +int CanvasImageElementSource::sourceWidth() { |
| + SourceImageStatus status; |
| + RefPtr<Image> image = |
| + getSourceImageForCanvas(&status, PreferNoAcceleration, |
| + SnapshotReasonUnknown, sourceDefaultSize()); |
| + return image->width(); |
| +} |
| + |
| +int CanvasImageElementSource::sourceHeight() { |
| + SourceImageStatus status; |
| + RefPtr<Image> image = |
| + getSourceImageForCanvas(&status, PreferNoAcceleration, |
| + SnapshotReasonUnknown, sourceDefaultSize()); |
| + return image->height(); |
| +} |
| + |
| +bool CanvasImageElementSource::isOpaque() const { |
| + Image* image = const_cast<Element*>(element())->imageContents(); |
| + return image && image->currentFrameKnownToBeOpaque(); |
| +} |
| + |
| +} // namespace blink |