Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(212)

Side by Side Diff: third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.cpp

Issue 2802813002: Adds SVGImageElement as a ImageBitmapSource (Closed)
Patch Set: tests Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/html/canvas/CanvasImageElementSource.h"
6
7 #include "core/layout/LayoutObject.h"
8 #include "core/loader/ImageLoader.h"
9 #include "core/svg/graphics/SVGImageForContainer.h"
10
11 namespace blink {
12
13 ImageResourceContent* CanvasImageElementSource::cachedImage() const {
14 return imageLoader().image();
15 }
16
17 const Element& CanvasImageElementSource::element() const {
18 return *imageLoader().element();
19 }
20
21 bool CanvasImageElementSource::isSVGSource() const {
22 return cachedImage() && cachedImage()->getImage()->isSVGImage();
23 }
24
25 PassRefPtr<Image> CanvasImageElementSource::getSourceImageForCanvas(
26 SourceImageStatus* status,
27 AccelerationHint,
28 SnapshotReason,
29 const FloatSize& defaultObjectSize) const {
30 if (!imageLoader().imageComplete() || !cachedImage()) {
31 *status = IncompleteSourceImageStatus;
32 return nullptr;
33 }
34
35 if (cachedImage()->errorOccurred()) {
36 *status = UndecodableSourceImageStatus;
37 return nullptr;
38 }
39
40 RefPtr<Image> sourceImage;
41 if (cachedImage()->getImage()->isSVGImage()) {
42 UseCounter::count(element().document(), UseCounter::SVGInCanvas2D);
43 SVGImage* svgImage = toSVGImage(cachedImage()->getImage());
44 IntSize imageSize =
45 roundedIntSize(svgImage->concreteObjectSize(defaultObjectSize));
46 sourceImage = SVGImageForContainer::create(
47 svgImage, imageSize, 1,
48 element().document().completeURL(element().imageSourceURL()));
49 } else {
50 sourceImage = cachedImage()->getImage();
51 }
52
53 *status = NormalSourceImageStatus;
54 return sourceImage->imageForDefaultFrame();
55 }
56
57 bool CanvasImageElementSource::wouldTaintOrigin(
58 SecurityOrigin* destinationSecurityOrigin) const {
59 return cachedImage() &&
60 !cachedImage()->isAccessAllowed(destinationSecurityOrigin);
61 }
62
63 FloatSize CanvasImageElementSource::elementSize(
64 const FloatSize& defaultObjectSize) const {
65 ImageResourceContent* image = cachedImage();
66 if (!image)
67 return FloatSize();
68
69 if (image->getImage() && image->getImage()->isSVGImage()) {
70 return toSVGImage(cachedImage()->getImage())
71 ->concreteObjectSize(defaultObjectSize);
72 }
73
74 return FloatSize(image->imageSize(
75 LayoutObject::shouldRespectImageOrientation(element().layoutObject()),
76 1.0f));
77 }
78
79 FloatSize CanvasImageElementSource::defaultDestinationSize(
80 const FloatSize& defaultObjectSize) const {
81 ImageResourceContent* image = cachedImage();
82 if (!image)
83 return FloatSize();
84
85 if (image->getImage() && image->getImage()->isSVGImage()) {
86 return toSVGImage(cachedImage()->getImage())
87 ->concreteObjectSize(defaultObjectSize);
88 }
89
90 LayoutSize size;
91 size = image->imageSize(
92 LayoutObject::shouldRespectImageOrientation(element().layoutObject()),
93 1.0f);
94 return FloatSize(size);
95 }
96
97 bool CanvasImageElementSource::isAccelerated() const {
98 return false;
99 }
100
101 const KURL& CanvasImageElementSource::sourceURL() const {
102 return cachedImage()->response().url();
103 }
104
105 int CanvasImageElementSource::sourceWidth() {
106 SourceImageStatus status;
107 RefPtr<Image> image =
108 getSourceImageForCanvas(&status, PreferNoAcceleration,
109 SnapshotReasonUnknown, sourceDefaultObjectSize());
110 return image->width();
111 }
112
113 int CanvasImageElementSource::sourceHeight() {
114 SourceImageStatus status;
115 RefPtr<Image> image =
116 getSourceImageForCanvas(&status, PreferNoAcceleration,
117 SnapshotReasonUnknown, sourceDefaultObjectSize());
118 return image->height();
119 }
120
121 bool CanvasImageElementSource::isOpaque() const {
122 Image* image = const_cast<Element&>(element()).imageContents();
123 return image && image->currentFrameKnownToBeOpaque();
124 }
125
126 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698