# Copyright 2013 The PDFium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/features.gni")
import("//build/config/freetype/freetype.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")
import("//third_party/skia/gn/codec.gni")
import("//third_party/skia/gn/shared_sources.gni")
import("//third_party/skia/modules/skcms/skcms.gni")
import("../pdfium.gni")
import("features.gni")

if (current_cpu == "arm") {
  import("//build/config/arm.gni")
}
if (current_cpu == "mipsel" || current_cpu == "mips64el") {
  import("//build/config/mips.gni")
}

if (pdf_enable_fontations) {
  import("//build/rust/rust_static_library.gni")
}

skia_use_ganesh_backend = !is_ios
skia_support_pdf = false

if (pdf_enable_fontations) {
  source_set("path_bridge") {
    sources = skia_fontations_path_bridge_sources
  }

  rust_static_library("bridge_rust_side") {
    allow_unsafe = true
    crate_root = skia_fontations_bridge_root
    sources = skia_ports_fontations_bridge_rust_side_sources
    cxx_bindings = [ skia_fontations_bridge_root ]
    deps = [
      ":path_bridge",
      "//third_party/rust/font_types/v0_9:lib",
      "//third_party/rust/read_fonts/v0_31:lib",
      "//third_party/rust/skrifa/v0_33:lib",
    ]
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      ":skia_config",
      "//build/config/compiler:no_chromium_code",
    ]
  }
}

# External-facing config for dependent code.
config("skia_config") {
  include_dirs = [ "//third_party/skia" ]

  defines = [
    "SK_ENCODE_PNG",
    "SK_USER_CONFIG_HEADER=\"../../skia/config/SkPdfiumUserConfig.h\"",
    "SK_DISABLE_LEGACY_INIT_DECODERS",
    "SK_DISABLE_LEGACY_PNG_WRITEBUFFER",
  ]

  if (is_win) {
    defines += [ "SK_FREETYPE_MINIMUM_RUNTIME_VERSION=(((FREETYPE_MAJOR) * 0x01000000) | ((FREETYPE_MINOR) * 0x00010000) | ((FREETYPE_PATCH) * 0x00000100))" ]
  }

  if (is_component_build) {
    defines += [
      "SKIA_DLL",
      "GR_GL_IGNORE_ES3_MSAA=0",
    ]
  }

  if (skia_use_ganesh_backend) {
    defines += [ "SK_GANESH" ]
  }

  if (skia_use_gl) {
    defines += [ "SK_GL" ]
  }

  if (is_android) {
    defines += [
      "SK_BUILD_FOR_ANDROID",
      "USE_CHROMIUM_SKIA",
    ]
  }

  if (is_mac) {
    defines += [ "SK_BUILD_FOR_MAC" ]
  }

  if (is_win) {
    defines += [ "GR_GL_FUNCTION_TYPE=__stdcall" ]
  }

  if (pdf_enable_fontations) {
    include_dirs += [ "$root_gen_dir/third_party/skia" ]
  }
}

# Internal-facing config for Skia library code.
config("skia_library_config") {
  # Turn on SK_API to export Skia's public API
  defines = [
    "IS_SKIA_IMPL=1",
    "SKIA_IMPLEMENTATION=1",
  ]

  if (use_blink && !use_system_freetype) {
    defines += [ "SK_FREETYPE_MINIMUM_RUNTIME_VERSION=(((FREETYPE_MAJOR) * 0x01000000) | ((FREETYPE_MINOR) * 0x00010000) | ((FREETYPE_PATCH) * 0x00000100))" ]
  }
  if (use_blink) {
    defines += [ "SK_TYPEFACE_FACTORY_FREETYPE" ]
  }
  if (is_win) {
    defines += [ "SK_TYPEFACE_FACTORY_DIRECTWRITE" ]
  }
  if (is_apple) {
    defines += [ "SK_TYPEFACE_FACTORY_CORETEXT" ]
  }

  if (current_cpu == "arm") {
    if (arm_use_neon) {
      defines += [ "SK_ARM_HAS_NEON" ]
    } else if (arm_optionally_use_neon) {
      defines += [ "SK_ARM_HAS_OPTIONAL_NEON" ]
    }
  }

  # Settings for text blitting, chosen to approximate the system browser.
  if (is_linux || is_chromeos) {
    defines += [
      "SK_GAMMA_EXPONENT=1.2",
      "SK_GAMMA_CONTRAST=0.2",
    ]
  } else if (is_android) {
    defines += [
      "SK_GAMMA_APPLY_TO_A8",
      "SK_GAMMA_EXPONENT=1.4",
      "SK_GAMMA_CONTRAST=0.0",
    ]
  } else if (is_win) {
    defines += [
      "SK_GAMMA_SRGB",
      "SK_GAMMA_CONTRAST=0.5",
    ]
  } else if (is_mac) {
    defines += [
      "SK_GAMMA_SRGB",
      "SK_GAMMA_CONTRAST=0.0",
    ]
  }

  if (is_android) {
    defines += [
      # Android devices are typically more memory constrained, so default to a
      # smaller glyph cache (it may be overriden at runtime when the renderer
      # starts up, depending on the actual device memory).
      "SK_DEFAULT_FONT_CACHE_LIMIT=1048576",  # 1024 * 1024
    ]
  } else {
    defines += [ "SK_DEFAULT_FONT_CACHE_LIMIT=20971520" ]  # 20 * 1024 * 1024
  }

  if (is_win) {
    defines += [
      # On windows, GDI handles are a scarse system-wide resource so we have to
      # keep the glyph cache, which holds up to 4 GDI handles per entry, to a
      # fairly small size. http://crbug.com/314387
      "SK_DEFAULT_FONT_CACHE_COUNT_LIMIT=256",
    ]
  }
}

component("skia") {
  deps = []

  sources = [
    # PDFium sources.
    "config/SkPdfiumUserConfig.h",
    "ext/google_logging.cc",
  ]

  # The skia sources values are relative to the skia_dir, so we need to rebase.
  sources += skia_core_public
  sources += skia_pathops_sources
  sources += skia_sksl_pipeline_sources
  sources += skia_sksl_codegen_sources
  sources += skia_sksl_core_sources
  sources += skia_sksl_core_module_sources
  sources += skia_utils_private
  sources += skia_xps_sources
  sources += skia_codec_decode_bmp
  sources += skia_codec_libpng_srcs
  sources += skia_codec_png_base
  sources += skia_codec_shared
  sources += skia_encode_libpng_srcs
  sources += skia_encode_png_base
  sources += skia_encode_srcs
  sources += skia_ports_sources
  sources += [
    "//third_party/skia/src/ports/SkImageGenerator_none.cpp",
    "//third_party/skia/src/sfnt/SkOTTable_name.cpp",
    "//third_party/skia/src/sfnt/SkOTUtils.cpp",

    #pdfium
    "//third_party/skia/src/ports/SkDiscardableMemory_none.cpp",
    "//third_party/skia/src/ports/SkMemory_malloc.cpp",
  ]

  # This and skia_opts are really the same conceptual target so share headers.
  allow_circular_includes_from = [ ":skia_opts" ]

  # GPU
  if (skia_use_ganesh_backend) {
    sources += skia_gpu_public
    sources += skia_ganesh_private
    sources += skia_null_gpu_sources
    sources += skia_shared_gpu_sources
    if (skia_use_gl) {
      sources += skia_gpu_gl_public
      sources += skia_gpu_gl_private
    }
  }

  # Remove unused util files include in utils.gni
  sources -= [
    "//third_party/skia/src/utils/SkCamera.cpp",
    "//third_party/skia/src/utils/SkParsePath.cpp",
  ]

  if (is_win) {
    libs = [ "fontsub.lib" ]
  }

  # need separate win section to handle chromes auto gn filter
  # (build/config/BUILDCONFIG.gn)
  if (is_win) {
    sources -= [
      #windows
      "//third_party/skia/src/utils/win/SkWGL_win.cpp",
    ]
  }

  # Select Skia ports.

  # FreeType is needed everywhere (except on iOS), on Linux and Android as main
  # font backend, on Windows and Mac as fallback backend for Variations.
  if (!is_ios) {
    sources += skia_ports_freetype_sources
  }

  if (is_win) {
    # See SK_TYPEFACE_FACTORY_DIRECTWRITE
    sources += skia_ports_windows_fonts_sources
    sources += skia_ports_windows_sources
  } else {
    sources += [ "//third_party/skia/src/ports/SkOSFile_posix.cpp" ]
  }

  frameworks = []
  if (is_apple) {
    # See SK_TYPEFACE_FACTORY_CORETEXT
    sources += skia_ports_fontmgr_coretext_sources
    frameworks += [
      "CoreFoundation.framework",
      "CoreGraphics.framework",
      "CoreText.framework",
    ]
  }

  if (is_linux || is_chromeos) {
    sources += skia_ports_fci_sources
    sources += skia_ports_fontmgr_custom_sources
    sources += skia_ports_fontmgr_empty_sources
    sources += skia_ports_typeface_proxy_sources
  }

  if (is_android) {
    # Unlike Chromium, standalone PDFium on Linux and Chrome OS does not
    # require these files, since PDFium does not perform Android emulation.
    # Note that this requires expat.
    sources += skia_ports_fontmgr_android_sources
  }

  if (is_win || (is_apple && use_blink)) {
    # Add the FreeType custom font manager as a fallback backend for variable fonts.
    sources += skia_ports_fontmgr_custom_sources
    sources += skia_ports_fontmgr_empty_sources
  }

  if (pdf_enable_fontations) {
    sources += skia_ports_typeface_fontations_sources

    # Fontations Rust/C++ bridge interfaces.
    deps += [
      ":bridge_rust_side",
      ":path_bridge",
    ]
  }

  if (is_clang) {
    # Skia won't compile with some of the more strict clang warnings.
    # e.g. it does:
    #  SkASSERT(!"sk_out_of_memory");
    configs -= [ "//build/config/clang:extra_warnings" ]
  }

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    ":skia_config",
    ":skia_library_config",
    "//build/config/compiler:no_chromium_code",
  ]
  public_configs = [ ":skia_config" ]

  deps += [
    ":skcms",
    ":skia_opts",
    "../third_party:png",
    "../third_party:zlib",
    "//:freetype_common",
  ]
  public_deps = [ ":skia_core_and_effects" ]

  if (is_linux || is_chromeos) {
    deps += [
      "//third_party:fontconfig",
      "//third_party/icu:icuuc",
    ]
  }

  if (is_android) {
    deps += [
      "//third_party/cpu_features:ndk_compat",
      "//third_party/expat",
    ]
  }

  if (is_android && !is_debug) {
    configs -= [ "//build/config/compiler:default_optimization" ]
    configs += [ "//build/config/compiler:optimize_max" ]
  }

  if (is_ios) {
    frameworks += [ "ImageIO.framework" ]
  }

  if (skia_support_pdf) {
    sources += skia_pdf_sources
  } else {
    sources += [ "//third_party/skia/src/pdf/SkDocument_PDF_None.cpp" ]
  }
}

# Template for things that are logically part of :skia, but need to be split out
# so custom compile flags can be applied.
#
# These are all opted out of check_includes, due to (logically) being part of
# skia.
template("skia_source_set") {
  source_set(target_name) {
    forward_variables_from(invoker, "*")

    check_includes = false

    if (!is_debug) {
      configs -= [ "//build/config/compiler:default_optimization" ]
      configs += [ "//build/config/compiler:optimize_max" ]
    }

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      ":skia_config",
      ":skia_library_config",
      "//build/config/compiler:no_chromium_code",
    ]
    public_configs = [ ":skia_config" ]
  }
}

skia_source_set("skia_core_and_effects") {
  defines = []
  sources = skia_core_sources
  sources += skia_effects_sources
  sources += skia_colorfilters_sources
  sources += skia_effects_imagefilter_sources

  visibility = [ ":skia" ]
}

# Bits that involve special vector-y hardware.
if (current_cpu == "x86" || current_cpu == "x64") {
  skia_source_set("skia_opts_hsw") {
    sources = skia_opts.hsw_sources
    if (!is_win) {
      cflags = [
        "-mavx2",
        "-mbmi",
        "-mbmi2",
        "-mf16c",
        "-mfma",
      ]
    }
    if (is_win) {
      cflags = [ "/arch:AVX2" ]
    }
    visibility = [ ":skia_opts" ]
  }
}

skia_source_set("skia_opts") {
  cflags = []
  defines = []

  if (current_cpu == "x86" || current_cpu == "x64") {
    deps = [ ":skia_opts_hsw" ]
  } else if (current_cpu == "arm") {
    # The assembly uses the frame pointer register (r7 in Thumb/r11 in
    # ARM), the compiler doesn't like that.
    cflags += [ "-fomit-frame-pointer" ]

    if (arm_version >= 7) {
      if (arm_use_neon || arm_optionally_use_neon) {
        # Root build config sets -mfpu=$arm_fpu, which we expect to be neon
        # when running this.
        if (!arm_use_neon) {
          configs -= [ "//build/config/compiler:compiler_arm_fpu" ]
          cflags += [ "-mfpu=neon" ]
        }
      }
    }
  } else if (current_cpu == "arm64") {
    # Conditional and empty body needed to avoid assert below
  } else if (current_cpu == "mipsel" || current_cpu == "mips64el") {
    cflags += [ "-fomit-frame-pointer" ]
  } else {
    assert(false, "Unsupported target CPU " + current_cpu)
  }

  if (is_android && !is_debug) {
    configs -= [ "//build/config/compiler:default_optimization" ]
    configs += [ "//build/config/compiler:optimize_max" ]
  }

  visibility = [ ":skia" ]
}

if (current_cpu == "x64") {
  skia_source_set("skcms_TransformHsw") {
    sources = skcms_TransformHsw
    if (!is_win) {
      cflags = [
        "-w",
        "-march=haswell",
        "-std=c11",
      ]
    } else {
      cflags = [ "/arch:AVX2" ]
    }
    visibility = [ ":skcms" ]
  }
  skia_source_set("skcms_TransformSkx") {
    sources = skcms_TransformSkx
    if (!is_win) {
      cflags = [
        "-w",
        "-march=skylake-avx512",
        "-std=c11",
      ]
    } else {
      cflags = [ "/arch:AVX512" ]
    }
    visibility = [ ":skcms" ]
  }
} else {
  skia_source_set("skcms_TransformHsw") {
    sources = []
    visibility = [ ":skcms" ]
  }
  skia_source_set("skcms_TransformSkx") {
    sources = []
    visibility = [ ":skcms" ]
  }
}

source_set("skcms_TransformBaseline_and_public") {
  if (!is_win || is_clang) {
    cflags = [
      "-w",
      "-std=c11",
    ]
  } else {
    cflags = []
  }

  # LLVM automatically sets the equivalent of GCC's -mfp16-format=ieee on ARM
  # builds by default, while GCC itself does not. We need it to enable support
  # for half-precision floating point data types used by SKCMS on ARM.
  if ((is_linux || is_chromeos) && !is_clang && current_cpu == "arm") {
    cflags += [ "-mfp16-format=ieee" ]
  }

  sources = rebase_path(skcms_TransformBaseline + skcms_public,
                        ".",
                        "//third_party/skia/modules/skcms")
}

source_set("skcms") {
  deps = [
    ":skcms_TransformBaseline_and_public",
    ":skcms_TransformHsw",
    ":skcms_TransformSkx",
  ]
  public =
      rebase_path(skcms_public_headers, ".", "//third_party/skia/modules/skcms")
  include_dirs = [ "//third_party/skia/modules/skcms" ]
}
