# 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("../tools/impeller.gni")

config("impeller_canvas_recorder_config") {
  defines = [ "IMPELLER_TRACE_CANVAS" ]
}

impeller_component("aiks") {
  sources = [
    "aiks_context.cc",
    "aiks_context.h",
    "canvas.cc",
    "canvas.h",
    "canvas_recorder.h",
    "canvas_type.h",
    "color_filter.cc",
    "color_filter.h",
    "color_source.cc",
    "color_source.h",
    "image.cc",
    "image.h",
    "image_filter.cc",
    "image_filter.h",
    "paint.cc",
    "paint.h",
    "paint_pass_delegate.cc",
    "paint_pass_delegate.h",
    "picture.cc",
    "picture.h",
    "picture_recorder.cc",
    "picture_recorder.h",
    "trace_serializer.h",
  ]

  public_deps = [
    "../base",
    "../entity",
    "../geometry",
  ]

  deps = [ "//flutter/fml" ]

  if (impeller_trace_canvas) {
    sources += [ "trace_serializer.cc" ]
    public_configs = [ ":impeller_canvas_recorder_config" ]
  }
}

impeller_component("aiks_playground") {
  testonly = true

  sources = [
    "aiks_playground.cc",
    "aiks_playground.h",
    "aiks_playground_inspector.cc",
    "aiks_playground_inspector.h",
  ]
  deps = [
    ":aiks",
    "../playground:playground_test",
  ]
  public_deps = [
    "//flutter/impeller/typographer/backends/skia:typographer_skia_backend",
  ]
}

impeller_component("context_spy") {
  testonly = true

  sources = [
    "testing/context_mock.h",
    "testing/context_spy.cc",
    "testing/context_spy.h",
  ]
  deps = [
    "//flutter/impeller/entity:entity_test_helpers",
    "//flutter/impeller/renderer",
    "//flutter/testing:testing_lib",
  ]
}

template("aiks_unittests_component") {
  target_name = invoker.target_name
  predefined_sources = [
    "aiks_blend_unittests.cc",
    "aiks_blur_unittests.cc",
    "aiks_gradient_unittests.cc",
    "aiks_path_unittests.cc",
    "aiks_unittests.cc",
    "aiks_unittests.h",
  ]
  additional_sources = []
  if (defined(invoker.sources)) {
    additional_sources = invoker.sources
  }
  impeller_component(target_name) {
    testonly = true
    if (defined(invoker.defines)) {
      defines = invoker.defines
    } else {
      defines = []
    }
    defines += [ "_USE_MATH_DEFINES" ]

    sources = predefined_sources + additional_sources
    deps = [
      ":aiks",
      ":aiks_playground",
      ":context_spy",
      "//flutter/impeller/geometry:geometry_asserts",
      "//flutter/impeller/golden_tests:golden_playground_test",
      "//flutter/impeller/playground:playground_test",
      "//flutter/impeller/scene",
      "//flutter/impeller/typographer/backends/stb:typographer_stb_backend",
      "//flutter/testing:testing_lib",
      "//flutter/third_party/txt",
    ]
    if (defined(invoker.public_configs)) {
      public_configs = invoker.public_configs
    }
  }
}

aiks_unittests_component("aiks_unittests") {
  sources = [
    "canvas_recorder_unittests.cc",
    "canvas_unittests.cc",
    "trace_serializer_unittests.cc",
  ]

  if (!impeller_trace_canvas) {
    sources += [ "trace_serializer.cc" ]
    public_configs = [ ":impeller_canvas_recorder_config" ]
  }
}

aiks_unittests_component("aiks_unittests_golden") {
  defines = [
    "IMPELLER_GOLDEN_TESTS",
    "IMPELLER_ENABLE_VALIDATION=1",
  ]
}

executable("canvas_benchmarks") {
  testonly = true
  sources = [ "canvas_benchmarks.cc" ]
  deps = [
    ":aiks",
    "//flutter/benchmarking",
  ]
}
