# Copyright 2018 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("../../gn/skia.gni")

if (skia_enable_skottie) {
  config("public_config") {
    defines = [ "SK_ENABLE_SKOTTIE" ]
    include_dirs = [ "include" ]
  }

  component("skottie") {
    check_includes = false
    import("skottie.gni")
    public_configs = [ ":public_config" ]
    public = skia_skottie_public
    sources = skia_skottie_sources
    configs += [ "../../:skia_private" ]
    deps = [
      "../..:skia",
      "../skresources",
      "../sksg",
      "../skshaper",
    ]
  }

  if (defined(is_skia_standalone)) {
    config("utils_config") {
      include_dirs = [ "utils" ]
    }
    source_set("utils") {
      check_includes = false
      testonly = true

      public_configs = [ ":utils_config" ]
      configs += [ "../../:skia_private" ]

      sources = [ "utils/SkottieUtils.cpp" ]
      deps = [
        ":skottie",
        "../..:skia",
      ]
    }

    if (skia_enable_tools) {
      source_set("tests") {
        testonly = true

        configs += [
          "../..:skia_private",
          "../..:tests_config",
        ]
        sources = [
          "src/SkottieTest.cpp",
          "tests/AudioLayer.cpp",
          "tests/Image.cpp",
          "tests/Keyframe.cpp",
          "tests/Text.cpp",
        ]

        deps = [
          ":skottie",
          "../..:gpu_tool_utils",
          "../..:skia",
          "../skshaper",
        ]
      }

      source_set("fuzz") {
        check_includes = false
        testonly = true

        configs += [ "../..:skia_private" ]
        include_dirs = [
          "../../tools",
          "../../tools/flags",
          "../../tools/fonts",
        ]
        sources = [
          "../../tools/Resources.cpp",
          "../../tools/fonts/TestFontMgr.cpp",
          "../../tools/fonts/TestSVGTypeface.cpp",
          "../../tools/fonts/TestTypeface.cpp",
          "fuzz/FuzzSkottieJSON.cpp",
        ]

        deps = [
          "../..:skia",
          "../svg",
        ]

        public_deps = [ ":skottie" ]
      }

      source_set("tool") {
        check_includes = false
        testonly = true

        configs += [ "../..:skia_private" ]
        sources = [ "src/SkottieTool.cpp" ]

        deps = [
          "../..:flags",
          "../..:skia",
          "../../experimental/ffmpeg:video_encoder",
        ]

        public_deps = [
          ":skottie",
          ":utils",
        ]
      }

      source_set("gm") {
        check_includes = false
        testonly = true

        # would be nice to have a gm_config
        include_dirs = [ "../../gm" ]

        configs += [ "../..:skia_private" ]
        sources = [
          "gm/ExternalProperties.cpp",
          "gm/SkottieGM.cpp",
        ]

        deps = [
          ":skottie",
          ":utils",
          "../..:gpu_tool_utils",
          "../..:skia",
          "../..:tool_utils",
        ]
      }
    }
  }
} else {
  group("skottie") {
  }
  group("fuzz") {
  }
  group("gm") {
  }
  group("tests") {
  }
  group("utils") {
  }
}
