# Copyright 2015 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/rust.gni")
import("//build_overrides/pdfium.gni")

# This file contains PDFium-related build flags.

declare_args() {
  # Build PDFium either:
  # 1) When set to true, with a bundled FreeType, built from FreeType source
  #    code in //third_party/freetype and PDFium's FreeType configs in
  #    third_party/freetype/include.
  # 2) When set to false, use whatever FreeType target is defined in
  #    //build/config/freetype.
  pdf_bundle_freetype = pdf_bundle_freetype_override

  # Generate logging messages for click events that reach PDFium
  pdf_enable_click_logging = false

  # Build PDFium either with or without v8 support.
  pdf_enable_v8 = pdf_enable_v8_override

  # Build PDFium either with or without XFA Forms support.
  pdf_enable_xfa = pdf_enable_xfa_override

  # If XFA, also support bmp codec. Ignored if not XFA.
  pdf_enable_xfa_bmp = true

  # If XFA, also support gif codec. Ignored if not XFA.
  pdf_enable_xfa_gif = true

  # If XFA, also support png codec. Ignored if not XFA.
  pdf_enable_xfa_png = true

  # If XFA, also support tiff codec. Ignored if not XFA.
  pdf_enable_xfa_tiff = true

  # Build PDFium against PartitionAlloc. When false, PDFium must build without
  # requiring any PartitionAlloc headers or code to be present. When true,
  # PDFium will use PartitionAlloc partitions to separate strings, scalars,
  # etc. from other allocations. However, the use of PartitionAlloc for new or
  # malloc is controlled by args in build_overrides/partition_alloc.gni.
  pdf_use_partition_alloc = pdf_use_partition_alloc_override

  # Build PDFium to use AGG (fully supported).
  pdf_use_agg = true

  # Build PDFium to use Skia (experimental) for all PDFium graphics.
  # If `pdf_use_agg` is enabled as well, coexists in build with AGG graphics
  # and the default renderer is selectable at runtime.
  pdf_use_skia = pdf_use_skia_override

  # When building PDFium with Skia enabled, use a custom font manager if there
  # is one. The target that PDFium will depend on must implement the following
  # C++ function signature:
  #
  # sk_sp<SkFontMgr> pdfium_skia_custom_font_manager();
  pdf_skia_font_manager_target = pdf_skia_font_manager_target_override

  # Build PDFium with experimental Fontations library support.
  # If enabled, coexists in build with FreeType library and the default font
  # library is selectable at runtime.
  # Note that Fontations requires Skia and Rust support.
  pdf_enable_fontations = pdf_enable_fontations_override

  # Build PDFium with Rust-based PNG decoder and encoder.
  # If enabled, it ensures that PDFium doesn't depend on `libpng`.
  # Note that `pdf_enable_rust_png` requires Skia and Rust support.
  pdf_enable_rust_png = pdf_enable_rust_png_override

  # Build PDFium standalone. Now only controls whether the test binaries
  # are built. Most logic is conditioned by build_with_chromium.
  pdf_is_standalone = false

  # Build a complete static library
  pdf_is_complete_lib = false

  # Enable callgrind for performance profiling
  enable_callgrind = false

  # Don't build against bundled lcms2.
  use_system_lcms2 = false

  # Don't build against bundled libopenjpeg2.
  use_system_libopenjpeg2 = false

  # Don't build against bundled libpng.
  use_system_libpng = false

  # Don't build against bundled libtiff.
  use_system_libtiff = false

  # Don't build against bundled zlib.
  use_system_zlib = false
}

assert(!pdf_is_complete_lib || !is_component_build,
       "pdf_is_complete_lib=true requires is_component_build=false")

assert(pdf_use_agg || pdf_use_skia,
       "At least one of pdf_use_agg or pdf_use_skia must be true")

assert(
    !pdf_enable_fontations || (enable_rust && enable_rust_cxx && pdf_use_skia),
    "pdf_enable_fontations=true requires enable_rust=true, enable_rust_cxx=true, and pdf_use_skia=true")

assert(
    !pdf_enable_rust_png || (enable_rust && enable_rust_cxx && pdf_use_skia),
    "pdf_enable_rust_png=true requires enable_rust=true, enable_rust_cxx=true, and pdf_use_skia=true")
