# Copyright 2019 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")

template("skwasm_variant") {
  wasm_lib(target_name) {
    public_configs = [ "//flutter:config" ]

    sources = [
      "canvas.cc",
      "canvas_text.h",
      "contour_measure.cc",
      "data.cc",
      "export.h",
      "filters.cc",
      "fonts.cc",
      "helpers.h",
      "image.cc",
      "images.h",
      "live_objects.cc",
      "live_objects.h",
      "paint.cc",
      "path.cc",
      "picture.cc",
      "render_context.h",
      "shaders.cc",
      "skwasm_support.h",
      "string.cc",
      "surface.cc",
      "text/line_metrics.cc",
      "text/paragraph.cc",
      "text/paragraph_builder.cc",
      "text/paragraph_style.cc",
      "text/strut_style.cc",
      "text/text_style.cc",
      "text/text_types.h",
      "vertices.cc",
      "wrappers.h",
    ]

    cflags = [ "-mreference-types" ]

    ldflags = [
      "-std=c++20",
      "-lGL",
      "-sUSE_WEBGL2=1",
      "-sMAX_WEBGL_VERSION=2",
      "-sOFFSCREENCANVAS_SUPPORT",
      "-sALLOW_MEMORY_GROWTH",
      "-sALLOW_TABLE_GROWTH",
      "-lexports.js",
      "-sEXPORTED_FUNCTIONS=[stackAlloc]",
      "-sEXPORTED_RUNTIME_METHODS=[addFunction,wasmExports,wasmMemory,stackAlloc]",
      "-sINCOMING_MODULE_JS_API=[instantiateWasm,locateFile,noExitRuntime,mainScriptUrlOrBlob,wasmMemory,wasm,skwasmSingleThreaded]",
      "-sUSE_ES6_IMPORT_META=0",
      "--js-library",
      rebase_path("library_skwasm_support.js"),
    ]

    inputs = [ rebase_path("library_skwasm_support.js") ]
    if (invoker.is_heavy) {
      sources += [
        "animated_image.cc",
        "text/paragraph_builder_builtin_icu.cc",
      ]
    } else {
      sources += [
        "animated_image_stub.cc",
        "text/paragraph_builder_client_icu.cc",
      ]
    }

    if (invoker.use_impeller) {
      sources += [
        "canvas_text_impeller.cc",
        "images_impeller.cc",
        "render_context_impeller.cc",
        "shaders_impeller.cc",
      ]
    } else {
      sources += [
        "canvas_text_skia.cc",
        "images_skia.cc",
        "render_context_skia.cc",
        "shaders_skia.cc",
      ]
    }

    if (is_debug) {
      ldflags += [
        "-sASSERTIONS=1",
        "-sGL_ASSERTIONS=1",
      ]
    } else {
      ldflags += [ "--closure=1" ]
    }

    deps = [
      "//flutter/display_list",
      "//flutter/skia/modules/skparagraph",
      "//flutter/skia/modules/skunicode",
    ]

    if (invoker.use_impeller) {
      deps += [ "//flutter/impeller" ]
    } else {
      deps += [ "//flutter/skia" ]
    }
  }
}

skwasm_variant("skwasm") {
  is_heavy = false
  use_impeller = false
}

skwasm_variant("skwasm_heavy") {
  is_heavy = true
  use_impeller = false
}

skwasm_variant("wimp") {
  is_heavy = false
  use_impeller = true
}
