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

Side by Side Diff: third_party/WebKit/Source/core/html/canvas/HTMLAndSVGImageElementSource.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
1 // Copyright 2017 The Chromium Authors. All rights reserved. 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 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/html/canvas/CanvasImageElementSource.h" 5 #include "core/html/canvas/HTMLAndSVGImageElementSource.h"
6 6
7 #include "core/frame/ImageBitmap.h"
8 #include "core/frame/LocalDOMWindow.h"
7 #include "core/layout/LayoutObject.h" 9 #include "core/layout/LayoutObject.h"
8 #include "core/loader/ImageLoader.h" 10 #include "core/loader/ImageLoader.h"
9 #include "core/svg/graphics/SVGImageForContainer.h" 11 #include "core/svg/graphics/SVGImageForContainer.h"
10 12
11 namespace blink { 13 namespace blink {
12 14
13 ImageResourceContent* CanvasImageElementSource::cachedImage() const { 15 ImageResourceContent* HTMLAndSVGImageElementSource::cachedImage() const {
14 return imageLoader().image(); 16 return imageLoader().image();
15 } 17 }
16 18
17 const Element& CanvasImageElementSource::element() const { 19 const Element& HTMLAndSVGImageElementSource::element() const {
18 return *imageLoader().element(); 20 return *imageLoader().element();
19 } 21 }
20 22
21 bool CanvasImageElementSource::isSVGSource() const { 23 bool HTMLAndSVGImageElementSource::isSVGSource() const {
22 return cachedImage() && cachedImage()->getImage()->isSVGImage(); 24 return cachedImage() && cachedImage()->getImage()->isSVGImage();
23 } 25 }
24 26
25 PassRefPtr<Image> CanvasImageElementSource::getSourceImageForCanvas( 27 PassRefPtr<Image> HTMLAndSVGImageElementSource::getSourceImageForCanvas(
26 SourceImageStatus* status, 28 SourceImageStatus* status,
27 AccelerationHint, 29 AccelerationHint,
28 SnapshotReason, 30 SnapshotReason,
29 const FloatSize& defaultObjectSize) const { 31 const FloatSize& defaultObjectSize) const {
30 if (!imageLoader().imageComplete() || !cachedImage()) { 32 if (!imageLoader().imageComplete() || !cachedImage()) {
31 *status = IncompleteSourceImageStatus; 33 *status = IncompleteSourceImageStatus;
32 return nullptr; 34 return nullptr;
33 } 35 }
34 36
35 if (cachedImage()->errorOccurred()) { 37 if (cachedImage()->errorOccurred()) {
(...skipping 11 matching lines...) Expand all
47 svgImage, imageSize, 1, 49 svgImage, imageSize, 1,
48 element().document().completeURL(element().imageSourceURL())); 50 element().document().completeURL(element().imageSourceURL()));
49 } else { 51 } else {
50 sourceImage = cachedImage()->getImage(); 52 sourceImage = cachedImage()->getImage();
51 } 53 }
52 54
53 *status = NormalSourceImageStatus; 55 *status = NormalSourceImageStatus;
54 return sourceImage->imageForDefaultFrame(); 56 return sourceImage->imageForDefaultFrame();
55 } 57 }
56 58
57 bool CanvasImageElementSource::wouldTaintOrigin( 59 bool HTMLAndSVGImageElementSource::wouldTaintOrigin(
58 SecurityOrigin* destinationSecurityOrigin) const { 60 SecurityOrigin* destinationSecurityOrigin) const {
59 return cachedImage() && 61 return cachedImage() &&
60 !cachedImage()->isAccessAllowed(destinationSecurityOrigin); 62 !cachedImage()->isAccessAllowed(destinationSecurityOrigin);
61 } 63 }
62 64
63 FloatSize CanvasImageElementSource::elementSize( 65 FloatSize HTMLAndSVGImageElementSource::elementSize(
64 const FloatSize& defaultObjectSize) const { 66 const FloatSize& defaultObjectSize) const {
65 ImageResourceContent* image = cachedImage(); 67 ImageResourceContent* image = cachedImage();
66 if (!image) 68 if (!image)
67 return FloatSize(); 69 return FloatSize();
68 70
69 if (image->getImage() && image->getImage()->isSVGImage()) { 71 if (image->getImage() && image->getImage()->isSVGImage()) {
70 return toSVGImage(cachedImage()->getImage()) 72 return toSVGImage(cachedImage()->getImage())
71 ->concreteObjectSize(defaultObjectSize); 73 ->concreteObjectSize(defaultObjectSize);
72 } 74 }
73 75
74 return FloatSize(image->imageSize( 76 return FloatSize(image->imageSize(
75 LayoutObject::shouldRespectImageOrientation(element().layoutObject()), 77 LayoutObject::shouldRespectImageOrientation(element().layoutObject()),
76 1.0f)); 78 1.0f));
77 } 79 }
78 80
79 FloatSize CanvasImageElementSource::defaultDestinationSize( 81 FloatSize HTMLAndSVGImageElementSource::defaultDestinationSize(
80 const FloatSize& defaultObjectSize) const { 82 const FloatSize& defaultObjectSize) const {
81 ImageResourceContent* image = cachedImage(); 83 ImageResourceContent* image = cachedImage();
82 if (!image) 84 if (!image)
83 return FloatSize(); 85 return FloatSize();
84 86
85 if (image->getImage() && image->getImage()->isSVGImage()) { 87 if (image->getImage() && image->getImage()->isSVGImage()) {
86 return toSVGImage(cachedImage()->getImage()) 88 return toSVGImage(cachedImage()->getImage())
87 ->concreteObjectSize(defaultObjectSize); 89 ->concreteObjectSize(defaultObjectSize);
88 } 90 }
89 91
90 LayoutSize size; 92 LayoutSize size;
91 size = image->imageSize( 93 size = image->imageSize(
92 LayoutObject::shouldRespectImageOrientation(element().layoutObject()), 94 LayoutObject::shouldRespectImageOrientation(element().layoutObject()),
93 1.0f); 95 1.0f);
94 return FloatSize(size); 96 return FloatSize(size);
95 } 97 }
96 98
97 bool CanvasImageElementSource::isAccelerated() const { 99 bool HTMLAndSVGImageElementSource::isAccelerated() const {
98 return false; 100 return false;
99 } 101 }
100 102
101 const KURL& CanvasImageElementSource::sourceURL() const { 103 const KURL& HTMLAndSVGImageElementSource::sourceURL() const {
102 return cachedImage()->response().url(); 104 return cachedImage()->response().url();
103 } 105 }
104 106
105 int CanvasImageElementSource::sourceWidth() { 107 int HTMLAndSVGImageElementSource::sourceWidth() {
106 SourceImageStatus status; 108 SourceImageStatus status;
107 RefPtr<Image> image = 109 RefPtr<Image> image =
108 getSourceImageForCanvas(&status, PreferNoAcceleration, 110 getSourceImageForCanvas(&status, PreferNoAcceleration,
109 SnapshotReasonUnknown, sourceDefaultObjectSize()); 111 SnapshotReasonUnknown, sourceDefaultObjectSize());
110 return image->width(); 112 return image->width();
111 } 113 }
112 114
113 int CanvasImageElementSource::sourceHeight() { 115 int HTMLAndSVGImageElementSource::sourceHeight() {
114 SourceImageStatus status; 116 SourceImageStatus status;
115 RefPtr<Image> image = 117 RefPtr<Image> image =
116 getSourceImageForCanvas(&status, PreferNoAcceleration, 118 getSourceImageForCanvas(&status, PreferNoAcceleration,
117 SnapshotReasonUnknown, sourceDefaultObjectSize()); 119 SnapshotReasonUnknown, sourceDefaultObjectSize());
118 return image->height(); 120 return image->height();
119 } 121 }
120 122
121 bool CanvasImageElementSource::isOpaque() const { 123 bool HTMLAndSVGImageElementSource::isOpaque() const {
122 Image* image = const_cast<Element&>(element()).imageContents(); 124 Image* image = const_cast<Element&>(element()).imageContents();
123 return image && image->currentFrameKnownToBeOpaque(); 125 return image && image->currentFrameKnownToBeOpaque();
124 } 126 }
125 127
128 IntSize HTMLAndSVGImageElementSource::bitmapSourceSize() const {
129 ImageResourceContent* image = cachedImage();
130 if (!image)
131 return IntSize();
132 LayoutSize lSize = image->imageSize(
133 LayoutObject::shouldRespectImageOrientation(element().layoutObject()),
134 1.0f);
135 DCHECK(lSize.fraction().isZero());
136 return IntSize(lSize.width().toInt(), lSize.height().toInt());
137 }
138
139 ScriptPromise HTMLAndSVGImageElementSource::createImageBitmap(
140 ScriptState* scriptState,
141 EventTarget& eventTarget,
142 Optional<IntRect> cropRect,
143 const ImageBitmapOptions& options,
144 ExceptionState& exceptionState) {
145 DCHECK(eventTarget.toLocalDOMWindow());
146 if ((cropRect &&
147 !ImageBitmap::isSourceSizeValid(cropRect->width(), cropRect->height(),
148 exceptionState)) ||
149 !ImageBitmap::isSourceSizeValid(bitmapSourceSize().width(),
150 bitmapSourceSize().height(),
151 exceptionState))
152 return ScriptPromise();
153 if (!ImageBitmap::isResizeOptionValid(options, exceptionState))
154 return ScriptPromise();
155 return ImageBitmapSource::fulfillImageBitmap(
156 scriptState,
157 ImageBitmap::create(this, cropRect,
158 eventTarget.toLocalDOMWindow()->document(), options));
159 }
160
126 } // namespace blink 161 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698