# 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("//build/toolchain/wasm.gni")

# This toolchain is only to be used by canvaskit_group below.
wasm_toolchain("canvaskit") {
  extra_toolchain_args = {
    # Include ICU data.
    skia_use_icu = true
    skia_use_client_icu = false

    # Include image codecs.
    skia_use_libjpeg_turbo_decode = true
    skia_use_libpng_decode = true
    skia_use_libwebp_decode = true

    # Disable LTO.
    enable_lto = false
  }
}

copy("canvaskit_group") {
  visibility = [ "//flutter/web_sdk:*" ]
  public_deps = [ "//flutter/skia/modules/canvaskit(:canvaskit)" ]

  sources = [
    "$root_out_dir/canvaskit/canvaskit.js",
    "$root_out_dir/canvaskit/canvaskit.js.symbols",
    "$root_out_dir/canvaskit/canvaskit.wasm",
  ]
  outputs = [ "$root_out_dir/flutter_web_sdk/canvaskit/{{source_file_part}}" ]
}

# This toolchain is only to be used by canvaskit_chromium_group below.
wasm_toolchain("canvaskit_chromium") {
  extra_toolchain_args = {
    # In Chromium browsers, we can use the browser's APIs to get the necessary
    # ICU data.
    skia_use_icu = false
    skia_use_client_icu = true
    skia_icu_bidi_third_party_dir = "//flutter/third_party/canvaskit/icu_bidi"

    # TODO(mdebbar): Set these to false once all image decoding can be done
    # using the browser's built-in codecs.
    # https://github.com/flutter/flutter/issues/122331
    skia_use_libjpeg_turbo_decode = true
    skia_use_libpng_decode = true
    skia_use_libwebp_decode = true

    # Disable LTO.
    enable_lto = false
  }
}

copy("canvaskit_chromium_group") {
  visibility = [ "//flutter/web_sdk:*" ]
  public_deps = [ "//flutter/skia/modules/canvaskit(:canvaskit_chromium)" ]

  sources = [
    "$root_out_dir/canvaskit_chromium/canvaskit.js",
    "$root_out_dir/canvaskit_chromium/canvaskit.js.symbols",
    "$root_out_dir/canvaskit_chromium/canvaskit.wasm",
  ]
  outputs = [
    "$root_out_dir/flutter_web_sdk/canvaskit/chromium/{{source_file_part}}",
  ]
}

# This toolchain is only to be used by canvaskit_experimental_webparagraph_group below.
wasm_toolchain("canvaskit_experimental_webparagraph") {
  extra_toolchain_args = {
    # In Chromium browsers, we can use the browser's APIs to get the necessary
    # ICU data.
    skia_use_icu = false
    skia_use_client_icu = false

    # We still need BiDi information since there's no browser API for it.
    skia_use_bidi = true
    skia_canvaskit_enable_bidi = true
    skia_icu_bidi_third_party_dir = "//flutter/third_party/canvaskit/icu_bidi"

    # Remove all other text-related features that we don't need with WebParagraph.
    skia_enable_skparagraph = false
    skia_canvaskit_enable_paragraph = false
    skia_enable_skshaper = false
    skia_use_harfbuzz = false
    skia_use_freetype = false
    flutter_use_freetype_woff2 = false
    skia_enable_fontmgr_custom_embedded = false
    skia_enable_fontmgr_custom_empty = false
    skia_canvaskit_enable_font = false
    skia_canvaskit_enable_alias_font = false

    # TODO(mdebbar): Set these to false once all image decoding can be done
    # using the browser's built-in codecs.
    # https://github.com/flutter/flutter/issues/122331
    skia_use_libjpeg_turbo_decode = true
    skia_use_libpng_decode = true
    skia_use_libwebp_decode = true

    # Disable LTO.
    enable_lto = false
  }
}

copy("canvaskit_experimental_webparagraph_group") {
  visibility = [ "//flutter/web_sdk:*" ]
  public_deps = [
    "//flutter/skia/modules/canvaskit(:canvaskit_experimental_webparagraph)",
  ]

  sources = [
    "$root_out_dir/canvaskit_experimental_webparagraph/canvaskit.js",
    "$root_out_dir/canvaskit_experimental_webparagraph/canvaskit.js.symbols",
    "$root_out_dir/canvaskit_experimental_webparagraph/canvaskit.wasm",
  ]
  outputs = [ "$root_out_dir/flutter_web_sdk/canvaskit/experimental_webparagraph/{{source_file_part}}" ]
}

# This toolchain is only to be used by skwasm_group below.
template("skwasm_toolchain") {
  assert(defined(invoker.skwasm_is_heavy))
  forward_variables_from(invoker,
                         [
                           "skwasm_is_mt",
                           "skwasm_is_heavy",
                         ])
  wasm_toolchain(target_name) {
    extra_toolchain_args = {
      # In Chromium browsers, we can use the browser's APIs to get the necessary
      # ICU data. So we use built-in ICU data only in the heavy (non-chromium) case
      skia_use_icu = skwasm_is_heavy
      skia_use_client_icu = !skwasm_is_heavy
      if (!skwasm_is_heavy) {
        skia_icu_bidi_third_party_dir =
            "//flutter/third_party/canvaskit/icu_bidi"
      }

      skia_use_libjpeg_turbo_decode = skwasm_is_heavy
      skia_use_libpng_decode = skwasm_is_heavy
      skia_use_libwebp_decode = skwasm_is_heavy

      # We use OffscreenCanvas to produce PNG data instead of skia
      skia_use_no_png_encode = true
      skia_use_libpng_encode = false

      # skwasm is multithreaded
      wasm_use_workers = true
      wasm_prioritize_size = true
    }
  }
}

skwasm_toolchain("skwasm") {
  skwasm_is_heavy = false
}

skwasm_toolchain("skwasm_heavy") {
  skwasm_is_heavy = true
}

copy("skwasm_group") {
  visibility = [ "//flutter/web_sdk:*" ]
  public_deps = [ "//flutter/skwasm(:skwasm)" ]

  sources = [
    "$root_out_dir/skwasm/skwasm.js",
    "$root_out_dir/skwasm/skwasm.js.symbols",
    "$root_out_dir/skwasm/skwasm.wasm",
  ]
  if (is_debug) {
    if (!wasm_use_dwarf) {
      sources += [ "$root_out_dir/skwasm/skwasm.wasm.map" ]
    }
  }
  outputs = [ "$root_out_dir/flutter_web_sdk/canvaskit/{{source_file_part}}" ]
}

copy("skwasm_heavy_group") {
  visibility = [ "//flutter/web_sdk:*" ]
  public_deps = [ "//flutter/skwasm:skwasm_heavy(:skwasm_heavy)" ]

  sources = [
    "$root_out_dir/skwasm_heavy/skwasm_heavy.js",
    "$root_out_dir/skwasm_heavy/skwasm_heavy.js.symbols",
    "$root_out_dir/skwasm_heavy/skwasm_heavy.wasm",
  ]
  if (is_debug) {
    if (!wasm_use_dwarf) {
      sources += [ "$root_out_dir/skwasm_heavy/skwasm_heavy.wasm.map" ]
    }
  }
  outputs = [ "$root_out_dir/flutter_web_sdk/canvaskit/{{source_file_part}}" ]
}

copy("wimp_group") {
  visibility = [ "//flutter/web_sdk:*" ]
  public_deps = [ "//flutter/skwasm:wimp(:skwasm)" ]

  sources = [
    "$root_out_dir/skwasm/wimp.js",
    "$root_out_dir/skwasm/wimp.js.symbols",
    "$root_out_dir/skwasm/wimp.wasm",
  ]
  if (is_debug) {
    if (!wasm_use_dwarf) {
      sources += [ "$root_out_dir/skwasm/wimp.wasm.map" ]
    }
  }
  outputs = [ "$root_out_dir/flutter_web_sdk/canvaskit/{{source_file_part}}" ]
}
