@@ -22,51 +22,84 @@ set(${target_name}_src
2222 pngwutil.c
2323)
2424
25- set (_PNG_ISA_SIMD ${AX_ISA_SIMD} )
25+ add_library (${target_name} STATIC
26+ ${${target_name} _src}
27+ )
28+
29+ # -----------------------------------------------------------------------------
30+ # macOS Universal Binary Logic (Fat Build)
31+ # -----------------------------------------------------------------------------
32+ if (APPLE AND CMAKE_SYSTEM_NAME STREQUAL "Darwin" )
33+ # We rely on CMAKE_OSX_ARCHITECTURES being set by the user/system
34+ # (e.g., -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64") to control the output.
2635
27- if (_PNG_ISA_SIMD STREQUAL "neon" )
28- set (libpng_arm_sources
36+ # --- NEON OBJECT LIBRARY (for arm64 slice) ---
37+ add_library ( png_arm_neon OBJECT
2938 arm/arm_init.c
3039 arm/filter_neon_intrinsics.c
31- arm/palette_neon_intrinsics.c)
32-
33- # notes:
34- # - android armv7: needs PNG_ARM_NEON_CHECK_SUPPORTED for very older devices, but axmol no longer support them
35- # PNG_ARM_NEON_IMPLEMENTATION:
36- # 1: use instrinsics
37- # 2: use handcode
38- set (libpng_optimize_flag "PNG_ARM_NEON_OPT=1" )
39- elseif (_PNG_ISA_SIMD MATCHES "sse" )
40- set (libpng_intel_sources
40+ arm/palette_neon_intrinsics.c
41+ )
42+ target_compile_definitions (png_arm_neon PRIVATE "PNG_ARM_NEON_OPT=1" )
43+
44+ # Restrict compilation/use of these objects to the arm64 slice only
45+ set_target_properties (png_arm_neon PROPERTIES
46+ OSX_ARCHITECTURES "arm64"
47+ COMPILE_FLAGS "-march=armv8-a+simd"
48+ )
49+
50+ # --- SSE OBJECT LIBRARY (for x86_64 slice) ---
51+ add_library (png_intel_sse OBJECT
4152 intel/intel_init.c
42- intel/filter_sse2_intrinsics.c)
43- set (libpng_optimize_flag "PNG_INTEL_SSE_OPT=1" )
53+ intel/filter_sse2_intrinsics.c
54+ )
55+ target_compile_definitions (png_intel_sse PRIVATE "PNG_INTEL_SSE_OPT=1" )
56+
57+ # Restrict compilation/use of these objects to the x86_64 slice only
58+ set_target_properties (png_intel_sse PROPERTIES
59+ OSX_ARCHITECTURES "x86_64"
60+ COMPILE_FLAGS "-msse2"
61+ )
62+
63+ # Link object libraries into main library
64+ target_sources (${target_name} PRIVATE
65+ $<TARGET_OBJECTS :png_arm_neon >
66+ $<TARGET_OBJECTS :png_intel_sse >
67+ )
68+
69+ # -----------------------------------------------------------------------------
70+ # Non-Darwin Conditional SIMD Logic (Android, iOS, Windows, Linux)
71+ # -----------------------------------------------------------------------------
72+ else ()
73+ set (_PNG_ISA_SIMD ${AX_ISA_SIMD} )
74+ if (_PNG_ISA_SIMD STREQUAL "neon" )
75+ target_sources (${target_name} PRIVATE
76+ arm/arm_init.c
77+ arm/filter_neon_intrinsics.c
78+ arm/palette_neon_intrinsics.c )
79+ target_compile_definitions (${target_name} PUBLIC "PNG_ARM_NEON_OPT=1" )
80+ elseif (_PNG_ISA_SIMD MATCHES "sse" )
81+ target_sources (${target_name} PRIVATE
82+ intel/intel_init.c
83+ intel/filter_sse2_intrinsics.c )
84+ target_compile_definitions (${target_name} PUBLIC "PNG_INTEL_SSE_OPT=1" )
85+ endif ()
4486endif ()
4587
46- add_library (${target_name} STATIC
47- ${${target_name} _src}
48- ${libpng_arm_sources}
49- ${libpng_intel_sources}
50- )
5188
52- # cmake builtin FindPNG.cmake detect cached variable PNG_PNG_INCLUDE_DIR
5389set (PNG_PNG_INCLUDE_DIR "${CMAKE_CURRENT_LIST_DIR } " CACHE INTERNAL "png include dir" FORCE )
54-
5590set (PNG_INCLUDE_DIR "${PNG_PNG_INCLUDE_DIR} " CACHE INTERNAL "" FORCE )
5691target_include_directories (${target_name} PUBLIC "${PNG_INCLUDE_DIR} " )
5792
58- if (_PNG_ISA_SIMD)
59- target_compile_definitions (${target_name} PUBLIC ${libpng_optimize_flag} )
60- endif ()
61-
6293target_include_directories (${target_name} PRIVATE "${ZLIB_INCLUDE_DIR} " )
6394
95+ # Android Specific Linking for CPU Features
6496if (ANDROID )
6597 target_include_directories (${target_name} PRIVATE ${cpufeatures_include_dir} )
6698 target_link_libraries (${target_name} INTERFACE cpufeatures )
6799endif ()
68100
69- # Export png as PNG::PNG to avoid cmake builtin FindPNG.cmake add target again
101+ # Export png as PNG::PNG to avoid conflicts and enable modern linking
70102add_library (PNG::PNG ALIAS ${target_name} )
71103
72- set (PNG_LIBRARY "png" CACHE INTERNAL "png include dir" FORCE )
104+ # Set compatibility variable
105+ set (PNG_LIBRARY "png" CACHE INTERNAL "png library" FORCE )
0 commit comments