blob: 927d8efaad91e6c4c48eb0c7e006c6adeed4c333 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "modules/shapedetection/BarcodeDetector.h"
#include "core/dom/DOMException.h"
#include "core/geometry/DOMRect.h"
#include "core/html/canvas/CanvasImageSource.h"
#include "modules/imagecapture/Point2D.h"
#include "modules/shapedetection/DetectedBarcode.h"
#include "public/platform/InterfaceProvider.h"
#include "public/platform/Platform.h"
namespace blink {
BarcodeDetector* BarcodeDetector::create() {
return new BarcodeDetector();
}
BarcodeDetector::BarcodeDetector() : ShapeDetector() {
Platform::current()->interfaceProvider()->getInterface(
mojo::MakeRequest(&m_barcodeService));
m_barcodeService.set_connection_error_handler(convertToBaseCallback(
WTF::bind(&BarcodeDetector::onBarcodeServiceConnectionError,
wrapWeakPersistent(this))));
}
ScriptPromise BarcodeDetector::doDetect(ScriptPromiseResolver* resolver,
skia::mojom::blink::BitmapPtr bitmap) {
ScriptPromise promise = resolver->promise();
if (!m_barcodeService) {
resolver->reject(DOMException::create(
NotSupportedError, "Barcode detection service unavailable."));
return promise;
}
m_barcodeServiceRequests.insert(resolver);
m_barcodeService->Detect(
std::move(bitmap), convertToBaseCallback(WTF::bind(
&BarcodeDetector::onDetectBarcodes,
wrapPersistent(this), wrapPersistent(resolver))));
return promise;
}
void BarcodeDetector::onDetectBarcodes(
ScriptPromiseResolver* resolver,
Vector<shape_detection::mojom::blink::BarcodeDetectionResultPtr>
barcodeDetectionResults) {
DCHECK(m_barcodeServiceRequests.contains(resolver));
m_barcodeServiceRequests.erase(resolver);
HeapVector<Member<DetectedBarcode>> detectedBarcodes;
for (const auto& barcode : barcodeDetectionResults) {
HeapVector<Point2D> cornerPoints;
for (const auto& corner_point : barcode->corner_points) {
Point2D point;
point.setX(corner_point->x);
point.setY(corner_point->y);
cornerPoints.push_back(point);
}
detectedBarcodes.push_back(DetectedBarcode::create(
barcode->raw_value,
DOMRect::create(barcode->bounding_box->x, barcode->bounding_box->y,
barcode->bounding_box->width,
barcode->bounding_box->height),
cornerPoints));
}
resolver->resolve(detectedBarcodes);
}
void BarcodeDetector::onBarcodeServiceConnectionError() {
for (const auto& request : m_barcodeServiceRequests) {
request->reject(DOMException::create(NotSupportedError,
"Barcode Detection not implemented."));
}
m_barcodeServiceRequests.clear();
m_barcodeService.reset();
}
DEFINE_TRACE(BarcodeDetector) {
ShapeDetector::trace(visitor);
visitor->trace(m_barcodeServiceRequests);
}
} // namespace blink