OLD | NEW |
| (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/ImageElementBase.h" | |
6 | |
7 #include "core/frame/ImageBitmap.h" | |
8 #include "core/frame/LocalDOMWindow.h" | |
9 #include "core/layout/LayoutObject.h" | |
10 #include "core/loader/ImageLoader.h" | |
11 #include "core/svg/graphics/SVGImageForContainer.h" | |
12 | |
13 namespace blink { | |
14 | |
15 ImageResourceContent* ImageElementBase::CachedImage() const { | |
16 return GetImageLoader().GetImage(); | |
17 } | |
18 | |
19 const Element& ImageElementBase::GetElement() const { | |
20 return *GetImageLoader().GetElement(); | |
21 } | |
22 | |
23 bool ImageElementBase::IsSVGSource() const { | |
24 return CachedImage() && CachedImage()->GetImage()->IsSVGImage(); | |
25 } | |
26 | |
27 PassRefPtr<Image> ImageElementBase::GetSourceImageForCanvas( | |
28 SourceImageStatus* status, | |
29 AccelerationHint, | |
30 SnapshotReason, | |
31 const FloatSize& default_object_size) const { | |
32 if (!GetImageLoader().ImageComplete() || !CachedImage()) { | |
33 *status = kIncompleteSourceImageStatus; | |
34 return nullptr; | |
35 } | |
36 | |
37 if (CachedImage()->ErrorOccurred()) { | |
38 *status = kUndecodableSourceImageStatus; | |
39 return nullptr; | |
40 } | |
41 | |
42 RefPtr<Image> source_image; | |
43 if (CachedImage()->GetImage()->IsSVGImage()) { | |
44 UseCounter::Count(GetElement().GetDocument(), UseCounter::kSVGInCanvas2D); | |
45 SVGImage* svg_image = ToSVGImage(CachedImage()->GetImage()); | |
46 IntSize image_size = | |
47 RoundedIntSize(svg_image->ConcreteObjectSize(default_object_size)); | |
48 source_image = SVGImageForContainer::Create( | |
49 svg_image, image_size, 1, | |
50 GetElement().GetDocument().CompleteURL(GetElement().ImageSourceURL())); | |
51 } else { | |
52 source_image = CachedImage()->GetImage(); | |
53 } | |
54 | |
55 *status = kNormalSourceImageStatus; | |
56 return source_image->ImageForDefaultFrame(); | |
57 } | |
58 | |
59 bool ImageElementBase::WouldTaintOrigin( | |
60 SecurityOrigin* destination_security_origin) const { | |
61 return CachedImage() && | |
62 !CachedImage()->IsAccessAllowed(destination_security_origin); | |
63 } | |
64 | |
65 FloatSize ImageElementBase::ElementSize( | |
66 const FloatSize& default_object_size) const { | |
67 ImageResourceContent* image = CachedImage(); | |
68 if (!image) | |
69 return FloatSize(); | |
70 | |
71 if (image->GetImage() && image->GetImage()->IsSVGImage()) { | |
72 return ToSVGImage(CachedImage()->GetImage()) | |
73 ->ConcreteObjectSize(default_object_size); | |
74 } | |
75 | |
76 return FloatSize(image->ImageSize(LayoutObject::ShouldRespectImageOrientation( | |
77 GetElement().GetLayoutObject()), | |
78 1.0f)); | |
79 } | |
80 | |
81 FloatSize ImageElementBase::DefaultDestinationSize( | |
82 const FloatSize& default_object_size) const { | |
83 ImageResourceContent* image = CachedImage(); | |
84 if (!image) | |
85 return FloatSize(); | |
86 | |
87 if (image->GetImage() && image->GetImage()->IsSVGImage()) { | |
88 return ToSVGImage(CachedImage()->GetImage()) | |
89 ->ConcreteObjectSize(default_object_size); | |
90 } | |
91 | |
92 LayoutSize size; | |
93 size = image->ImageSize(LayoutObject::ShouldRespectImageOrientation( | |
94 GetElement().GetLayoutObject()), | |
95 1.0f); | |
96 return FloatSize(size); | |
97 } | |
98 | |
99 bool ImageElementBase::IsAccelerated() const { | |
100 return false; | |
101 } | |
102 | |
103 const KURL& ImageElementBase::SourceURL() const { | |
104 return CachedImage()->GetResponse().Url(); | |
105 } | |
106 | |
107 int ImageElementBase::SourceWidth() { | |
108 SourceImageStatus status; | |
109 RefPtr<Image> image = GetSourceImageForCanvas(&status, kPreferNoAcceleration, | |
110 kSnapshotReasonUnknown, | |
111 SourceDefaultObjectSize()); | |
112 return image->width(); | |
113 } | |
114 | |
115 int ImageElementBase::SourceHeight() { | |
116 SourceImageStatus status; | |
117 RefPtr<Image> image = GetSourceImageForCanvas(&status, kPreferNoAcceleration, | |
118 kSnapshotReasonUnknown, | |
119 SourceDefaultObjectSize()); | |
120 return image->height(); | |
121 } | |
122 | |
123 bool ImageElementBase::IsOpaque() const { | |
124 Image* image = const_cast<Element&>(GetElement()).ImageContents(); | |
125 return image && image->CurrentFrameKnownToBeOpaque(); | |
126 } | |
127 | |
128 IntSize ImageElementBase::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 ImageElementBase::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 | |
162 } // namespace blink | |
OLD | NEW |