# Copyright 2014 The Chromium 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("//testing/libfuzzer/fuzzer_test.gni")

config("qcms_config") {
  include_dirs = [ "src" ]
}

disable_qcms = false

static_library("qcms") {
  if (disable_qcms) {
    sources = [
      "src/empty.c",
    ]
  } else {
    sources = [
      "src/chain.c",
      "src/chain.h",
      "src/iccread.c",
      "src/matrix.c",
      "src/matrix.h",
      "src/qcms.h",
      "src/qcms_util.c",
      "src/qcmsint.h",
      "src/qcmstypes.h",
      "src/transform.c",
      "src/transform_util.c",
      "src/transform_util.h",
    ]

    defines = []

    if (current_cpu == "x86" || current_cpu == "x64") {
      defines += [ "SSE2_ENABLE" ]
      sources += [ "src/transform-sse2.c" ]
    }

    if (use_fuzzing_engine) {
      defines += [ "USE_LIBFUZZER" ]
    }
  }

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]
  public_configs = [ ":qcms_config" ]

  if (is_win) {
    cflags = [
      "/wd4018",  # Signed/unsigned mismatch in comparison.
      "/wd4056",  # Overflow in floating-point constant arithmetic (INFINITY).
      "/wd4756",  # Overflow in constant arithmetic (INFINITY).
    ]
  }
}

# fuzzers BUILD depends on this target. Needed for package discovery
group("fuzzers") {
}

fuzzer_test("qcms_color_space_fuzzer") {
  sources = [
    "//testing/libfuzzer/fuzzers/color_space_data.h",
    "qcms_color_space_fuzzer.cc",
  ]
  deps = [
    ":qcms",
    "//base",
  ]
  dict = "//testing/libfuzzer/fuzzers/dicts/icc.dict"
  libfuzzer_options = [ "max_len=4194304" ]
}

if (!disable_qcms) {
  executable("qcms_tests") {
    if (current_cpu == "x86" || current_cpu == "x64") {
      defines = [ "SSE2_ENABLE" ]
    }
    sources = [
      "src/tests/qcms_test_internal_srgb.c",
      "src/tests/qcms_test_main.c",
      "src/tests/qcms_test_munsell.c",
      "src/tests/qcms_test_ntsc_gamut.c",
      "src/tests/qcms_test_output_trc.c",
      "src/tests/qcms_test_tetra_clut_rgba.c",
      "src/tests/qcms_test_util.c",
    ]

    deps = [
      "//build/win:default_exe_manifest",
      "//third_party/qcms",
    ]

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
    public_configs = [ ":qcms_config" ]
  }
}
