# 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_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_unicode.cpp",
    "fx_unicode.h",
    "maybe_owned.h",
    "observable.h",
    "pauseindicator_iface.h",
    "retain_ptr.h",
    "retained_tree_node.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_memorystream.cpp",
      "cfx_memorystream.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",
    "cfx_seekablestreamproxy_unittest.cpp",
    "cfx_widetextbuf_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",
    "retained_tree_node_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_memorystream_unittest.cpp",
      "cfx_seekablemultistream_unittest.cpp",
      "css/cfx_cssdeclaration_unittest.cpp",
      "css/cfx_cssstylesheet_unittest.cpp",
      "css/cfx_cssvaluelistparser_unittest.cpp",
    ]
    deps += [
      ":seekablemultistream",
      "../fpdfapi/parser",
      "css",
    ]
  }
}
