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

  skia_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" ]
    }
    skia_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) {
      skia_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",
          "../..:skia",
          "../..:test",
          "../skshaper",
        ]
      }

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

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

      skia_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") {
  }
}
