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

Side by Side Diff: third_party/WebKit/Source/modules/offscreencanvas2d/OffscreenCanvasRenderingContext2D.cpp

Issue 2849463005: Refactor ImageBuffer to make OffscreenCanvas match HTMLCanvasElement (Closed)
Patch Set: x Created 3 years, 7 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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698