| 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 |