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

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()->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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698