# Copyright 2019 Google LLC.

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

declare_args() {
  skia_enable_skparagraph = true
  paragraph_gms_enabled = true
  paragraph_tests_enabled = true
  paragraph_bench_enabled = false
}

if (skia_enable_skparagraph && skia_enable_skshaper && skia_use_icu &&
    skia_use_harfbuzz) {
  config("public_config") {
    include_dirs = [
      "include",
      "utils",
    ]
  }

  skia_component("skparagraph") {
    import("skparagraph.gni")
    public_configs = [ ":public_config" ]
    public = skparagraph_public
    sources = skparagraph_sources
    deps = [
      "../..:skia",
      "../skshaper",
      "../skunicode",
    ]
  }

  config("utils_config") {
    include_dirs = [ "utils" ]
  }

  if (defined(is_skia_standalone) && skia_enable_tools) {
    skia_source_set("utils") {
      import("skparagraph.gni")
      public_configs = [ ":utils_config" ]
      configs = [ "../../:skia_private" ]
      sources = skparagraph_utils
      deps = [
        "../..:skia",
        "../skshaper",
      ]
    }

    skia_source_set("gm") {
      if (paragraph_gms_enabled) {
        testonly = true
        sources = [ "gm/simple_gm.cpp" ]
        deps = [
          ":skparagraph",
          "../..:gpu_tool_utils",
          "../..:skia",
          "../skshaper",
        ]
      } else {
        sources = []
      }
    }

    skia_source_set("tests") {
      if (paragraph_tests_enabled) {
        testonly = true
        sources = [ "tests/SkParagraphTest.cpp" ]
        deps = [
          ":skparagraph",
          "../..:skia",
          "../..:test",
          "../skshaper",
        ]
      } else {
        sources = []
      }
    }

    skia_source_set("bench") {
      if (paragraph_bench_enabled) {
        testonly = true
        sources = [ "bench/ParagraphBench.cpp" ]
        deps = [
          ":skparagraph",
          "../..:skia",
          "../skshaper",
        ]
      } else {
        sources = []
      }
    }

    skia_source_set("samples") {
      testonly = true
      sources = [ "samples/SampleParagraph.cpp" ]
      deps = [
        ":skparagraph",
        ":utils",
        "../..:skia",
        "../skshaper",
      ]
    }
  }
} else {
  group("skparagraph") {
  }
  group("utils") {
  }
  group("gm") {
  }
  group("tests") {
  }
  group("bench") {
  }
  group("samples") {
  }
}
