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/shapedetection/ShapeDetector.h" | 5 #include "modules/shapedetection/ShapeDetector.h" |
6 | 6 |
7 #include "core/dom/DOMException.h" | 7 #include "core/dom/DOMException.h" |
8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
9 #include "core/dom/ExecutionContext.h" | 9 #include "core/dom/ExecutionContext.h" |
10 #include "core/frame/ImageBitmap.h" | 10 #include "core/frame/ImageBitmap.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 if (size.IsEmpty()) { | 109 if (size.IsEmpty()) { |
110 resolver->Resolve(HeapVector<Member<DOMRect>>()); | 110 resolver->Resolve(HeapVector<Member<DOMRect>>()); |
111 return promise; | 111 return promise; |
112 } | 112 } |
113 | 113 |
114 SkPixmap pixmap; | 114 SkPixmap pixmap; |
115 RefPtr<Uint8Array> pixel_data; | 115 RefPtr<Uint8Array> pixel_data; |
116 uint8_t* pixel_data_ptr = nullptr; | 116 uint8_t* pixel_data_ptr = nullptr; |
117 WTF::CheckedNumeric<int> allocation_size = 0; | 117 WTF::CheckedNumeric<int> allocation_size = 0; |
118 | 118 |
119 sk_sp<SkImage> sk_image = image->ImageForCurrentFrame(); | 119 // makeNonTextureImage() will make a raster copy of ImageForCurrentFrame() if |
120 // Use |skImage|'s pixels if it has direct access to them. | 120 // needed, otherwise returning the original SkImage. |
121 if (sk_image->peekPixels(&pixmap)) { | 121 const sk_sp<SkImage> sk_image = |
| 122 image->ImageForCurrentFrame()->makeNonTextureImage(); |
| 123 if (sk_image && sk_image->peekPixels(&pixmap)) { |
122 pixel_data_ptr = static_cast<uint8_t*>(pixmap.writable_addr()); | 124 pixel_data_ptr = static_cast<uint8_t*>(pixmap.writable_addr()); |
123 allocation_size = pixmap.getSafeSize(); | 125 allocation_size = pixmap.getSafeSize(); |
124 } else if (image_source.isImageBitmap()) { | |
125 ImageBitmap* image_bitmap = image_source.getAsImageBitmap(); | |
126 pixel_data = image_bitmap->CopyBitmapData(image_bitmap->IsPremultiplied() | |
127 ? kPremultiplyAlpha | |
128 : kDontPremultiplyAlpha, | |
129 kN32ColorType); | |
130 pixel_data_ptr = pixel_data->Data(); | |
131 allocation_size = image_bitmap->Size().Area() * 4 /* bytes per pixel */; | |
132 } else { | 126 } else { |
133 // TODO(mcasas): retrieve the pixels from elsewhere. | 127 // TODO(mcasas): retrieve the pixels from elsewhere. |
134 NOTREACHED(); | 128 NOTREACHED(); |
135 resolver->Reject(DOMException::Create( | 129 resolver->Reject(DOMException::Create( |
136 kInvalidStateError, "Failed to get pixels for current frame.")); | 130 kInvalidStateError, "Failed to get pixels for current frame.")); |
137 return promise; | 131 return promise; |
138 } | 132 } |
139 | 133 |
140 mojo::ScopedSharedBufferHandle shared_buffer_handle = GetSharedBufferOnData( | 134 mojo::ScopedSharedBufferHandle shared_buffer_handle = GetSharedBufferOnData( |
141 resolver, pixel_data_ptr, allocation_size.ValueOrDefault(0)); | 135 resolver, pixel_data_ptr, allocation_size.ValueOrDefault(0)); |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 kInvalidStateError, | 225 kInvalidStateError, |
232 "Failed to read pixels: Unable to decompress or unsupported format.")); | 226 "Failed to read pixels: Unable to decompress or unsupported format.")); |
233 return promise; | 227 return promise; |
234 } | 228 } |
235 | 229 |
236 return DoDetect(resolver, std::move(shared_buffer_handle), | 230 return DoDetect(resolver, std::move(shared_buffer_handle), |
237 img->naturalWidth(), img->naturalHeight()); | 231 img->naturalWidth(), img->naturalHeight()); |
238 } | 232 } |
239 | 233 |
240 } // namespace blink | 234 } // namespace blink |
OLD | NEW |