# Copyright (c) 2023 Huawei Device Co., Ltd.
# 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.

if (defined(ohos_lite)) {
  import("//build/lite/config/component/lite_component.gni")
} else {
  import("//build/ohos.gni")
}

declare_args() {
  is_arm_ohos_clang_pc = (target_cpu == "arm" || target_cpu == "arm64") &&
                         is_ohos && is_clang && target_platform == "pc"
}

action("libjpeg_action") {
  script = "//third_party/libjpeg-turbo/install.py"
  outputs = [
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jddiffct.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jpeg_nbits.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdlhuff.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdlossls.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcdiffct.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jclossls.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jclhuff.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcapimin.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcapistd.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jccoefct.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jccolor.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcdctmgr.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jchuff.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcicc.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcinit.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcmainct.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcmarker.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcmaster.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcomapi.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcparam.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcphuff.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcprepct.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcsample.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jctrans.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdapimin.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdapistd.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdatadst.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdatasrc.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdcoefct.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdcolor.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jddctmgr.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdicc.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdinput.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdmainct.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdmarker.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdmaster.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdmerge.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdphuff.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdpostct.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdsample.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdtrans.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jerror.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jfdctflt.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jfdctfst.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jfdctint.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jidctflt.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jidctfst.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jidctint.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jidctred.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jmemmgr.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jmemnobs.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jquant1.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jquant2.c",
    "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jutils.c",
  ]

  if (is_arm_ohos_clang_pc) {
    outputs += [ "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdhuff_opt.c" ]
  } else {
    outputs += [ "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdhuff.c" ]
  }

  mkernel = defined(ohos_kernel_type) && ohos_kernel_type == "liteos_m"
  if (mkernel || is_win) {
    outputs += [ "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jsimd_none.c" ]
  } else if (current_cpu == "arm" || current_cpu == "arm64") {
    outputs += [
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jcgray-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jcphuff-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jcsample-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jdmerge-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jdsample-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jfdctfst-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jidctred-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jquanti-neon.c",
    ]

    # NEON_INTRINSICS as default
    outputs += [
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jccolor-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jidctfst-neon.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jidctint-neon.c",
    ]
    if (current_cpu == "arm") {
      outputs += [
        "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/aarch32/jchuff-neon.c",
        "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/aarch32/jsimd.c",
        "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jdcolor-neon.c",
        "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jfdctint-neon.c",
      ]
    } else {
      outputs += [
        "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/aarch64/jchuff-neon.c",
        "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/aarch64/jsimd.c",
        "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jdcolor-neon.c",
        "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm/jfdctint-neon.c",
      ]
    }
  } else {
    outputs += [ "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jsimd_none.c" ]
  }

  if (!defined(ohos_lite)) {
    outputs += [
      # enable arith codec
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jaricom.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jcarith.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdarith.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdatadst-tj.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/jdatasrc-tj.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/rdbmp.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/rdppm.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/transupp.c",

      # enable turbo
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/turbojpeg.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/wrbmp.c",
      "${target_gen_dir}/libjpeg-turbo-3.1.0/src/wrppm.c",
    ]
  }

  inputs = [
    "//third_party/libjpeg-turbo/libjpeg-turbo-3.1.0.tar.gz",
    "//third_party/libjpeg-turbo/Add-loongarch64.patch",
    "//third_party/libjpeg-turbo/libjpeg-turbo-2.1.x-bugfix.patch",
    "//third_party/libjpeg-turbo/liteos_adapting.patch",
    "//third_party/libjpeg-turbo/libjpeg-turbo-optimize.patch"
  ]

  libjpeg_path = rebase_path("${target_gen_dir}", root_build_dir)
  libjpeg_source_path =
      rebase_path("//third_party/libjpeg-turbo", root_build_dir)
  args = [
    "--gen-dir",
    "$libjpeg_path",
    "--source-dir",
    "$libjpeg_source_path",
  ]
}

include_dirs = []
define_config = [ "HAVE_UNSIGNED_SHORT=1" ]
cflags = []

mkernel = defined(ohos_kernel_type) && ohos_kernel_type == "liteos_m"
if (mkernel || is_win) {
  define_config += [
    "NO_PUTENV",
    "NO_GETENV",
  ]
} else if (current_cpu == "arm" || current_cpu == "arm64") {
  define_config += [ "NEON_INTRINSICS" ]
  cflags += [
    "-DNEON_INTRINSICS",
    "-Wno-pointer-sign",
  ]
  include_dirs += [ "${target_gen_dir}/libjpeg-turbo-3.1.0/simd/arm" ]
  if (current_cpu == "arm") {
    cflags += [
      "-mfpu=neon",
      "-mfloat-abi=softfp",
    ]
  }
}

if (!defined(ohos_lite)) {
  define_config += [
    "C_ARITH_CODING_SUPPORTED=1",  #Support arithmetic encoding
    "D_ARITH_CODING_SUPPORTED=1",  #Support arithmetic decoding
    "BMP_SUPPORTED=1",  #Support arithmetic decoding
    "PPM_SUPPORTED=1",  #Support arithmetic decoding
  ]
}

if (is_ohos) {
  define_config += [ "SK_ENABLE_HI_JPEG" ]
}

config("turbojpeg_config") {
  include_dirs += [ "${target_gen_dir}/libjpeg-turbo-3.1.0/src" ]
  ldflags = [ "-Wl,--lto-O0" ]
  defines = define_config
}

if (defined(ohos_lite)) {
  lite_library("libjpeg") {
    if (ohos_kernel_type == "liteos_m") {
      target_type = "static_library"
    } else {
      target_type = "shared_library"
    }
    sources = get_target_outputs(":libjpeg_action")
    deps = [ ":libjpeg_action" ]
    public_configs = [ ":turbojpeg_config" ]
    if (defined(board_toolchain_type) && board_toolchain_type == "iccarm") {
      cflags += [
        "-DHAVE_STDLIB_H",
        "--diag_suppress",
        "Pa181,Pe301,Pe546",
      ]
      cflags_cc = cflags
    }
  }
} else {
  ohos_static_library("turbojpeg_static") {
    visibility = [
      ":*",
      "//vendor/huawei/foundation/multimedia/algorithm_camera/refine_engine/algo_plugin/ipp/ITOF:libcamera_ips_ipp_itof",
      "//ide/tools/previewer/test/unittest/jsapp_lite:jsapp_lite_test",
      "//ide/tools/previewer/test/unittest/mock:mock_rich_test",
      "//ide/tools/previewer/test/unittest/mock_lite:mock_lite_test",
      "//ide/tools/previewer/mock:mock_lite",
      "//ide/tools/previewer/mock:mock_rich",
      "//drivers/peripheral/camera/vdi_base/usb_camera/pipeline_core:usb_camera_pipeline_core",
      "//test/testfwk/arkxtest/uitest:uitest_addon",
      "//foundation/arkui/ui_lite/ext/updater:libupdater_layout",
      "//foundation/arkui/ui_lite/ext/ide:ui_ide",
      "//foundation/arkui/ui_ext_lite/ext/updater:libupdater_layout",
      "//foundation/arkui/ui_ext_lite/tools/ide:graphic_lite",
      "//foundation/window/window_manager/dm/test/unittest:dm_unittest_common",
      "//foundation/ability/ability_runtime/test/fuzztest/abilityframeworkscjenvironment_fuzzer:AbilityFrameworksCjEnvironmentFuzzTest",
      "//foundation/ability/ability_runtime/test/fuzztest/openlinkoptions_fuzzer:OpenLinkOptionsFuzzTest",
      "//foundation/ability/ability_runtime/test/fuzztest/freezeutil_fuzzer:FreezeUtilFuzzTest",
      "//foundation/ability/ability_runtime/test/fuzztest/statusbardelegatemanager_fuzzer:StatusBarDelegateManagerFuzzTest",
      "//out/*",
      "//vendor/hisi/confidential/contexthub/src/framework/hisi/ui/third_party/*",
      "//device/board/hihope/rk3568/camera/vdi_impl/v4l2/pipeline_core:camera_pipeline_core",
      "//device/board/revoview/wukong100/camera/vdi_impl/v4l2/pipeline_core:camera_pipeline_core",
      "//foundation/window/window_manager/dmserver/test/unittest:dmserver_unittest_common",
      "//foundation/window/window_manager/extension/window_extension/test/unittest:window_extension_unittest_common",
      "//vendor/hisi/ap/hardware/camera_product/mm_platform/software_encode:libsoftware_encode",
      "//vendor/hisi/ap/hardware/camera_hal/hw_platform:libhw_platform",
      "//device/hmos_emulator/hardware/camera/pipeline_core:camera_pipeline_core",
      "//vendor/hisi/llt/hisecally_tools/hifsfuzz_testcases/libfuzzer/plat/ohos/camera_arch/camera_hal_libdependentso_fuzzer:exec_camera_hal_libdependentso_fuzzer",
      "//vendor/hisi/llt/hisecally_tools/hifsfuzz_testcases/libfuzzer/plat/ohos/camera_arch/camera_hal_buffer_fuzzer:exec_camera_hal_buffer_fuzzer",
    ]
    sources = get_target_outputs(":libjpeg_action")
    public_configs = [ ":turbojpeg_config" ]
    deps = [ ":libjpeg_action" ]
    part_name = "libjpeg-turbo"
    subsystem_name = "thirdparty"
    if (is_arm_ohos_clang_pc) {
      defines = [ "HUFF_DECODE_OPT" ]
      cflags += [ "-fvisibility=hidden" ]
    }
  }
  ohos_shared_library("turbojpeg") {
    sources = get_target_outputs(":libjpeg_action")
    public_configs = [ ":turbojpeg_config" ]
    deps = [ ":libjpeg_action" ]
    innerapi_tags = [ 
        "platformsdk",
        "chipsetsdk"  
        ]
    part_name = "libjpeg-turbo"
    subsystem_name = "thirdparty"
    if (is_arm_ohos_clang_pc) {
      defines = [
        "HUFF_DECODE_OPT",
        "HIDE_INTERNAL",
      ]
      ldflags = [ "-Wl,-Bsymbolic" ]
    }

    sanitize = {
      cfi = true
      cfi_cross_dso = true
      debug = false
    }
    branch_protector_ret = "pac_ret"
  }
}