# 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.

# Do not use the targets in this file unless you need a certain libjpeg
# implementation. Use the meta target //third_party:jpeg instead.

import("//build/config/sanitizers/sanitizers.gni")
if (current_cpu == "arm") {
  import("//build/config/arm.gni")
}

if (current_cpu == "x86" || current_cpu == "x64") {
  import("//third_party/yasm/yasm_assemble.gni")

  yasm_assemble("simd_asm") {
    defines = []

    if (current_cpu == "x86") {
      sources = [
        "simd/jccolor-mmx.asm",
        "simd/jccolor-sse2.asm",
        "simd/jcgray-mmx.asm",
        "simd/jcgray-sse2.asm",
        "simd/jchuff-sse2.asm",
        "simd/jcsample-mmx.asm",
        "simd/jcsample-sse2.asm",
        "simd/jdcolor-mmx.asm",
        "simd/jdcolor-sse2.asm",
        "simd/jdmerge-mmx.asm",
        "simd/jdmerge-sse2.asm",
        "simd/jdsample-mmx.asm",
        "simd/jdsample-sse2.asm",
        "simd/jfdctflt-3dn.asm",
        "simd/jfdctflt-sse.asm",
        "simd/jfdctfst-mmx.asm",
        "simd/jfdctfst-sse2.asm",
        "simd/jfdctint-mmx.asm",
        "simd/jfdctint-sse2.asm",
        "simd/jidctflt-3dn.asm",
        "simd/jidctflt-sse.asm",
        "simd/jidctflt-sse2.asm",
        "simd/jidctfst-mmx.asm",
        "simd/jidctfst-sse2.asm",
        "simd/jidctint-mmx.asm",
        "simd/jidctint-sse2.asm",
        "simd/jidctred-mmx.asm",
        "simd/jidctred-sse2.asm",
        "simd/jquant-3dn.asm",
        "simd/jquant-mmx.asm",
        "simd/jquant-sse.asm",
        "simd/jquantf-sse2.asm",
        "simd/jquanti-sse2.asm",
        "simd/jsimdcpu.asm",
      ]
      defines += [
        "__x86__",
        "PIC",
      ]
    } else if (current_cpu == "x64") {
      sources = [
        "simd/jccolor-sse2-64.asm",
        "simd/jcgray-sse2-64.asm",
        "simd/jchuff-sse2-64.asm",
        "simd/jcsample-sse2-64.asm",
        "simd/jdcolor-sse2-64.asm",
        "simd/jdmerge-sse2-64.asm",
        "simd/jdsample-sse2-64.asm",
        "simd/jfdctflt-sse-64.asm",
        "simd/jfdctfst-sse2-64.asm",
        "simd/jfdctint-sse2-64.asm",
        "simd/jidctflt-sse2-64.asm",
        "simd/jidctfst-sse2-64.asm",
        "simd/jidctint-sse2-64.asm",
        "simd/jidctred-sse2-64.asm",
        "simd/jquantf-sse2-64.asm",
        "simd/jquanti-sse2-64.asm",
      ]
      defines += [
        "__x86_64__",
        "PIC",
      ]
    }

    if (is_win) {
      defines += [ "MSVC" ]
      include_dirs = [ "win" ]
      if (current_cpu == "x86") {
        defines += [ "WIN32" ]
      } else {
        defines += [ "WIN64" ]
      }
    } else if (is_mac || is_ios) {
      defines += [ "MACHO" ]
      include_dirs = [ "mac" ]
    } else if (is_linux || is_android) {
      defines += [ "ELF" ]
      include_dirs = [ "linux" ]
    }
  }
}

source_set("simd") {
  if (current_cpu == "x86") {
    deps = [
      ":simd_asm",
    ]
    sources = [
      "simd/jsimd_i386.c",
    ]
  } else if (current_cpu == "x64") {
    deps = [
      ":simd_asm",
    ]
    sources = [
      "simd/jsimd_x86_64.c",
    ]
  } else if (current_cpu == "arm" && arm_version >= 7 &&
             (arm_use_neon || arm_optionally_use_neon)) {
    sources = [
      "simd/jsimd_arm.c",
      "simd/jsimd_arm_neon.S",
    ]
  } else if (current_cpu == "arm64") {
    sources = [
      "simd/jsimd_arm64.c",
      "simd/jsimd_arm64_neon.S",
    ]
  } else {
    sources = [
      "jsimd_none.c",
    ]
  }

  if (is_win) {
    cflags = [ "/wd4245" ]
  }
}

config("libjpeg_config") {
  include_dirs = [ "." ]
}

source_set("libjpeg") {
  sources = [
    "jcapimin.c",
    "jcapistd.c",
    "jccoefct.c",
    "jccolor.c",
    "jcdctmgr.c",
    "jchuff.c",
    "jchuff.h",
    "jcinit.c",
    "jcmainct.c",
    "jcmarker.c",
    "jcmaster.c",
    "jcomapi.c",
    "jconfig.h",
    "jcparam.c",
    "jcphuff.c",
    "jcprepct.c",
    "jcsample.c",
    "jdapimin.c",
    "jdapistd.c",
    "jdatadst.c",
    "jdatasrc.c",
    "jdcoefct.c",
    "jdcolor.c",
    "jdct.h",
    "jddctmgr.c",
    "jdhuff.c",
    "jdhuff.h",
    "jdinput.c",
    "jdmainct.c",
    "jdmarker.c",
    "jdmaster.c",
    "jdmerge.c",
    "jdphuff.c",
    "jdpostct.c",
    "jdsample.c",
    "jerror.c",
    "jerror.h",
    "jfdctflt.c",
    "jfdctfst.c",
    "jfdctint.c",
    "jidctflt.c",
    "jidctfst.c",
    "jidctint.c",
    "jidctred.c",
    "jinclude.h",
    "jmemmgr.c",
    "jmemnobs.c",
    "jmemsys.h",
    "jmorecfg.h",
    "jpegint.h",
    "jpeglib.h",
    "jpeglibmangler.h",
    "jquant1.c",
    "jquant2.c",
    "jutils.c",
    "jversion.h",
  ]

  defines = [
    "WITH_SIMD",
    "NO_GETENV",
  ]

  configs += [ ":libjpeg_config" ]

  public_configs = [ ":libjpeg_config" ]

  # MemorySanitizer doesn't support assembly code, so keep it disabled in
  # MSan builds for now.
  if (is_msan) {
    sources += [ "jsimd_none.c" ]
  } else {
    deps = [
      ":simd",
    ]
  }
}
