# Copyright 2017 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.

import("//services/service_manager/public/cpp/service.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//testing/test.gni")

source_set("lib") {
  sources = [
    "shape_detection_service.cc",
    "shape_detection_service.h",
    "text_detection_impl.h",
  ]

  if (is_mac) {
    sources += [
      "barcode_detection_impl_mac.h",
      "barcode_detection_impl_mac.mm",
      "barcode_detection_impl_mac_vision.h",
      "barcode_detection_impl_mac_vision.mm",
      "barcode_detection_provider_mac.h",
      "barcode_detection_provider_mac.mm",
      "detection_utils_mac.h",
      "detection_utils_mac.mm",
      "face_detection_impl_mac.h",
      "face_detection_impl_mac.mm",
      "face_detection_impl_mac_vision.h",
      "face_detection_impl_mac_vision.mm",
      "face_detection_provider_mac.h",
      "face_detection_provider_mac.mm",
      "text_detection_impl_mac.h",
      "text_detection_impl_mac.mm",
    ]
    libs = [ "QuartzCore.framework" ]
  } else if (is_win) {
    sources += [
      "barcode_detection_provider_impl.cc",
      "barcode_detection_provider_impl.h",
      "detection_utils_win.cc",
      "detection_utils_win.h",
      "face_detection_impl_win.cc",
      "face_detection_impl_win.h",
      "face_detection_provider_win.cc",
      "face_detection_provider_win.h",
      "text_detection_impl_win.cc",
      "text_detection_impl_win.h",
    ]
  } else {
    sources += [
      "barcode_detection_provider_impl.cc",
      "barcode_detection_provider_impl.h",
      "face_detection_provider_impl.cc",
      "face_detection_provider_impl.h",
      "text_detection_impl.cc",
    ]
  }

  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  deps = [
    "//mojo/public/cpp/bindings",
    "//ui/gfx",
    "//ui/gfx/geometry",
  ]

  public_deps = [
    "//base",
    "//media/capture",
    "//services/service_manager/public/cpp",
    "//services/shape_detection/public/mojom",
  ]

  if (is_android) {
    deps += [ ":shape_detection_jni_headers" ]
  }
}

if (is_android) {
  generate_jni("shape_detection_jni_headers") {
    sources = [
      "android/java/src/org/chromium/shape_detection/InterfaceRegistrar.java",
    ]
    jni_package = "shape_detection"
  }

  android_library("shape_detection_java") {
    java_files = [
      "android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java",
      "android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java",
      "android/java/src/org/chromium/shape_detection/FaceDetectionImpl.java",
      "android/java/src/org/chromium/shape_detection/FaceDetectionImplGmsCore.java",
      "android/java/src/org/chromium/shape_detection/FaceDetectionProviderImpl.java",
      "android/java/src/org/chromium/shape_detection/InterfaceRegistrar.java",
      "android/java/src/org/chromium/shape_detection/BitmapUtils.java",
      "android/java/src/org/chromium/shape_detection/TextDetectionImpl.java",
    ]

    deps = [
      "$google_play_services_package:google_play_services_base_java",
      "$google_play_services_package:google_play_services_basement_java",
      "$google_play_services_package:google_play_services_vision_common_java",
      "$google_play_services_package:google_play_services_vision_java",
      "//base:base_java",
      "//mojo/public/java:base_java",
      "//mojo/public/java:bindings_java",
      "//mojo/public/java:system_java",
      "//mojo/public/java/system:system_impl_java",
      "//services/service_manager/public/java:service_manager_java",
      "//services/service_manager/public/mojom:mojom_java",
      "//services/shape_detection/public/mojom:mojom_java",
      "//skia/public/interfaces:interfaces_java",
      "//ui/gfx/geometry/mojo:mojo_java",
    ]
  }
}

service_manifest("manifest") {
  name = "shape_detection"
  source = "manifest.json"
}

source_set("tests") {
  testonly = true
  sources = [
    "barcode_detection_impl_mac_unittest.mm",
    "face_detection_impl_mac_unittest.mm",
    "face_detection_impl_win_unittest.cc",
    "text_detection_impl_mac_unittest.mm",
    "text_detection_impl_win_unittest.cc",
  ]
  if (is_mac) {
    libs = [
      "CoreFoundation.framework",
      "CoreGraphics.framework",
      "QuartzCore.framework",
    ]
  }

  deps = [
    ":lib",
    "//base",
    "//base/test:test_support",
    "//skia",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/gfx",
    "//ui/gl",
  ]
  data = [
    "//services/test/data/mona_lisa.jpg",
    "//services/test/data/text_detection.png",
    "//services/test/data/the_beatles.jpg",
  ]
}
