# Copyright 2018 The PDFium 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/config/jumbo.gni")
import("../../pdfium.gni")
import("../../testing/test.gni")

jumbo_source_set("fxcrt") {
  sources = [
    "autorestorer.h",
    "bytestring.cpp",
    "bytestring.h",
    "cfx_binarybuf.cpp",
    "cfx_binarybuf.h",
    "cfx_bitstream.cpp",
    "cfx_bitstream.h",
    "cfx_datetime.cpp",
    "cfx_datetime.h",
    "cfx_fixedbufgrow.h",
    "cfx_memorystream.cpp",
    "cfx_memorystream.h",
    "cfx_readonlymemorystream.cpp",
    "cfx_readonlymemorystream.h",
    "cfx_seekablestreamproxy.cpp",
    "cfx_seekablestreamproxy.h",
    "cfx_utf8decoder.cpp",
    "cfx_utf8decoder.h",
    "cfx_utf8encoder.cpp",
    "cfx_utf8encoder.h",
    "cfx_widetextbuf.cpp",
    "cfx_widetextbuf.h",
    "fileaccess_iface.h",
    "fx_bidi.cpp",
    "fx_bidi.h",
    "fx_codepage.cpp",
    "fx_codepage.h",
    "fx_coordinates.cpp",
    "fx_coordinates.h",
    "fx_extension.cpp",
    "fx_extension.h",
    "fx_memory.cpp",
    "fx_memory.h",
    "fx_number.cpp",
    "fx_number.h",
    "fx_random.cpp",
    "fx_random.h",
    "fx_safe_types.h",
    "fx_stream.cpp",
    "fx_stream.h",
    "fx_string.cpp",
    "fx_string.h",
    "fx_system.cpp",
    "fx_system.h",
    "fx_ucddata.cpp",
    "fx_ucddata.h",
    "fx_unicode.cpp",
    "fx_unicode.h",
    "maybe_owned.h",
    "observable.h",
    "pauseindicator_iface.h",
    "retain_ptr.h",
    "shared_copy_on_write.h",
    "string_data_template.h",
    "string_pool_template.h",
    "string_view_template.h",
    "unowned_ptr.h",
    "weak_ptr.h",
    "widestring.cpp",
    "widestring.h",
    "xml/cfx_xmlchardata.cpp",
    "xml/cfx_xmlchardata.h",
    "xml/cfx_xmldocument.cpp",
    "xml/cfx_xmldocument.h",
    "xml/cfx_xmlelement.cpp",
    "xml/cfx_xmlelement.h",
    "xml/cfx_xmlinstruction.cpp",
    "xml/cfx_xmlinstruction.h",
    "xml/cfx_xmlnode.cpp",
    "xml/cfx_xmlnode.h",
    "xml/cfx_xmlparser.cpp",
    "xml/cfx_xmlparser.h",
    "xml/cfx_xmltext.cpp",
    "xml/cfx_xmltext.h",
  ]
  configs += [ "../../:pdfium_core_config" ]
  visibility = [
    "../*",
    "../../:*",
    "../../fpdfsdk/*",
    "../../fxbarcode:*",
    "../../fxjs:*",
    "../../third_party:fx_agg",
    "../../third_party:fx_lcms2",
    "../../third_party:fx_tiff",
    "../../third_party:pdfium_base",
    "../../xfa/*",
  ]
  deps = [
    "../../third_party:pdfium_base",
  ]
  public_deps = [
    "../../:freetype_common",
    "../../third_party:pdfium_base",
    "//third_party/icu:icuuc",
  ]
  allow_circular_includes_from = [ "../../third_party:pdfium_base" ]

  if (is_posix || is_fuchsia) {
    sources += [
      "cfx_fileaccess_posix.cpp",
      "cfx_fileaccess_posix.h",
    ]
  }
  if (is_win) {
    sources += [
      "cfx_fileaccess_windows.cpp",
      "cfx_fileaccess_windows.h",
    ]
  }
  if (pdf_enable_xfa) {
    sources += [
      "cfx_char.cpp",
      "cfx_char.h",
      "cfx_decimal.cpp",
      "cfx_decimal.h",
      "fx_arabic.cpp",
      "fx_arabic.h",
      "locale_iface.h",
    ]
  }
}

if (pdf_enable_xfa) {
  jumbo_source_set("seekablemultistream") {
    sources = [
      "cfx_seekablemultistream.cpp",
      "cfx_seekablemultistream.h",
    ]
    deps = [
      ":fxcrt",
      "../fpdfapi/parser",
    ]
    configs += [ "../../:pdfium_core_config" ]
    visibility = [ "../../*" ]
  }
}

pdfium_unittest_source_set("unittests") {
  sources = [
    "autorestorer_unittest.cpp",
    "bytestring_unittest.cpp",
    "cfx_bitstream_unittest.cpp",
    "fx_bidi_unittest.cpp",
    "fx_coordinates_unittest.cpp",
    "fx_extension_unittest.cpp",
    "fx_memory_unittest.cpp",
    "fx_number_unittest.cpp",
    "fx_random_unittest.cpp",
    "fx_string_unittest.cpp",
    "fx_system_unittest.cpp",
    "maybe_owned_unittest.cpp",
    "observable_unittest.cpp",
    "pdfium_span_unittest.cpp",
    "retain_ptr_unittest.cpp",
    "shared_copy_on_write_unittest.cpp",
    "string_pool_template_unittest.cpp",
    "unowned_ptr_unittest.cpp",
    "weak_ptr_unittest.cpp",
    "widestring_unittest.cpp",
    "xml/cfx_xmlchardata_unittest.cpp",
    "xml/cfx_xmldocument_unittest.cpp",
    "xml/cfx_xmlelement_unittest.cpp",
    "xml/cfx_xmlinstruction_unittest.cpp",
    "xml/cfx_xmlnode_unittest.cpp",
    "xml/cfx_xmlparser_unittest.cpp",
    "xml/cfx_xmltext_unittest.cpp",
  ]
  deps = []
  pdfium_root_dir = "../../"

  if (pdf_enable_xfa) {
    sources += [
      "cfx_seekablemultistream_unittest.cpp",
      "css/cfx_cssdeclaration_unittest.cpp",
      "css/cfx_cssstylesheet_unittest.cpp",
      "css/cfx_cssvaluelistparser_unittest.cpp",
    ]
    deps += [
      ":seekablemultistream",
      "../fpdfapi/parser",
      "css",
    ]
  }
}
