# Copyright 2014 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/sanitizers/sanitizers.gni")
import("//build_overrides/v8.gni")
import("../pdfium.gni")

group("samples") {
  testonly = true
  deps = [
    ":pdfium_diff",
    ":pdfium_test",
  ]
}

config("pdfium_samples_config") {
  defines = [
    "PNG_PREFIX",
    "PNG_USE_READ_MACROS",
  ]
  include_dirs = [ ".." ]
  if (pdf_enable_v8) {
    defines += [ "PDF_ENABLE_V8" ]
  }
  if (pdf_enable_xfa) {
    defines += [ "PDF_ENABLE_XFA" ]
  }
  if (pdf_use_skia) {
    defines += [ "PDF_ENABLE_SKIA" ]
  }
}

executable("pdfium_test") {
  testonly = true
  sources = [
    "image_diff_png.cc",
    "image_diff_png.h",
    "pdfium_test.cc",
  ]
  deps = [
    "../:pdfium",
    "../:test_support",
    "//build/config/sanitizers:deps",

    # Regardless of whether the library ships against system freetype,
    # always link this binary against the bundled one for consistency
    # of results across platforms.
    "../third_party:fx_freetype",
  ]
  if (!pdf_enable_xfa) {
    deps += [ "../third_party:fx_lpng" ]
  }
  if (pdf_enable_v8) {
    deps += [ "//v8:v8_libplatform" ]
    include_dirs = [
      "//v8",
      "//v8/include",
    ]
    configs += [ "//v8:external_startup_data" ]
  }
  if (pdf_use_skia) {
    deps += [ "//skia" ]
  }
  configs += [ ":pdfium_samples_config" ]
}

executable("pdfium_diff") {
  testonly = true
  sources = [
    "image_diff.cc",
    "image_diff_png.cc",
    "image_diff_png.h",
  ]
  deps = [
    "../:pdfium",
    "//build/config/sanitizers:deps",
  ]
  if (!pdf_enable_xfa) {
    deps += [ "../third_party:fx_lpng" ]
  }
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    ":pdfium_samples_config",
    "//build/config/compiler:no_chromium_code",
  ]
}
