# 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("//flutter/common/config.gni")
import("//flutter/impeller/tools/impeller.gni")
import("//flutter/testing/testing.gni")

if (is_fuchsia) {
  import("//flutter/tools/fuchsia/gn-sdk/src/gn_configs.gni")
}

config("display_list_config") {
  defines = []

  if (impeller_enable_3d) {
    defines += [ "IMPELLER_ENABLE_3D" ]
  }
}

source_set("display_list") {
  sources = [
    "benchmarking/dl_complexity.cc",
    "benchmarking/dl_complexity.h",
    "benchmarking/dl_complexity_gl.cc",
    "benchmarking/dl_complexity_gl.h",
    "benchmarking/dl_complexity_metal.cc",
    "benchmarking/dl_complexity_metal.h",
    "display_list.cc",
    "display_list.h",
    "dl_attributes.h",
    "dl_blend_mode.cc",
    "dl_blend_mode.h",
    "dl_builder.cc",
    "dl_builder.h",
    "dl_canvas.cc",
    "dl_canvas.h",
    "dl_color.h",
    "dl_op_flags.cc",
    "dl_op_flags.h",
    "dl_op_receiver.cc",
    "dl_op_receiver.h",
    "dl_op_records.cc",
    "dl_op_records.h",
    "dl_paint.cc",
    "dl_paint.h",
    "dl_sampling_options.h",
    "dl_tile_mode.h",
    "dl_vertices.cc",
    "dl_vertices.h",
    "effects/dl_color_filter.cc",
    "effects/dl_color_filter.h",
    "effects/dl_color_source.cc",
    "effects/dl_color_source.h",
    "effects/dl_image_filter.cc",
    "effects/dl_image_filter.h",
    "effects/dl_mask_filter.cc",
    "effects/dl_mask_filter.h",
    "effects/dl_path_effect.cc",
    "effects/dl_path_effect.h",
    "effects/dl_runtime_effect.cc",
    "effects/dl_runtime_effect.h",
    "geometry/dl_region.cc",
    "geometry/dl_region.h",
    "geometry/dl_rtree.cc",
    "geometry/dl_rtree.h",
    "image/dl_image.cc",
    "image/dl_image.h",
    "image/dl_image_skia.cc",
    "image/dl_image_skia.h",
    "skia/dl_sk_canvas.cc",
    "skia/dl_sk_canvas.h",
    "skia/dl_sk_conversions.cc",
    "skia/dl_sk_conversions.h",
    "skia/dl_sk_dispatcher.cc",
    "skia/dl_sk_dispatcher.h",
    "skia/dl_sk_paint_dispatcher.cc",
    "skia/dl_sk_paint_dispatcher.h",
    "skia/dl_sk_types.h",
    "utils/dl_bounds_accumulator.cc",
    "utils/dl_bounds_accumulator.h",
    "utils/dl_matrix_clip_tracker.cc",
    "utils/dl_matrix_clip_tracker.h",
    "utils/dl_receiver_utils.cc",
    "utils/dl_receiver_utils.h",
  ]

  public_configs = [ ":display_list_config" ]

  public_deps = [
    "//flutter/fml",
    "//flutter/impeller/runtime_stage",
    "//flutter/impeller/typographer",
    "//flutter/skia",
  ]

  if (!defined(defines)) {
    defines = []
  }
}

test_fixtures("display_list_fixtures") {
  fixtures =
      [ "//flutter/third_party/txt/third_party/fonts/Roboto-Regular.ttf" ]
}

if (enable_unittests) {
  executable("display_list_unittests") {
    testonly = true

    sources = [
      "benchmarking/dl_complexity_unittests.cc",
      "display_list_unittests.cc",
      "dl_color_unittests.cc",
      "dl_paint_unittests.cc",
      "dl_vertices_unittests.cc",
      "effects/dl_color_filter_unittests.cc",
      "effects/dl_color_source_unittests.cc",
      "effects/dl_image_filter_unittests.cc",
      "effects/dl_mask_filter_unittests.cc",
      "effects/dl_path_effect_unittests.cc",
      "geometry/dl_region_unittests.cc",
      "geometry/dl_rtree_unittests.cc",
      "skia/dl_sk_conversions_unittests.cc",
      "skia/dl_sk_paint_dispatcher_unittests.cc",
      "utils/dl_matrix_clip_tracker_unittests.cc",
    ]

    deps = [
      ":display_list",
      ":display_list_fixtures",
      "//flutter/display_list/testing:display_list_testing",
      "//flutter/testing",
      "//flutter/testing:skia",
    ]

    if (!defined(defines)) {
      defines = []
    }
    if (is_win) {
      # Required for M_PI and others.
      defines += [ "_USE_MATH_DEFINES" ]
    }

    # This is needed for //flutter/third_party/googletest for linking zircon
    # symbols.
    if (is_fuchsia) {
      libs = [ "${fuchsia_arch_root}/sysroot/lib/libzircon.so" ]
    }
  }

  executable("display_list_rendertests") {
    testonly = true

    sources = [ "testing/dl_rendering_unittests.cc" ]

    deps = [
      ":display_list",
      ":display_list_fixtures",
      "//flutter/common/graphics",
      "//flutter/display_list/testing:display_list_surface_provider",
      "//flutter/display_list/testing:display_list_testing",
      "//flutter/impeller/typographer/backends/skia:typographer_skia_backend",
      "//flutter/testing",
      "//flutter/third_party/txt",
    ]

    if (!defined(defines)) {
      defines = []
    }
    if (is_win) {
      # Required for M_PI and others.
      defines += [ "_USE_MATH_DEFINES" ]
    }

    # This is needed for //flutter/third_party/googletest for linking zircon
    # symbols.
    if (is_fuchsia) {
      libs = [ "${fuchsia_arch_root}/sysroot/lib/libzircon.so" ]
    }
  }

  executable("display_list_builder_benchmarks") {
    testonly = true

    sources = [ "benchmarking/dl_builder_benchmarks.cc" ]

    deps = [
      ":display_list",
      ":display_list_fixtures",
      "//flutter/benchmarking",
      "//flutter/display_list/testing:display_list_testing",
      "//flutter/testing:testing_lib",
    ]
  }

  executable("display_list_region_benchmarks") {
    testonly = true

    sources = [ "benchmarking/dl_region_benchmarks.cc" ]

    deps = [
      ":display_list_fixtures",
      "//flutter/benchmarking",
      "//flutter/testing:testing_lib",
    ]
  }

  executable("display_list_transform_benchmarks") {
    testonly = true

    sources = [ "benchmarking/dl_transform_benchmarks.cc" ]

    deps = [
      ":display_list_fixtures",
      "//flutter/benchmarking",
      "//flutter/testing:testing_lib",
    ]
  }
}

source_set("display_list_benchmarks_source") {
  testonly = true

  sources = [
    "benchmarking/dl_benchmarks.cc",
    "benchmarking/dl_benchmarks.h",
  ]

  deps = [
    ":display_list",
    ":display_list_fixtures",
    "$dart_src/runtime:libdart_jit",  # for tracing
    "//flutter/benchmarking",
    "//flutter/common/graphics",
    "//flutter/display_list/testing:display_list_surface_provider",
    "//flutter/display_list/testing:display_list_testing",
    "//flutter/fml",
    "//flutter/skia",
    "//flutter/testing:skia",
    "//flutter/testing:testing_lib",
  ]
}

executable("display_list_benchmarks") {
  testonly = true

  deps = [ ":display_list_benchmarks_source" ]
}

if (is_ios) {
  shared_library("ios_display_list_benchmarks") {
    testonly = true
    visibility = [ ":*" ]

    configs -= [
      "//build/config/gcc:symbol_visibility_hidden",
      "//build/config:symbol_visibility_hidden",
    ]
    configs += [ "//flutter/benchmarking:benchmark_library_config" ]
    cflags = [
      "-fobjc-arc",
      "-mios-simulator-version-min=$ios_testing_deployment_target",
    ]
    ldflags =
        [ "-Wl,-install_name,@rpath/libios_display_list_benchmarks.dylib" ]
    deps = [
      ":display_list_benchmarks_source",
      "//flutter/benchmarking:benchmarking_library",
    ]
  }
}
