blob: 7e5ca70baa61c31f45e1779f5579ccbcb8cd3da1 [file] [log] [blame] [edit]
# 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/features.gni")
import("//build/config/sanitizers/sanitizers.gni")
if (current_cpu == "arm" || current_cpu == "arm64") {
import("//build/config/arm.gni")
}
assert(
use_blink,
"This is not used if blink is not enabled, don't drag it in unintentionally")
source_set("libjpeg_headers") {
sources = [
"src/jconfig.h",
"src/jdct.h",
"src/jinclude.h",
"src/jmorecfg.h",
"src/jpeglib.h",
"src/jpeglibmangler.h",
]
}
if (current_cpu == "x86" || current_cpu == "x64") {
import("//third_party/nasm/nasm_assemble.gni")
nasm_assemble("simd_asm") {
defines = []
include_dirs = [ "simd/nasm/" ]
inputs = [
"simd/nasm/jdct.inc",
"simd/nasm/jsimdcfg.inc",
"simd/nasm/jsimdext.inc",
"simd/nasm/jcolsamp.inc",
]
if (current_cpu == "x86") {
include_dirs += [ "simd/i386/" ]
inputs += [
"simd/i386/jccolext-avx2.asm",
"simd/i386/jccolext-mmx.asm",
"simd/i386/jccolext-sse2.asm",
"simd/i386/jcgryext-avx2.asm",
"simd/i386/jcgryext-mmx.asm",
"simd/i386/jcgryext-sse2.asm",
"simd/i386/jdcolext-avx2.asm",
"simd/i386/jdcolext-mmx.asm",
"simd/i386/jdcolext-sse2.asm",
"simd/i386/jdmrgext-avx2.asm",
"simd/i386/jdmrgext-mmx.asm",
"simd/i386/jdmrgext-sse2.asm",
]
sources = [
"simd/i386/jccolor-avx2.asm",
"simd/i386/jccolor-mmx.asm",
"simd/i386/jccolor-sse2.asm",
"simd/i386/jcgray-avx2.asm",
"simd/i386/jcgray-mmx.asm",
"simd/i386/jcgray-sse2.asm",
"simd/i386/jchuff-sse2.asm",
"simd/i386/jcphuff-sse2.asm",
"simd/i386/jcsample-avx2.asm",
"simd/i386/jcsample-mmx.asm",
"simd/i386/jcsample-sse2.asm",
"simd/i386/jdcolor-avx2.asm",
"simd/i386/jdcolor-mmx.asm",
"simd/i386/jdcolor-sse2.asm",
"simd/i386/jdmerge-avx2.asm",
"simd/i386/jdmerge-mmx.asm",
"simd/i386/jdmerge-sse2.asm",
"simd/i386/jdsample-avx2.asm",
"simd/i386/jdsample-mmx.asm",
"simd/i386/jdsample-sse2.asm",
"simd/i386/jfdctflt-3dn.asm",
"simd/i386/jfdctflt-sse.asm",
"simd/i386/jfdctfst-mmx.asm",
"simd/i386/jfdctfst-sse2.asm",
"simd/i386/jfdctint-avx2.asm",
"simd/i386/jfdctint-mmx.asm",
"simd/i386/jfdctint-sse2.asm",
"simd/i386/jidctflt-3dn.asm",
"simd/i386/jidctflt-sse.asm",
"simd/i386/jidctflt-sse2.asm",
"simd/i386/jidctfst-mmx.asm",
"simd/i386/jidctfst-sse2.asm",
"simd/i386/jidctint-avx2.asm",
"simd/i386/jidctint-mmx.asm",
"simd/i386/jidctint-sse2.asm",
"simd/i386/jidctred-mmx.asm",
"simd/i386/jidctred-sse2.asm",
"simd/i386/jquant-3dn.asm",
"simd/i386/jquant-mmx.asm",
"simd/i386/jquant-sse.asm",
"simd/i386/jquantf-sse2.asm",
"simd/i386/jquanti-avx2.asm",
"simd/i386/jquanti-sse2.asm",
"simd/i386/jsimdcpu.asm",
]
defines += [
"__x86__",
"PIC",
]
} else if (current_cpu == "x64") {
include_dirs += [ "simd/x86_64/" ]
inputs += [
"simd/x86_64/jccolext-avx2.asm",
"simd/x86_64/jccolext-sse2.asm",
"simd/x86_64/jcgryext-avx2.asm",
"simd/x86_64/jcgryext-sse2.asm",
"simd/x86_64/jdcolext-avx2.asm",
"simd/x86_64/jdcolext-sse2.asm",
"simd/x86_64/jdmrgext-avx2.asm",
"simd/x86_64/jdmrgext-sse2.asm",
]
sources = [
"simd/x86_64/jccolor-avx2.asm",
"simd/x86_64/jccolor-sse2.asm",
"simd/x86_64/jcgray-avx2.asm",
"simd/x86_64/jcgray-sse2.asm",
"simd/x86_64/jchuff-sse2.asm",
"simd/x86_64/jcphuff-sse2.asm",
"simd/x86_64/jcsample-avx2.asm",
"simd/x86_64/jcsample-sse2.asm",
"simd/x86_64/jdcolor-avx2.asm",
"simd/x86_64/jdcolor-sse2.asm",
"simd/x86_64/jdmerge-avx2.asm",
"simd/x86_64/jdmerge-sse2.asm",
"simd/x86_64/jdsample-avx2.asm",
"simd/x86_64/jdsample-sse2.asm",
"simd/x86_64/jfdctflt-sse.asm",
"simd/x86_64/jfdctfst-sse2.asm",
"simd/x86_64/jfdctint-avx2.asm",
"simd/x86_64/jfdctint-sse2.asm",
"simd/x86_64/jidctflt-sse2.asm",
"simd/x86_64/jidctfst-sse2.asm",
"simd/x86_64/jidctint-avx2.asm",
"simd/x86_64/jidctint-sse2.asm",
"simd/x86_64/jidctred-sse2.asm",
"simd/x86_64/jquantf-sse2.asm",
"simd/x86_64/jquanti-avx2.asm",
"simd/x86_64/jquanti-sse2.asm",
"simd/x86_64/jsimdcpu.asm",
]
defines += [
"__x86_64__",
"PIC",
]
}
if (is_win) {
defines += [ "MSVC" ]
if (current_cpu == "x86") {
defines += [ "WIN32" ]
} else {
defines += [ "WIN64" ]
}
} else if (is_mac || is_ios) {
defines += [ "MACHO" ]
} else if (is_linux || is_android || is_fuchsia || is_chromeos) {
defines += [ "ELF" ]
}
}
}
config("libjpeg_simd_config") {
if (is_msan && (current_cpu == "x86" || current_cpu == "x64")) {
# MemorySanitizer doesn't support assembly code, so keep it disabled in x86
# and x64 MSan builds for now.
} else if (current_cpu == "x86" || current_cpu == "x64") {
defines = [ "WITH_SIMD" ]
} else if (current_cpu == "arm" || current_cpu == "arm64") {
defines = [
"NEON_INTRINSICS",
"WITH_SIMD",
]
}
}
static_library("simd") {
include_dirs = [ "." ]
deps = [ ":libjpeg_headers" ]
defines = [ "MANGLE_JPEG_NAMES" ]
configs += [ ":libjpeg_simd_config" ]
if (is_msan && (current_cpu == "x86" || current_cpu == "x64")) {
# MemorySanitizer doesn't support assembly code, so keep it disabled in x86
# and x64 MSan builds for now.
} else if (current_cpu == "x86") {
deps += [ ":simd_asm" ]
sources = [ "simd/i386/jsimd.c" ]
} else if (current_cpu == "x64") {
deps += [ ":simd_asm" ]
sources = [ "simd/x86_64/jsimd.c" ]
} else if (current_cpu == "arm" || current_cpu == "arm64") {
include_dirs += [ "simd/arm/" ]
sources = [
"simd/arm/jccolor-neon.c",
"simd/arm/jcgray-neon.c",
"simd/arm/jcphuff-neon.c",
"simd/arm/jcsample-neon.c",
"simd/arm/jdcolor-neon.c",
"simd/arm/jdmerge-neon.c",
"simd/arm/jdsample-neon.c",
"simd/arm/jfdctfst-neon.c",
"simd/arm/jfdctint-neon.c",
"simd/arm/jidctfst-neon.c",
"simd/arm/jidctint-neon.c",
"simd/arm/jidctred-neon.c",
"simd/arm/jquanti-neon.c",
]
if (current_cpu == "arm") {
sources += [
"simd/arm/aarch32/jchuff-neon.c",
"simd/arm/aarch32/jsimd.c",
]
} else if (current_cpu == "arm64") {
sources += [
"simd/arm/aarch64/jchuff-neon.c",
"simd/arm/aarch64/jsimd.c",
]
}
configs -= [ "//build/config/compiler:default_optimization" ]
configs += [ "//build/config/compiler:optimize_speed" ]
}
if (is_win) {
cflags = [ "/wd4245" ]
}
}
config("libjpeg_config") {
include_dirs = [ "src" ]
defines = [ "MANGLE_JPEG_NAMES" ]
}
# Based on
# https://github.com/libjpeg-turbo/libjpeg-turbo/blob/20ade4de/CMakeLists.txt#L605
#
# Starting in 3.x, libjpeg-turbo supports runtime-selectable precision.
# This requires compiling some source sets multiple times, with different
# BITS_IN_JSAMPLE defines (16, 12, and the default 8), to generate precision-
# specific symbols (e.g. jpeg16_read_scanlines vs jpeg12_read_scanlines vs
# jpeg_read_scanlines).
libjpeg16_sources = [
"src/jcapistd.c",
"src/jccolor.c",
"src/jcdiffct.c",
"src/jclossls.c",
"src/jcmainct.c",
"src/jcprepct.c",
"src/jcsample.c",
"src/jdapistd.c",
"src/jdcolor.c",
"src/jddiffct.c",
"src/jdlossls.c",
"src/jdmainct.c",
"src/jdpostct.c",
"src/jdsample.c",
"src/jutils.c",
]
libjpeg12_sources = libjpeg16_sources + [
"src/jccoefct.c",
"src/jcdctmgr.c",
"src/jdcoefct.c",
"src/jddctmgr.c",
"src/jdmerge.c",
"src/jfdctfst.c",
"src/jfdctint.c",
"src/jidctflt.c",
"src/jidctfst.c",
"src/jidctint.c",
"src/jidctred.c",
"src/jquant1.c",
"src/jquant2.c",
]
libjpeg_sources = libjpeg12_sources + [
"src/jcapimin.c",
"src/jchuff.c",
"src/jcicc.c",
"src/jcinit.c",
"src/jclhuff.c",
"src/jcmarker.c",
"src/jcmaster.c",
"src/jcomapi.c",
"src/jcparam.c",
"src/jcphuff.c",
"src/jctrans.c",
"src/jdapimin.c",
"src/jdatadst.c",
"src/jdatasrc.c",
"src/jdhuff.c",
"src/jdicc.c",
"src/jdinput.c",
"src/jdlhuff.c",
"src/jdmarker.c",
"src/jdmaster.c",
"src/jdphuff.c",
"src/jdtrans.c",
"src/jerror.c",
"src/jfdctflt.c",
"src/jmemmgr.c",
"src/jmemnobs.c",
"src/jpeg_nbits.c",
]
static_library("libjpeg16") {
sources = libjpeg16_sources
defines = [
"NO_GETENV",
"NO_PUTENV",
"BITS_IN_JSAMPLE=16",
]
configs += [ ":libjpeg_config" ]
public_configs = [ ":libjpeg_config" ]
public_deps = [ ":libjpeg_headers" ]
}
static_library("libjpeg12") {
sources = libjpeg12_sources
defines = [
"NO_GETENV",
"NO_PUTENV",
"BITS_IN_JSAMPLE=12",
]
configs += [ ":libjpeg_config" ]
public_configs = [ ":libjpeg_config" ]
public_deps = [ ":libjpeg_headers" ]
}
static_library("libjpeg") {
sources = libjpeg_sources
defines = [
"NO_GETENV",
"NO_PUTENV",
]
configs += [
":libjpeg_config",
":libjpeg_simd_config",
]
public_configs = [ ":libjpeg_config" ]
public_deps = [ ":libjpeg_headers" ]
deps = [
":libjpeg12",
":libjpeg16",
":simd",
]
if (current_cpu == "x86" || current_cpu == "x64") {
# Avoid the 64K jpeg_nbits table.
# Note: USE_CLZ_INTRINSIC is enabled by default for Arm (jpeg_nbits.h)
defines += [ "USE_CLZ_INTRINSIC" ]
}
}
# PPM also require multiple precision-dependent versions.
turbojpeg_ppm_sources = [
"src/rdppm.c",
"src/wrppm.c",
]
static_library("turbojpeg_ppm16") {
sources = turbojpeg_ppm_sources
defines = [
"BMP_SUPPORTED",
"PPM_SUPPORTED",
"BITS_IN_JSAMPLE=16",
]
configs += [ ":libjpeg_config" ]
public_configs = [ ":libjpeg_config" ]
public_deps = [ ":libjpeg" ]
}
static_library("turbojpeg_ppm12") {
sources = turbojpeg_ppm_sources
defines = [
"BMP_SUPPORTED",
"PPM_SUPPORTED",
"BITS_IN_JSAMPLE=12",
]
configs += [ ":libjpeg_config" ]
public_configs = [ ":libjpeg_config" ]
public_deps = [ ":libjpeg" ]
}
static_library("turbojpeg") {
sources = turbojpeg_ppm_sources + [
"src/jdatadst-tj.c",
"src/jdatasrc-tj.c",
"src/rdbmp.c",
"src/transupp.c",
"src/turbojpeg.c",
"src/wrbmp.c",
]
defines = [
"BMP_SUPPORTED",
"PPM_SUPPORTED",
]
configs += [
":libjpeg_config",
":libjpeg_simd_config",
]
public_configs = [ ":libjpeg_config" ]
public_deps = [ ":libjpeg" ]
deps = [
":turbojpeg_ppm12",
":turbojpeg_ppm16",
]
cflags_c = [
# [3.1.0] turbojpeg.c:706:5: error: 'break' will never be executed
"-Wno-unreachable-code-break",
]
}
if (build_with_chromium) {
import("//testing/test.gni")
static_library("rdcolmap12") {
sources = [ "src/rdcolmap.c" ]
deps = [ ":turbojpeg" ]
defines = [
"GTEST",
"BMP_SUPPORTED",
"PPM_SUPPORTED",
"BITS_IN_JSAMPLE=12",
]
}
test("libjpeg_turbo_unittests") {
testonly = true
sources = [
"gtest/cjpeg-gtest-wrapper.cpp",
"gtest/djpeg-gtest-wrapper.cpp",
"gtest/gtest-utils.cpp",
"gtest/jpegtran-gtest-wrapper.cpp",
"gtest/tjbench-gtest-wrapper.cpp",
"gtest/tjunittest-gtest-wrapper.cpp",
"src/cdjpeg.c",
"src/cjpeg.c",
"src/djpeg.c",
"src/jpegtran.c",
"src/md5/md5.c",
"src/md5/md5hl.c",
"src/rdcolmap.c",
"src/rdgif.c",
"src/rdswitch.c",
"src/tjbench.c",
"src/tjunittest.c",
"src/tjutil.c",
]
deps = [
":rdcolmap12",
":turbojpeg",
"//base",
"//crypto",
"//testing/gtest",
"//testing/gtest:gtest_main",
]
data = [ "testimages/" ]
defines = [
"GTEST",
"BMP_SUPPORTED",
"PPM_SUPPORTED",
]
include_dirs = [
"//third_party/googletest/src/googletest/include/gtest",
".",
]
configs -= [ "//build/config/compiler:chromium_code" ]
configs += [
":libjpeg_simd_config",
"//build/config/compiler:no_chromium_code",
]
if (is_win) {
cflags = [ "-U_CRT_SECURE_NO_DEPRECATE" ]
}
}
}