blob: a5d48a250e63f87fab72370f1cae179db8885303 [file] [log] [blame]
# This file will be copied into //third_party/externals/libjpeg-turbo via the new_local_repository
# rule in WORKSPACE.bazel, so all files should be relative to that path.
load("@bazel_skylib//lib:selects.bzl", "selects")
config_setting(
name = "mac_arm64",
constraint_values = [
"@platforms//cpu:arm64",
"@platforms//os:macos",
],
)
selects.config_setting_group(
name = "arm_or_arm64",
match_any = [
"@platforms//cpu:arm",
"@platforms//cpu:arm64",
],
)
LIBJPEG_HEADERS = [
"src/jconfig.h",
"src/jerror.h",
"src/jdct.h",
"src/jinclude.h",
"src/jpeglib.h",
"src/jpeglibmangler.h",
"src/jmorecfg.h",
"src/jconfigint.h",
"src/jpegint.h",
"src/jpegapicomp.h",
"src/jpeg_nbits.h",
"src/jsimddct.h",
"src/jversion.h",
"src/jdhuff.h",
]
# 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).
JPEG16_SRCS = [
"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/jdmainct.h",
"src/jdpostct.c",
"src/jdsample.c",
"src/jdsample.h",
"src/jutils.c",
"src/jsimd.h",
"src/jlossls.h",
"src/jdmaster.c",
"src/jdmaster.h",
"src/jdmerge.h",
"src/jmemsys.h",
]
JPEG12_SRCS = JPEG16_SRCS + [
"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",
"src/jdcoefct.h",
]
JPEGTURBO_SRCS = JPEG12_SRCS + [
"src/jchuff.c",
"src/jchuff.h",
"src/jaricom.c",
"src/jcapimin.c",
"src/jcarith.c",
"src/jcicc.c",
"src/jcinit.c",
"src/jclhuff.c",
"src/jcmarker.c",
"src/jcmaster.c",
"src/jcmaster.h",
"src/jcomapi.c",
"src/jcparam.c",
"src/jcphuff.c",
"src/jctrans.c",
"src/jdapimin.c",
"src/jdarith.c",
"src/jdatadst.c",
"src/jdatasrc.c",
"src/jdhuff.c",
"src/jdicc.c",
"src/jdinput.c",
"src/jdlhuff.c",
"src/jdmarker.c",
"src/jdphuff.c",
"src/jdtrans.c",
"src/jerror.c",
"src/jfdctflt.c",
"src/jmemmgr.c",
"src/jmemnobs.c",
"src/jpeg_nbits.c",
]
JPEGTURBO_TEXT_HDRS = [
"src/jccolext.c",
"src/jdmrgext.c",
"src/jdcolext.c",
"src/jdcol565.c",
"src/jdmrg565.c",
"src/jstdhuff.c",
"src/jsamplecomp.h",
] + select({
":arm_or_arm64": [
"simd/arm/jdmrgext-neon.c",
"simd/arm/jcgryext-neon.c",
"simd/arm/jdcolext-neon.c",
],
"//conditions:default": [],
}) + select({
"@platforms//cpu:arm": [
"simd/arm/aarch32/jccolext-neon.c",
],
"@platforms//cpu:arm64": [
"simd/arm/aarch64/jccolext-neon.c",
],
"//conditions:default": [],
})
JPEGTURBO_DEFINES = [
# Add support for arithmetic encoding (C_) and decoding (D_).
# This matches Android. Note that such JPEGs are likely rare, given lack of
# support by major browsers.
"C_ARITH_CODING_SUPPORTED=1",
"D_ARITH_CODING_SUPPORTED=1",
] + select({
":arm_or_arm64": [
"NEON_INTRINSICS",
"WITH_SIMD",
],
"//conditions:default": [],
}) + select({
# Cuts a 64K table.
"//conditions:default": ["USE_CLZ_INTRINSIC"],
":mac_arm64": [], # disabled on M1 macs already
"@platforms//os:windows": [],
})
cc_library(
name = "libjpeg16",
srcs = JPEG16_SRCS,
hdrs = LIBJPEG_HEADERS,
includes = ["src"],
local_defines = [
"NO_GETENV",
"NO_PUTENV",
"BITS_IN_JSAMPLE=16",
"C_ARITH_CODING_SUPPORTED=1",
"D_ARITH_CODING_SUPPORTED=1",
],
textual_hdrs = JPEGTURBO_TEXT_HDRS,
)
cc_library(
name = "libjpeg12",
srcs = JPEG12_SRCS,
hdrs = LIBJPEG_HEADERS,
includes = ["src"],
local_defines = [
"NO_GETENV",
"NO_PUTENV",
"BITS_IN_JSAMPLE=12",
"C_ARITH_CODING_SUPPORTED=1",
"D_ARITH_CODING_SUPPORTED=1",
],
textual_hdrs = JPEGTURBO_TEXT_HDRS,
)
cc_library(
name = "libjpeg_turbo",
srcs = JPEGTURBO_SRCS + select({
":arm_or_arm64": [
"simd/arm/jccolor-neon.c",
"simd/arm/jcgray-neon.c",
"simd/arm/jchuff.h",
"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",
"simd/arm/neon-compat.h",
"simd/jsimd.h",
],
"//conditions:default": [],
}) + select({
"@platforms//cpu:arm": [
"simd/arm/aarch32/jchuff-neon.c",
"simd/arm/aarch32/jsimd.c",
],
"@platforms//cpu:arm64": [
"simd/arm/aarch64/jchuff-neon.c",
"simd/arm/aarch64/jsimd.c",
"simd/arm/align.h",
],
"//conditions:default": [],
}),
hdrs = LIBJPEG_HEADERS,
copts = [
# There are some #include "neon-compat.h" etc that need this search path
"-Iexternal/libjpeg_turbo/simd/arm/",
],
includes = ["src"],
local_defines = JPEGTURBO_DEFINES,
textual_hdrs = JPEGTURBO_TEXT_HDRS,
visibility = ["//visibility:public"],
deps = [
":libjpeg12",
":libjpeg16",
],
)