# 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.

import("//build/ohos.gni")
import("//foundation/multimedia/image_framework/ide/image_decode_config.gni")
if (use_mingw_win || use_clang_mac) {
  graphic_root = "/${image_sep_f}${image_oundation}/${graphic_multimedia}"
}
if (use_clang_mac) {
  third_party_dir = "/third_party"
  third_party_root = "/${third_party_dir}"
}

config("plugins_includes") {
  include_dirs = [
    "${image_subsystem}/plugins/manager/include",
    "${image_subsystem}/plugins/manager/include/image",
    "${image_subsystem}/plugins/manager/include/pluginbase",
  ]
}
config("third_part_includes") {
  include_dirs = [ "../libjpegplugin/include" ]
}
config("win_config") {
  if (use_mingw_win) {
    defines = image_decode_windows_defines
    defines += [ "CROSS_PLATFORM" ]
    include_dirs += [
      "${image_subsystem}/mock/native/include",
      "${image_subsystem}/mock/native/include/secure",
      "${asdk_dir}/static_library/${target_os}_${target_cpu}/include/external/skia/include/codec",
      "${asdk_dir}/static_library/${target_os}_${target_cpu}/include/external/skia/include/config",
      "${asdk_dir}/static_library/${target_os}_${target_cpu}/include/external/skia/include/config/win",
      "${asdk_dir}/static_library/${target_os}_${target_cpu}/include/external/skia/include/core",
    ]
  }
}
config("mac_config") {
  if (use_clang_mac) {
    defines = image_decode_mac_defines
    defines += [ "CROSS_PLATFORM" ]
    include_dirs += [
      "${image_subsystem}/mock/native/include",
      "${asdk_dir}/static_library/${target_os}_${target_cpu}/include/external/skia/include/codec",
      "${asdk_dir}/static_library/${target_os}_${target_cpu}/include/external/skia/include/core",
      "${asdk_dir}/static_library/${target_os}_${target_cpu}/include/external/skia/include/config/mac",
      "${asdk_dir}/static_library/${target_os}_${target_cpu}/include/external/skia/include/config",
      "${third_party_root}/bounds_checking_function/include",
    ]
  }
}
config("ext_public_config") {
  include_dirs = [ "${image_subsystem}/plugins/manager/include" ]
}

ohos_shared_library("textureEncoderCL") {
  if (!use_clang_android && !use_clang_ios) {
    branch_protector_ret = "pac_ret"
    sanitize = {
      cfi = true
      cfi_cross_dso = true
      cfi_vcall_icall_only = true
      debug = false
    }
  }
  sources = [ "src/texture_encode/image_compressor.cpp" ]
  include_dirs = [
    "${image_subsystem}/frameworks/innerkitsimpl/utils/include",
    "${image_subsystem}/interfaces/innerkits/include",
    "include/texture_encode",
  ]
  if (use_mingw_win) {
    configs += [ ":win_config" ]
  } else if (use_clang_mac) {
    configs += [ ":mac_config" ]
  } else {
    deps = [ "${image_subsystem}/frameworks/innerkitsimpl/utils:image_utils" ]
    external_deps = [
      "c_utils:utils",
      "hilog:libhilog",
      "opencl-headers:libcl",
    ]
  }
  cflags = [ "-O3" ]
  cflags_cc = [ "-O3" ]
  innerapi_tags = [ "platformsdk" ]
  subsystem_name = "multimedia"
  part_name = "image_framework"
}

ohos_shared_library("extplugin") {
  if (!use_clang_android && !use_clang_ios) {
    branch_protector_ret = "pac_ret"
    sanitize = {
      boundary_sanitizer = true
      cfi = true
      cfi_cross_dso = true
      cfi_vcall_icall_only = true
      debug = false
      integer_overflow = true
      ubsan = true
    }
  }
  sources = [
    "src/ext_decoder.cpp",
    "src/ext_encoder.cpp",
    "src/ext_pixel_convert.cpp",
    "src/ext_stream.cpp",
    "src/ext_wstream.cpp",
    "src/hdr/hdr_helper.cpp",
    "src/hdr/jpeg_mpf_parser.cpp",
    "src/jpeg_yuv_decoder/jpeg_decoder_yuv.cpp",
    "src/jpeg_yuv_decoder/jpeg_yuvdata_converter.cpp",
    "src/jpeg_yuv_decoder/yuv_helper.cpp",
    "src/plugin_export.cpp",
    "src/texture_encode/astc_codec.cpp",
    "src/bandjpeg/fast_manager.cpp",
    "src/bandjpeg/progressive_jpeg_decoder.cpp"
  ]
  if (enable_jpeg_hw_decode) {
    sources += [
      "src/hardware/jpeg_hw_decoder.cpp",
      "src/hardware/jpeg_dma_pool.cpp",
      "src/hardware/jpeg_hw_tile_decoder.cpp",
    ]
  }
  configs = [
    ":plugins_includes",
    ":third_part_includes",
  ]
  include_dirs = [
    "include",
    "include/hdr",
    "include/heif_impl/heif_parser",
    "include/texture_encode",
    "include/jpeg_yuv_decoder",
    "${image_subsystem}/interfaces/innerkits/include",
    "${image_subsystem}/frameworks/innerkitsimpl/utils/include",
    "${image_subsystem}/frameworks/innerkitsimpl/accessor/include",
    "${image_subsystem}/plugins/common/libs/image/formatagentplugin/include",
    "${image_subsystem}/plugins/common/libs/image/librawplugin/include",
    "${image_subsystem}/frameworks/innerkitsimpl/pixelconverter/include",
  ]
  if (use_mingw_win) {
    configs += [ ":win_config" ]
    deps = [
      ":heifparser",
      "${graphic_root}/ide/libs/skia:skia",
      "${image_subsystem}/frameworks/innerkitsimpl/utils:image_utils_static",
      "${image_subsystem}/mock/native:log_mock_static",
      "${image_subsystem}/plugins/common/libs/image/formatagentplugin:imageformatagent",
      "${image_subsystem}/plugins/common/libs/image/librawplugin:rawplugin",
      "${image_subsystem}/plugins/manager:pluginmanager_static",
    ]
    deps += skia_core
  } else if (use_clang_mac) {
    configs += [ ":mac_config" ]
    deps = [
      ":heifparser",
      "${graphic_root}/ide/libs/skia:skia",
      "${image_subsystem}/frameworks/innerkitsimpl/utils:image_utils_static",
      "${image_subsystem}/mock/native:log_mock_static",
      "${image_subsystem}/plugins/common/libs/image/formatagentplugin:imageformatagent",
      "${image_subsystem}/plugins/common/libs/image/librawplugin:rawplugin",
      "${image_subsystem}/plugins/manager:pluginmanager_static",
      "${third_party_root}/bounds_checking_function:libsec_static",
    ]
  } else {
    public_configs = [ ":ext_public_config" ]
    defines = []
    deps = [
      ":avifimpl",
      ":heifimpl",
      ":heifparser",
      "${image_subsystem}//frameworks/innerkitsimpl/pixelconverter:pixelconvertadapter",
      "${image_subsystem}/frameworks/innerkitsimpl/utils:image_utils",
      "${image_subsystem}/interfaces/innerkits:image_native",
      "${image_subsystem}/plugins/common/libs/image/formatagentplugin:imageformatagent",
      "${image_subsystem}/plugins/common/libs/image/librawplugin:rawplugin",
      "${image_subsystem}/plugins/manager:pluginmanager",
      "${image_subsystem}/frameworks/innerkitsimpl/accessor:image_accessor",
    ]

    external_deps = [
      "astc-encoder:astc_encoder_shared",
      "c_utils:utils",
      "drivers_interface_display:libdisplay_commontype_proxy_1.0",
      "ffmpeg:libohosffmpeg",
      "ffrt:libffrt",
      "graphic_2d:color_manager",
      "graphic_surface:surface",
      "hilog:libhilog",
      "hisysevent:libhisysevent",
      "libexif:libexif",
      "libjpeg-turbo:turbojpeg",
      "skia:libjpegm133",
      "skia:piexm133",
      "skia:skia_canvaskit",
      "zlib:libz",
    ]

    if (defined(global_parts_info) &&
        defined(global_parts_info.open_source_libyuv)) {
      defines += [ "ENABLE_ASTC_ENCODE_BASED_GPU" ]
      deps += [ ":textureEncoderCL" ]
      external_deps += [ "opencl-headers:libcl" ]
    }

    if (defined(global_parts_info) &&
        defined(global_parts_info.graphic_graphic_2d_ext)) {
      defines += [ "SUT_ENCODE_ENABLE" ]
      if (target_cpu == "arm64" || is_emulator) {
        defines += [ "SUT_PATH_X64" ]
      }
    }

    if (enable_jpeg_hw_decode) {
      external_deps += [
        "drivers_interface_codec:libimage_proxy_2.1",
        "drivers_interface_display:libdisplay_buffer_hdi_impl",
        "drivers_interface_display:libdisplay_buffer_proxy_1.0",
        "drivers_interface_display:libdisplay_composer_hdi_impl_1.3",
        "drivers_interface_display:libdisplay_composer_proxy_1.0",
        "hdf_core:libhdf_utils",
        "hdf_core:libhdi",
        "ipc:ipc_single",
      ]
      defines += [ "JPEG_HW_DECODE_ENABLE" ]
      defines += [ "JPEG_HW_TILE_DECODE_ENABLE" ]
    }

    if (enable_heif_hw_decode) {
      defines += [ "HEIF_HW_DECODE_ENABLE" ]
      include_dirs += [ "include/heif_impl/heif_parser" ]
      external_deps += [
        "drivers_interface_codec:libcodec_proxy_4.0",
        "openmax:libopenmax_static",
      ]
    }

    if (enable_heif_hw_encode) {
      defines += [ "HEIF_HW_ENCODE_ENABLE" ]
      external_deps += [ "drivers_interface_codec:libimage_proxy_2.1" ]
    }

    if (has_dav1d) {
      external_deps += [ "dav1d:dav1d_ohos" ]
      defines += [ "AVIF_DECODE_ENABLE" ]
    }
  }
  if (is_ohos) {
    sources += [ "src/sk_ohoscodec.cpp" ]
    defines += [ "SK_ENABLE_OHOS_CODEC" ]
  }
  if (image_use_new_skia) {
    defines += [ "USE_M133_SKIA" ]
  }
  cflags = [
    "-DIMAGE_COLORSPACE_FLAG",
    "-O3",
    "-fstack-protector-strong",
  ]
  cflags_cc = [ "-O3" ]
  innerapi_tags = [ "platformsdk" ]

  external_deps += [ "zlib:libz" ]

  subsystem_name = "multimedia"
  part_name = "image_framework"
}

ohos_prebuilt_etc("extpluginmetadata") {
  source = "extplugin.pluginmeta"
  relative_install_dir = "multimediaplugin/image"
  subsystem_name = "multimedia"
  part_name = "image_framework"
}

if (is_arkui_x) {
  ohos_source_set("heifparser") {
    if (!use_clang_android && !use_clang_ios) {
      sanitize = {
        cfi = true
        cfi_cross_dso = true
        cfi_vcall_icall_only = true
        debug = false
      }
    }

    remove_configs = [ "//build/config/compiler:no_rtti" ]

    configs = [ "//build/config/compiler:rtti" ]

    include_dirs = [
      "include/heif_impl/heif_parser",
      "${image_subsystem}/frameworks/innerkitsimpl/utils/include",
      "${image_subsystem}/interfaces/innerkits/include",
    ]

    sources = [
      "src/heif_impl/heif_parser/box/basic_box.cpp",
      "src/heif_impl/heif_parser/box/cr3_box.cpp",
      "src/heif_impl/heif_parser/box/heif_box.cpp",
      "src/heif_impl/heif_parser/box/item_data_box.cpp",
      "src/heif_impl/heif_parser/box/item_info_box.cpp",
      "src/heif_impl/heif_parser/box/item_movie_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_aux_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_av1c_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_basic_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_color_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_display_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_hvcc_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_transform_box.cpp",
      "src/heif_impl/heif_parser/box/item_ref_box.cpp",
      "src/heif_impl/heif_parser/cr3_parser.cpp",
      "src/heif_impl/heif_parser/heif_image.cpp",
      "src/heif_impl/heif_parser/heif_parser.cpp",
      "src/heif_impl/heif_parser/heif_stream.cpp",
      "src/heif_impl/heif_parser/heif_utils.cpp",
    ]

    external_deps = [ "c_utils:utils" ]

    subsystem_name = "multimedia"
    deps = [
      "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog_${target_os}",
      "//third_party/bounds_checking_function:libsec_static",
    ]
    part_name = "image_framework"
  }
} else {
  ohos_shared_library("heifparser") {
    if (!use_clang_android && !use_clang_ios) {
      branch_protector_ret = "pac_ret"
      sanitize = {
        cfi = true
        cfi_cross_dso = true
        cfi_vcall_icall_only = true
        debug = false
      }
    }

    remove_configs = [ "//build/config/compiler:no_rtti" ]

    configs = [ "//build/config/compiler:rtti" ]

    include_dirs = [
      "include/heif_impl/heif_parser",
      "${image_subsystem}/frameworks/innerkitsimpl/utils/include",
      "${image_subsystem}/interfaces/innerkits/include",
    ]

    sources = [
      "src/heif_impl/heif_parser/box/basic_box.cpp",
      "src/heif_impl/heif_parser/box/cr3_box.cpp",
      "src/heif_impl/heif_parser/box/heif_box.cpp",
      "src/heif_impl/heif_parser/box/item_data_box.cpp",
      "src/heif_impl/heif_parser/box/item_info_box.cpp",
      "src/heif_impl/heif_parser/box/item_movie_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_aux_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_av1c_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_basic_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_color_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_display_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_hvcc_box.cpp",
      "src/heif_impl/heif_parser/box/item_property_transform_box.cpp",
      "src/heif_impl/heif_parser/box/item_ref_box.cpp",
      "src/heif_impl/heif_parser/cr3_parser.cpp",
      "src/heif_impl/heif_parser/heif_image.cpp",
      "src/heif_impl/heif_parser/heif_parser.cpp",
      "src/heif_impl/heif_parser/heif_stream.cpp",
      "src/heif_impl/heif_parser/heif_utils.cpp",
    ]

    external_deps = [
       "bounds_checking_function:libsec_shared",
       "c_utils:utils",
       "hilog:libhilog",
    ]

    subsystem_name = "multimedia"
    innerapi_tags = [ "platformsdk_indirect" ]
    part_name = "image_framework"
  }
}

config("heif_hw_decoder_cfg") {
  cflags_cc = [ "-fexceptions" ]
}

ohos_shared_library("heifimpl") {
  if (!use_clang_android && !use_clang_ios) {
    branch_protector_ret = "pac_ret"
    sanitize = {
      cfi = true
      cfi_cross_dso = true
      cfi_vcall_icall_only = true
      debug = false
    }
  }

  defines = []
  if (build_variant == "root") {
    defines += [ "BUILD_ENG_VERSION" ]
  }
  if (enable_heif_hw_decode) {
    defines += [ "HEIF_HW_DECODE_ENABLE" ]
  }

  configs = []
  if (enable_heif_hw_decode) {
    configs += [ ":heif_hw_decoder_cfg" ]
  }

  include_dirs = [
    "include",
    "include/heif_impl",
    "include/heif_impl/heif_parser",
    "${image_subsystem}/frameworks/innerkitsimpl/utils/include",
    "${image_subsystem}/interfaces/innerkits/include",
  ]

  sources = [
    "src/heif_impl/HeifDecoderImpl.cpp",
  ]

  deps = [
    ":heifparser",
    "${image_subsystem}/frameworks/innerkitsimpl/utils:image_utils",
  ]

  external_deps = [
    "graphic_2d:color_manager",
    "graphic_surface:surface",
    "hilog:libhilog",
  ]

  if (enable_heif_hw_decode) {
    external_deps += [
      "c_utils:utils",
      "drivers_interface_codec:libcodec_proxy_4.0",
      "drivers_interface_codec:libimage_proxy_2.1",
      "drivers_interface_display:display_commontype_idl_headers",
      "hdf_core:libhdi",
      "hitrace:hitrace_meter",
      "init:libbegetutil",
      "ipc:ipc_core",
      "openmax:libopenmax_static",
      "qos_manager:qos",
    ]
  }

  subsystem_name = "multimedia"
  innerapi_tags = [ "platformsdk_indirect" ]
  part_name = "image_framework"
}

ohos_shared_library("avifimpl") {
  if (!use_clang_android && !use_clang_ios) {
    branch_protector_ret = "pac_ret"
    sanitize = {
      cfi = true
      cfi_cross_dso = true
      cfi_vcall_icall_only = true
      debug = false
    }
  }

  defines = []
  if (build_variant == "root") {
    defines += [ "BUILD_ENG_VERSION" ]
  }

  include_dirs = [
    "include",
    "include/heif_impl",
    "include/heif_impl/heif_parser",
    "${image_subsystem}/frameworks/innerkitsimpl/utils/include",
    "${image_subsystem}/interfaces/innerkits/include",
    "${image_subsystem}/frameworks/innerkitsimpl/common/include",
    "${image_subsystem}/frameworks/innerkitsimpl/pixelconverter/include",
  ]

  sources = [
    "src/heif_impl/AvifDecoderImpl.cpp",
  ]

  deps = [
    ":heifparser",
    "${image_subsystem}/frameworks/innerkitsimpl/utils:image_utils",
    "${image_subsystem}/frameworks/innerkitsimpl/pixelconverter:pixelconvertadapter",
  ]

  external_deps = [
    "bounds_checking_function:libsec_shared",
    "ffmpeg:libohosffmpeg",
    "graphic_2d:color_manager",
    "graphic_surface:surface",
    "hilog:libhilog",
  ]

  if (has_dav1d) {
    external_deps += [ "dav1d:dav1d_ohos" ]
    defines += [ "AVIF_DECODE_ENABLE" ]
  }

  subsystem_name = "multimedia"
  innerapi_tags = [ "platformsdk_indirect" ]
  part_name = "image_framework"
}