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

source_set("fxge") {
  sources = [
    "agg/fx_agg_driver.cpp",
    "agg/fx_agg_driver.h",
    "calculate_pitch.cpp",
    "calculate_pitch.h",
    "cfx_cliprgn.cpp",
    "cfx_cliprgn.h",
    "cfx_color.cpp",
    "cfx_color.h",
    "cfx_defaultrenderdevice.cpp",
    "cfx_defaultrenderdevice.h",
    "cfx_drawutils.cpp",
    "cfx_drawutils.h",
    "cfx_face.cpp",
    "cfx_face.h",
    "cfx_fillrenderoptions.h",
    "cfx_folderfontinfo.cpp",
    "cfx_folderfontinfo.h",
    "cfx_font.cpp",
    "cfx_font.h",
    "cfx_fontcache.cpp",
    "cfx_fontcache.h",
    "cfx_fontmapper.cpp",
    "cfx_fontmapper.h",
    "cfx_fontmgr.cpp",
    "cfx_fontmgr.h",
    "cfx_gemodule.cpp",
    "cfx_gemodule.h",
    "cfx_glyphbitmap.cpp",
    "cfx_glyphbitmap.h",
    "cfx_glyphcache.cpp",
    "cfx_glyphcache.h",
    "cfx_graphstate.cpp",
    "cfx_graphstate.h",
    "cfx_graphstatedata.cpp",
    "cfx_graphstatedata.h",
    "cfx_path.cpp",
    "cfx_path.h",
    "cfx_renderdevice.cpp",
    "cfx_renderdevice.h",
    "cfx_substfont.cpp",
    "cfx_substfont.h",
    "cfx_textrenderoptions.h",
    "cfx_unicodeencoding.cpp",
    "cfx_unicodeencoding.h",
    "dib/cfx_bitmapcomposer.cpp",
    "dib/cfx_bitmapcomposer.h",
    "dib/cfx_bitmapstorer.cpp",
    "dib/cfx_bitmapstorer.h",
    "dib/cfx_cmyk_to_srgb.cpp",
    "dib/cfx_cmyk_to_srgb.h",
    "dib/cfx_dibbase.cpp",
    "dib/cfx_dibbase.h",
    "dib/cfx_dibitmap.cpp",
    "dib/cfx_dibitmap.h",
    "dib/cfx_imagerenderer.cpp",
    "dib/cfx_imagerenderer.h",
    "dib/cfx_imagestretcher.cpp",
    "dib/cfx_imagestretcher.h",
    "dib/cfx_imagetransformer.cpp",
    "dib/cfx_imagetransformer.h",
    "dib/cfx_scanlinecompositor.cpp",
    "dib/cfx_scanlinecompositor.h",
    "dib/cstretchengine.cpp",
    "dib/cstretchengine.h",
    "dib/fx_dib.cpp",
    "dib/fx_dib.h",
    "dib/scanlinecomposer_iface.h",
    "fontdata/chromefontdata/FoxitDingbats.cpp",
    "fontdata/chromefontdata/FoxitFixed.cpp",
    "fontdata/chromefontdata/FoxitFixedBold.cpp",
    "fontdata/chromefontdata/FoxitFixedBoldItalic.cpp",
    "fontdata/chromefontdata/FoxitFixedItalic.cpp",
    "fontdata/chromefontdata/FoxitSans.cpp",
    "fontdata/chromefontdata/FoxitSansBold.cpp",
    "fontdata/chromefontdata/FoxitSansBoldItalic.cpp",
    "fontdata/chromefontdata/FoxitSansItalic.cpp",
    "fontdata/chromefontdata/FoxitSansMM.cpp",
    "fontdata/chromefontdata/FoxitSerif.cpp",
    "fontdata/chromefontdata/FoxitSerifBold.cpp",
    "fontdata/chromefontdata/FoxitSerifBoldItalic.cpp",
    "fontdata/chromefontdata/FoxitSerifItalic.cpp",
    "fontdata/chromefontdata/FoxitSerifMM.cpp",
    "fontdata/chromefontdata/FoxitSymbol.cpp",
    "fontdata/chromefontdata/chromefontdata.h",
    "freetype/fx_freetype.cpp",
    "freetype/fx_freetype.h",
    "fx_font.cpp",
    "fx_font.h",
    "render_defines.h",
    "renderdevicedriver_iface.cpp",
    "renderdevicedriver_iface.h",
    "scoped_font_transform.cpp",
    "scoped_font_transform.h",
    "systemfontinfo_iface.h",
    "text_char_pos.cpp",
    "text_char_pos.h",
    "text_glyph_pos.cpp",
    "text_glyph_pos.h",
  ]

  configs += [
    "../../:pdfium_strict_config",
    "../../:pdfium_noshorten_config",
  ]

  deps = [
    "../../third_party:fx_agg",
    "../fxcrt",
  ]

  public_deps = []

  if (is_component_build || use_system_freetype) {
    # ft_adobe_glyph_list is not exported from the Freetype shared library so we
    # need it defined in component builds and builds using system freetype.
    defines = [ "DEFINE_PS_TABLES_DATA" ]
  }

  if (pdf_enable_xfa) {
    sources += [
      "cfx_unicodeencodingex.cpp",
      "cfx_unicodeencodingex.h",
    ]
  }

  if (pdf_use_skia) {
    sources += [ "skia/fx_skia_device.cpp" ]
    public_deps += [ "//skia" ]
  }

  if (is_android) {
    sources += [
      "android/cfpf_skiadevicemodule.cpp",
      "android/cfpf_skiadevicemodule.h",
      "android/cfpf_skiafont.cpp",
      "android/cfpf_skiafont.h",
      "android/cfpf_skiafontmgr.cpp",
      "android/cfpf_skiafontmgr.h",
      "android/cfpf_skiapathfont.cpp",
      "android/cfpf_skiapathfont.h",
      "android/cfx_androidfontinfo.cpp",
      "android/cfx_androidfontinfo.h",
      "android/fx_android_impl.cpp",
    ]
  }

  if (is_linux || is_chromeos || is_fuchsia) {
    sources += [ "linux/fx_linux_impl.cpp" ]
  }

  if (is_mac) {
    sources += [
      "apple/fx_apple_impl.cpp",
      "apple/fx_apple_platform.cpp",
      "apple/fx_apple_platform.h",
      "apple/fx_quartz_device.cpp",
      "apple/fx_quartz_device.h",
    ]
    frameworks = [ "CoreGraphics.framework" ]
  }

  if (is_win) {
    sources += [
      "cfx_windowsrenderdevice.cpp",
      "cfx_windowsrenderdevice.h",
      "dib/cfx_dibextractor.cpp",
      "dib/cfx_dibextractor.h",
      "win32/cfx_psfonttracker.cpp",
      "win32/cfx_psfonttracker.h",
      "win32/cfx_psrenderer.cpp",
      "win32/cfx_psrenderer.h",
      "win32/cgdi_device_driver.cpp",
      "win32/cgdi_device_driver.h",
      "win32/cgdi_display_driver.cpp",
      "win32/cgdi_display_driver.h",
      "win32/cgdi_plus_ext.cpp",
      "win32/cgdi_plus_ext.h",
      "win32/cgdi_printer_driver.cpp",
      "win32/cgdi_printer_driver.h",
      "win32/cps_printer_driver.cpp",
      "win32/cps_printer_driver.h",
      "win32/cpsoutput.cpp",
      "win32/cpsoutput.h",
      "win32/ctext_only_printer_driver.cpp",
      "win32/ctext_only_printer_driver.h",
      "win32/cwin32_platform.cpp",
      "win32/cwin32_platform.h",
    ]
    configs -= [ "//build/config/win:lean_and_mean" ]
  }

  visibility = [ "../../*" ]
}

pdfium_unittest_source_set("unittests") {
  sources = [
    "cfx_defaultrenderdevice_unittest.cpp",
    "cfx_folderfontinfo_unittest.cpp",
    "cfx_fontmapper_unittest.cpp",
    "cfx_path_unittest.cpp",
    "dib/cfx_cmyk_to_srgb_unittest.cpp",
    "dib/cfx_dibbase_unittest.cpp",
    "dib/cfx_dibitmap_unittest.cpp",
    "dib/cstretchengine_unittest.cpp",
    "fx_font_unittest.cpp",
  ]
  deps = [
    ":fxge",
    "../fpdfapi/page",
    "../fpdfapi/parser",
  ]
  pdfium_root_dir = "../../"

  if (is_win) {
    sources += [ "win32/cfx_psrenderer_unittest.cpp" ]
  }
}

pdfium_embeddertest_source_set("embeddertests") {
  sources = [ "fx_ge_text_embeddertest.cpp" ]
  deps = []
  pdfium_root_dir = "../../"

  if (pdf_use_skia) {
    sources += [ "skia/fx_skia_device_embeddertest.cpp" ]
    deps += [
      ":fxge",
      "../../fpdfsdk",
      "//skia",
    ]
  }

  if (is_win) {
    sources += [ "cfx_windowsrenderdevice_embeddertest.cpp" ]
    deps += [
      ":fxge",
      "../fxcodec",
    ]
  }
}
