# 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("aiks_unittests") {
  testonly = true

  sources = [
    "aiks_unittests.cc",
    "canvas_recorder_unittests.cc",
    "canvas_unittests.cc",
    "testing/context_mock.h",
    "testing/context_spy.cc",
    "testing/context_spy.h",
    "trace_serializer_unittests.cc",
  ]
  deps = [
    ":aiks",
    ":aiks_playground",
    "//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 (!impeller_trace_canvas) {
    sources += [ "trace_serializer.cc" ]
    public_configs = [ ":impeller_canvas_recorder_config" ]
  }
}

impeller_component("aiks_unittests_golden") {
  testonly = true

  defines = [
    "IMPELLER_GOLDEN_TESTS",
    "IMPELLER_ENABLE_VALIDATION=1",
  ]

  sources = [
    "aiks_unittests.cc",
    "testing/context_mock.h",
    "testing/context_spy.cc",
    "testing/context_spy.h",
  ]
  deps = [
    ":aiks",
    ":aiks_playground",
    "//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",
  ]
}

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