OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h" | 5 #include "modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.h" |
6 | 6 |
7 #include "bindings/modules/v8/OffscreenCanvasRenderingContext2DOrWebGLRenderingC
ontextOrWebGL2RenderingContext.h" | 7 #include "bindings/modules/v8/OffscreenCanvasRenderingContext2DOrWebGLRenderingC
ontextOrWebGL2RenderingContext.h" |
8 #include "core/dom/ExecutionContext.h" | 8 #include "core/dom/ExecutionContext.h" |
9 #include "core/frame/ImageBitmap.h" | 9 #include "core/frame/ImageBitmap.h" |
10 #include "core/frame/Settings.h" | 10 #include "core/frame/Settings.h" |
11 #include "core/workers/WorkerGlobalScope.h" | 11 #include "core/workers/WorkerGlobalScope.h" |
12 #include "core/workers/WorkerSettings.h" | 12 #include "core/workers/WorkerSettings.h" |
13 #include "platform/graphics/ImageBuffer.h" | 13 #include "platform/graphics/ImageBuffer.h" |
14 #include "platform/graphics/StaticBitmapImage.h" | 14 #include "platform/graphics/StaticBitmapImage.h" |
15 #include "platform/graphics/UnacceleratedImageBufferSurface.h" | |
16 #include "platform/graphics/gpu/AcceleratedImageBufferSurface.h" | |
17 #include "platform/graphics/paint/PaintCanvas.h" | 15 #include "platform/graphics/paint/PaintCanvas.h" |
18 #include "platform/wtf/Assertions.h" | 16 #include "platform/wtf/Assertions.h" |
19 #include "platform/wtf/CurrentTime.h" | 17 #include "platform/wtf/CurrentTime.h" |
20 | 18 |
21 namespace blink { | 19 namespace blink { |
22 | 20 |
23 OffscreenCanvasRenderingContext2D::~OffscreenCanvasRenderingContext2D() {} | 21 OffscreenCanvasRenderingContext2D::~OffscreenCanvasRenderingContext2D() {} |
24 | 22 |
25 OffscreenCanvasRenderingContext2D::OffscreenCanvasRenderingContext2D( | 23 OffscreenCanvasRenderingContext2D::OffscreenCanvasRenderingContext2D( |
26 ScriptState* script_state, | 24 ScriptState* script_state, |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 | 81 |
84 int OffscreenCanvasRenderingContext2D::Width() const { | 82 int OffscreenCanvasRenderingContext2D::Width() const { |
85 return host()->Size().Width(); | 83 return host()->Size().Width(); |
86 } | 84 } |
87 | 85 |
88 int OffscreenCanvasRenderingContext2D::Height() const { | 86 int OffscreenCanvasRenderingContext2D::Height() const { |
89 return host()->Size().Height(); | 87 return host()->Size().Height(); |
90 } | 88 } |
91 | 89 |
92 bool OffscreenCanvasRenderingContext2D::HasImageBuffer() const { | 90 bool OffscreenCanvasRenderingContext2D::HasImageBuffer() const { |
93 return !!image_buffer_; | 91 return host()->HasImageBuffer(); |
94 } | 92 } |
95 | 93 |
96 void OffscreenCanvasRenderingContext2D::Reset() { | 94 void OffscreenCanvasRenderingContext2D::Reset() { |
97 image_buffer_ = nullptr; | 95 host()->DiscardImageBuffer(); |
98 BaseRenderingContext2D::Reset(); | 96 BaseRenderingContext2D::Reset(); |
99 } | 97 } |
100 | 98 |
101 ColorBehavior OffscreenCanvasRenderingContext2D::DrawImageColorBehavior() | 99 ColorBehavior OffscreenCanvasRenderingContext2D::DrawImageColorBehavior() |
102 const { | 100 const { |
103 return CanvasRenderingContext::ColorBehaviorForMediaDrawnToCanvas(); | 101 return CanvasRenderingContext::ColorBehaviorForMediaDrawnToCanvas(); |
104 } | 102 } |
105 | 103 |
106 ImageBuffer* OffscreenCanvasRenderingContext2D::GetImageBuffer() const { | 104 ImageBuffer* OffscreenCanvasRenderingContext2D::GetImageBuffer() const { |
107 if (!image_buffer_) { | 105 return host()->GetImageBuffer(); |
108 IntSize surface_size(Width(), Height()); | |
109 OpacityMode opacity_mode = HasAlpha() ? kNonOpaque : kOpaque; | |
110 std::unique_ptr<ImageBufferSurface> surface; | |
111 if (RuntimeEnabledFeatures::accelerated2dCanvasEnabled()) { | |
112 surface.reset( | |
113 new AcceleratedImageBufferSurface(surface_size, opacity_mode)); | |
114 } | |
115 | |
116 if (!surface || !surface->IsValid()) { | |
117 surface.reset(new UnacceleratedImageBufferSurface( | |
118 surface_size, opacity_mode, kInitializeImagePixels)); | |
119 } | |
120 | |
121 OffscreenCanvasRenderingContext2D* non_const_this = | |
122 const_cast<OffscreenCanvasRenderingContext2D*>(this); | |
123 non_const_this->image_buffer_ = ImageBuffer::Create(std::move(surface)); | |
124 | |
125 if (needs_matrix_clip_restore_) { | |
126 RestoreMatrixClipStack(image_buffer_->Canvas()); | |
127 non_const_this->needs_matrix_clip_restore_ = false; | |
128 } | |
129 } | |
130 | |
131 return image_buffer_.get(); | |
132 } | 106 } |
133 | 107 |
134 RefPtr<StaticBitmapImage> | 108 RefPtr<StaticBitmapImage> |
135 OffscreenCanvasRenderingContext2D::TransferToStaticBitmapImage() { | 109 OffscreenCanvasRenderingContext2D::TransferToStaticBitmapImage() { |
136 if (!GetImageBuffer()) | 110 if (!GetImageBuffer()) |
137 return nullptr; | 111 return nullptr; |
138 sk_sp<SkImage> sk_image = image_buffer_->NewSkImageSnapshot( | 112 sk_sp<SkImage> sk_image = host()->GetImageBuffer()->NewSkImageSnapshot( |
139 kPreferAcceleration, kSnapshotReasonTransferToImageBitmap); | 113 kPreferAcceleration, kSnapshotReasonTransferToImageBitmap); |
140 RefPtr<StaticBitmapImage> image = | 114 RefPtr<StaticBitmapImage> image = |
141 StaticBitmapImage::Create(std::move(sk_image)); | 115 StaticBitmapImage::Create(std::move(sk_image)); |
142 image->SetOriginClean(this->OriginClean()); | 116 image->SetOriginClean(this->OriginClean()); |
143 return image; | 117 return image; |
144 } | 118 } |
145 | 119 |
146 ImageBitmap* OffscreenCanvasRenderingContext2D::TransferToImageBitmap( | 120 ImageBitmap* OffscreenCanvasRenderingContext2D::TransferToImageBitmap( |
147 ScriptState* script_state) { | 121 ScriptState* script_state) { |
148 UseCounter::Feature feature = | 122 UseCounter::Feature feature = |
149 UseCounter::kOffscreenCanvasTransferToImageBitmap2D; | 123 UseCounter::kOffscreenCanvasTransferToImageBitmap2D; |
150 UseCounter::Count(ExecutionContext::From(script_state), feature); | 124 UseCounter::Count(ExecutionContext::From(script_state), feature); |
151 RefPtr<StaticBitmapImage> image = TransferToStaticBitmapImage(); | 125 RefPtr<StaticBitmapImage> image = TransferToStaticBitmapImage(); |
152 if (!image) | 126 if (!image) |
153 return nullptr; | 127 return nullptr; |
154 image_buffer_.reset(); // "Transfer" means no retained buffer | 128 host()->DiscardImageBuffer(); // "Transfer" means no retained buffer |
155 needs_matrix_clip_restore_ = true; | |
156 return ImageBitmap::Create(std::move(image)); | 129 return ImageBitmap::Create(std::move(image)); |
157 } | 130 } |
158 | 131 |
159 PassRefPtr<Image> OffscreenCanvasRenderingContext2D::GetImage( | 132 PassRefPtr<Image> OffscreenCanvasRenderingContext2D::GetImage( |
160 AccelerationHint hint, | 133 AccelerationHint hint, |
161 SnapshotReason reason) const { | 134 SnapshotReason reason) const { |
162 if (!GetImageBuffer()) | 135 if (!GetImageBuffer()) |
163 return nullptr; | 136 return nullptr; |
164 sk_sp<SkImage> sk_image = image_buffer_->NewSkImageSnapshot(hint, reason); | 137 sk_sp<SkImage> sk_image = |
| 138 host()->GetImageBuffer()->NewSkImageSnapshot(hint, reason); |
165 RefPtr<StaticBitmapImage> image = | 139 RefPtr<StaticBitmapImage> image = |
166 StaticBitmapImage::Create(std::move(sk_image)); | 140 StaticBitmapImage::Create(std::move(sk_image)); |
167 return image; | 141 return image; |
168 } | 142 } |
169 | 143 |
170 ImageData* OffscreenCanvasRenderingContext2D::ToImageData( | 144 ImageData* OffscreenCanvasRenderingContext2D::ToImageData( |
171 SnapshotReason reason) { | 145 SnapshotReason reason) { |
172 if (!GetImageBuffer()) | 146 if (!GetImageBuffer()) |
173 return nullptr; | 147 return nullptr; |
174 sk_sp<SkImage> snapshot = | 148 sk_sp<SkImage> snapshot = host()->GetImageBuffer()->NewSkImageSnapshot( |
175 image_buffer_->NewSkImageSnapshot(kPreferNoAcceleration, reason); | 149 kPreferNoAcceleration, reason); |
176 ImageData* image_data = nullptr; | 150 ImageData* image_data = nullptr; |
177 if (snapshot) { | 151 if (snapshot) { |
178 image_data = ImageData::Create(host()->Size()); | 152 image_data = ImageData::Create(host()->Size()); |
179 SkImageInfo image_info = | 153 SkImageInfo image_info = |
180 SkImageInfo::Make(this->Width(), this->Height(), kRGBA_8888_SkColorType, | 154 SkImageInfo::Make(this->Width(), this->Height(), kRGBA_8888_SkColorType, |
181 kUnpremul_SkAlphaType); | 155 kUnpremul_SkAlphaType); |
182 snapshot->readPixels(image_info, image_data->data()->Data(), | 156 snapshot->readPixels(image_info, image_data->data()->Data(), |
183 image_info.minRowBytes(), 0, 0); | 157 image_info.minRowBytes(), 0, 0); |
184 } | 158 } |
185 return image_data; | 159 return image_data; |
(...skipping 11 matching lines...) Expand all Loading... |
197 } | 171 } |
198 | 172 |
199 PaintCanvas* OffscreenCanvasRenderingContext2D::DrawingCanvas() const { | 173 PaintCanvas* OffscreenCanvasRenderingContext2D::DrawingCanvas() const { |
200 ImageBuffer* buffer = GetImageBuffer(); | 174 ImageBuffer* buffer = GetImageBuffer(); |
201 if (!buffer) | 175 if (!buffer) |
202 return nullptr; | 176 return nullptr; |
203 return GetImageBuffer()->Canvas(); | 177 return GetImageBuffer()->Canvas(); |
204 } | 178 } |
205 | 179 |
206 PaintCanvas* OffscreenCanvasRenderingContext2D::ExistingDrawingCanvas() const { | 180 PaintCanvas* OffscreenCanvasRenderingContext2D::ExistingDrawingCanvas() const { |
207 if (!image_buffer_) | 181 if (!host()->HasImageBuffer()) |
208 return nullptr; | 182 return nullptr; |
209 return image_buffer_->Canvas(); | 183 return host()->GetImageBuffer()->Canvas(); |
210 } | 184 } |
211 | 185 |
212 void OffscreenCanvasRenderingContext2D::DisableDeferral(DisableDeferralReason) { | 186 void OffscreenCanvasRenderingContext2D::DisableDeferral(DisableDeferralReason) { |
213 } | 187 } |
214 | 188 |
215 AffineTransform OffscreenCanvasRenderingContext2D::BaseTransform() const { | 189 AffineTransform OffscreenCanvasRenderingContext2D::BaseTransform() const { |
216 if (!image_buffer_) | 190 if (!host()->HasImageBuffer()) |
217 return AffineTransform(); // identity | 191 return AffineTransform(); // identity |
218 return image_buffer_->BaseTransform(); | 192 return host()->GetImageBuffer()->BaseTransform(); |
219 } | 193 } |
220 | 194 |
221 void OffscreenCanvasRenderingContext2D::DidDraw(const SkIRect& dirty_rect) {} | 195 void OffscreenCanvasRenderingContext2D::DidDraw(const SkIRect& dirty_rect) {} |
222 | 196 |
223 bool OffscreenCanvasRenderingContext2D::StateHasFilter() { | 197 bool OffscreenCanvasRenderingContext2D::StateHasFilter() { |
224 return GetState().HasFilterForOffscreenCanvas(host()->Size()); | 198 return GetState().HasFilterForOffscreenCanvas(host()->Size()); |
225 } | 199 } |
226 | 200 |
227 sk_sp<SkImageFilter> OffscreenCanvasRenderingContext2D::StateGetFilter() { | 201 sk_sp<SkImageFilter> OffscreenCanvasRenderingContext2D::StateGetFilter() { |
228 return GetState().GetFilterForOffscreenCanvas(host()->Size()); | 202 return GetState().GetFilterForOffscreenCanvas(host()->Size()); |
(...skipping 22 matching lines...) Expand all Loading... |
251 | 225 |
252 String OffscreenCanvasRenderingContext2D::ColorSpaceAsString() const { | 226 String OffscreenCanvasRenderingContext2D::ColorSpaceAsString() const { |
253 return CanvasRenderingContext::ColorSpaceAsString(); | 227 return CanvasRenderingContext::ColorSpaceAsString(); |
254 } | 228 } |
255 | 229 |
256 CanvasPixelFormat OffscreenCanvasRenderingContext2D::PixelFormat() const { | 230 CanvasPixelFormat OffscreenCanvasRenderingContext2D::PixelFormat() const { |
257 return color_params().pixel_format(); | 231 return color_params().pixel_format(); |
258 } | 232 } |
259 | 233 |
260 bool OffscreenCanvasRenderingContext2D::IsAccelerated() const { | 234 bool OffscreenCanvasRenderingContext2D::IsAccelerated() const { |
261 return image_buffer_ && image_buffer_->IsAccelerated(); | 235 return host()->HasImageBuffer() && host()->GetImageBuffer()->IsAccelerated(); |
262 } | 236 } |
263 } | 237 } |
OLD | NEW |