# Copyright 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build/fuchsia/sdk.gni")
import("//flutter/common/config.gni")
import("//flutter/testing/testing.gni")

declare_args() {
  flutter_use_fontconfig = false
}

if (flutter_use_fontconfig) {
  assert(is_linux)
}

config("txt_config") {
  visibility = [ ":*" ]
  include_dirs = [ "src" ]
}

config("allow_posix_names") {
  if (is_win && is_clang) {
    # POSIX names of many functions are marked deprecated by default;
    # disable that since they are used for cross-platform compatibility.
    defines = [ "_CRT_NONSTDC_NO_DEPRECATE" ]
  }
}

config("define_skshaper") {
  if (flutter_enable_skshaper) {
    defines = [ "FLUTTER_ENABLE_SKSHAPER" ]
  }
}

source_set("txt") {
  defines = []
  if (flutter_use_fontconfig) {
    defines += [ "FLUTTER_USE_FONTCONFIG" ]
  }

  sources = [
    "src/log/log.cc",
    "src/log/log.h",
    "src/minikin/CmapCoverage.cpp",
    "src/minikin/CmapCoverage.h",
    "src/minikin/Emoji.cpp",
    "src/minikin/Emoji.h",
    "src/minikin/FontCollection.cpp",
    "src/minikin/FontCollection.h",
    "src/minikin/FontFamily.cpp",
    "src/minikin/FontFamily.h",
    "src/minikin/FontLanguage.cpp",
    "src/minikin/FontLanguage.h",
    "src/minikin/FontLanguageListCache.cpp",
    "src/minikin/FontLanguageListCache.h",
    "src/minikin/FontUtils.cpp",
    "src/minikin/FontUtils.h",
    "src/minikin/GraphemeBreak.cpp",
    "src/minikin/GraphemeBreak.h",
    "src/minikin/HbFontCache.cpp",
    "src/minikin/HbFontCache.h",
    "src/minikin/Hyphenator.cpp",
    "src/minikin/Hyphenator.h",
    "src/minikin/Layout.cpp",
    "src/minikin/Layout.h",
    "src/minikin/LayoutUtils.cpp",
    "src/minikin/LayoutUtils.h",
    "src/minikin/LineBreaker.cpp",
    "src/minikin/LineBreaker.h",
    "src/minikin/Measurement.cpp",
    "src/minikin/Measurement.h",
    "src/minikin/MinikinFont.cpp",
    "src/minikin/MinikinFont.h",
    "src/minikin/MinikinInternal.cpp",
    "src/minikin/MinikinInternal.h",
    "src/minikin/SparseBitSet.cpp",
    "src/minikin/SparseBitSet.h",
    "src/minikin/WordBreaker.cpp",
    "src/minikin/WordBreaker.h",
    "src/txt/asset_font_manager.cc",
    "src/txt/asset_font_manager.h",
    "src/txt/font_asset_provider.cc",
    "src/txt/font_asset_provider.h",
    "src/txt/font_collection.cc",
    "src/txt/font_collection.h",
    "src/txt/font_features.cc",
    "src/txt/font_features.h",
    "src/txt/font_skia.cc",
    "src/txt/font_skia.h",
    "src/txt/font_style.h",
    "src/txt/font_weight.h",
    "src/txt/line_metrics.h",
    "src/txt/paint_record.cc",
    "src/txt/paint_record.h",
    "src/txt/paragraph.h",
    "src/txt/paragraph_builder.cc",
    "src/txt/paragraph_builder.h",
    "src/txt/paragraph_builder_txt.cc",
    "src/txt/paragraph_builder_txt.h",
    "src/txt/paragraph_style.cc",
    "src/txt/paragraph_style.h",
    "src/txt/paragraph_txt.cc",
    "src/txt/paragraph_txt.h",
    "src/txt/placeholder_run.cc",
    "src/txt/placeholder_run.h",
    "src/txt/platform.h",
    "src/txt/run_metrics.h",
    "src/txt/styled_runs.cc",
    "src/txt/styled_runs.h",
    "src/txt/test_font_manager.cc",
    "src/txt/test_font_manager.h",
    "src/txt/text_baseline.h",
    "src/txt/text_decoration.cc",
    "src/txt/text_decoration.h",
    "src/txt/text_shadow.cc",
    "src/txt/text_shadow.h",
    "src/txt/text_style.cc",
    "src/txt/text_style.h",
    "src/txt/typeface_font_asset_provider.cc",
    "src/txt/typeface_font_asset_provider.h",
    "src/utils/JenkinsHash.cpp",
    "src/utils/JenkinsHash.h",
    "src/utils/LinuxUtils.h",
    "src/utils/LruCache.h",
    "src/utils/MacUtils.h",
    "src/utils/TypeHelpers.h",
    "src/utils/WindowsUtils.h",
  ]

  public_configs = [ ":txt_config" ]

  configs += [ ":define_skshaper" ]

  public_deps = [
    "//flutter/display_list",
    "//flutter/fml",
    "//third_party/harfbuzz",
    "//third_party/icu",
    "//third_party/skia",
  ]

  deps = [ "//third_party/skia" ]

  if (flutter_use_fontconfig) {
    deps += [ "//third_party/fontconfig" ]
  }

  if (flutter_enable_skshaper) {
    sources += [
      "src/skia/paragraph_builder_skia.cc",
      "src/skia/paragraph_builder_skia.h",
      "src/skia/paragraph_skia.cc",
      "src/skia/paragraph_skia.h",
    ]

    deps += [ "//third_party/skia/modules/skparagraph" ]
  }

  if (is_mac || is_ios) {
    sources += [ "src/txt/platform_mac.mm" ]
    deps += [ "//flutter/fml" ]
  } else if (is_android) {
    sources += [ "src/txt/platform_android.cc" ]
  } else if (is_linux) {
    sources += [ "src/txt/platform_linux.cc" ]
  } else if (is_fuchsia) {
    sources += [ "src/txt/platform_fuchsia.cc" ]
    deps += [ "$fuchsia_sdk_root/fidl:fuchsia.fonts" ]
  } else if (is_win) {
    sources += [ "src/txt/platform_windows.cc" ]
  } else {
    sources += [ "src/txt/platform.cc" ]
  }
}

if (enable_unittests) {
  txt_common_executable_deps = [
    "//flutter/fml",  # For ICU initialization.
    "//third_party/dart/runtime:libdart_jit",  # For logging.
  ]

  test_fixtures("txt_fixtures") {
    fixtures = [
      "third_party/fonts/Bold.ttf",
      "third_party/fonts/Bold.ttx",
      "third_party/fonts/BoldItalic.ttf",
      "third_party/fonts/BoldItalic.ttx",
      "third_party/fonts/ColorEmojiFont.ttf",
      "third_party/fonts/ColorEmojiFont.ttx",
      "third_party/fonts/ColorTextMixedEmojiFont.ttf",
      "third_party/fonts/ColorTextMixedEmojiFont.ttx",
      "third_party/fonts/DroidSerif.ttf",
      "third_party/fonts/Emoji.ttf",
      "third_party/fonts/Emoji.ttx",
      "third_party/fonts/HomemadeApple.ttf",
      "third_party/fonts/Italic.ttf",
      "third_party/fonts/Italic.ttx",
      "third_party/fonts/Ja.ttf",
      "third_party/fonts/Ja.ttx",
      "third_party/fonts/Katibeh-Regular.ttf",
      "third_party/fonts/Ko.ttf",
      "third_party/fonts/Ko.ttx",
      "third_party/fonts/MultiAxis.ttf",
      "third_party/fonts/MultiAxis.ttx",
      "third_party/fonts/NoCmapFormat14.ttf",
      "third_party/fonts/NoCmapFormat14.ttx",
      "third_party/fonts/NoGlyphFont.ttf",
      "third_party/fonts/NoGlyphFont.ttx",
      "third_party/fonts/NotoColorEmoji.ttf",
      "third_party/fonts/NotoNaskhArabic-Regular.ttf",
      "third_party/fonts/NotoSansCJK-Regular.ttc",
      "third_party/fonts/NotoSansKhmer-Regular.ttf",
      "third_party/fonts/Regular.ttf",
      "third_party/fonts/Regular.ttx",
      "third_party/fonts/Roboto-Black.ttf",
      "third_party/fonts/Roboto-BlackItalic.ttf",
      "third_party/fonts/Roboto-Bold.ttf",
      "third_party/fonts/Roboto-BoldItalic.ttf",
      "third_party/fonts/Roboto-Italic.ttf",
      "third_party/fonts/Roboto-Light.ttf",
      "third_party/fonts/Roboto-LightItalic.ttf",
      "third_party/fonts/Roboto-Medium.ttf",
      "third_party/fonts/Roboto-MediumItalic.ttf",
      "third_party/fonts/Roboto-Regular.ttf",
      "third_party/fonts/Roboto-Thin.ttf",
      "third_party/fonts/Roboto-ThinItalic.ttf",
      "third_party/fonts/SourceHanSerifCN-Bold.otf",
      "third_party/fonts/SourceHanSerifCN-Regular.otf",
      "third_party/fonts/TextEmojiFont.ttf",
      "third_party/fonts/TextEmojiFont.ttx",
      "third_party/fonts/UnicodeBMPOnly.ttf",
      "third_party/fonts/UnicodeBMPOnly.ttx",
      "third_party/fonts/UnicodeBMPOnly2.ttf",
      "third_party/fonts/UnicodeBMPOnly2.ttx",
      "third_party/fonts/UnicodeUCS4.ttf",
      "third_party/fonts/UnicodeUCS4.ttx",
      "third_party/fonts/VariationSelectorTest-Regular.ttf",
      "third_party/fonts/VariationSelectorTest-Regular.ttx",
      "third_party/fonts/ZhHans.ttf",
      "third_party/fonts/ZhHans.ttx",
      "third_party/fonts/ZhHant.ttf",
      "third_party/fonts/ZhHant.ttx",
      "third_party/fonts/ahem.ttf",
      "third_party/fonts/emoji.xml",
      "third_party/fonts/itemize.xml",
    ]
  }

  source_set("txt_test_utils") {
    sources = [
      "tests/txt_test_utils.cc",
      "tests/txt_test_utils.h",
    ]

    configs += [ ":define_skshaper" ]

    deps = [
      ":txt",
      "//flutter/fml",
      "//third_party/skia",
    ]
  }

  executable("txt_benchmarks") {
    testonly = true

    sources = [
      "benchmarks/paint_record_benchmarks.cc",
      "benchmarks/paragraph_benchmarks.cc",
      "benchmarks/paragraph_builder_benchmarks.cc",
      "benchmarks/txt_run_all_benchmarks.cc",
    ]

    configs += [ ":define_skshaper" ]

    deps = [
             ":txt",
             ":txt_fixtures",
             ":txt_test_utils",
             "//flutter/testing:testing_lib",
             "//third_party/benchmark",
           ] + txt_common_executable_deps

    if (flutter_enable_skshaper) {
      sources += [ "benchmarks/skparagraph_benchmarks.cc" ]

      deps += [ "//third_party/skia/modules/skparagraph" ]
    }
  }

  executable("txt_unittests") {
    testonly = true

    sources = [
      "tests/CmapCoverageTest.cpp",
      "tests/EmojiTest.cpp",
      "tests/FileUtils.cpp",
      "tests/FileUtils.h",
      "tests/FontTestUtils.h",
      "tests/GraphemeBreakTests.cpp",
      "tests/ICUTestBase.h",
      "tests/LayoutUtilsTest.cpp",
      "tests/MeasurementTests.cpp",
      "tests/SparseBitSetTest.cpp",
      "tests/UnicodeUtils.cpp",
      "tests/UnicodeUtils.h",
      "tests/UnicodeUtilsTest.cpp",
      "tests/font_collection_unittests.cc",
      "tests/paragraph_unittests.cc",
      "tests/render_test.cc",
      "tests/render_test.h",
      "tests/txt_run_all_unittests.cc",

      # These tests require static fixtures.
      # "tests/FontCollectionItemizeTest.cpp",
      # "tests/FontCollectionTest.cpp",
      # "tests/FontFamilyTest.cpp",
      # "tests/FontLanguageListCacheTest.cpp",
      # "tests/FontTestUtils.cpp",
      # "tests/HbFontCacheTest.cpp",
      # "tests/HyphenatorTest.cpp",
      # "tests/LayoutTest.cpp",
    ]

    if (!is_win) {
      sources += [
        "tests/MinikinFontForTest.cpp",
        "tests/MinikinFontForTest.h",
      ]
    }

    configs += [
      ":allow_posix_names",
      ":define_skshaper",
    ]

    deps = [
             ":txt",
             ":txt_test_utils",
             "//flutter/testing:testing_lib",
             ":txt_fixtures",
           ] + txt_common_executable_deps

    if (is_fuchsia) {
      sources += [ "tests/platform_fuchsia_unittests.cc" ]
      deps += [
        "$fuchsia_sdk_root/fidl:fuchsia.fonts",
        "$fuchsia_sdk_root/pkg:async-testing",
      ]
    }
  }
}
