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

Side by Side Diff: third_party/WebKit/Source/core/html/canvas/CanvasImageElementSource.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
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698