# 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_test",
    ":pdfium_diff",
  ]
}

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

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

    # 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/pdfium/third_party:fx_freetype",
    ":fx_lpng",
  ]
  if (pdf_enable_v8) {
    deps += [ "//v8:v8_libplatform" ]
    include_dirs = [
      "//v8",
      "//v8/include",
    ]
    configs += [ "//v8:external_startup_data" ]
  }
  configs += [ ":pdfium_samples_config" ]
}

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

static_library("fx_lpng") {
  testonly = true
  sources = [
    "fx_lpng/include/fx_png.h",
    "fx_lpng/src/fx_png.c",
    "fx_lpng/src/fx_pngerror.c",
    "fx_lpng/src/fx_pngget.c",
    "fx_lpng/src/fx_pngmem.c",
    "fx_lpng/src/fx_pngpread.c",
    "fx_lpng/src/fx_pngread.c",
    "fx_lpng/src/fx_pngrio.c",
    "fx_lpng/src/fx_pngrtran.c",
    "fx_lpng/src/fx_pngrutil.c",
    "fx_lpng/src/fx_pngset.c",
    "fx_lpng/src/fx_pngtrans.c",
    "fx_lpng/src/fx_pngwio.c",
    "fx_lpng/src/fx_pngwrite.c",
    "fx_lpng/src/fx_pngwtran.c",
    "fx_lpng/src/fx_pngwutil.c",
  ]
  include_dirs = [ "../core/src/fxcodec/fx_zlib/include/" ]
  configs += [ ":pdfium_samples_config" ]
}
