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/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 GetImageLoader().GetImage(); | |
15 } | |
16 | |
17 const Element& CanvasImageElementSource::GetElement() const { | |
18 return *GetImageLoader().GetElement(); | |
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& default_object_size) const { | |
30 if (!GetImageLoader().ImageComplete() || !CachedImage()) { | |
31 *status = kIncompleteSourceImageStatus; | |
32 return nullptr; | |
33 } | |
34 | |
35 if (CachedImage()->ErrorOccurred()) { | |
36 *status = kUndecodableSourceImageStatus; | |
37 return nullptr; | |
38 } | |
39 | |
40 RefPtr<Image> source_image; | |
41 if (CachedImage()->GetImage()->IsSVGImage()) { | |
42 UseCounter::Count(GetElement().GetDocument(), UseCounter::kSVGInCanvas2D); | |
43 SVGImage* svg_image = ToSVGImage(CachedImage()->GetImage()); | |
44 IntSize image_size = | |
45 RoundedIntSize(svg_image->ConcreteObjectSize(default_object_size)); | |
46 source_image = SVGImageForContainer::Create( | |
47 svg_image, image_size, 1, | |
48 GetElement().GetDocument().CompleteURL(GetElement().ImageSourceURL())); | |
49 } else { | |
50 source_image = CachedImage()->GetImage(); | |
51 } | |
52 | |
53 *status = kNormalSourceImageStatus; | |
54 return source_image->ImageForDefaultFrame(); | |
55 } | |
56 | |
57 bool CanvasImageElementSource::WouldTaintOrigin( | |
58 SecurityOrigin* destination_security_origin) const { | |
59 return CachedImage() && | |
60 !CachedImage()->IsAccessAllowed(destination_security_origin); | |
61 } | |
62 | |
63 FloatSize CanvasImageElementSource::ElementSize( | |
64 const FloatSize& default_object_size) 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(default_object_size); | |
72 } | |
73 | |
74 return FloatSize(image->ImageSize(LayoutObject::ShouldRespectImageOrientation( | |
75 GetElement().GetLayoutObject()), | |
76 1.0f)); | |
77 } | |
78 | |
79 FloatSize CanvasImageElementSource::DefaultDestinationSize( | |
80 const FloatSize& default_object_size) 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(default_object_size); | |
88 } | |
89 | |
90 LayoutSize size; | |
91 size = image->ImageSize(LayoutObject::ShouldRespectImageOrientation( | |
92 GetElement().GetLayoutObject()), | |
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()->GetResponse().Url(); | |
103 } | |
104 | |
105 int CanvasImageElementSource::SourceWidth() { | |
106 SourceImageStatus status; | |
107 RefPtr<Image> image = GetSourceImageForCanvas(&status, kPreferNoAcceleration, | |
108 kSnapshotReasonUnknown, | |
109 SourceDefaultObjectSize()); | |
110 return image->width(); | |
111 } | |
112 | |
113 int CanvasImageElementSource::SourceHeight() { | |
114 SourceImageStatus status; | |
115 RefPtr<Image> image = GetSourceImageForCanvas(&status, kPreferNoAcceleration, | |
116 kSnapshotReasonUnknown, | |
117 SourceDefaultObjectSize()); | |
118 return image->height(); | |
119 } | |
120 | |
121 bool CanvasImageElementSource::IsOpaque() const { | |
122 Image* image = const_cast<Element&>(GetElement()).ImageContents(); | |
123 return image && image->CurrentFrameKnownToBeOpaque(); | |
124 } | |
125 | |
126 } // namespace blink | |
OLD | NEW |