Chromium Code Reviews| 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/DOMRect.h" | 8 #include "core/dom/DOMRect.h" |
| 9 #include "core/dom/Document.h" | 9 #include "core/dom/Document.h" |
| 10 #include "core/frame/ImageBitmap.h" | 10 #include "core/frame/ImageBitmap.h" |
| 11 #include "core/frame/LocalFrame.h" | 11 #include "core/frame/LocalFrame.h" |
| 12 #include "core/html/HTMLImageElement.h" | 12 #include "core/html/HTMLImageElement.h" |
| 13 #include "core/html/HTMLVideoElement.h" | 13 #include "core/html/HTMLVideoElement.h" |
| 14 #include "core/html/canvas/CanvasImageSource.h" | 14 #include "core/html/ImageData.h" |
| 15 #include "core/loader/resource/ImageResourceContent.h" | 15 #include "core/loader/resource/ImageResourceContent.h" |
| 16 #include "platform/graphics/Image.h" | 16 #include "platform/graphics/Image.h" |
| 17 #include "third_party/skia/include/core/SkImage.h" | 17 #include "third_party/skia/include/core/SkImage.h" |
| 18 #include "third_party/skia/include/core/SkImageInfo.h" | 18 #include "third_party/skia/include/core/SkImageInfo.h" |
| 19 #include "wtf/CheckedNumeric.h" | 19 #include "wtf/CheckedNumeric.h" |
| 20 | 20 |
| 21 namespace blink { | 21 namespace blink { |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 46 return sharedBufferHandle; | 46 return sharedBufferHandle; |
| 47 } | 47 } |
| 48 | 48 |
| 49 } // anonymous namespace | 49 } // anonymous namespace |
| 50 | 50 |
| 51 ShapeDetector::ShapeDetector(LocalFrame& frame) { | 51 ShapeDetector::ShapeDetector(LocalFrame& frame) { |
| 52 DCHECK(frame.interfaceProvider()); | 52 DCHECK(frame.interfaceProvider()); |
| 53 } | 53 } |
| 54 | 54 |
| 55 ScriptPromise ShapeDetector::detect(ScriptState* scriptState, | 55 ScriptPromise ShapeDetector::detect(ScriptState* scriptState, |
| 56 const CanvasImageSourceUnion& imageSource) { | 56 const ImageBitmapSourceUnion& imageSource) { |
| 57 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); | 57 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| 58 ScriptPromise promise = resolver->promise(); | 58 ScriptPromise promise = resolver->promise(); |
| 59 | 59 |
| 60 if (imageSource.isImageData()) | |
| 61 return detectShapesOnImageData(resolver, imageSource.getAsImageData()); | |
| 62 | |
| 60 CanvasImageSource* canvasImageSource; | 63 CanvasImageSource* canvasImageSource; |
| 61 if (imageSource.isHTMLImageElement()) { | 64 if (imageSource.isHTMLImageElement()) { |
| 62 canvasImageSource = imageSource.getAsHTMLImageElement(); | 65 canvasImageSource = imageSource.getAsHTMLImageElement(); |
| 63 } else if (imageSource.isImageBitmap()) { | 66 } else if (imageSource.isImageBitmap()) { |
| 64 canvasImageSource = imageSource.getAsImageBitmap(); | 67 canvasImageSource = imageSource.getAsImageBitmap(); |
| 65 } else if (imageSource.isHTMLVideoElement()) { | 68 } else if (imageSource.isHTMLVideoElement()) { |
| 66 canvasImageSource = imageSource.getAsHTMLVideoElement(); | 69 canvasImageSource = imageSource.getAsHTMLVideoElement(); |
| 67 } else if (imageSource.isHTMLCanvasElement()) { | 70 } else if (imageSource.isHTMLCanvasElement()) { |
| 68 canvasImageSource = imageSource.getAsHTMLCanvasElement(); | 71 canvasImageSource = imageSource.getAsHTMLCanvasElement(); |
| 69 } else if (imageSource.isOffscreenCanvas()) { | 72 } else if (imageSource.isOffscreenCanvas()) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 134 | 137 |
| 135 mojo::ScopedSharedBufferHandle sharedBufferHandle = getSharedBufferOnData( | 138 mojo::ScopedSharedBufferHandle sharedBufferHandle = getSharedBufferOnData( |
| 136 resolver, pixelDataPtr, allocationSize.ValueOrDefault(0)); | 139 resolver, pixelDataPtr, allocationSize.ValueOrDefault(0)); |
| 137 if (!sharedBufferHandle->is_valid()) | 140 if (!sharedBufferHandle->is_valid()) |
| 138 return promise; | 141 return promise; |
| 139 | 142 |
| 140 return doDetect(resolver, std::move(sharedBufferHandle), image->width(), | 143 return doDetect(resolver, std::move(sharedBufferHandle), image->width(), |
| 141 image->height()); | 144 image->height()); |
| 142 } | 145 } |
| 143 | 146 |
| 147 ScriptPromise ShapeDetector::detectShapesOnImageData( | |
| 148 ScriptPromiseResolver* resolver, | |
| 149 ImageData* imageData) { | |
| 150 ScriptPromise promise = resolver->promise(); | |
|
xianglu
2016/12/14 22:32:28
Should we check origin for ImageData as well?
mcasas
2016/12/14 23:37:42
[1] tells us that ImageDatas can not be created fr
| |
| 151 | |
| 152 uint8_t* const data = imageData->data()->data(); | |
| 153 WTF::CheckedNumeric<int> allocationSize = imageData->size().area() * 4; | |
| 154 | |
| 155 mojo::ScopedSharedBufferHandle sharedBufferHandle = | |
| 156 getSharedBufferOnData(resolver, data, allocationSize.ValueOrDefault(0)); | |
| 157 if (!sharedBufferHandle->is_valid()) | |
| 158 return promise; | |
| 159 | |
| 160 return doDetect(resolver, std::move(sharedBufferHandle), imageData->width(), | |
| 161 imageData->height()); | |
| 162 } | |
| 163 | |
| 144 ScriptPromise ShapeDetector::detectShapesOnImageElement( | 164 ScriptPromise ShapeDetector::detectShapesOnImageElement( |
| 145 ScriptPromiseResolver* resolver, | 165 ScriptPromiseResolver* resolver, |
| 146 const HTMLImageElement* img) { | 166 const HTMLImageElement* img) { |
| 147 ScriptPromise promise = resolver->promise(); | 167 ScriptPromise promise = resolver->promise(); |
| 148 | 168 |
| 149 if (img->bitmapSourceSize().isZero()) { | 169 if (img->bitmapSourceSize().isZero()) { |
|
xianglu
2016/12/14 22:32:28
The promise is resolved when HTMLImageElement is e
mcasas
2016/12/14 23:37:42
Added a TODO+bug.
| |
| 150 resolver->resolve(HeapVector<Member<DOMRect>>()); | 170 resolver->resolve(HeapVector<Member<DOMRect>>()); |
| 151 return promise; | 171 return promise; |
| 152 } | 172 } |
| 153 | 173 |
| 154 ImageResourceContent* const imageResource = img->cachedImage(); | 174 ImageResourceContent* const imageResource = img->cachedImage(); |
| 155 if (!imageResource || imageResource->errorOccurred()) { | 175 if (!imageResource || imageResource->errorOccurred()) { |
| 156 resolver->reject(DOMException::create( | 176 resolver->reject(DOMException::create( |
| 157 InvalidStateError, "Failed to load or decode HTMLImageElement.")); | 177 InvalidStateError, "Failed to load or decode HTMLImageElement.")); |
| 158 return promise; | 178 return promise; |
| 159 } | 179 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 204 InvalidStateError, | 224 InvalidStateError, |
| 205 "Failed to read pixels: Unable to decompress or unsupported format.")); | 225 "Failed to read pixels: Unable to decompress or unsupported format.")); |
| 206 return promise; | 226 return promise; |
| 207 } | 227 } |
| 208 | 228 |
| 209 return doDetect(resolver, std::move(sharedBufferHandle), img->naturalWidth(), | 229 return doDetect(resolver, std::move(sharedBufferHandle), img->naturalWidth(), |
| 210 img->naturalHeight()); | 230 img->naturalHeight()); |
| 211 } | 231 } |
| 212 | 232 |
| 213 } // namespace blink | 233 } // namespace blink |
| OLD | NEW |