| # 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", |
| ], |
| ) |