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

if (is_fuchsia) {
  import("//build/fuchsia/sdk.gni")
}

import("$flutter_root/testing/testing.gni")

source_set("flow") {
  sources = [
    "compositor_context.cc",
    "compositor_context.h",
    "debug_print.cc",
    "debug_print.h",
    "embedded_views.cc",
    "embedded_views.h",
    "instrumentation.cc",
    "instrumentation.h",
    "layers/backdrop_filter_layer.cc",
    "layers/backdrop_filter_layer.h",
    "layers/clip_path_layer.cc",
    "layers/clip_path_layer.h",
    "layers/clip_rect_layer.cc",
    "layers/clip_rect_layer.h",
    "layers/clip_rrect_layer.cc",
    "layers/clip_rrect_layer.h",
    "layers/color_filter_layer.cc",
    "layers/color_filter_layer.h",
    "layers/container_layer.cc",
    "layers/container_layer.h",
    "layers/layer.cc",
    "layers/layer.h",
    "layers/layer_tree.cc",
    "layers/layer_tree.h",
    "layers/opacity_layer.cc",
    "layers/opacity_layer.h",
    "layers/performance_overlay_layer.cc",
    "layers/performance_overlay_layer.h",
    "layers/physical_shape_layer.cc",
    "layers/physical_shape_layer.h",
    "layers/picture_layer.cc",
    "layers/picture_layer.h",
    "layers/platform_view_layer.cc",
    "layers/platform_view_layer.h",
    "layers/shader_mask_layer.cc",
    "layers/shader_mask_layer.h",
    "layers/texture_layer.cc",
    "layers/texture_layer.h",
    "layers/transform_layer.cc",
    "layers/transform_layer.h",
    "matrix_decomposition.cc",
    "matrix_decomposition.h",
    "paint_utils.cc",
    "paint_utils.h",
    "raster_cache.cc",
    "raster_cache.h",
    "raster_cache_key.cc",
    "raster_cache_key.h",
    "skia_gpu_object.cc",
    "skia_gpu_object.h",
    "texture.cc",
    "texture.h",
  ]

  public_configs = [ "$flutter_root:config" ]

  public_deps = []

  deps = [
    "$flutter_root/common",
    "$flutter_root/fml",
    "//third_party/skia",
  ]

  if (is_fuchsia) {
    sources += [
      "layers/child_scene_layer.cc",
      "layers/child_scene_layer.h",
      "scene_update_context.cc",
      "scene_update_context.h",
      "view_holder.cc",
      "view_holder.h",
    ]

    if (using_fuchsia_sdk) {
      public_deps += [
        "$fuchsia_sdk_root/fidl:fuchsia.ui.gfx",
        "$fuchsia_sdk_root/pkg:scenic_cpp",
      ]
    } else {
      public_deps += [
        "//garnet/public/lib/ui/scenic/cpp",
        "//sdk/fidl/fuchsia.ui.scenic",
        "//topaz/public/dart-pkg/zircon",
        "//zircon/public/lib/zx",
      ]
    }
  }
}

test_fixtures("flow_fixtures") {
  fixtures = []
}

executable("flow_unittests") {
  testonly = true

  sources = [
    "flow_run_all_unittests.cc",
    "flow_test_utils.cc",
    "flow_test_utils.h",
    "layers/performance_overlay_layer_unittests.cc",
    "layers/physical_shape_layer_unittests.cc",
    "matrix_decomposition_unittests.cc",
    "mutators_stack_unittests.cc",
    "raster_cache_unittests.cc",
  ]

  deps = [
    ":flow",
    ":flow_fixtures",
    "$flutter_root/fml",
    "//third_party/dart/runtime:libdart_jit",  # for tracing
    "//third_party/googletest:gtest",
    "//third_party/skia",
  ]
}
