# Copyright 2013 The Flutter 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("//build/fuchsia/sdk.gni")
import("$flutter_root/common/config.gni")
import("$flutter_root/testing/testing.gni")

source_set("ui") {
  sources = [
    "compositing/scene.cc",
    "compositing/scene.h",
    "compositing/scene_builder.cc",
    "compositing/scene_builder.h",
    "dart_runtime_hooks.cc",
    "dart_runtime_hooks.h",
    "dart_ui.cc",
    "dart_ui.h",
    "dart_wrapper.h",
    "io_manager.h",
    "isolate_name_server/isolate_name_server.cc",
    "isolate_name_server/isolate_name_server.h",
    "isolate_name_server/isolate_name_server_natives.cc",
    "isolate_name_server/isolate_name_server_natives.h",
    "painting/canvas.cc",
    "painting/canvas.h",
    "painting/codec.cc",
    "painting/codec.h",
    "painting/color_filter.cc",
    "painting/color_filter.h",
    "painting/engine_layer.cc",
    "painting/engine_layer.h",
    "painting/frame_info.cc",
    "painting/frame_info.h",
    "painting/gradient.cc",
    "painting/gradient.h",
    "painting/image.cc",
    "painting/image.h",
    "painting/image_decoder.cc",
    "painting/image_decoder.h",
    "painting/image_encoding.cc",
    "painting/image_encoding.h",
    "painting/image_filter.cc",
    "painting/image_filter.h",
    "painting/image_shader.cc",
    "painting/image_shader.h",
    "painting/matrix.cc",
    "painting/matrix.h",
    "painting/multi_frame_codec.cc",
    "painting/multi_frame_codec.h",
    "painting/paint.cc",
    "painting/paint.h",
    "painting/path.cc",
    "painting/path.h",
    "painting/path_measure.cc",
    "painting/path_measure.h",
    "painting/picture.cc",
    "painting/picture.h",
    "painting/picture_recorder.cc",
    "painting/picture_recorder.h",
    "painting/rrect.cc",
    "painting/rrect.h",
    "painting/shader.cc",
    "painting/shader.h",
    "painting/single_frame_codec.cc",
    "painting/single_frame_codec.h",
    "painting/vertices.cc",
    "painting/vertices.h",
    "plugins/callback_cache.cc",
    "plugins/callback_cache.h",
    "semantics/custom_accessibility_action.cc",
    "semantics/custom_accessibility_action.h",
    "semantics/semantics_node.cc",
    "semantics/semantics_node.h",
    "semantics/semantics_update.cc",
    "semantics/semantics_update.h",
    "semantics/semantics_update_builder.cc",
    "semantics/semantics_update_builder.h",
    "text/asset_manager_font_provider.cc",
    "text/asset_manager_font_provider.h",
    "text/font_collection.cc",
    "text/font_collection.h",
    "text/paragraph.cc",
    "text/paragraph.h",
    "text/paragraph_builder.cc",
    "text/paragraph_builder.h",
    "text/text_box.cc",
    "text/text_box.h",
    "ui_dart_state.cc",
    "ui_dart_state.h",
    "window/platform_message.cc",
    "window/platform_message.h",
    "window/platform_message_response.cc",
    "window/platform_message_response.h",
    "window/platform_message_response_dart.cc",
    "window/platform_message_response_dart.h",
    "window/pointer_data.cc",
    "window/pointer_data.h",
    "window/pointer_data_packet.cc",
    "window/pointer_data_packet.h",
    "window/viewport_metrics.cc",
    "window/viewport_metrics.h",
    "window/window.cc",
    "window/window.h",
  ]

  public_configs = [ "$flutter_root:config" ]

  deps = [
    "$flutter_root/assets",
    "$flutter_root/common",
    "$flutter_root/flow",
    "$flutter_root/fml",
    "$flutter_root/runtime:test_font",
    "//third_party/dart/runtime/bin:dart_io_api",
    "//third_party/rapidjson",
    "//third_party/skia",
    "//third_party/tonic",
  ]

  public_deps = [
    "$flutter_root/third_party/txt",
  ]

  if (flutter_enable_skshaper) {
    defines = [ "FLUTTER_ENABLE_SKSHAPER" ]
  }

  if (is_fuchsia) {
    sources += [
      "compositing/scene_host.cc",
      "compositing/scene_host.h",
    ]

    if (using_fuchsia_sdk) {
      deps += [
        "$flutter_root/shell/platform/fuchsia/dart-pkg/fuchsia",
        "$flutter_root/shell/platform/fuchsia/dart-pkg/zircon",
        "$fuchsia_sdk_root/pkg:async-cpp",
      ]
    } else {
      deps += [ "//topaz/public/dart-pkg/zircon" ]
    }
  }
}

if (current_toolchain == host_toolchain) {
  test_fixtures("ui_unittests_fixtures") {
    dart_main = "fixtures/ui_test.dart"
    fixtures = [
      "fixtures/DashInNooglerHat.jpg",
      "fixtures/Horizontal.jpg",
    ]
  }

  executable("ui_unittests") {
    testonly = true

    sources = [
      "painting/image_decoder_unittests.cc",
    ]

    deps = [
      ":ui",
      ":ui_unittests_fixtures",
      "$flutter_root/common",
      "$flutter_root/testing:dart",
      "$flutter_root/testing:opengl",
    ]
  }
}
