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

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

if (enable_unittests) {
  test_fixtures("display_list_fixtures") {
    fixtures = []
  }

  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_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",
    ]

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

    # This is needed for //third_party/googletest for linking zircon symbols.
    if (is_fuchsia) {
      libs =
          [ "${fuchsia_sdk_path}/arch/${target_cpu}/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/testing",
    ]

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

    # This is needed for //third_party/googletest for linking zircon symbols.
    if (is_fuchsia) {
      libs =
          [ "${fuchsia_sdk_path}/arch/${target_cpu}/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",
    ]
  }
}

fixtures_location("display_list_benchmarks_fixtures") {
  assets_dir = "$target_gen_dir/"
}

source_set("display_list_benchmarks_source") {
  testonly = true

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

  deps = [
    ":display_list",
    ":display_list_benchmarks_fixtures",
    "//flutter/benchmarking",
    "//flutter/common/graphics",
    "//flutter/display_list/testing:display_list_surface_provider",
    "//flutter/fml",
    "//flutter/testing:skia",
    "//flutter/testing:testing_lib",
    "//third_party/dart/runtime:libdart_jit",  # for tracing
    "//third_party/skia",
  ]
}

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",
    ]
  }
}
