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

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

Issue 2802813002: Adds SVGImageElement as a ImageBitmapSource (Closed)
Patch Set: merge 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 GetImageLoader().GetImage(); 16 return GetImageLoader().GetImage();
15 } 17 }
16 18
17 const Element& CanvasImageElementSource::GetElement() const { 19 const Element& HTMLAndSVGImageElementSource::GetElement() const {
18 return *GetImageLoader().GetElement(); 20 return *GetImageLoader().GetElement();
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& default_object_size) const { 31 const FloatSize& default_object_size) const {
30 if (!GetImageLoader().ImageComplete() || !CachedImage()) { 32 if (!GetImageLoader().ImageComplete() || !CachedImage()) {
31 *status = kIncompleteSourceImageStatus; 33 *status = kIncompleteSourceImageStatus;
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 svg_image, image_size, 1, 49 svg_image, image_size, 1,
48 GetElement().GetDocument().CompleteURL(GetElement().ImageSourceURL())); 50 GetElement().GetDocument().CompleteURL(GetElement().ImageSourceURL()));
49 } else { 51 } else {
50 source_image = CachedImage()->GetImage(); 52 source_image = CachedImage()->GetImage();
51 } 53 }
52 54
53 *status = kNormalSourceImageStatus; 55 *status = kNormalSourceImageStatus;
54 return source_image->ImageForDefaultFrame(); 56 return source_image->ImageForDefaultFrame();
55 } 57 }
56 58
57 bool CanvasImageElementSource::WouldTaintOrigin( 59 bool HTMLAndSVGImageElementSource::WouldTaintOrigin(
58 SecurityOrigin* destination_security_origin) const { 60 SecurityOrigin* destination_security_origin) const {
59 return CachedImage() && 61 return CachedImage() &&
60 !CachedImage()->IsAccessAllowed(destination_security_origin); 62 !CachedImage()->IsAccessAllowed(destination_security_origin);
61 } 63 }
62 64
63 FloatSize CanvasImageElementSource::ElementSize( 65 FloatSize HTMLAndSVGImageElementSource::ElementSize(
64 const FloatSize& default_object_size) const { 66 const FloatSize& default_object_size) 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(default_object_size); 73 ->ConcreteObjectSize(default_object_size);
72 } 74 }
73 75
74 return FloatSize(image->ImageSize(LayoutObject::ShouldRespectImageOrientation( 76 return FloatSize(image->ImageSize(LayoutObject::ShouldRespectImageOrientation(
75 GetElement().GetLayoutObject()), 77 GetElement().GetLayoutObject()),
76 1.0f)); 78 1.0f));
77 } 79 }
78 80
79 FloatSize CanvasImageElementSource::DefaultDestinationSize( 81 FloatSize HTMLAndSVGImageElementSource::DefaultDestinationSize(
80 const FloatSize& default_object_size) const { 82 const FloatSize& default_object_size) 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(default_object_size); 89 ->ConcreteObjectSize(default_object_size);
88 } 90 }
89 91
90 LayoutSize size; 92 LayoutSize size;
91 size = image->ImageSize(LayoutObject::ShouldRespectImageOrientation( 93 size = image->ImageSize(LayoutObject::ShouldRespectImageOrientation(
92 GetElement().GetLayoutObject()), 94 GetElement().GetLayoutObject()),
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()->GetResponse().Url(); 104 return CachedImage()->GetResponse().Url();
103 } 105 }
104 106
105 int CanvasImageElementSource::SourceWidth() { 107 int HTMLAndSVGImageElementSource::SourceWidth() {
106 SourceImageStatus status; 108 SourceImageStatus status;
107 RefPtr<Image> image = GetSourceImageForCanvas(&status, kPreferNoAcceleration, 109 RefPtr<Image> image = GetSourceImageForCanvas(&status, kPreferNoAcceleration,
108 kSnapshotReasonUnknown, 110 kSnapshotReasonUnknown,
109 SourceDefaultObjectSize()); 111 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 = GetSourceImageForCanvas(&status, kPreferNoAcceleration, 117 RefPtr<Image> image = GetSourceImageForCanvas(&status, kPreferNoAcceleration,
116 kSnapshotReasonUnknown, 118 kSnapshotReasonUnknown,
117 SourceDefaultObjectSize()); 119 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&>(GetElement()).ImageContents(); 124 Image* image = const_cast<Element&>(GetElement()).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 =
133 image->ImageSize(LayoutObject::ShouldRespectImageOrientation(
134 GetElement().GetLayoutObject()),
135 1.0f);
136 DCHECK(lSize.Fraction().IsZero());
137 return IntSize(lSize.Width().ToInt(), lSize.Height().ToInt());
138 }
139
140 ScriptPromise HTMLAndSVGImageElementSource::CreateImageBitmap(
141 ScriptState* script_state,
142 EventTarget& event_target,
143 Optional<IntRect> crop_rect,
144 const ImageBitmapOptions& options,
145 ExceptionState& exception_state) {
146 DCHECK(event_target.ToLocalDOMWindow());
147 if ((crop_rect &&
148 !ImageBitmap::IsSourceSizeValid(crop_rect->Width(), crop_rect->Height(),
149 exception_state)) ||
150 !ImageBitmap::IsSourceSizeValid(BitmapSourceSize().Width(),
151 BitmapSourceSize().Height(),
152 exception_state))
153 return ScriptPromise();
154 if (!ImageBitmap::IsResizeOptionValid(options, exception_state))
155 return ScriptPromise();
156 return ImageBitmapSource::FulfillImageBitmap(
157 script_state, ImageBitmap::Create(
158 this, crop_rect,
159 event_target.ToLocalDOMWindow()->document(), options));
160 }
161
126 } // namespace blink 162 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698