# cmake file for libpng

if (NOT DE_DEFS)
	message(FATAL_ERROR "Include Defs.cmake")
endif ()

if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/src/png.h")
	set(DEFAULT_PNG_SRC_PATH ${CMAKE_CURRENT_SOURCE_DIR}/src)
else ()
	# Assume build inside Android source tree
	set(DEFAULT_PNG_SRC_PATH "../libpng")
endif ()

set(PNG_SRC_PATH ${DEFAULT_PNG_SRC_PATH} CACHE STRING "Path to libpng source tree")

if (IS_ABSOLUTE ${PNG_SRC_PATH})
	set(PNG_ABS_PATH ${PNG_SRC_PATH})
else ()
	set(PNG_ABS_PATH "${CMAKE_SOURCE_DIR}/${PNG_SRC_PATH}")
endif ()

set(PNG_SRCS
	${PNG_ABS_PATH}/png.h
	${PNG_ABS_PATH}/pngconf.h
	${PNG_ABS_PATH}/png.c
	${PNG_ABS_PATH}/pngset.c
	${PNG_ABS_PATH}/pngget.c
	${PNG_ABS_PATH}/pngrutil.c
	${PNG_ABS_PATH}/pngtrans.c
	${PNG_ABS_PATH}/pngwutil.c
	${PNG_ABS_PATH}/pngread.c
	${PNG_ABS_PATH}/pngrio.c
	${PNG_ABS_PATH}/pngwio.c
	${PNG_ABS_PATH}/pngwrite.c
	${PNG_ABS_PATH}/pngrtran.c
	${PNG_ABS_PATH}/pngwtran.c
	${PNG_ABS_PATH}/pngmem.c
	${PNG_ABS_PATH}/pngerror.c
	${PNG_ABS_PATH}/pngpread.c
	)


if(DE_CPU_IS_ARM AND NOT DEFINED DE_CPU_IS_ARM_NEON)
    set(DE_CPU_IS_ARM_NEON 1)
    message(STATUS "DE_CPU_IS_ARM_NEON is not defined: Assuming ARM NEON is supported.")
else ()
    set(DE_CPU_IS_ARM_NEON 0)
endif()

if (DE_CPU_IS_ARM_64 OR (DE_CPU_IS_ARM AND DE_CPU_IS_ARM_NEON))
	# armv8-a has always neon
	set(PNG_SRCS
		${PNG_SRCS}
		${PNG_ABS_PATH}/arm/arm_init.c
		${PNG_ABS_PATH}/arm/filter_neon_intrinsics.c
		${PNG_ABS_PATH}/arm/filter_neon.S
		)
else ()
    message(STATUS "Disabling ARM NEON optimizations.")
    add_definitions(-DPNG_ARM_NEON_OPT=0)
endif ()


if (DE_DEBUG EQUAL 1)
	add_definitions(-DPNG_DEBUG)
endif ()

if (DE_OS_IS_UNIX OR DE_OS_IS_QNX)
	# for snprintf()
	add_definitions(-D_XOPEN_SOURCE=600)
endif ()

set(CMAKE_C_FLAGS ${DE_3RD_PARTY_C_FLAGS})

add_library(png STATIC ${PNG_SRCS})
target_link_libraries(png ${ZLIB_LIBRARY})

set(PNG_INCLUDE_PATH	${PNG_ABS_PATH}	PARENT_SCOPE)
set(PNG_LIBRARY			png				PARENT_SCOPE)
