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()->GetImageBuffer(); |
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 const_cast<CanvasRenderingContextHost*>(host()) |
108 IntSize surface_size(Width(), Height()); | 106 ->GetOrCreateImageBuffer(); |
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 } | 107 } |
133 | 108 |
134 RefPtr<StaticBitmapImage> | 109 RefPtr<StaticBitmapImage> |
135 OffscreenCanvasRenderingContext2D::TransferToStaticBitmapImage() { | 110 OffscreenCanvasRenderingContext2D::TransferToStaticBitmapImage() { |
136 if (!GetImageBuffer()) | 111 if (!GetImageBuffer()) |
137 return nullptr; | 112 return nullptr; |
138 sk_sp<SkImage> sk_image = image_buffer_->NewSkImageSnapshot( | 113 sk_sp<SkImage> sk_image = host()->GetImageBuffer()->NewSkImageSnapshot( |
139 kPreferAcceleration, kSnapshotReasonTransferToImageBitmap); | 114 kPreferAcceleration, kSnapshotReasonTransferToImageBitmap); |
140 RefPtr<StaticBitmapImage> image = | 115 RefPtr<StaticBitmapImage> image = |
141 StaticBitmapImage::Create(std::move(sk_image)); | 116 StaticBitmapImage::Create(std::move(sk_image)); |
142 image->SetOriginClean(this->OriginClean()); | 117 image->SetOriginClean(this->OriginClean()); |
143 return image; | 118 return image; |
144 } | 119 } |
145 | 120 |
146 ImageBitmap* OffscreenCanvasRenderingContext2D::TransferToImageBitmap( | 121 ImageBitmap* OffscreenCanvasRenderingContext2D::TransferToImageBitmap( |
147 ScriptState* script_state) { | 122 ScriptState* script_state) { |
148 UseCounter::Feature feature = | 123 UseCounter::Feature feature = |
149 UseCounter::kOffscreenCanvasTransferToImageBitmap2D; | 124 UseCounter::kOffscreenCanvasTransferToImageBitmap2D; |
150 UseCounter::Count(ExecutionContext::From(script_state), feature); | 125 UseCounter::Count(ExecutionContext::From(script_state), feature); |
151 RefPtr<StaticBitmapImage> image = TransferToStaticBitmapImage(); | 126 RefPtr<StaticBitmapImage> image = TransferToStaticBitmapImage(); |
152 if (!image) | 127 if (!image) |
153 return nullptr; | 128 return nullptr; |
154 image_buffer_.reset(); // "Transfer" means no retained buffer | 129 host()->DiscardImageBuffer(); // "Transfer" means no retained buffer |
155 needs_matrix_clip_restore_ = true; | |
156 return ImageBitmap::Create(std::move(image)); | 130 return ImageBitmap::Create(std::move(image)); |
157 } | 131 } |
158 | 132 |
159 PassRefPtr<Image> OffscreenCanvasRenderingContext2D::GetImage( | 133 PassRefPtr<Image> OffscreenCanvasRenderingContext2D::GetImage( |
160 AccelerationHint hint, | 134 AccelerationHint hint, |
161 SnapshotReason reason) const { | 135 SnapshotReason reason) const { |
162 if (!GetImageBuffer()) | 136 if (!GetImageBuffer()) |
163 return nullptr; | 137 return nullptr; |
164 sk_sp<SkImage> sk_image = image_buffer_->NewSkImageSnapshot(hint, reason); | 138 sk_sp<SkImage> sk_image = |
| 139 host()->GetImageBuffer()->NewSkImageSnapshot(hint, reason); |
165 RefPtr<StaticBitmapImage> image = | 140 RefPtr<StaticBitmapImage> image = |
166 StaticBitmapImage::Create(std::move(sk_image)); | 141 StaticBitmapImage::Create(std::move(sk_image)); |
167 return image; | 142 return image; |
168 } | 143 } |
169 | 144 |
170 ImageData* OffscreenCanvasRenderingContext2D::ToImageData( | 145 ImageData* OffscreenCanvasRenderingContext2D::ToImageData( |
171 SnapshotReason reason) { | 146 SnapshotReason reason) { |
172 if (!GetImageBuffer()) | 147 if (!GetImageBuffer()) |
173 return nullptr; | 148 return nullptr; |
174 sk_sp<SkImage> snapshot = | 149 sk_sp<SkImage> snapshot = host()->GetImageBuffer()->NewSkImageSnapshot( |
175 image_buffer_->NewSkImageSnapshot(kPreferNoAcceleration, reason); | 150 kPreferNoAcceleration, reason); |
176 ImageData* image_data = nullptr; | 151 ImageData* image_data = nullptr; |
177 if (snapshot) { | 152 if (snapshot) { |
178 image_data = ImageData::Create(host()->Size()); | 153 image_data = ImageData::Create(host()->Size()); |
179 SkImageInfo image_info = | 154 SkImageInfo image_info = |
180 SkImageInfo::Make(this->Width(), this->Height(), kRGBA_8888_SkColorType, | 155 SkImageInfo::Make(this->Width(), this->Height(), kRGBA_8888_SkColorType, |
181 kUnpremul_SkAlphaType); | 156 kUnpremul_SkAlphaType); |
182 snapshot->readPixels(image_info, image_data->data()->Data(), | 157 snapshot->readPixels(image_info, image_data->data()->Data(), |
183 image_info.minRowBytes(), 0, 0); | 158 image_info.minRowBytes(), 0, 0); |
184 } | 159 } |
185 return image_data; | 160 return image_data; |
(...skipping 11 matching lines...) Expand all Loading... |
197 } | 172 } |
198 | 173 |
199 PaintCanvas* OffscreenCanvasRenderingContext2D::DrawingCanvas() const { | 174 PaintCanvas* OffscreenCanvasRenderingContext2D::DrawingCanvas() const { |
200 ImageBuffer* buffer = GetImageBuffer(); | 175 ImageBuffer* buffer = GetImageBuffer(); |
201 if (!buffer) | 176 if (!buffer) |
202 return nullptr; | 177 return nullptr; |
203 return GetImageBuffer()->Canvas(); | 178 return GetImageBuffer()->Canvas(); |
204 } | 179 } |
205 | 180 |
206 PaintCanvas* OffscreenCanvasRenderingContext2D::ExistingDrawingCanvas() const { | 181 PaintCanvas* OffscreenCanvasRenderingContext2D::ExistingDrawingCanvas() const { |
207 if (!image_buffer_) | 182 if (!host()->GetImageBuffer()) |
208 return nullptr; | 183 return nullptr; |
209 return image_buffer_->Canvas(); | 184 return host()->GetImageBuffer()->Canvas(); |
210 } | 185 } |
211 | 186 |
212 void OffscreenCanvasRenderingContext2D::DisableDeferral(DisableDeferralReason) { | 187 void OffscreenCanvasRenderingContext2D::DisableDeferral(DisableDeferralReason) { |
213 } | 188 } |
214 | 189 |
215 AffineTransform OffscreenCanvasRenderingContext2D::BaseTransform() const { | 190 AffineTransform OffscreenCanvasRenderingContext2D::BaseTransform() const { |
216 if (!image_buffer_) | 191 if (!host()->GetImageBuffer()) |
217 return AffineTransform(); // identity | 192 return AffineTransform(); // identity |
218 return image_buffer_->BaseTransform(); | 193 return host()->GetImageBuffer()->BaseTransform(); |
219 } | 194 } |
220 | 195 |
221 void OffscreenCanvasRenderingContext2D::DidDraw(const SkIRect& dirty_rect) {} | 196 void OffscreenCanvasRenderingContext2D::DidDraw(const SkIRect& dirty_rect) {} |
222 | 197 |
223 bool OffscreenCanvasRenderingContext2D::StateHasFilter() { | 198 bool OffscreenCanvasRenderingContext2D::StateHasFilter() { |
224 return GetState().HasFilterForOffscreenCanvas(host()->Size()); | 199 return GetState().HasFilterForOffscreenCanvas(host()->Size()); |
225 } | 200 } |
226 | 201 |
227 sk_sp<SkImageFilter> OffscreenCanvasRenderingContext2D::StateGetFilter() { | 202 sk_sp<SkImageFilter> OffscreenCanvasRenderingContext2D::StateGetFilter() { |
228 return GetState().GetFilterForOffscreenCanvas(host()->Size()); | 203 return GetState().GetFilterForOffscreenCanvas(host()->Size()); |
229 } | 204 } |
230 | 205 |
231 void OffscreenCanvasRenderingContext2D::ValidateStateStack() const { | 206 void OffscreenCanvasRenderingContext2D::ValidateStateStack() const { |
232 #if DCHECK_IS_ON() | 207 #if DCHECK_IS_ON() |
233 if (PaintCanvas* sk_canvas = ExistingDrawingCanvas()) { | 208 if (PaintCanvas* sk_canvas = ExistingDrawingCanvas()) { |
234 DCHECK_EQ(static_cast<size_t>(sk_canvas->getSaveCount()), | 209 DCHECK_EQ(static_cast<size_t>(sk_canvas->getSaveCount()), |
235 state_stack_.size() + 1); | 210 state_stack_.size() + 1); |
236 } | 211 } |
237 #endif | 212 #endif |
238 } | 213 } |
239 | 214 |
240 bool OffscreenCanvasRenderingContext2D::isContextLost() const { | 215 bool OffscreenCanvasRenderingContext2D::isContextLost() const { |
241 return false; | 216 return false; |
242 } | 217 } |
243 | 218 |
244 bool OffscreenCanvasRenderingContext2D::IsPaintable() const { | 219 bool OffscreenCanvasRenderingContext2D::IsPaintable() const { |
245 return this->GetImageBuffer(); | 220 return GetImageBuffer(); |
246 } | 221 } |
247 | 222 |
248 CanvasColorSpace OffscreenCanvasRenderingContext2D::ColorSpace() const { | 223 CanvasColorSpace OffscreenCanvasRenderingContext2D::ColorSpace() const { |
249 return color_params().color_space(); | 224 return color_params().color_space(); |
250 } | 225 } |
251 | 226 |
252 String OffscreenCanvasRenderingContext2D::ColorSpaceAsString() const { | 227 String OffscreenCanvasRenderingContext2D::ColorSpaceAsString() const { |
253 return CanvasRenderingContext::ColorSpaceAsString(); | 228 return CanvasRenderingContext::ColorSpaceAsString(); |
254 } | 229 } |
255 | 230 |
256 CanvasPixelFormat OffscreenCanvasRenderingContext2D::PixelFormat() const { | 231 CanvasPixelFormat OffscreenCanvasRenderingContext2D::PixelFormat() const { |
257 return color_params().pixel_format(); | 232 return color_params().pixel_format(); |
258 } | 233 } |
259 | 234 |
260 bool OffscreenCanvasRenderingContext2D::IsAccelerated() const { | 235 bool OffscreenCanvasRenderingContext2D::IsAccelerated() const { |
261 return image_buffer_ && image_buffer_->IsAccelerated(); | 236 return host()->GetImageBuffer() && host()->GetImageBuffer()->IsAccelerated(); |
262 } | 237 } |
263 } | 238 } |
OLD | NEW |