From 0d0b68540c3782297a320173f483eba80b59f3f0 Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Fri, 17 Jan 2020 00:50:29 +0000 Subject: [PATCH] forgot to bind texture properly --- build/CMakeCache.txt | 428 - build/CMakeFiles/3.16.2/CMakeCCompiler.cmake | 76 - .../CMakeFiles/3.16.2/CMakeCXXCompiler.cmake | 88 - .../3.16.2/CMakeDetermineCompilerABI_C.bin | Bin 16384 -> 0 bytes .../3.16.2/CMakeDetermineCompilerABI_CXX.bin | Bin 16400 -> 0 bytes build/CMakeFiles/3.16.2/CMakeSystem.cmake | 15 - .../3.16.2/CompilerIdC/CMakeCCompilerId.c | 671 -- build/CMakeFiles/3.16.2/CompilerIdC/a.out | Bin 16544 -> 0 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 660 -- build/CMakeFiles/3.16.2/CompilerIdCXX/a.out | Bin 16552 -> 0 bytes .../CMakeDirectoryInformation.cmake | 16 - build/CMakeFiles/CMakeError.log | 58 - build/CMakeFiles/CMakeOutput.log | 445 - build/CMakeFiles/Makefile.cmake | 60 - build/CMakeFiles/Makefile2 | 106 - build/CMakeFiles/TargetDirectories.txt | 3 - build/CMakeFiles/cmake.check_cache | 1 - build/CMakeFiles/output.dir/CXX.includecache | 22 - build/CMakeFiles/output.dir/DependInfo.cmake | 28 - build/CMakeFiles/output.dir/build.make | 115 - build/CMakeFiles/output.dir/cmake_clean.cmake | 11 - build/CMakeFiles/output.dir/depend.internal | 9 - build/CMakeFiles/output.dir/depend.make | 9 - build/CMakeFiles/output.dir/flags.make | 10 - build/CMakeFiles/output.dir/link.txt | 1 - build/CMakeFiles/output.dir/progress.make | 4 - build/CMakeFiles/output.dir/src/main.cpp.o | Bin 180760 -> 0 bytes .../output.dir/src/thirdparty/glad.cpp.o | Bin 190696 -> 0 bytes build/CMakeFiles/progress.marks | 1 - build/Makefile | 208 - build/cmake_install.cmake | 49 - build/output | Bin 315592 -> 0 bytes resources/2d.frag | 2 +- src/framebuffer.cpp | 2 +- src/main.cpp | 30 +- src/renderer.cpp | 9 +- src/thirdparty/stb_image.h | 7666 +++++++++++++++++ 37 files changed, 7693 insertions(+), 3110 deletions(-) delete mode 100644 build/CMakeCache.txt delete mode 100644 build/CMakeFiles/3.16.2/CMakeCCompiler.cmake delete mode 100644 build/CMakeFiles/3.16.2/CMakeCXXCompiler.cmake delete mode 100644 build/CMakeFiles/3.16.2/CMakeDetermineCompilerABI_C.bin delete mode 100644 build/CMakeFiles/3.16.2/CMakeDetermineCompilerABI_CXX.bin delete mode 100644 build/CMakeFiles/3.16.2/CMakeSystem.cmake delete mode 100644 build/CMakeFiles/3.16.2/CompilerIdC/CMakeCCompilerId.c delete mode 100644 build/CMakeFiles/3.16.2/CompilerIdC/a.out delete mode 100644 build/CMakeFiles/3.16.2/CompilerIdCXX/CMakeCXXCompilerId.cpp delete mode 100644 build/CMakeFiles/3.16.2/CompilerIdCXX/a.out delete mode 100644 build/CMakeFiles/CMakeDirectoryInformation.cmake delete mode 100644 build/CMakeFiles/CMakeError.log delete mode 100644 build/CMakeFiles/CMakeOutput.log delete mode 100644 build/CMakeFiles/Makefile.cmake delete mode 100644 build/CMakeFiles/Makefile2 delete mode 100644 build/CMakeFiles/TargetDirectories.txt delete mode 100644 build/CMakeFiles/cmake.check_cache delete mode 100644 build/CMakeFiles/output.dir/CXX.includecache delete mode 100644 build/CMakeFiles/output.dir/DependInfo.cmake delete mode 100644 build/CMakeFiles/output.dir/build.make delete mode 100644 build/CMakeFiles/output.dir/cmake_clean.cmake delete mode 100644 build/CMakeFiles/output.dir/depend.internal delete mode 100644 build/CMakeFiles/output.dir/depend.make delete mode 100644 build/CMakeFiles/output.dir/flags.make delete mode 100644 build/CMakeFiles/output.dir/link.txt delete mode 100644 build/CMakeFiles/output.dir/progress.make delete mode 100644 build/CMakeFiles/output.dir/src/main.cpp.o delete mode 100644 build/CMakeFiles/output.dir/src/thirdparty/glad.cpp.o delete mode 100644 build/CMakeFiles/progress.marks delete mode 100644 build/Makefile delete mode 100644 build/cmake_install.cmake delete mode 100644 build/output create mode 100644 src/thirdparty/stb_image.h diff --git a/build/CMakeCache.txt b/build/CMakeCache.txt deleted file mode 100644 index def5034..0000000 --- a/build/CMakeCache.txt +++ /dev/null @@ -1,428 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: /home/ben/mnt/Projects-linux/2d-gi/build -# It was generated by CMake: /usr/bin/cmake -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//Value Computed by CMake -2D_GLOBAL_ILLUMINATION_BINARY_DIR:STATIC=/home/ben/mnt/Projects-linux/2d-gi/build - -//Value Computed by CMake -2D_GLOBAL_ILLUMINATION_SOURCE_DIR:STATIC=/home/ben/mnt/Projects-linux/2d-gi - -//Path to a program. -CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line - -//Path to a program. -CMAKE_AR:FILEPATH=/usr/bin/ar - -//Choose the type of build, options are: None Debug Release RelWithDebInfo -// MinSizeRel ... -CMAKE_BUILD_TYPE:STRING= - -//Enable/Disable color output during build. -CMAKE_COLOR_MAKEFILE:BOOL=ON - -//CXX compiler -CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ - -//A wrapper around 'ar' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar - -//A wrapper around 'ranlib' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib - -//Flags used by the CXX compiler during all build types. -CMAKE_CXX_FLAGS:STRING= - -//Flags used by the CXX compiler during DEBUG builds. -CMAKE_CXX_FLAGS_DEBUG:STRING=-g - -//Flags used by the CXX compiler during MINSIZEREL builds. -CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the CXX compiler during RELEASE builds. -CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the CXX compiler during RELWITHDEBINFO builds. -CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//C compiler -CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc - -//A wrapper around 'ar' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_C_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar - -//A wrapper around 'ranlib' adding the appropriate '--plugin' option -// for the GCC compiler -CMAKE_C_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib - -//Flags used by the C compiler during all build types. -CMAKE_C_FLAGS:STRING= - -//Flags used by the C compiler during DEBUG builds. -CMAKE_C_FLAGS_DEBUG:STRING=-g - -//Flags used by the C compiler during MINSIZEREL builds. -CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG - -//Flags used by the C compiler during RELEASE builds. -CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG - -//Flags used by the C compiler during RELWITHDEBINFO builds. -CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG - -//Path to a program. -CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND - -//Flags used by the linker during all build types. -CMAKE_EXE_LINKER_FLAGS:STRING= - -//Flags used by the linker during DEBUG builds. -CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during MINSIZEREL builds. -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during RELEASE builds. -CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during RELWITHDEBINFO builds. -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Enable/Disable output of compile commands during generation. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF - -//Install path prefix, prepended onto install directories. -CMAKE_INSTALL_PREFIX:PATH=/usr/local - -//Path to a program. -CMAKE_LINKER:FILEPATH=/usr/bin/ld - -//Path to a program. -CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make - -//Flags used by the linker during the creation of modules during -// all build types. -CMAKE_MODULE_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of modules during -// DEBUG builds. -CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of modules during -// MINSIZEREL builds. -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of modules during -// RELEASE builds. -CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of modules during -// RELWITHDEBINFO builds. -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_NM:FILEPATH=/usr/bin/nm - -//Path to a program. -CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy - -//Path to a program. -CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=2D_GLOBAL_ILLUMINATION - -//Path to a program. -CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib - -//Path to a program. -CMAKE_READELF:FILEPATH=/usr/bin/readelf - -//Flags used by the linker during the creation of shared libraries -// during all build types. -CMAKE_SHARED_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of shared libraries -// during DEBUG builds. -CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of shared libraries -// during MINSIZEREL builds. -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELEASE builds. -CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of shared libraries -// during RELWITHDEBINFO builds. -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//If set, runtime paths are not added when installing shared libraries, -// but are added when building. -CMAKE_SKIP_INSTALL_RPATH:BOOL=NO - -//If set, runtime paths are not added when using shared libraries. -CMAKE_SKIP_RPATH:BOOL=NO - -//Flags used by the linker during the creation of static libraries -// during all build types. -CMAKE_STATIC_LINKER_FLAGS:STRING= - -//Flags used by the linker during the creation of static libraries -// during DEBUG builds. -CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= - -//Flags used by the linker during the creation of static libraries -// during MINSIZEREL builds. -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELEASE builds. -CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= - -//Flags used by the linker during the creation of static libraries -// during RELWITHDEBINFO builds. -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= - -//Path to a program. -CMAKE_STRIP:FILEPATH=/usr/bin/strip - -//If this value is on, makefiles will be generated without the -// .SILENT directive, and all commands will be echoed to the console -// during the make. This is useful for debugging only. With Visual -// Studio IDE projects all commands are done without /nologo. -CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE - -//Path to a file. -OPENGL_EGL_INCLUDE_DIR:PATH=/usr/include - -//Path to a file. -OPENGL_GLX_INCLUDE_DIR:PATH=/usr/include - -//Path to a file. -OPENGL_INCLUDE_DIR:PATH=/usr/include - -//Path to a library. -OPENGL_egl_LIBRARY:FILEPATH=/usr/lib/libEGL.so - -//Path to a library. -OPENGL_gl_LIBRARY:FILEPATH=/usr/lib/libGL.so - -//Path to a library. -OPENGL_glu_LIBRARY:FILEPATH=/usr/lib/libGLU.so - -//Path to a library. -OPENGL_glx_LIBRARY:FILEPATH=/usr/lib/libGLX.so - -//Path to a library. -OPENGL_opengl_LIBRARY:FILEPATH=/usr/lib/libOpenGL.so - -//Path to a file. -OPENGL_xmesa_INCLUDE_DIR:PATH=OPENGL_xmesa_INCLUDE_DIR-NOTFOUND - -//The directory containing a CMake configuration file for SDL2. -SDL2_DIR:PATH=/usr/lib64/cmake/SDL2 - - -######################## -# INTERNAL cache entries -######################## - -//ADVANCED property for variable: CMAKE_ADDR2LINE -CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_AR -CMAKE_AR-ADVANCED:INTERNAL=1 -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=/home/ben/mnt/Projects-linux/2d-gi/build -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=16 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE -CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=/usr/bin/cmake -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest -//ADVANCED property for variable: CMAKE_CXX_COMPILER -CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR -CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB -CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS -CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG -CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL -CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE -CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO -CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER -CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_AR -CMAKE_C_COMPILER_AR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_COMPILER_RANLIB -CMAKE_C_COMPILER_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS -CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG -CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL -CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE -CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO -CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_DLLTOOL -CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 -//Path to cache edit program executable. -CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake -//Executable file format -CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS -CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG -CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL -CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE -CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS -CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//Name of generator. -CMAKE_GENERATOR:INTERNAL=Unix Makefiles -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Test CMAKE_HAVE_LIBC_PTHREAD -CMAKE_HAVE_LIBC_PTHREAD:INTERNAL= -//Have library pthreads -CMAKE_HAVE_PTHREADS_CREATE:INTERNAL= -//Have library pthread -CMAKE_HAVE_PTHREAD_CREATE:INTERNAL=1 -//Have include pthread.h -CMAKE_HAVE_PTHREAD_H:INTERNAL=1 -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=/home/ben/mnt/Projects-linux/2d-gi -//Install .so files without execute permission. -CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 -//ADVANCED property for variable: CMAKE_LINKER -CMAKE_LINKER-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS -CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG -CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL -CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE -CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_NM -CMAKE_NM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJCOPY -CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_OBJDUMP -CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_RANLIB -CMAKE_RANLIB-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_READELF -CMAKE_READELF-ADVANCED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.16 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS -CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG -CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL -CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE -CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH -CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_SKIP_RPATH -CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS -CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG -CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL -CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE -CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO -CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: CMAKE_STRIP -CMAKE_STRIP-ADVANCED:INTERNAL=1 -//uname command -CMAKE_UNAME:INTERNAL=/usr/bin/uname -//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE -CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 -//Details about finding OpenGL -FIND_PACKAGE_MESSAGE_DETAILS_OpenGL:INTERNAL=[/usr/lib/libOpenGL.so][/usr/lib/libGLX.so][/usr/include][c ][v()] -//Details about finding Threads -FIND_PACKAGE_MESSAGE_DETAILS_Threads:INTERNAL=[TRUE][v()] -//ADVANCED property for variable: OPENGL_EGL_INCLUDE_DIR -OPENGL_EGL_INCLUDE_DIR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENGL_GLX_INCLUDE_DIR -OPENGL_GLX_INCLUDE_DIR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENGL_INCLUDE_DIR -OPENGL_INCLUDE_DIR-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENGL_egl_LIBRARY -OPENGL_egl_LIBRARY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENGL_gl_LIBRARY -OPENGL_gl_LIBRARY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENGL_glu_LIBRARY -OPENGL_glu_LIBRARY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENGL_glx_LIBRARY -OPENGL_glx_LIBRARY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENGL_opengl_LIBRARY -OPENGL_opengl_LIBRARY-ADVANCED:INTERNAL=1 -//ADVANCED property for variable: OPENGL_xmesa_INCLUDE_DIR -OPENGL_xmesa_INCLUDE_DIR-ADVANCED:INTERNAL=1 - diff --git a/build/CMakeFiles/3.16.2/CMakeCCompiler.cmake b/build/CMakeFiles/3.16.2/CMakeCCompiler.cmake deleted file mode 100644 index 7f2f128..0000000 --- a/build/CMakeFiles/3.16.2/CMakeCCompiler.cmake +++ /dev/null @@ -1,76 +0,0 @@ -set(CMAKE_C_COMPILER "/usr/bin/cc") -set(CMAKE_C_COMPILER_ARG1 "") -set(CMAKE_C_COMPILER_ID "GNU") -set(CMAKE_C_COMPILER_VERSION "9.2.0") -set(CMAKE_C_COMPILER_VERSION_INTERNAL "") -set(CMAKE_C_COMPILER_WRAPPER "") -set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") -set(CMAKE_C_COMPILE_FEATURES "c_std_90;c_function_prototypes;c_std_99;c_restrict;c_variadic_macros;c_std_11;c_static_assert") -set(CMAKE_C90_COMPILE_FEATURES "c_std_90;c_function_prototypes") -set(CMAKE_C99_COMPILE_FEATURES "c_std_99;c_restrict;c_variadic_macros") -set(CMAKE_C11_COMPILE_FEATURES "c_std_11;c_static_assert") - -set(CMAKE_C_PLATFORM_ID "Linux") -set(CMAKE_C_SIMULATE_ID "") -set(CMAKE_C_COMPILER_FRONTEND_VARIANT "") -set(CMAKE_C_SIMULATE_VERSION "") - - - -set(CMAKE_AR "/usr/bin/ar") -set(CMAKE_C_COMPILER_AR "/usr/bin/gcc-ar") -set(CMAKE_RANLIB "/usr/bin/ranlib") -set(CMAKE_C_COMPILER_RANLIB "/usr/bin/gcc-ranlib") -set(CMAKE_LINKER "/usr/bin/ld") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCC 1) -set(CMAKE_C_COMPILER_LOADED 1) -set(CMAKE_C_COMPILER_WORKS TRUE) -set(CMAKE_C_ABI_COMPILED TRUE) -set(CMAKE_COMPILER_IS_MINGW ) -set(CMAKE_COMPILER_IS_CYGWIN ) -if(CMAKE_COMPILER_IS_CYGWIN) - set(CYGWIN 1) - set(UNIX 1) -endif() - -set(CMAKE_C_COMPILER_ENV_VAR "CC") - -if(CMAKE_COMPILER_IS_MINGW) - set(MINGW 1) -endif() -set(CMAKE_C_COMPILER_ID_RUN 1) -set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) -set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) -set(CMAKE_C_LINKER_PREFERENCE 10) - -# Save compiler ABI information. -set(CMAKE_C_SIZEOF_DATA_PTR "8") -set(CMAKE_C_COMPILER_ABI "ELF") -set(CMAKE_C_LIBRARY_ARCHITECTURE "") - -if(CMAKE_C_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_C_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") -endif() - -if(CMAKE_C_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include;/usr/local/include;/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed;/usr/include") -set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "gcc;gcc_s;c;gcc;gcc_s") -set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0;/usr/lib;/lib") -set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/build/CMakeFiles/3.16.2/CMakeCXXCompiler.cmake b/build/CMakeFiles/3.16.2/CMakeCXXCompiler.cmake deleted file mode 100644 index da977ed..0000000 --- a/build/CMakeFiles/3.16.2/CMakeCXXCompiler.cmake +++ /dev/null @@ -1,88 +0,0 @@ -set(CMAKE_CXX_COMPILER "/usr/bin/c++") -set(CMAKE_CXX_COMPILER_ARG1 "") -set(CMAKE_CXX_COMPILER_ID "GNU") -set(CMAKE_CXX_COMPILER_VERSION "9.2.0") -set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") -set(CMAKE_CXX_COMPILER_WRAPPER "") -set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") -set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20") -set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") -set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") -set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") -set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") -set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") - -set(CMAKE_CXX_PLATFORM_ID "Linux") -set(CMAKE_CXX_SIMULATE_ID "") -set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "") -set(CMAKE_CXX_SIMULATE_VERSION "") - - - -set(CMAKE_AR "/usr/bin/ar") -set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar") -set(CMAKE_RANLIB "/usr/bin/ranlib") -set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib") -set(CMAKE_LINKER "/usr/bin/ld") -set(CMAKE_MT "") -set(CMAKE_COMPILER_IS_GNUCXX 1) -set(CMAKE_CXX_COMPILER_LOADED 1) -set(CMAKE_CXX_COMPILER_WORKS TRUE) -set(CMAKE_CXX_ABI_COMPILED TRUE) -set(CMAKE_COMPILER_IS_MINGW ) -set(CMAKE_COMPILER_IS_CYGWIN ) -if(CMAKE_COMPILER_IS_CYGWIN) - set(CYGWIN 1) - set(UNIX 1) -endif() - -set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") - -if(CMAKE_COMPILER_IS_MINGW) - set(MINGW 1) -endif() -set(CMAKE_CXX_COMPILER_ID_RUN 1) -set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;CPP) -set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) - -foreach (lang C OBJC OBJCXX) - if (CMAKE_${lang}_COMPILER_ID_RUN) - foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) - list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) - endforeach() - endif() -endforeach() - -set(CMAKE_CXX_LINKER_PREFERENCE 30) -set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) - -# Save compiler ABI information. -set(CMAKE_CXX_SIZEOF_DATA_PTR "8") -set(CMAKE_CXX_COMPILER_ABI "ELF") -set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") - -if(CMAKE_CXX_SIZEOF_DATA_PTR) - set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") -endif() - -if(CMAKE_CXX_COMPILER_ABI) - set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") -endif() - -if(CMAKE_CXX_LIBRARY_ARCHITECTURE) - set(CMAKE_LIBRARY_ARCHITECTURE "") -endif() - -set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") -if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) - set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") -endif() - - - - - -set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include/c++/9.2.0;/usr/include/c++/9.2.0/x86_64-pc-linux-gnu;/usr/include/c++/9.2.0/backward;/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include;/usr/local/include;/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed;/usr/include") -set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;c;gcc_s;gcc") -set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0;/usr/lib;/lib") -set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/build/CMakeFiles/3.16.2/CMakeDetermineCompilerABI_C.bin b/build/CMakeFiles/3.16.2/CMakeDetermineCompilerABI_C.bin deleted file mode 100644 index 8fc25aedb2f37ddf0ffff464ffc2668226372f22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/build/CMakeFiles/3.16.2/CMakeSystem.cmake b/build/CMakeFiles/3.16.2/CMakeSystem.cmake deleted file mode 100644 index 0e37536..0000000 --- a/build/CMakeFiles/3.16.2/CMakeSystem.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CMAKE_HOST_SYSTEM "Linux-5.3.18-1-MANJARO") -set(CMAKE_HOST_SYSTEM_NAME "Linux") -set(CMAKE_HOST_SYSTEM_VERSION "5.3.18-1-MANJARO") -set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") - - - -set(CMAKE_SYSTEM "Linux-5.3.18-1-MANJARO") -set(CMAKE_SYSTEM_NAME "Linux") -set(CMAKE_SYSTEM_VERSION "5.3.18-1-MANJARO") -set(CMAKE_SYSTEM_PROCESSOR "x86_64") - -set(CMAKE_CROSSCOMPILING "FALSE") - -set(CMAKE_SYSTEM_LOADED 1) diff --git a/build/CMakeFiles/3.16.2/CompilerIdC/CMakeCCompilerId.c b/build/CMakeFiles/3.16.2/CompilerIdC/CMakeCCompilerId.c deleted file mode 100644 index d884b50..0000000 --- a/build/CMakeFiles/3.16.2/CompilerIdC/CMakeCCompilerId.c +++ /dev/null @@ -1,671 +0,0 @@ -#ifdef __cplusplus -# error "A C++ compiler has been selected for C." -#endif - -#if defined(__18CXX) -# define ID_VOID_MAIN -#endif -#if defined(__CLASSIC_C__) -/* cv-qualifiers did not exist in K&R C */ -# define const -# define volatile -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_C) -# define COMPILER_ID "SunPro" -# if __SUNPRO_C >= 0x5100 - /* __SUNPRO_C = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) -# endif - -#elif defined(__HP_cc) -# define COMPILER_ID "HP" - /* __HP_cc = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) - -#elif defined(__DECC) -# define COMPILER_ID "Compaq" - /* __DECC_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) - -#elif defined(__IBMC__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 -# define COMPILER_ID "XL" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMC__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) -# define COMPILER_ID "Fujitsu" - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__TINYC__) -# define COMPILER_ID "TinyCC" - -#elif defined(__BCC__) -# define COMPILER_ID "Bruce" - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) -# define COMPILER_ID "GNU" -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - -#elif defined(__SDCC_VERSION_MAJOR) || defined(SDCC) -# define COMPILER_ID "SDCC" -# if defined(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MAJOR DEC(__SDCC_VERSION_MAJOR) -# define COMPILER_VERSION_MINOR DEC(__SDCC_VERSION_MINOR) -# define COMPILER_VERSION_PATCH DEC(__SDCC_VERSION_PATCH) -# else - /* SDCC = VRP */ -# define COMPILER_VERSION_MAJOR DEC(SDCC/100) -# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) -# define COMPILER_VERSION_PATCH DEC(SDCC % 10) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXE) || defined(__CRAYXC) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - - -#if !defined(__STDC__) -# if (defined(_MSC_VER) && !defined(__clang__)) \ - || (defined(__ibmxl__) || defined(__IBMC__)) -# define C_DIALECT "90" -# else -# define C_DIALECT -# endif -#elif __STDC_VERSION__ >= 201000L -# define C_DIALECT "11" -#elif __STDC_VERSION__ >= 199901L -# define C_DIALECT "99" -#else -# define C_DIALECT "90" -#endif -const char* info_language_dialect_default = - "INFO" ":" "dialect_default[" C_DIALECT "]"; - -/*--------------------------------------------------------------------------*/ - -#ifdef ID_VOID_MAIN -void main() {} -#else -# if defined(__CLASSIC_C__) -int main(argc, argv) int argc; char *argv[]; -# else -int main(int argc, char* argv[]) -# endif -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; - require += info_arch[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXE) || defined(__CRAYXC) - require += info_cray[argc]; -#endif - require += info_language_dialect_default[argc]; - (void)argv; - return require; -} -#endif diff --git a/build/CMakeFiles/3.16.2/CompilerIdC/a.out b/build/CMakeFiles/3.16.2/CompilerIdC/a.out deleted file mode 100644 index bae4a3cdf006320b4c5b12401129b785aa336333..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16544 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 diff --git a/build/CMakeFiles/3.16.2/CompilerIdCXX/CMakeCXXCompilerId.cpp b/build/CMakeFiles/3.16.2/CompilerIdCXX/CMakeCXXCompilerId.cpp deleted file mode 100644 index 69cfdba..0000000 --- a/build/CMakeFiles/3.16.2/CompilerIdCXX/CMakeCXXCompilerId.cpp +++ /dev/null @@ -1,660 +0,0 @@ -/* This source file must have a .cpp extension so that all C++ compilers - recognize the extension without flags. Borland does not know .cxx for - example. */ -#ifndef __cplusplus -# error "A C compiler has been selected for C++." -#endif - - -/* Version number components: V=Version, R=Revision, P=Patch - Version date components: YYYY=Year, MM=Month, DD=Day */ - -#if defined(__COMO__) -# define COMPILER_ID "Comeau" - /* __COMO_VERSION__ = VRR */ -# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) -# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) - -#elif defined(__INTEL_COMPILER) || defined(__ICC) -# define COMPILER_ID "Intel" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# if defined(__GNUC__) -# define SIMULATE_ID "GNU" -# endif - /* __INTEL_COMPILER = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) -# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) -# if defined(__INTEL_COMPILER_UPDATE) -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) -# else -# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) -# endif -# if defined(__INTEL_COMPILER_BUILD_DATE) - /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ -# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) -# endif -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# if defined(__GNUC__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) -# elif defined(__GNUG__) -# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(__PATHCC__) -# define COMPILER_ID "PathScale" -# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) -# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) -# if defined(__PATHCC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) -# endif - -#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) -# define COMPILER_ID "Embarcadero" -# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) -# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) -# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) - -#elif defined(__BORLANDC__) -# define COMPILER_ID "Borland" - /* __BORLANDC__ = 0xVRR */ -# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) -# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) - -#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 -# define COMPILER_ID "Watcom" - /* __WATCOMC__ = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__WATCOMC__) -# define COMPILER_ID "OpenWatcom" - /* __WATCOMC__ = VVRP + 1100 */ -# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) -# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) -# if (__WATCOMC__ % 10) > 0 -# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) -# endif - -#elif defined(__SUNPRO_CC) -# define COMPILER_ID "SunPro" -# if __SUNPRO_CC >= 0x5100 - /* __SUNPRO_CC = 0xVRRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# else - /* __SUNPRO_CC = 0xVRP */ -# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) -# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) -# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) -# endif - -#elif defined(__HP_aCC) -# define COMPILER_ID "HP" - /* __HP_aCC = VVRRPP */ -# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) -# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) -# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) - -#elif defined(__DECCXX) -# define COMPILER_ID "Compaq" - /* __DECCXX_VER = VVRRTPPPP */ -# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) -# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) -# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) - -#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) -# define COMPILER_ID "zOS" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__ibmxl__) && defined(__clang__) -# define COMPILER_ID "XLClang" -# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) -# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) -# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) -# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) - - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 -# define COMPILER_ID "XL" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 -# define COMPILER_ID "VisualAge" - /* __IBMCPP__ = VRP */ -# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) -# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) -# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) - -#elif defined(__PGI) -# define COMPILER_ID "PGI" -# define COMPILER_VERSION_MAJOR DEC(__PGIC__) -# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) -# if defined(__PGIC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) -# endif - -#elif defined(_CRAYC) -# define COMPILER_ID "Cray" -# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) -# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) - -#elif defined(__TI_COMPILER_VERSION__) -# define COMPILER_ID "TI" - /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ -# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) -# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) -# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) - -#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) -# define COMPILER_ID "Fujitsu" - -#elif defined(__ghs__) -# define COMPILER_ID "GHS" -/* __GHS_VERSION_NUMBER = VVVVRP */ -# ifdef __GHS_VERSION_NUMBER -# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) -# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) -# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) -# endif - -#elif defined(__SCO_VERSION__) -# define COMPILER_ID "SCO" - -#elif defined(__ARMCC_VERSION) && !defined(__clang__) -# define COMPILER_ID "ARMCC" -#if __ARMCC_VERSION >= 1000000 - /* __ARMCC_VERSION = VRRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#else - /* __ARMCC_VERSION = VRPPPP */ - # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) - # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) - # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) -#endif - - -#elif defined(__clang__) && defined(__apple_build_version__) -# define COMPILER_ID "AppleClang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif -# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) - -#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) -# define COMPILER_ID "ARMClang" - # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) - # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) - # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION % 10000) -# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) - -#elif defined(__clang__) -# define COMPILER_ID "Clang" -# if defined(_MSC_VER) -# define SIMULATE_ID "MSVC" -# endif -# define COMPILER_VERSION_MAJOR DEC(__clang_major__) -# define COMPILER_VERSION_MINOR DEC(__clang_minor__) -# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) -# if defined(_MSC_VER) - /* _MSC_VER = VVRR */ -# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) -# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) -# endif - -#elif defined(__GNUC__) || defined(__GNUG__) -# define COMPILER_ID "GNU" -# if defined(__GNUC__) -# define COMPILER_VERSION_MAJOR DEC(__GNUC__) -# else -# define COMPILER_VERSION_MAJOR DEC(__GNUG__) -# endif -# if defined(__GNUC_MINOR__) -# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) -# endif -# if defined(__GNUC_PATCHLEVEL__) -# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) -# endif - -#elif defined(_MSC_VER) -# define COMPILER_ID "MSVC" - /* _MSC_VER = VVRR */ -# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) -# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) -# if defined(_MSC_FULL_VER) -# if _MSC_VER >= 1400 - /* _MSC_FULL_VER = VVRRPPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) -# else - /* _MSC_FULL_VER = VVRRPPPP */ -# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) -# endif -# endif -# if defined(_MSC_BUILD) -# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) -# endif - -#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) -# define COMPILER_ID "ADSP" -#if defined(__VISUALDSPVERSION__) - /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ -# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) -# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) -# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) -#endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# define COMPILER_ID "IAR" -# if defined(__VER__) && defined(__ICCARM__) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) -# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) -# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__)) -# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) -# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) -# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) -# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) -# endif - - -/* These compilers are either not known or too old to define an - identification macro. Try to identify the platform and guess that - it is the native compiler. */ -#elif defined(__hpux) || defined(__hpua) -# define COMPILER_ID "HP" - -#else /* unknown compiler */ -# define COMPILER_ID "" -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; -#ifdef SIMULATE_ID -char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; -#endif - -#ifdef __QNXNTO__ -char const* qnxnto = "INFO" ":" "qnxnto[]"; -#endif - -#if defined(__CRAYXE) || defined(__CRAYXC) -char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; -#endif - -#define STRINGIFY_HELPER(X) #X -#define STRINGIFY(X) STRINGIFY_HELPER(X) - -/* Identify known platforms by name. */ -#if defined(__linux) || defined(__linux__) || defined(linux) -# define PLATFORM_ID "Linux" - -#elif defined(__CYGWIN__) -# define PLATFORM_ID "Cygwin" - -#elif defined(__MINGW32__) -# define PLATFORM_ID "MinGW" - -#elif defined(__APPLE__) -# define PLATFORM_ID "Darwin" - -#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) -# define PLATFORM_ID "Windows" - -#elif defined(__FreeBSD__) || defined(__FreeBSD) -# define PLATFORM_ID "FreeBSD" - -#elif defined(__NetBSD__) || defined(__NetBSD) -# define PLATFORM_ID "NetBSD" - -#elif defined(__OpenBSD__) || defined(__OPENBSD) -# define PLATFORM_ID "OpenBSD" - -#elif defined(__sun) || defined(sun) -# define PLATFORM_ID "SunOS" - -#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) -# define PLATFORM_ID "AIX" - -#elif defined(__hpux) || defined(__hpux__) -# define PLATFORM_ID "HP-UX" - -#elif defined(__HAIKU__) -# define PLATFORM_ID "Haiku" - -#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) -# define PLATFORM_ID "BeOS" - -#elif defined(__QNX__) || defined(__QNXNTO__) -# define PLATFORM_ID "QNX" - -#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) -# define PLATFORM_ID "Tru64" - -#elif defined(__riscos) || defined(__riscos__) -# define PLATFORM_ID "RISCos" - -#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) -# define PLATFORM_ID "SINIX" - -#elif defined(__UNIX_SV__) -# define PLATFORM_ID "UNIX_SV" - -#elif defined(__bsdos__) -# define PLATFORM_ID "BSDOS" - -#elif defined(_MPRAS) || defined(MPRAS) -# define PLATFORM_ID "MP-RAS" - -#elif defined(__osf) || defined(__osf__) -# define PLATFORM_ID "OSF1" - -#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) -# define PLATFORM_ID "SCO_SV" - -#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) -# define PLATFORM_ID "ULTRIX" - -#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) -# define PLATFORM_ID "Xenix" - -#elif defined(__WATCOMC__) -# if defined(__LINUX__) -# define PLATFORM_ID "Linux" - -# elif defined(__DOS__) -# define PLATFORM_ID "DOS" - -# elif defined(__OS2__) -# define PLATFORM_ID "OS2" - -# elif defined(__WINDOWS__) -# define PLATFORM_ID "Windows3x" - -# else /* unknown platform */ -# define PLATFORM_ID -# endif - -#elif defined(__INTEGRITY) -# if defined(INT_178B) -# define PLATFORM_ID "Integrity178" - -# else /* regular Integrity */ -# define PLATFORM_ID "Integrity" -# endif - -#else /* unknown platform */ -# define PLATFORM_ID - -#endif - -/* For windows compilers MSVC and Intel we can determine - the architecture of the compiler being used. This is because - the compilers do not have flags that can change the architecture, - but rather depend on which compiler is being used -*/ -#if defined(_WIN32) && defined(_MSC_VER) -# if defined(_M_IA64) -# define ARCHITECTURE_ID "IA64" - -# elif defined(_M_X64) || defined(_M_AMD64) -# define ARCHITECTURE_ID "x64" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# elif defined(_M_ARM64) -# define ARCHITECTURE_ID "ARM64" - -# elif defined(_M_ARM) -# if _M_ARM == 4 -# define ARCHITECTURE_ID "ARMV4I" -# elif _M_ARM == 5 -# define ARCHITECTURE_ID "ARMV5I" -# else -# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) -# endif - -# elif defined(_M_MIPS) -# define ARCHITECTURE_ID "MIPS" - -# elif defined(_M_SH) -# define ARCHITECTURE_ID "SHx" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__WATCOMC__) -# if defined(_M_I86) -# define ARCHITECTURE_ID "I86" - -# elif defined(_M_IX86) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) -# if defined(__ICCARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__ICCRX__) -# define ARCHITECTURE_ID "RX" - -# elif defined(__ICCRH850__) -# define ARCHITECTURE_ID "RH850" - -# elif defined(__ICCRL78__) -# define ARCHITECTURE_ID "RL78" - -# elif defined(__ICCRISCV__) -# define ARCHITECTURE_ID "RISCV" - -# elif defined(__ICCAVR__) -# define ARCHITECTURE_ID "AVR" - -# elif defined(__ICC430__) -# define ARCHITECTURE_ID "MSP430" - -# elif defined(__ICCV850__) -# define ARCHITECTURE_ID "V850" - -# elif defined(__ICC8051__) -# define ARCHITECTURE_ID "8051" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif - -#elif defined(__ghs__) -# if defined(__PPC64__) -# define ARCHITECTURE_ID "PPC64" - -# elif defined(__ppc__) -# define ARCHITECTURE_ID "PPC" - -# elif defined(__ARM__) -# define ARCHITECTURE_ID "ARM" - -# elif defined(__x86_64__) -# define ARCHITECTURE_ID "x64" - -# elif defined(__i386__) -# define ARCHITECTURE_ID "X86" - -# else /* unknown architecture */ -# define ARCHITECTURE_ID "" -# endif -#else -# define ARCHITECTURE_ID -#endif - -/* Convert integer to decimal digit literals. */ -#define DEC(n) \ - ('0' + (((n) / 10000000)%10)), \ - ('0' + (((n) / 1000000)%10)), \ - ('0' + (((n) / 100000)%10)), \ - ('0' + (((n) / 10000)%10)), \ - ('0' + (((n) / 1000)%10)), \ - ('0' + (((n) / 100)%10)), \ - ('0' + (((n) / 10)%10)), \ - ('0' + ((n) % 10)) - -/* Convert integer to hex digit literals. */ -#define HEX(n) \ - ('0' + ((n)>>28 & 0xF)), \ - ('0' + ((n)>>24 & 0xF)), \ - ('0' + ((n)>>20 & 0xF)), \ - ('0' + ((n)>>16 & 0xF)), \ - ('0' + ((n)>>12 & 0xF)), \ - ('0' + ((n)>>8 & 0xF)), \ - ('0' + ((n)>>4 & 0xF)), \ - ('0' + ((n) & 0xF)) - -/* Construct a string literal encoding the version number components. */ -#ifdef COMPILER_VERSION_MAJOR -char const info_version[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', - COMPILER_VERSION_MAJOR, -# ifdef COMPILER_VERSION_MINOR - '.', COMPILER_VERSION_MINOR, -# ifdef COMPILER_VERSION_PATCH - '.', COMPILER_VERSION_PATCH, -# ifdef COMPILER_VERSION_TWEAK - '.', COMPILER_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct a string literal encoding the internal version number. */ -#ifdef COMPILER_VERSION_INTERNAL -char const info_version_internal[] = { - 'I', 'N', 'F', 'O', ':', - 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', - 'i','n','t','e','r','n','a','l','[', - COMPILER_VERSION_INTERNAL,']','\0'}; -#endif - -/* Construct a string literal encoding the version number components. */ -#ifdef SIMULATE_VERSION_MAJOR -char const info_simulate_version[] = { - 'I', 'N', 'F', 'O', ':', - 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', - SIMULATE_VERSION_MAJOR, -# ifdef SIMULATE_VERSION_MINOR - '.', SIMULATE_VERSION_MINOR, -# ifdef SIMULATE_VERSION_PATCH - '.', SIMULATE_VERSION_PATCH, -# ifdef SIMULATE_VERSION_TWEAK - '.', SIMULATE_VERSION_TWEAK, -# endif -# endif -# endif - ']','\0'}; -#endif - -/* Construct the string literal in pieces to prevent the source from - getting matched. Store it in a pointer rather than an array - because some compilers will just produce instructions to fill the - array rather than assigning a pointer to a static array. */ -char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; -char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; - - - - -#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) && _MSVC_LANG < 201403L -# if defined(__INTEL_CXX11_MODE__) -# if defined(__cpp_aggregate_nsdmi) -# define CXX_STD 201402L -# else -# define CXX_STD 201103L -# endif -# else -# define CXX_STD 199711L -# endif -#elif defined(_MSC_VER) && defined(_MSVC_LANG) -# define CXX_STD _MSVC_LANG -#else -# define CXX_STD __cplusplus -#endif - -const char* info_language_dialect_default = "INFO" ":" "dialect_default[" -#if CXX_STD > 201703L - "20" -#elif CXX_STD >= 201703L - "17" -#elif CXX_STD >= 201402L - "14" -#elif CXX_STD >= 201103L - "11" -#else - "98" -#endif -"]"; - -/*--------------------------------------------------------------------------*/ - -int main(int argc, char* argv[]) -{ - int require = 0; - require += info_compiler[argc]; - require += info_platform[argc]; -#ifdef COMPILER_VERSION_MAJOR - require += info_version[argc]; -#endif -#ifdef COMPILER_VERSION_INTERNAL - require += info_version_internal[argc]; -#endif -#ifdef SIMULATE_ID - require += info_simulate[argc]; -#endif -#ifdef SIMULATE_VERSION_MAJOR - require += info_simulate_version[argc]; -#endif -#if defined(__CRAYXE) || defined(__CRAYXC) - require += info_cray[argc]; -#endif - require += info_language_dialect_default[argc]; - (void)argv; - return require; -} diff --git a/build/CMakeFiles/3.16.2/CompilerIdCXX/a.out b/build/CMakeFiles/3.16.2/CompilerIdCXX/a.out deleted file mode 100644 index 7a628e59c407288a7b3dd6fe172c306fade59f14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16552 zcmeHOUu+b|8K1kua5Qk|5S$RG>TTKwqr`_XgxZM=cmBs(Is+kgN^8urzB}8e+#l<1 zFEuE%RHlS0HMLZ!jjE`5iK0C4(1!|DeW)N%ninciB}&v*rEO>-h18@?1P$T(eKX&8 zx4S-9QLFZ$+L88tGr#Z8%zQh$H@iFYwZ3@2-{%vY0%EJclGdo0C<(52QU)L@I>ZC; zyH2bXOQF0(a!MXm08*7E{Z0%L9{@zVH%RWrPm>-aw-6ES7E5n5C<&vWexRKcQJHzh zCTa&G^VRw^s?mkVs9}tDJB-bpR%Lgm%ZaUM&=4F`+jk6$TNmzr6h3s~LS@e{zZX7!`Db5! zMMKM_v4Ph`+K; z$b@4b#|x*cHeU5uNv_*?9B-WFZ9HF7D7$0h=~l)j9(ob*BH%^9i+~paF9Kc!ya;#^ z_>Uv-xA15Fq0ih5>c<;?zd;E78>cOQ<)S`wE_hb@M)}5D1LaHm^zt9{nRn)Q4aH|0 z&coDKpIy0ALf0kGtTcTe%>O>8&vxBLKeG+*B6Qxdn!xo7u28Erk}YJ(0%9iOZTnS;9!s(1S?m^!_B=ldu-p~u0tRerA@>7OqUIar~M~q*+Kzj!-_CHZ!S& z1>Z2o%~Hl1*|>RB_|^rUZh`9YdztmuN(Ej6i0pi&vKR0jz!w3BZdWSj0P%Y;Cf~u` z!Z+RMTeo6aa1LHqAdhPbTEHIP6o}qs@{1yJo8edveoDy4LXAiLJu8>`r@#`_fEt2h zKgd%k?+-P8+dmLmb0W|e(q@Lzyx>OH!%q-g;isnKcu~1tq)Y2W&xB}45XL52zU|jBH%^9i+~paF9Kc!ya;#^_-{vm*H`j-N?yz8 zMzvD5w${<0hOr*5>BO``L3M%WN-76wvFoE$=5?OySWdW>kk@yhiu{;TpmwLWX6OIkrS)xL%Dq3X4@`V*8IOsy#qTRrnGs z+c!z}@C8|xIZp7nC(C ztk*hW@o(E={_K1JR?zage<$y+u48xd0dd{FxR!(gcq0&`^X}Ad5Ii27{8GW=#>p=e ze14pKQ1E$m^2-H}7bg#+j~6=I1OeDJq1EMA2)<5i>aac?t|HCOsC+<#s_XUb(trqy zD|Pi7tLv+s`mo5F)>k|ERifUw2#ALSuYY#x!&{Z8ol*IKXcBAc@(&BWF8{~^CwToV z5w|OD0bX?V_=kY^L!5WH;*8fj@`qh~3-Np(grZCs7N4lKldt1J$uEqX1w8ua`>J#T zKZoJ)!C>I~9`mn4re6C`N&S@~swvHO1@b0SPya2c9~MVGONutAr+-<>7mlAlLI?d~ z;kdma{VyC3?@K=rOxO4c$UrUZ@58|R@aFNg4C~#XO_H8_0CZoB^x$izo4DGiG}}%ao^M`n;vI31FvzxhCPe$ zBArWHk%UMTtfEzd#aRha+s0y8StEfPS&FdpB$+oRGWjtxVC?z{FNEurUtRokiPU>{3#0c-J7R+aJs@+` zl5`SsLys`F$9Hze;>OPY{%8A!jGfvjbY0a^uxlblQE zV4u{Kh~)BCDl(BPMaD{L*lm_h5*6znXtm4bu~O6UD|;6yK-WSI9{JiiS z$Z?9w_B{V&e2wfGFxK|84+{89!S*~)W#s2CZa?cWJ`eWzjKXD}&oXLMnY;Z&i-VBC zn6f?3dl@xqFxT(y{}Hf76@E^GKPi<6`FW67Sr_LKzX^xkp8qEquek!o?%4;PAG(Nks;txhQ@BIlKKyQecE-y^iFrAN||yd7jVsLx*+k zxtZxxkb!l`attEJ^HJW1%jXMan7GXNCU9Xms*hPb?}N3>m{?DhYGvks0RlYtY|qaZ zyw92UGxPXhJ3f!U0$c1q+w*hC6`ClufXtrQp7A#zwA+g)X}2ll>y+4Pf7t#S2<-Me z?^;9l1Z-ZlXW}oAL0{Z{p3muI$n~&3)@4ugP(aRI58Ko9t!l#dcC3!ws+JJ@$zdA> t9^cd8SmgF_T=4w|x7}tg=J3W0Y1HMM>s3;m%h$KR)uA-*vLd0|{+}T!V!;3a diff --git a/build/CMakeFiles/CMakeDirectoryInformation.cmake b/build/CMakeFiles/CMakeDirectoryInformation.cmake deleted file mode 100644 index b25e022..0000000 --- a/build/CMakeFiles/CMakeDirectoryInformation.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.16 - -# Relative path conversion top directories. -set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/ben/mnt/Projects-linux/2d-gi") -set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/ben/mnt/Projects-linux/2d-gi/build") - -# Force unix paths in dependencies. -set(CMAKE_FORCE_UNIX_PATHS 1) - - -# The C and CXX include file regular expressions for this directory. -set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") -set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") -set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) -set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/CMakeFiles/CMakeError.log b/build/CMakeFiles/CMakeError.log deleted file mode 100644 index 2c8c061..0000000 --- a/build/CMakeFiles/CMakeError.log +++ /dev/null @@ -1,58 +0,0 @@ -Performing C SOURCE FILE Test CMAKE_HAVE_LIBC_PTHREAD failed with the following output: -Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_c8283/fast && /usr/bin/make -f CMakeFiles/cmTC_c8283.dir/build.make CMakeFiles/cmTC_c8283.dir/build -make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -Building C object CMakeFiles/cmTC_c8283.dir/src.c.o -/usr/bin/cc -DCMAKE_HAVE_LIBC_PTHREAD -o CMakeFiles/cmTC_c8283.dir/src.c.o -c /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp/src.c -Linking C executable cmTC_c8283 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_c8283.dir/link.txt --verbose=1 -/usr/bin/cc -DCMAKE_HAVE_LIBC_PTHREAD CMakeFiles/cmTC_c8283.dir/src.c.o -o cmTC_c8283 -/usr/bin/ld: CMakeFiles/cmTC_c8283.dir/src.c.o: in function `main': -src.c:(.text+0x3e): undefined reference to `pthread_create' -/usr/bin/ld: src.c:(.text+0x4a): undefined reference to `pthread_detach' -/usr/bin/ld: src.c:(.text+0x5b): undefined reference to `pthread_join' -collect2: error: ld returned 1 exit status -make[1]: *** [CMakeFiles/cmTC_c8283.dir/build.make:87: cmTC_c8283] Error 1 -make[1]: Leaving directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -make: *** [Makefile:121: cmTC_c8283/fast] Error 2 - - -Source file was: -#include - -void* test_func(void* data) -{ - return data; -} - -int main(void) -{ - pthread_t thread; - pthread_create(&thread, NULL, test_func, NULL); - pthread_detach(thread); - pthread_join(thread, NULL); - pthread_atfork(NULL, NULL, NULL); - pthread_exit(NULL); - - return 0; -} - -Determining if the function pthread_create exists in the pthreads failed with the following output: -Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_73579/fast && /usr/bin/make -f CMakeFiles/cmTC_73579.dir/build.make CMakeFiles/cmTC_73579.dir/build -make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -Building C object CMakeFiles/cmTC_73579.dir/CheckFunctionExists.c.o -/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTC_73579.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.16/Modules/CheckFunctionExists.c -Linking C executable cmTC_73579 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_73579.dir/link.txt --verbose=1 -/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_73579.dir/CheckFunctionExists.c.o -o cmTC_73579 -lpthreads -/usr/bin/ld: cannot find -lpthreads -collect2: error: ld returned 1 exit status -make[1]: *** [CMakeFiles/cmTC_73579.dir/build.make:87: cmTC_73579] Error 1 -make[1]: Leaving directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -make: *** [Makefile:121: cmTC_73579/fast] Error 2 - - - diff --git a/build/CMakeFiles/CMakeOutput.log b/build/CMakeFiles/CMakeOutput.log deleted file mode 100644 index 64689b1..0000000 --- a/build/CMakeFiles/CMakeOutput.log +++ /dev/null @@ -1,445 +0,0 @@ -The system is: Linux - 5.3.18-1-MANJARO - x86_64 -Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. -Compiler: /usr/bin/cc -Build flags: -Id flags: - -The output was: -0 - - -Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" - -The C compiler identification is GNU, found in "/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/3.16.2/CompilerIdC/a.out" - -Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. -Compiler: /usr/bin/c++ -Build flags: -Id flags: - -The output was: -0 - - -Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" - -The CXX compiler identification is GNU, found in "/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/3.16.2/CompilerIdCXX/a.out" - -Determining if the C compiler works passed with the following output: -Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_957e3/fast && /usr/bin/make -f CMakeFiles/cmTC_957e3.dir/build.make CMakeFiles/cmTC_957e3.dir/build -make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -Building C object CMakeFiles/cmTC_957e3.dir/testCCompiler.c.o -/usr/bin/cc -o CMakeFiles/cmTC_957e3.dir/testCCompiler.c.o -c /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp/testCCompiler.c -Linking C executable cmTC_957e3 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_957e3.dir/link.txt --verbose=1 -/usr/bin/cc CMakeFiles/cmTC_957e3.dir/testCCompiler.c.o -o cmTC_957e3 -make[1]: Leaving directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' - - - -Detecting C compiler ABI info compiled with the following output: -Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_a986f/fast && /usr/bin/make -f CMakeFiles/cmTC_a986f.dir/build.make CMakeFiles/cmTC_a986f.dir/build -make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -Building C object CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -/usr/bin/cc -v -o CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c -Using built-in specs. -COLLECT_GCC=/usr/bin/cc -Target: x86_64-pc-linux-gnu -Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc -Thread model: posix -gcc version 9.2.0 (GCC) -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/cc1 -quiet -v /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -version -o /tmp/cch5STWt.s -GNU C17 (GCC) version 9.2.0 (x86_64-pc-linux-gnu) - compiled by GNU C version 9.2.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP - -GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 -ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../x86_64-pc-linux-gnu/include" -#include "..." search starts here: -#include <...> search starts here: - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include - /usr/local/include - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed - /usr/include -End of search list. -GNU C17 (GCC) version 9.2.0 (x86_64-pc-linux-gnu) - compiled by GNU C version 9.2.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP - -GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 -Compiler executable checksum: 084559c67b5620be476de387987f6c74 -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' - as -v --64 -o CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o /tmp/cch5STWt.s -GNU assembler version 2.33.1 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.33.1 -COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64' -Linking C executable cmTC_a986f -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_a986f.dir/link.txt --verbose=1 -/usr/bin/cc -v CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -o cmTC_a986f -Using built-in specs. -COLLECT_GCC=/usr/bin/cc -COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper -Target: x86_64-pc-linux-gnu -Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc -Thread model: posix -gcc version 9.2.0 (GCC) -COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_a986f' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/cc29ToJU.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_a986f /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0 -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../.. CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_a986f' '-mtune=generic' '-march=x86-64' -make[1]: Leaving directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' - - - -Parsed C implicit include dir info from above output: rv=done - found start of include info - found start of implicit include info - add: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include] - add: [/usr/local/include] - add: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed] - add: [/usr/include] - end of search list found - collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include] - collapse include dir [/usr/local/include] ==> [/usr/local/include] - collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed] - collapse include dir [/usr/include] ==> [/usr/include] - implicit include dirs: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include;/usr/local/include;/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed;/usr/include] - - -Parsed C implicit link information from above output: - link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] - ignore line: [Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp] - ignore line: [] - ignore line: [Run Build Command(s):/usr/bin/make cmTC_a986f/fast && /usr/bin/make -f CMakeFiles/cmTC_a986f.dir/build.make CMakeFiles/cmTC_a986f.dir/build] - ignore line: [make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp'] - ignore line: [Building C object CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o] - ignore line: [/usr/bin/cc -v -o CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/cc] - ignore line: [Target: x86_64-pc-linux-gnu] - ignore line: [Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c c++ ada fortran go lto objc obj-c++ d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc] - ignore line: [Thread model: posix] - ignore line: [gcc version 9.2.0 (GCC) ] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/cc1 -quiet -v /usr/share/cmake-3.16/Modules/CMakeCCompilerABI.c -quiet -dumpbase CMakeCCompilerABI.c -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -version -o /tmp/cch5STWt.s] - ignore line: [GNU C17 (GCC) version 9.2.0 (x86_64-pc-linux-gnu)] - ignore line: [ compiled by GNU C version 9.2.0 GMP version 6.1.2 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.21-GMP] - ignore line: [] - ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] - ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../x86_64-pc-linux-gnu/include"] - ignore line: [#include "..." search starts here:] - ignore line: [#include <...> search starts here:] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include] - ignore line: [ /usr/local/include] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed] - ignore line: [ /usr/include] - ignore line: [End of search list.] - ignore line: [GNU C17 (GCC) version 9.2.0 (x86_64-pc-linux-gnu)] - ignore line: [ compiled by GNU C version 9.2.0 GMP version 6.1.2 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.21-GMP] - ignore line: [] - ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] - ignore line: [Compiler executable checksum: 084559c67b5620be476de387987f6c74] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] - ignore line: [ as -v --64 -o CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o /tmp/cch5STWt.s] - ignore line: [GNU assembler version 2.33.1 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.33.1] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o' '-c' '-mtune=generic' '-march=x86-64'] - ignore line: [Linking C executable cmTC_a986f] - ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_a986f.dir/link.txt --verbose=1] - ignore line: [/usr/bin/cc -v CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -o cmTC_a986f ] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/cc] - ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper] - ignore line: [Target: x86_64-pc-linux-gnu] - ignore line: [Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c c++ ada fortran go lto objc obj-c++ d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc] - ignore line: [Thread model: posix] - ignore line: [gcc version 9.2.0 (GCC) ] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_a986f' '-mtune=generic' '-march=x86-64'] - link line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/cc29ToJU.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_a986f /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0 -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../.. CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o] - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/collect2] ==> ignore - arg [-plugin] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/liblto_plugin.so] ==> ignore - arg [-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper] ==> ignore - arg [-plugin-opt=-fresolution=/tmp/cc29ToJU.res] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore - arg [-plugin-opt=-pass-through=-lc] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore - arg [--build-id] ==> ignore - arg [--eh-frame-hdr] ==> ignore - arg [--hash-style=gnu] ==> ignore - arg [-m] ==> ignore - arg [elf_x86_64] ==> ignore - arg [-dynamic-linker] ==> ignore - arg [/lib64/ld-linux-x86-64.so.2] ==> ignore - arg [-pie] ==> ignore - arg [-o] ==> ignore - arg [cmTC_a986f] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/Scrt1.o] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtbeginS.o] ==> ignore - arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0] - arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib] - arg [-L/lib/../lib] ==> dir [/lib/../lib] - arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] - arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../..] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../..] - arg [CMakeFiles/cmTC_a986f.dir/CMakeCCompilerABI.c.o] ==> ignore - arg [-lgcc] ==> lib [gcc] - arg [--push-state] ==> ignore - arg [--as-needed] ==> ignore - arg [-lgcc_s] ==> lib [gcc_s] - arg [--pop-state] ==> ignore - arg [-lc] ==> lib [c] - arg [-lgcc] ==> lib [gcc] - arg [--push-state] ==> ignore - arg [--as-needed] ==> ignore - arg [-lgcc_s] ==> lib [gcc_s] - arg [--pop-state] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtendS.o] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o] ==> ignore - collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0] - collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib] ==> [/usr/lib] - collapse library dir [/lib/../lib] ==> [/lib] - collapse library dir [/usr/lib/../lib] ==> [/usr/lib] - collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../..] ==> [/usr/lib] - implicit libs: [gcc;gcc_s;c;gcc;gcc_s] - implicit dirs: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0;/usr/lib;/lib] - implicit fwks: [] - - -Determining if the CXX compiler works passed with the following output: -Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_0213c/fast && /usr/bin/make -f CMakeFiles/cmTC_0213c.dir/build.make CMakeFiles/cmTC_0213c.dir/build -make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -Building CXX object CMakeFiles/cmTC_0213c.dir/testCXXCompiler.cxx.o -/usr/bin/c++ -o CMakeFiles/cmTC_0213c.dir/testCXXCompiler.cxx.o -c /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx -Linking CXX executable cmTC_0213c -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_0213c.dir/link.txt --verbose=1 -/usr/bin/c++ CMakeFiles/cmTC_0213c.dir/testCXXCompiler.cxx.o -o cmTC_0213c -make[1]: Leaving directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' - - - -Detecting CXX compiler ABI info compiled with the following output: -Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_460a7/fast && /usr/bin/make -f CMakeFiles/cmTC_460a7.dir/build.make CMakeFiles/cmTC_460a7.dir/build -make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -Building CXX object CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -/usr/bin/c++ -v -o CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp -Using built-in specs. -COLLECT_GCC=/usr/bin/c++ -Target: x86_64-pc-linux-gnu -Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc -Thread model: posix -gcc version 9.2.0 (GCC) -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -version -o /tmp/ccWDzqJh.s -GNU C++14 (GCC) version 9.2.0 (x86_64-pc-linux-gnu) - compiled by GNU C version 9.2.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP - -GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 -ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../x86_64-pc-linux-gnu/include" -#include "..." search starts here: -#include <...> search starts here: - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0 - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/x86_64-pc-linux-gnu - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/backward - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include - /usr/local/include - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed - /usr/include -End of search list. -GNU C++14 (GCC) version 9.2.0 (x86_64-pc-linux-gnu) - compiled by GNU C version 9.2.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version isl-0.21-GMP - -GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 -Compiler executable checksum: e70628160ff7c7e477f7d9570e6637cb -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' - as -v --64 -o CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccWDzqJh.s -GNU assembler version 2.33.1 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.33.1 -COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' -Linking CXX executable cmTC_460a7 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_460a7.dir/link.txt --verbose=1 -/usr/bin/c++ -v CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_460a7 -Using built-in specs. -COLLECT_GCC=/usr/bin/c++ -COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper -Target: x86_64-pc-linux-gnu -Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc -Thread model: posix -gcc version 9.2.0 (GCC) -COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/ -LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/ -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_460a7' '-shared-libgcc' '-mtune=generic' '-march=x86-64' - /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/cc1ZlbaF.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_460a7 /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0 -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../.. CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o -COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_460a7' '-shared-libgcc' '-mtune=generic' '-march=x86-64' -make[1]: Leaving directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' - - - -Parsed CXX implicit include dir info from above output: rv=done - found start of include info - found start of implicit include info - add: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0] - add: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/x86_64-pc-linux-gnu] - add: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/backward] - add: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include] - add: [/usr/local/include] - add: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed] - add: [/usr/include] - end of search list found - collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0] ==> [/usr/include/c++/9.2.0] - collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/x86_64-pc-linux-gnu] ==> [/usr/include/c++/9.2.0/x86_64-pc-linux-gnu] - collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/backward] ==> [/usr/include/c++/9.2.0/backward] - collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include] - collapse include dir [/usr/local/include] ==> [/usr/local/include] - collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed] - collapse include dir [/usr/include] ==> [/usr/include] - implicit include dirs: [/usr/include/c++/9.2.0;/usr/include/c++/9.2.0/x86_64-pc-linux-gnu;/usr/include/c++/9.2.0/backward;/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include;/usr/local/include;/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed;/usr/include] - - -Parsed CXX implicit link information from above output: - link line regex: [^( *|.*[/\])(ld|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\]+-)?ld|collect2)[^/\]*( |$)] - ignore line: [Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp] - ignore line: [] - ignore line: [Run Build Command(s):/usr/bin/make cmTC_460a7/fast && /usr/bin/make -f CMakeFiles/cmTC_460a7.dir/build.make CMakeFiles/cmTC_460a7.dir/build] - ignore line: [make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp'] - ignore line: [Building CXX object CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o] - ignore line: [/usr/bin/c++ -v -o CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/c++] - ignore line: [Target: x86_64-pc-linux-gnu] - ignore line: [Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c c++ ada fortran go lto objc obj-c++ d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc] - ignore line: [Thread model: posix] - ignore line: [gcc version 9.2.0 (GCC) ] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake-3.16/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpbase CMakeCXXCompilerABI.cpp -mtune=generic -march=x86-64 -auxbase-strip CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -version -o /tmp/ccWDzqJh.s] - ignore line: [GNU C++14 (GCC) version 9.2.0 (x86_64-pc-linux-gnu)] - ignore line: [ compiled by GNU C version 9.2.0 GMP version 6.1.2 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.21-GMP] - ignore line: [] - ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] - ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../x86_64-pc-linux-gnu/include"] - ignore line: [#include "..." search starts here:] - ignore line: [#include <...> search starts here:] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/x86_64-pc-linux-gnu] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../include/c++/9.2.0/backward] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include] - ignore line: [ /usr/local/include] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/include-fixed] - ignore line: [ /usr/include] - ignore line: [End of search list.] - ignore line: [GNU C++14 (GCC) version 9.2.0 (x86_64-pc-linux-gnu)] - ignore line: [ compiled by GNU C version 9.2.0 GMP version 6.1.2 MPFR version 4.0.2 MPC version 1.1.0 isl version isl-0.21-GMP] - ignore line: [] - ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] - ignore line: [Compiler executable checksum: e70628160ff7c7e477f7d9570e6637cb] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - ignore line: [ as -v --64 -o CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccWDzqJh.s] - ignore line: [GNU assembler version 2.33.1 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.33.1] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - ignore line: [Linking CXX executable cmTC_460a7] - ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_460a7.dir/link.txt --verbose=1] - ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_460a7 ] - ignore line: [Using built-in specs.] - ignore line: [COLLECT_GCC=/usr/bin/c++] - ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper] - ignore line: [Target: x86_64-pc-linux-gnu] - ignore line: [Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c c++ ada fortran go lto objc obj-c++ d --enable-shared --enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib --disable-werror --enable-checking=release --enable-default-pie --enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc] - ignore line: [Thread model: posix] - ignore line: [gcc version 9.2.0 (GCC) ] - ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/] - ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_460a7' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] - link line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/cc1ZlbaF.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_460a7 /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0 -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../.. CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o] - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/collect2] ==> ignore - arg [-plugin] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/liblto_plugin.so] ==> ignore - arg [-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper] ==> ignore - arg [-plugin-opt=-fresolution=/tmp/cc1ZlbaF.res] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc] ==> ignore - arg [-plugin-opt=-pass-through=-lc] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore - arg [-plugin-opt=-pass-through=-lgcc] ==> ignore - arg [--build-id] ==> ignore - arg [--eh-frame-hdr] ==> ignore - arg [--hash-style=gnu] ==> ignore - arg [-m] ==> ignore - arg [elf_x86_64] ==> ignore - arg [-dynamic-linker] ==> ignore - arg [/lib64/ld-linux-x86-64.so.2] ==> ignore - arg [-pie] ==> ignore - arg [-o] ==> ignore - arg [cmTC_460a7] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/Scrt1.o] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crti.o] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtbeginS.o] ==> ignore - arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0] - arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib] - arg [-L/lib/../lib] ==> dir [/lib/../lib] - arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] - arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../..] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../..] - arg [CMakeFiles/cmTC_460a7.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore - arg [-lstdc++] ==> lib [stdc++] - arg [-lm] ==> lib [m] - arg [-lgcc_s] ==> lib [gcc_s] - arg [-lgcc] ==> lib [gcc] - arg [-lc] ==> lib [c] - arg [-lgcc_s] ==> lib [gcc_s] - arg [-lgcc] ==> lib [gcc] - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/crtendS.o] ==> ignore - arg [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib/crtn.o] ==> ignore - collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0] - collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../../../lib] ==> [/usr/lib] - collapse library dir [/lib/../lib] ==> [/lib] - collapse library dir [/usr/lib/../lib] ==> [/usr/lib] - collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0/../../..] ==> [/usr/lib] - implicit libs: [stdc++;m;gcc_s;gcc;c;gcc_s;gcc] - implicit dirs: [/usr/lib/gcc/x86_64-pc-linux-gnu/9.2.0;/usr/lib;/lib] - implicit fwks: [] - - -Determining if the include file pthread.h exists passed with the following output: -Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_1437b/fast && /usr/bin/make -f CMakeFiles/cmTC_1437b.dir/build.make CMakeFiles/cmTC_1437b.dir/build -make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -Building C object CMakeFiles/cmTC_1437b.dir/CheckIncludeFile.c.o -/usr/bin/cc -o CMakeFiles/cmTC_1437b.dir/CheckIncludeFile.c.o -c /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp/CheckIncludeFile.c -Linking C executable cmTC_1437b -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_1437b.dir/link.txt --verbose=1 -/usr/bin/cc CMakeFiles/cmTC_1437b.dir/CheckIncludeFile.c.o -o cmTC_1437b -make[1]: Leaving directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' - - - -Determining if the function pthread_create exists in the pthread passed with the following output: -Change Dir: /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp - -Run Build Command(s):/usr/bin/make cmTC_67a51/fast && /usr/bin/make -f CMakeFiles/cmTC_67a51.dir/build.make CMakeFiles/cmTC_67a51.dir/build -make[1]: Entering directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' -Building C object CMakeFiles/cmTC_67a51.dir/CheckFunctionExists.c.o -/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTC_67a51.dir/CheckFunctionExists.c.o -c /usr/share/cmake-3.16/Modules/CheckFunctionExists.c -Linking C executable cmTC_67a51 -/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_67a51.dir/link.txt --verbose=1 -/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTC_67a51.dir/CheckFunctionExists.c.o -o cmTC_67a51 -lpthread -make[1]: Leaving directory '/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/CMakeTmp' - - - diff --git a/build/CMakeFiles/Makefile.cmake b/build/CMakeFiles/Makefile.cmake deleted file mode 100644 index a45e4b1..0000000 --- a/build/CMakeFiles/Makefile.cmake +++ /dev/null @@ -1,60 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.16 - -# The generator used is: -set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") - -# The top level Makefile was generated from the following files: -set(CMAKE_MAKEFILE_DEPENDS - "CMakeCache.txt" - "../CMakeLists.txt" - "CMakeFiles/3.16.2/CMakeCCompiler.cmake" - "CMakeFiles/3.16.2/CMakeCXXCompiler.cmake" - "CMakeFiles/3.16.2/CMakeSystem.cmake" - "/usr/lib64/cmake/SDL2/SDL2Config.cmake" - "/usr/lib64/cmake/SDL2/SDL2ConfigVersion.cmake" - "/usr/lib64/cmake/SDL2/SDL2Targets-noconfig.cmake" - "/usr/lib64/cmake/SDL2/SDL2Targets.cmake" - "/usr/share/cmake-3.16/Modules/CMakeCInformation.cmake" - "/usr/share/cmake-3.16/Modules/CMakeCXXInformation.cmake" - "/usr/share/cmake-3.16/Modules/CMakeCheckCompilerFlagCommonPatterns.cmake" - "/usr/share/cmake-3.16/Modules/CMakeCommonLanguageInclude.cmake" - "/usr/share/cmake-3.16/Modules/CMakeGenericSystem.cmake" - "/usr/share/cmake-3.16/Modules/CMakeInitializeConfigs.cmake" - "/usr/share/cmake-3.16/Modules/CMakeLanguageInformation.cmake" - "/usr/share/cmake-3.16/Modules/CMakeSystemSpecificInformation.cmake" - "/usr/share/cmake-3.16/Modules/CMakeSystemSpecificInitialize.cmake" - "/usr/share/cmake-3.16/Modules/CheckCSourceCompiles.cmake" - "/usr/share/cmake-3.16/Modules/CheckIncludeFile.cmake" - "/usr/share/cmake-3.16/Modules/CheckLibraryExists.cmake" - "/usr/share/cmake-3.16/Modules/Compiler/CMakeCommonCompilerMacros.cmake" - "/usr/share/cmake-3.16/Modules/Compiler/GNU-C.cmake" - "/usr/share/cmake-3.16/Modules/Compiler/GNU-CXX.cmake" - "/usr/share/cmake-3.16/Modules/Compiler/GNU.cmake" - "/usr/share/cmake-3.16/Modules/FindOpenGL.cmake" - "/usr/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake" - "/usr/share/cmake-3.16/Modules/FindPackageMessage.cmake" - "/usr/share/cmake-3.16/Modules/FindThreads.cmake" - "/usr/share/cmake-3.16/Modules/Internal/CMakeCheckCompilerFlag.cmake" - "/usr/share/cmake-3.16/Modules/Platform/Linux-GNU-C.cmake" - "/usr/share/cmake-3.16/Modules/Platform/Linux-GNU-CXX.cmake" - "/usr/share/cmake-3.16/Modules/Platform/Linux-GNU.cmake" - "/usr/share/cmake-3.16/Modules/Platform/Linux.cmake" - "/usr/share/cmake-3.16/Modules/Platform/UnixPaths.cmake" - ) - -# The corresponding makefile is: -set(CMAKE_MAKEFILE_OUTPUTS - "Makefile" - "CMakeFiles/cmake.check_cache" - ) - -# Byproducts of CMake generate step: -set(CMAKE_MAKEFILE_PRODUCTS - "CMakeFiles/CMakeDirectoryInformation.cmake" - ) - -# Dependency information for all targets: -set(CMAKE_DEPEND_INFO_FILES - "CMakeFiles/output.dir/DependInfo.cmake" - ) diff --git a/build/CMakeFiles/Makefile2 b/build/CMakeFiles/Makefile2 deleted file mode 100644 index 67af6a1..0000000 --- a/build/CMakeFiles/Makefile2 +++ /dev/null @@ -1,106 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.16 - -# Default target executed when no arguments are given to make. -default_target: all - -.PHONY : default_target - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/bin/cmake - -# The command to remove a file. -RM = /usr/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/ben/mnt/Projects-linux/2d-gi - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/ben/mnt/Projects-linux/2d-gi/build - -#============================================================================= -# Directory level rules for the build root directory - -# The main recursive "all" target. -all: CMakeFiles/output.dir/all - -.PHONY : all - -# The main recursive "preinstall" target. -preinstall: - -.PHONY : preinstall - -# The main recursive "clean" target. -clean: CMakeFiles/output.dir/clean - -.PHONY : clean - -#============================================================================= -# Target rules for target CMakeFiles/output.dir - -# All Build rule for target. -CMakeFiles/output.dir/all: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/depend - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/build - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles --progress-num=1,2,3 "Built target output" -.PHONY : CMakeFiles/output.dir/all - -# Build rule for subdir invocation for target. -CMakeFiles/output.dir/rule: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles 3 - $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/output.dir/all - $(CMAKE_COMMAND) -E cmake_progress_start /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles 0 -.PHONY : CMakeFiles/output.dir/rule - -# Convenience name for target. -output: CMakeFiles/output.dir/rule - -.PHONY : output - -# clean rule for target. -CMakeFiles/output.dir/clean: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/clean -.PHONY : CMakeFiles/output.dir/clean - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/build/CMakeFiles/TargetDirectories.txt b/build/CMakeFiles/TargetDirectories.txt deleted file mode 100644 index 3b83836..0000000 --- a/build/CMakeFiles/TargetDirectories.txt +++ /dev/null @@ -1,3 +0,0 @@ -/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/rebuild_cache.dir -/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/output.dir -/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/edit_cache.dir diff --git a/build/CMakeFiles/cmake.check_cache b/build/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd73..0000000 --- a/build/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/build/CMakeFiles/output.dir/CXX.includecache b/build/CMakeFiles/output.dir/CXX.includecache deleted file mode 100644 index 397edbc..0000000 --- a/build/CMakeFiles/output.dir/CXX.includecache +++ /dev/null @@ -1,22 +0,0 @@ -#IncludeRegexLine: ^[ ]*[#%][ ]*(include|import)[ ]*[<"]([^">]+)([">]) - -#IncludeRegexScan: ^.*$ - -#IncludeRegexComplain: ^$ - -#IncludeRegexTransform: - -../include/glad/glad.hpp -windows.h -- -KHR/khrplatform.h -- - -/home/ben/mnt/Projects-linux/2d-gi/src/main.cpp -iostream -- -SDL2/SDL.h -- -glad/glad.hpp -- - diff --git a/build/CMakeFiles/output.dir/DependInfo.cmake b/build/CMakeFiles/output.dir/DependInfo.cmake deleted file mode 100644 index 9ce95db..0000000 --- a/build/CMakeFiles/output.dir/DependInfo.cmake +++ /dev/null @@ -1,28 +0,0 @@ -# The set of languages for which implicit dependencies are needed: -set(CMAKE_DEPENDS_LANGUAGES - "CXX" - ) -# The set of files for implicit dependencies of each language: -set(CMAKE_DEPENDS_CHECK_CXX - "/home/ben/mnt/Projects-linux/2d-gi/src/main.cpp" "/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/output.dir/src/main.cpp.o" - "/home/ben/mnt/Projects-linux/2d-gi/src/thirdparty/glad.cpp" "/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/output.dir/src/thirdparty/glad.cpp.o" - ) -set(CMAKE_CXX_COMPILER_ID "GNU") - -# Preprocessor definitions for this target. -set(CMAKE_TARGET_DEFINITIONS_CXX - "RESOURCES=\"/home/ben/mnt/Projects-linux/2d-gi/resources/\"" - ) - -# The include file search paths: -set(CMAKE_CXX_TARGET_INCLUDE_PATH - "../output" - ".././include" - ) - -# Targets to which this target links. -set(CMAKE_TARGET_LINKED_INFO_FILES - ) - -# Fortran module output directory. -set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/build/CMakeFiles/output.dir/build.make b/build/CMakeFiles/output.dir/build.make deleted file mode 100644 index b1f5446..0000000 --- a/build/CMakeFiles/output.dir/build.make +++ /dev/null @@ -1,115 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.16 - -# Delete rule output on recipe failure. -.DELETE_ON_ERROR: - - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/bin/cmake - -# The command to remove a file. -RM = /usr/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/ben/mnt/Projects-linux/2d-gi - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/ben/mnt/Projects-linux/2d-gi/build - -# Include any dependencies generated for this target. -include CMakeFiles/output.dir/depend.make - -# Include the progress variables for this target. -include CMakeFiles/output.dir/progress.make - -# Include the compile flags for this target's objects. -include CMakeFiles/output.dir/flags.make - -CMakeFiles/output.dir/src/main.cpp.o: CMakeFiles/output.dir/flags.make -CMakeFiles/output.dir/src/main.cpp.o: ../src/main.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/output.dir/src/main.cpp.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/output.dir/src/main.cpp.o -c /home/ben/mnt/Projects-linux/2d-gi/src/main.cpp - -CMakeFiles/output.dir/src/main.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/output.dir/src/main.cpp.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ben/mnt/Projects-linux/2d-gi/src/main.cpp > CMakeFiles/output.dir/src/main.cpp.i - -CMakeFiles/output.dir/src/main.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/output.dir/src/main.cpp.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ben/mnt/Projects-linux/2d-gi/src/main.cpp -o CMakeFiles/output.dir/src/main.cpp.s - -CMakeFiles/output.dir/src/thirdparty/glad.cpp.o: CMakeFiles/output.dir/flags.make -CMakeFiles/output.dir/src/thirdparty/glad.cpp.o: ../src/thirdparty/glad.cpp - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object CMakeFiles/output.dir/src/thirdparty/glad.cpp.o" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/output.dir/src/thirdparty/glad.cpp.o -c /home/ben/mnt/Projects-linux/2d-gi/src/thirdparty/glad.cpp - -CMakeFiles/output.dir/src/thirdparty/glad.cpp.i: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/output.dir/src/thirdparty/glad.cpp.i" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/ben/mnt/Projects-linux/2d-gi/src/thirdparty/glad.cpp > CMakeFiles/output.dir/src/thirdparty/glad.cpp.i - -CMakeFiles/output.dir/src/thirdparty/glad.cpp.s: cmake_force - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/output.dir/src/thirdparty/glad.cpp.s" - /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/ben/mnt/Projects-linux/2d-gi/src/thirdparty/glad.cpp -o CMakeFiles/output.dir/src/thirdparty/glad.cpp.s - -# Object files for target output -output_OBJECTS = \ -"CMakeFiles/output.dir/src/main.cpp.o" \ -"CMakeFiles/output.dir/src/thirdparty/glad.cpp.o" - -# External object files for target output -output_EXTERNAL_OBJECTS = - -output: CMakeFiles/output.dir/src/main.cpp.o -output: CMakeFiles/output.dir/src/thirdparty/glad.cpp.o -output: CMakeFiles/output.dir/build.make -output: /usr/lib/libOpenGL.so -output: /usr/lib/libGL.so -output: CMakeFiles/output.dir/link.txt - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Linking CXX executable output" - $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/output.dir/link.txt --verbose=$(VERBOSE) - -# Rule to build all files generated by this target. -CMakeFiles/output.dir/build: output - -.PHONY : CMakeFiles/output.dir/build - -CMakeFiles/output.dir/clean: - $(CMAKE_COMMAND) -P CMakeFiles/output.dir/cmake_clean.cmake -.PHONY : CMakeFiles/output.dir/clean - -CMakeFiles/output.dir/depend: - cd /home/ben/mnt/Projects-linux/2d-gi/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/ben/mnt/Projects-linux/2d-gi /home/ben/mnt/Projects-linux/2d-gi /home/ben/mnt/Projects-linux/2d-gi/build /home/ben/mnt/Projects-linux/2d-gi/build /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/output.dir/DependInfo.cmake --color=$(COLOR) -.PHONY : CMakeFiles/output.dir/depend - diff --git a/build/CMakeFiles/output.dir/cmake_clean.cmake b/build/CMakeFiles/output.dir/cmake_clean.cmake deleted file mode 100644 index baf5caf..0000000 --- a/build/CMakeFiles/output.dir/cmake_clean.cmake +++ /dev/null @@ -1,11 +0,0 @@ -file(REMOVE_RECURSE - "CMakeFiles/output.dir/src/main.cpp.o" - "CMakeFiles/output.dir/src/thirdparty/glad.cpp.o" - "output" - "output.pdb" -) - -# Per-language clean rules from dependency scanning. -foreach(lang CXX) - include(CMakeFiles/output.dir/cmake_clean_${lang}.cmake OPTIONAL) -endforeach() diff --git a/build/CMakeFiles/output.dir/depend.internal b/build/CMakeFiles/output.dir/depend.internal deleted file mode 100644 index 06b102f..0000000 --- a/build/CMakeFiles/output.dir/depend.internal +++ /dev/null @@ -1,9 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.16 - -CMakeFiles/output.dir/src/main.cpp.o - ../include/glad/glad.hpp - /home/ben/mnt/Projects-linux/2d-gi/src/main.cpp -CMakeFiles/output.dir/src/thirdparty/glad.cpp.o - ../include/glad/glad.hpp - /home/ben/mnt/Projects-linux/2d-gi/src/thirdparty/glad.cpp diff --git a/build/CMakeFiles/output.dir/depend.make b/build/CMakeFiles/output.dir/depend.make deleted file mode 100644 index 5d43e99..0000000 --- a/build/CMakeFiles/output.dir/depend.make +++ /dev/null @@ -1,9 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.16 - -CMakeFiles/output.dir/src/main.cpp.o: ../include/glad/glad.hpp -CMakeFiles/output.dir/src/main.cpp.o: ../src/main.cpp - -CMakeFiles/output.dir/src/thirdparty/glad.cpp.o: ../include/glad/glad.hpp -CMakeFiles/output.dir/src/thirdparty/glad.cpp.o: ../src/thirdparty/glad.cpp - diff --git a/build/CMakeFiles/output.dir/flags.make b/build/CMakeFiles/output.dir/flags.make deleted file mode 100644 index 7c3d3db..0000000 --- a/build/CMakeFiles/output.dir/flags.make +++ /dev/null @@ -1,10 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.16 - -# compile CXX with /usr/bin/c++ -CXX_FLAGS = -g -std=c++17 - -CXX_DEFINES = -DRESOURCES=\"/home/ben/mnt/Projects-linux/2d-gi/resources/\" - -CXX_INCLUDES = -I/home/ben/mnt/Projects-linux/2d-gi/output -I/home/ben/mnt/Projects-linux/2d-gi/./include - diff --git a/build/CMakeFiles/output.dir/link.txt b/build/CMakeFiles/output.dir/link.txt deleted file mode 100644 index 9afc0b7..0000000 --- a/build/CMakeFiles/output.dir/link.txt +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/c++ -g CMakeFiles/output.dir/src/main.cpp.o CMakeFiles/output.dir/src/thirdparty/glad.cpp.o -o output -lSDL2 /usr/lib/libOpenGL.so /usr/lib/libGL.so -ldl -lpthread diff --git a/build/CMakeFiles/output.dir/progress.make b/build/CMakeFiles/output.dir/progress.make deleted file mode 100644 index 6a9dc74..0000000 --- a/build/CMakeFiles/output.dir/progress.make +++ /dev/null @@ -1,4 +0,0 @@ -CMAKE_PROGRESS_1 = 1 -CMAKE_PROGRESS_2 = 2 -CMAKE_PROGRESS_3 = 3 - diff --git a/build/CMakeFiles/output.dir/src/main.cpp.o b/build/CMakeFiles/output.dir/src/main.cpp.o deleted file mode 100644 index 364d29caa3964a209a17d6ee996c95335a964b01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180760 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 z z3D3a(-br|PzDytCPtNx7bA|6mJ)bVTE7CV#_-ROIcuzt|=aEx<{N>``bDrmq3$Kj! zA-vxp#957cwMG1srujI#gg2b*`4_^&_w&Ph2}1lDZM^@F_}An3qCDDz;5X{%{p!Lm z>FoJM!aJVtd3X;%h!dVCQXu~5v%P9e@MF-vUoCtrj$3aLz6kr*CgG#% z`uJOgZ|mUsUg0mJo%u<43)F{G(I1BG>W1~!6aMQsA3sI-@7S)P!q1rE{kg(hV0?a~ z@Q)L{zghTuO+DWsd=!qOeiz=Rg7=R_{~5OH%(k946n+Tpcx&O|`w3aXXP};3CcFmr z>wAT-XyMoUnDEP!uwBAmL%xOQRfqI<>F51_#b24>`3cqW+x@cf^9;0aHH42sJqgc~ z4)K3Q|J6hMlP~vi2ME6$`J5rV4#p>wgkOPj3eRZ{>z!HTlRdAG{xhU!1L7wM zzqOY4hX~Id?0L5E{ut-nApCX2ze{*|q%XYhIHczow4bkuzpe1%_yM$gKML=M{kJO0EyVu<@xyy>1J6gh(N+8nIDY9T{6Wl57v37`j3-PB5pWod3^M%*JejVPI8q&G0t@k&Je+cn+2+zWKypM(N zpXB3&=l_NH*WoxKyl*t{1*zVzbGrW>_u1*%dZIq7_ zo?{o*yM2b|H;JE$ap`ly|3myYgqOv5_yghLJoQ(?!}q?bpkEE?DLT%lr?&9dhj`vl z_*bZ};r*B)&ilQ*-&OoRh|^Daev0=e3vZ78{Yv56Q7$(LKV^=OvsCyV)RRYqKY{*b zz3?m0uZ8D|h3)!vmXE(v{L?S;JRD~S|1HG-LHrRDydRzu7W{p4JTF_@{|>x0^7&-p zdk{aor!x3qe{LjxhcZ5H8{vf*w+s@VG{F1e{gNSmQ8Ul;#Si`EY~feoe9N`M)7$wt zcL<+@_V5AWjg!5xxMG% zeU2f{f3rO=62BMrqq)Kt;<)cd;YY9VaqbrWS+?g73twH&^QVQMHP!Ro!mDO^{9kz9{4=8SM7!0d6D;%g@^YZhU@Ji&ee0gKVAIK zGd!O!yfgO4#lk-v=KbZumre2fap5PRzkXKu(hlAa&rb^J4Bu1OCH~9UkHY&6gMYAv zkMpzm2fKLwkMNmwJTIT)K72oK-ydqDUdGZP}yTH%K=&Ur!jN*t$e z7d{o`v0HcormuyceT-jlQ1}mnJwGaZ6Z(rvDCbbVXs!~%^M?XIh~wdN#cwdt$8RD0 zA?(i`g;(q0{ocY)yV&!5;agFEW((hkcHmm!tr7nY;V%~X_|FQz4ja5hc=_?(-zB^& z;(sChTC|g8(e8$PTQSnd3D4IF{M}iepDF%C#BU_L|ApS~BmBJ4o(~sZ8TEFY@H$BM zWZ`ci|F0Cj3Hfl7@O+H>mkJN{;1S^kI6tsncwwGT|0}}3!}-UZ!UrM!p9;SL4*@P4{bF6&SqPDXhK{u%QBOyRZ5`}8*w{%9}H+X(*->F6eWKl+RQ!fQ6 z&$mdNipYoX{d9Q;uVMUiqwvpBZ|@eq8};X5;fdKkJx>b{-%EK}cxAMQZwr5Ow2u?sj~4Q+DdK-G z{y?!719^&^C zeix1_M+$!l?ehfTJ#c(CO?bVre!W)6A) zAD`p-d%_Q*-1iC}j`%+bZ`#Sn`CIr}^zY@c--P^sd8qfR34apt>j)3gfr%9FD+0Mf~R_e#=XJdbSC_5B>Xx!jHxHe4p_C<9(c8g}24{`9I-5pq;6R zb}OW_e<&~EzoXu^6aEqAdkTO5bf2Dq!ozbPMhm~MocHsDzlH6(MR+>e?PbDe<9zih z;U6G=ct2Oz-u7tE_lW-s&MST|e193A&Od}_qdzKho?jl~Zpd0*Al%yQuwU$o=*_o>sZgH34apny;}G`7~kF^{3gU- zCVX2LAAgnb@fa69BYX$isXf96H}rABa~DE>mPLE@hxpAft|)`g1%C#P@2UvTp6lb+ z7G53aA;bHpLY&Ts-&*_wnC~k59n`CS!hdb!*E>>p(iqPt2oL?oG~u_PKMn7bI>CM1 znuKs(_!jZ6L_fYv_;EPQ_K5%h4;gCgr9`h?e6{R zjr{Ku+%Ma%o#D7ZctzC1Uc&#I=s!PL_y+VBS;7lZ|1T5%ZhIf+a^Y7Ocz&JmwHPNa z5q>4&uN1yH-^Y1Ucwe-KFACq*+56uLuhYZxL&9G_-t*dx{qK;U^OOC2L*e1R8IZ#%>}75Vd)_=8cOKM{UPPao$y;osuC@$bTKPV)Y-$d9nzHph8hS$ICq|C}NG z{D$5?Px#WyJrD2q3GsK-^}LJtxoMuK3jYts^_L1Ch4z2E@N$>Ce_EkQ}`eCJbzI5^_4w;O87do zOPhtaN561TczBL+cwa`y&k<<%D&aaq;8Vu<_0|&pHR@IP{!Q@H(Jr+R|K?#nPDkP4 z{77%%f1#ZmCVWR(A7`xaoj5)U*VRLMibi>VuK2xie)|#O;W<<5g_oP+<9sH36^>_r z6rO^5SQXn5((@+z!SLRPz&}Pi(_j4F?fiPvg%3a3^P7bao#y$y!bi67{4wE&Fz(tY z{GXxTe@%GZ4xYa&e4=fLo5Fh#!gjrlHmte_bFv8Qa@V z_||iLoSwoTL!5!a!*dTu3x6!%$H^0Z%_Prf3Ez$MEEHZJ`{C`v+hH6K?jsKQ@HG05 z*Tp{_``vrOPeXfnMEH%UR~0b62=TwdessR@N(23NT`2r%9Iu7v@P{~~`+0wW_^YOS zo+120j2|WmABp4NnZi%4=f3|K*zn+jk;rpCTgoo!aw-RYn#k$FDuAmIlGdY&nKCB`%P!nebpEj+xR z_gdlaW1Mq`@Ld)Cdc*VN!}eB1JGfT-E*E+K1>wl%gzds_Z|MEq!WV*nEqq-~?;jK% z&fA9P!-sTk#Bp(@R{nE=ACu+hYYBh5$n$fBuf5Xq7Q#p2_^YGv&G35*e-qbbh6(?; zu8%)fcvhk3MZ*7vKUa7k+dwznD7;;Y=XVRg4dob~-yZU3B>bnvUs=`1d0F_V<2?UC z_{n2EKP-F}+K01S`{iN1dFTh539o>0%P`>;5jQ;NJj8hqyh!}-d-(Ou75*`<<2*0? zN*q6K6MhE9OBLJ1r~leaKVMV$3n-Vq!W*Jp9U(ju?f*T(FG}0MadL#ei1Q&+gttX|9-g-x;$XK(cu@QsYWnz32_J&? zWV7(_J)a%I!*g^$7QQ^u$NyIN2&Dgz@OC4-U*|&qJEXs9uAjd^_(AyXguge^`#pt+ z=jTokURcHZ(}W+3{{3p<_n+egqyoL!Mih4U%_*K~6CxxGY?G5cgNY5IyKb5f`2Yw;OX=eyO2K8pN z@WuoEcI62V-zS_U{AKhz3x)SVJ9fM973i0r5&ksR`?~OXC;9YLy4e2?+jSkr54D7! zg#CJ$@YXmE8Y_I=$v*B1;Z4hXzDBq`+cz@dxGkh7t*gf;3jYV|O%whu>S6ePVTe;< zvX2w)dkwr&N6#OTIK9sG{2k#lk)NLlA2!?jKML=Qdh)06^0T~udPn~|r01A({Cor9 z;r&T1g+HC@{m#O7p&#rkye8t05IzwNR*vvB0}>+B6yXnIexC3 t)*+EEFS=^o*2 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 A;{X5v diff --git a/build/CMakeFiles/progress.marks b/build/CMakeFiles/progress.marks deleted file mode 100644 index 00750ed..0000000 --- a/build/CMakeFiles/progress.marks +++ /dev/null @@ -1 +0,0 @@ -3 diff --git a/build/Makefile b/build/Makefile deleted file mode 100644 index e1842a4..0000000 --- a/build/Makefile +++ /dev/null @@ -1,208 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.16 - -# Default target executed when no arguments are given to make. -default_target: all - -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - - -# Remove some rules from gmake that .SUFFIXES does not remove. -SUFFIXES = - -.SUFFIXES: .hpux_make_needs_suffix_list - - -# Suppress display of executed commands. -$(VERBOSE).SILENT: - - -# A target that is always out of date. -cmake_force: - -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/bin/cmake - -# The command to remove a file. -RM = /usr/bin/cmake -E remove -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/ben/mnt/Projects-linux/2d-gi - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/ben/mnt/Projects-linux/2d-gi/build - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." - /usr/bin/cmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache - -.PHONY : rebuild_cache/fast - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..." - /usr/bin/ccmake -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache - -.PHONY : edit_cache/fast - -# The main all target -all: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles/progress.marks - $(MAKE) -f CMakeFiles/Makefile2 all - $(CMAKE_COMMAND) -E cmake_progress_start /home/ben/mnt/Projects-linux/2d-gi/build/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - $(MAKE) -f CMakeFiles/Makefile2 clean -.PHONY : clean - -# The main clean target -clean/fast: clean - -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - $(MAKE) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - $(MAKE) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -#============================================================================= -# Target rules for targets named output - -# Build rule for target. -output: cmake_check_build_system - $(MAKE) -f CMakeFiles/Makefile2 output -.PHONY : output - -# fast build rule for target. -output/fast: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/build -.PHONY : output/fast - -src/main.o: src/main.cpp.o - -.PHONY : src/main.o - -# target to build an object file -src/main.cpp.o: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/src/main.cpp.o -.PHONY : src/main.cpp.o - -src/main.i: src/main.cpp.i - -.PHONY : src/main.i - -# target to preprocess a source file -src/main.cpp.i: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/src/main.cpp.i -.PHONY : src/main.cpp.i - -src/main.s: src/main.cpp.s - -.PHONY : src/main.s - -# target to generate assembly for a file -src/main.cpp.s: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/src/main.cpp.s -.PHONY : src/main.cpp.s - -src/thirdparty/glad.o: src/thirdparty/glad.cpp.o - -.PHONY : src/thirdparty/glad.o - -# target to build an object file -src/thirdparty/glad.cpp.o: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/src/thirdparty/glad.cpp.o -.PHONY : src/thirdparty/glad.cpp.o - -src/thirdparty/glad.i: src/thirdparty/glad.cpp.i - -.PHONY : src/thirdparty/glad.i - -# target to preprocess a source file -src/thirdparty/glad.cpp.i: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/src/thirdparty/glad.cpp.i -.PHONY : src/thirdparty/glad.cpp.i - -src/thirdparty/glad.s: src/thirdparty/glad.cpp.s - -.PHONY : src/thirdparty/glad.s - -# target to generate assembly for a file -src/thirdparty/glad.cpp.s: - $(MAKE) -f CMakeFiles/output.dir/build.make CMakeFiles/output.dir/src/thirdparty/glad.cpp.s -.PHONY : src/thirdparty/glad.cpp.s - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... rebuild_cache" - @echo "... output" - @echo "... edit_cache" - @echo "... src/main.o" - @echo "... src/main.i" - @echo "... src/main.s" - @echo "... src/thirdparty/glad.o" - @echo "... src/thirdparty/glad.i" - @echo "... src/thirdparty/glad.s" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/build/cmake_install.cmake b/build/cmake_install.cmake deleted file mode 100644 index e4eb62c..0000000 --- a/build/cmake_install.cmake +++ /dev/null @@ -1,49 +0,0 @@ -# Install script for directory: /home/ben/mnt/Projects-linux/2d-gi - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/usr/local") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "Debug") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Install shared libraries without execute permission? -if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) - set(CMAKE_INSTALL_SO_NO_EXE "0") -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - -if(CMAKE_INSTALL_COMPONENT) - set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") -else() - set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") -endif() - -string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT - "${CMAKE_INSTALL_MANIFEST_FILES}") -file(WRITE "/home/ben/mnt/Projects-linux/2d-gi/build/${CMAKE_INSTALL_MANIFEST}" - "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/build/output b/build/output deleted file mode 100644 index 93443eac34b7f4af7a05acc559fae4e7af695679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315592 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 diff --git a/resources/2d.frag b/resources/2d.frag index 2b857a0..1664bd5 100644 --- a/resources/2d.frag +++ b/resources/2d.frag @@ -9,5 +9,5 @@ uniform sampler2D iTexture; void main() { FragColour = texture(iTexture, fTextCoord); - // FragColour = vec4( 1.0, .0, .0, 1.0); // texture(iTexture, fTextCoord); + // FragColour = vec4( 1.0, .0, .0, 1.0 ); } diff --git a/src/framebuffer.cpp b/src/framebuffer.cpp index 644d1b0..e3cf523 100644 --- a/src/framebuffer.cpp +++ b/src/framebuffer.cpp @@ -26,7 +26,7 @@ void FrameBuffer::SetPixel( int x, int y, glm::vec3 p ) uint8_t r = (uint8_t)( pow( p.r, gamma ) * 255.0f ); uint8_t g = (uint8_t)( pow( p.g, gamma ) * 255.0f ); uint8_t b = (uint8_t)( pow( p.b, gamma ) * 255.0f ); - uint32_t col = 0xFF000000 | r << 16 | g << 8 | b; + uint32_t col = r << 24 | g << 16 | b << 8 | 0xFF; Data[i] = col; } diff --git a/src/main.cpp b/src/main.cpp index 890625b..2be6dfc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,14 +21,13 @@ struct Game SDL_GLContext GlContext = nullptr; }; -void GLAPIENTRY -MessageCallback( GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam ) +void GLAPIENTRY MessageCallback( GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam ) { std::cout << "GL CALLBACK: type = " << type << ", severity = " << severity @@ -74,8 +73,9 @@ int main() // Time to actually load OpenGL gladLoadGLLoader( SDL_GL_GetProcAddress ); - glEnable( GL_DEBUG_OUTPUT ); - glDebugMessageCallback( MessageCallback, 0 ); + // Doesnt work + //glEnable( GL_DEBUG_OUTPUT ); + //glDebugMessageCallback( MessageCallback, 0 ); Renderer renderer; renderer.LoadShader(); @@ -86,6 +86,16 @@ int main() framebuffer.SetPixel( 3, 1, { 1.0, 0.0, 0.0 } ); framebuffer.SetPixel( 4, 1, { 1.0, 0.0, 0.0 } ); framebuffer.SetPixel( 5, 1, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 1, 2, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 2, 2, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 3, 2, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 4, 2, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 5, 3, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 1, 3, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 2, 3, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 3, 3, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 4, 3, { 1.0, 0.0, 0.0 } ); + framebuffer.SetPixel( 5, 3, { 1.0, 0.0, 0.0 } ); renderer.RegisterBuffer( &framebuffer, 0 ); diff --git a/src/renderer.cpp b/src/renderer.cpp index 1dd2a2a..2fde98e 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -105,15 +105,16 @@ int8_t Renderer::RegisterBuffer( FrameBuffer* buffer, int layer ) // Load buffer as a texture into OpenGL GLuint texture; glGenTextures( 1, &texture ); + glBindTexture( GL_TEXTURE_2D, texture ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, buffer->GetWidth(), buffer->GetHeight(), 0, GL_RGB, GL_RGBA32UI, buffer->Data ); + // Colour stored as uint32_t so 0xRRGGBBAA except no A + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, buffer->GetWidth(), buffer->GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer->Data ); - FrameBufferRenderable fb = { buffer, @@ -160,7 +161,7 @@ void Renderer::UpdateBuffer( int8_t id ) return; FrameBuffer* buffer = mRenderQueue[id].Buffer; - glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, buffer->GetWidth(), buffer->GetHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, buffer->Data ); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, buffer->GetWidth(), buffer->GetHeight(), 0, GL_RGBA, GL_RGBA32UI, buffer->Data ); } void Renderer::Render() @@ -171,8 +172,8 @@ void Renderer::Render() for ( size_t i = 0; i < mRenderQueue.size(); i++ ) { FrameBufferRenderable* fb = &mRenderQueue[i]; - glBindTexture( GL_TEXTURE_2D, fb->TextureID ); glBindVertexArray( fb->VAO ); + glBindTexture( GL_TEXTURE_2D, fb->TextureID ); glDrawElements( GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0 ); } } diff --git a/src/thirdparty/stb_image.h b/src/thirdparty/stb_image.h new file mode 100644 index 0000000..d4194d1 --- /dev/null +++ b/src/thirdparty/stb_image.h @@ -0,0 +1,7666 @@ +/* stb_image - v2.23 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan + Dave Moore Roy Eltham Hayaki Saito Nathan Reed + Won Chun Luke Graham Johan Duparc Nick Verigakis + the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar + Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex + Ryamond Barbiero Paul Du Bois Engin Manap github:grim210 + Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw + Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus + Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo + Christian Floisand Kevin Schmidt JR Smith github:darealshinji + Blazej Dariusz Roszkowski github:Michaelangel007 +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data) +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// By default we convert iphone-formatted PNGs back to RGB, even though +// they are internally encoded differently. You can disable this conversion +// by calling stbi_convert_iphone_png_to_rgb(0), in which case +// you will always just get the native iphone "format" through (which +// is BGR stored in RGB). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// + + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#endif + + ////////////////////////////////////////////////////////////////////////////// + // + // PRIMARY API - works on images of any type + // + + // + // load image by filename, open file, or memory buffer + // + + typedef struct + { + int ( *read ) ( void* user, char* data, int size ); // fill 'data' with 'size' bytes. return number of bytes actually read + void ( *skip ) ( void* user, int n ); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + int ( *eof ) ( void* user ); // returns nonzero if we are at end of file/data + } stbi_io_callbacks; + + //////////////////////////////////// + // + // 8-bits-per-channel interface + // + + STBIDEF stbi_uc* stbi_load_from_memory( stbi_uc const* buffer, int len, int* x, int* y, int* channels_in_file, int desired_channels ); + STBIDEF stbi_uc* stbi_load_from_callbacks( stbi_io_callbacks const* clbk, void* user, int* x, int* y, int* channels_in_file, int desired_channels ); + +#ifndef STBI_NO_STDIO + STBIDEF stbi_uc* stbi_load( char const* filename, int* x, int* y, int* channels_in_file, int desired_channels ); + STBIDEF stbi_uc* stbi_load_from_file( FILE* f, int* x, int* y, int* channels_in_file, int desired_channels ); + // for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF + STBIDEF stbi_uc* stbi_load_gif_from_memory( stbi_uc const* buffer, int len, int** delays, int* x, int* y, int* z, int* comp, int req_comp ); +#endif + +#ifdef STBI_WINDOWS_UTF8 + STBIDEF int stbi_convert_wchar_to_utf8( char* buffer, size_t bufferlen, const wchar_t* input ); +#endif + + //////////////////////////////////// + // + // 16-bits-per-channel interface + // + + STBIDEF stbi_us* stbi_load_16_from_memory( stbi_uc const* buffer, int len, int* x, int* y, int* channels_in_file, int desired_channels ); + STBIDEF stbi_us* stbi_load_16_from_callbacks( stbi_io_callbacks const* clbk, void* user, int* x, int* y, int* channels_in_file, int desired_channels ); + +#ifndef STBI_NO_STDIO + STBIDEF stbi_us* stbi_load_16( char const* filename, int* x, int* y, int* channels_in_file, int desired_channels ); + STBIDEF stbi_us* stbi_load_from_file_16( FILE* f, int* x, int* y, int* channels_in_file, int desired_channels ); +#endif + + //////////////////////////////////// + // + // float-per-channel interface + // +#ifndef STBI_NO_LINEAR + STBIDEF float* stbi_loadf_from_memory( stbi_uc const* buffer, int len, int* x, int* y, int* channels_in_file, int desired_channels ); + STBIDEF float* stbi_loadf_from_callbacks( stbi_io_callbacks const* clbk, void* user, int* x, int* y, int* channels_in_file, int desired_channels ); + +#ifndef STBI_NO_STDIO + STBIDEF float* stbi_loadf( char const* filename, int* x, int* y, int* channels_in_file, int desired_channels ); + STBIDEF float* stbi_loadf_from_file( FILE* f, int* x, int* y, int* channels_in_file, int desired_channels ); +#endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma( float gamma ); + STBIDEF void stbi_hdr_to_ldr_scale( float scale ); +#endif // STBI_NO_HDR + +#ifndef STBI_NO_LINEAR + STBIDEF void stbi_ldr_to_hdr_gamma( float gamma ); + STBIDEF void stbi_ldr_to_hdr_scale( float scale ); +#endif // STBI_NO_LINEAR + + // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR + STBIDEF int stbi_is_hdr_from_callbacks( stbi_io_callbacks const* clbk, void* user ); + STBIDEF int stbi_is_hdr_from_memory( stbi_uc const* buffer, int len ); +#ifndef STBI_NO_STDIO + STBIDEF int stbi_is_hdr( char const* filename ); + STBIDEF int stbi_is_hdr_from_file( FILE* f ); +#endif // STBI_NO_STDIO + + + // get a VERY brief reason for failure + // NOT THREADSAFE + STBIDEF const char* stbi_failure_reason( void ); + + // free the loaded image -- this is just free() + STBIDEF void stbi_image_free( void* retval_from_stbi_load ); + + // get image dimensions & components without fully decoding + STBIDEF int stbi_info_from_memory( stbi_uc const* buffer, int len, int* x, int* y, int* comp ); + STBIDEF int stbi_info_from_callbacks( stbi_io_callbacks const* clbk, void* user, int* x, int* y, int* comp ); + STBIDEF int stbi_is_16_bit_from_memory( stbi_uc const* buffer, int len ); + STBIDEF int stbi_is_16_bit_from_callbacks( stbi_io_callbacks const* clbk, void* user ); + +#ifndef STBI_NO_STDIO + STBIDEF int stbi_info( char const* filename, int* x, int* y, int* comp ); + STBIDEF int stbi_info_from_file( FILE* f, int* x, int* y, int* comp ); + STBIDEF int stbi_is_16_bit( char const* filename ); + STBIDEF int stbi_is_16_bit_from_file( FILE* f ); +#endif + + + + // for image formats that explicitly notate that they have premultiplied alpha, + // we just return the colors as stored in the file. set this flag to force + // unpremultiplication. results are undefined if the unpremultiply overflow. + STBIDEF void stbi_set_unpremultiply_on_load( int flag_true_if_should_unpremultiply ); + + // indicate whether we should process iphone images back to canonical format, + // or just pass them through "as-is" + STBIDEF void stbi_convert_iphone_png_to_rgb( int flag_true_if_should_convert ); + + // flip the image vertically, so the first pixel in the output array is the bottom left + STBIDEF void stbi_set_flip_vertically_on_load( int flag_true_if_should_flip ); + + // ZLIB client - used by PNG, available for other purposes + + STBIDEF char* stbi_zlib_decode_malloc_guesssize( const char* buffer, int len, int initial_size, int* outlen ); + STBIDEF char* stbi_zlib_decode_malloc_guesssize_headerflag( const char* buffer, int len, int initial_size, int* outlen, int parse_header ); + STBIDEF char* stbi_zlib_decode_malloc( const char* buffer, int len, int* outlen ); + STBIDEF int stbi_zlib_decode_buffer( char* obuffer, int olen, const char* ibuffer, int ilen ); + + STBIDEF char* stbi_zlib_decode_noheader_malloc( const char* buffer, int len, int* outlen ); + STBIDEF int stbi_zlib_decode_noheader_buffer( char* obuffer, int olen, const char* ibuffer, int ilen ); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#ifdef STB_IMAGE_IMPLEMENTATION + +#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ + || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ + || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ + || defined(STBI_ONLY_ZLIB) +#ifndef STBI_ONLY_JPEG +#define STBI_NO_JPEG +#endif +#ifndef STBI_ONLY_PNG +#define STBI_NO_PNG +#endif +#ifndef STBI_ONLY_BMP +#define STBI_NO_BMP +#endif +#ifndef STBI_ONLY_PSD +#define STBI_NO_PSD +#endif +#ifndef STBI_ONLY_TGA +#define STBI_NO_TGA +#endif +#ifndef STBI_ONLY_GIF +#define STBI_NO_GIF +#endif +#ifndef STBI_ONLY_HDR +#define STBI_NO_HDR +#endif +#ifndef STBI_ONLY_PIC +#define STBI_NO_PIC +#endif +#ifndef STBI_ONLY_PNM +#define STBI_NO_PNM +#endif +#endif + +#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) +#define STBI_NO_ZLIB +#endif + + +#include +#include // ptrdiff_t on osx +#include +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER +#ifdef __cplusplus +#define stbi_inline inline +#else +#define stbi_inline +#endif +#else +#define stbi_inline __forceinline +#endif + + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof( stbi__uint32 ) == 4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL +#define stbi_lrot(x,y) _lrotl(x,y) +#else +#define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3( void ) +{ + int info[4]; + __cpuid( info, 1 ); + return info[3]; +} +#else +static int stbi__cpuid3( void ) +{ + int res; + __asm { + mov eax, 1 + cpuid + mov res, edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available( void ) +{ + int info3 = stbi__cpuid3(); + return ( ( info3 >> 26 ) & 1 ) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available( void ) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void* io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc* img_buffer, * img_buffer_end; + stbi_uc* img_buffer_original, * img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer( stbi__context* s ); + +// initialize a memory-decode context +static void stbi__start_mem( stbi__context* s, stbi_uc const* buffer, int len ) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc*)buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc*)buffer + len; +} + +// initialize a callback-based context +static void stbi__start_callbacks( stbi__context* s, stbi_io_callbacks* c, void* user ) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof( s->buffer_start ); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + stbi__refill_buffer( s ); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read( void* user, char* data, int size ) +{ + return (int)fread( data, 1, size, (FILE*)user ); +} + +static void stbi__stdio_skip( void* user, int n ) +{ + fseek( (FILE*)user, n, SEEK_CUR ); +} + +static int stbi__stdio_eof( void* user ) +{ + return feof( (FILE*)user ); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file( stbi__context* s, FILE* f ) +{ + stbi__start_callbacks( s, &stbi__stdio_callbacks, (void*)f ); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind( stbi__context* s ) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test( stbi__context* s ); +static void* stbi__jpeg_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ); +static int stbi__jpeg_info( stbi__context* s, int* x, int* y, int* comp ); +#endif + +#ifndef STBI_NO_PNG +static int stbi__png_test( stbi__context* s ); +static void* stbi__png_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ); +static int stbi__png_info( stbi__context* s, int* x, int* y, int* comp ); +static int stbi__png_is16( stbi__context* s ); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test( stbi__context* s ); +static void* stbi__bmp_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ); +static int stbi__bmp_info( stbi__context* s, int* x, int* y, int* comp ); +#endif + +#ifndef STBI_NO_TGA +static int stbi__tga_test( stbi__context* s ); +static void* stbi__tga_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ); +static int stbi__tga_info( stbi__context* s, int* x, int* y, int* comp ); +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_test( stbi__context* s ); +static void* stbi__psd_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri, int bpc ); +static int stbi__psd_info( stbi__context* s, int* x, int* y, int* comp ); +static int stbi__psd_is16( stbi__context* s ); +#endif + +#ifndef STBI_NO_HDR +static int stbi__hdr_test( stbi__context* s ); +static float* stbi__hdr_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ); +static int stbi__hdr_info( stbi__context* s, int* x, int* y, int* comp ); +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_test( stbi__context* s ); +static void* stbi__pic_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ); +static int stbi__pic_info( stbi__context* s, int* x, int* y, int* comp ); +#endif + +#ifndef STBI_NO_GIF +static int stbi__gif_test( stbi__context* s ); +static void* stbi__gif_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ); +static void* stbi__load_gif_main( stbi__context* s, int** delays, int* x, int* y, int* z, int* comp, int req_comp ); +static int stbi__gif_info( stbi__context* s, int* x, int* y, int* comp ); +#endif + +#ifndef STBI_NO_PNM +static int stbi__pnm_test( stbi__context* s ); +static void* stbi__pnm_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ); +static int stbi__pnm_info( stbi__context* s, int* x, int* y, int* comp ); +#endif + +// this is not threadsafe +static const char* stbi__g_failure_reason; + +STBIDEF const char* stbi_failure_reason( void ) +{ + return stbi__g_failure_reason; +} + +static int stbi__err( const char* str ) +{ + stbi__g_failure_reason = str; + return 0; +} + +static void* stbi__malloc( size_t size ) +{ + return STBI_MALLOC( size ); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid( int a, int b ) +{ + if ( b < 0 ) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid( int a, int b ) +{ + if ( a < 0 || b < 0 ) return 0; + if ( b == 0 ) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX / b; +} + +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid( int a, int b, int add ) +{ + return stbi__mul2sizes_valid( a, b ) && stbi__addsizes_valid( a * b, add ); +} + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid( int a, int b, int c, int add ) +{ + return stbi__mul2sizes_valid( a, b ) && stbi__mul2sizes_valid( a * b, c ) && + stbi__addsizes_valid( a * b * c, add ); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static int stbi__mad4sizes_valid( int a, int b, int c, int d, int add ) +{ + return stbi__mul2sizes_valid( a, b ) && stbi__mul2sizes_valid( a * b, c ) && + stbi__mul2sizes_valid( a * b * c, d ) && stbi__addsizes_valid( a * b * c * d, add ); +} +#endif + +// mallocs with size overflow checking +static void* stbi__malloc_mad2( int a, int b, int add ) +{ + if ( !stbi__mad2sizes_valid( a, b, add ) ) return NULL; + return stbi__malloc( a * b + add ); +} + +static void* stbi__malloc_mad3( int a, int b, int c, int add ) +{ + if ( !stbi__mad3sizes_valid( a, b, c, add ) ) return NULL; + return stbi__malloc( a * b * c + add ); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +static void* stbi__malloc_mad4( int a, int b, int c, int d, int add ) +{ + if ( !stbi__mad4sizes_valid( a, b, c, d, add ) ) return NULL; + return stbi__malloc( a * b * c * d + add ); +} +#endif + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS +#define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) +#define stbi__err(x,y) stbi__err(y) +#else +#define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free( void* retval_from_stbi_load ) +{ + STBI_FREE( retval_from_stbi_load ); +} + +#ifndef STBI_NO_LINEAR +static float* stbi__ldr_to_hdr( stbi_uc* data, int x, int y, int comp ); +#endif + +#ifndef STBI_NO_HDR +static stbi_uc* stbi__hdr_to_ldr( float* data, int x, int y, int comp ); +#endif + +static int stbi__vertically_flip_on_load = 0; + +STBIDEF void stbi_set_flip_vertically_on_load( int flag_true_if_should_flip ) +{ + stbi__vertically_flip_on_load = flag_true_if_should_flip; +} + +static void* stbi__load_main( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri, int bpc ) +{ + memset( ri, 0, sizeof( *ri ) ); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + +#ifndef STBI_NO_JPEG + if ( stbi__jpeg_test( s ) ) return stbi__jpeg_load( s, x, y, comp, req_comp, ri ); +#endif +#ifndef STBI_NO_PNG + if ( stbi__png_test( s ) ) return stbi__png_load( s, x, y, comp, req_comp, ri ); +#endif +#ifndef STBI_NO_BMP + if ( stbi__bmp_test( s ) ) return stbi__bmp_load( s, x, y, comp, req_comp, ri ); +#endif +#ifndef STBI_NO_GIF + if ( stbi__gif_test( s ) ) return stbi__gif_load( s, x, y, comp, req_comp, ri ); +#endif +#ifndef STBI_NO_PSD + if ( stbi__psd_test( s ) ) return stbi__psd_load( s, x, y, comp, req_comp, ri, bpc ); +#endif +#ifndef STBI_NO_PIC + if ( stbi__pic_test( s ) ) return stbi__pic_load( s, x, y, comp, req_comp, ri ); +#endif +#ifndef STBI_NO_PNM + if ( stbi__pnm_test( s ) ) return stbi__pnm_load( s, x, y, comp, req_comp, ri ); +#endif + +#ifndef STBI_NO_HDR + if ( stbi__hdr_test( s ) ) { + float* hdr = stbi__hdr_load( s, x, y, comp, req_comp, ri ); + return stbi__hdr_to_ldr( hdr, *x, *y, req_comp ? req_comp : *comp ); + } +#endif + +#ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if ( stbi__tga_test( s ) ) + return stbi__tga_load( s, x, y, comp, req_comp, ri ); +#endif + + return stbi__errpuc( "unknown image type", "Image not of any known type, or corrupt" ); +} + +static stbi_uc* stbi__convert_16_to_8( stbi__uint16* orig, int w, int h, int channels ) +{ + int i; + int img_len = w * h * channels; + stbi_uc* reduced; + + reduced = (stbi_uc*)stbi__malloc( img_len ); + if ( reduced == NULL ) return stbi__errpuc( "outofmem", "Out of memory" ); + + for ( i = 0; i < img_len; ++i ) + reduced[i] = (stbi_uc)( ( orig[i] >> 8 ) & 0xFF ); // top half of each byte is sufficient approx of 16->8 bit scaling + + STBI_FREE( orig ); + return reduced; +} + +static stbi__uint16* stbi__convert_8_to_16( stbi_uc* orig, int w, int h, int channels ) +{ + int i; + int img_len = w * h * channels; + stbi__uint16* enlarged; + + enlarged = (stbi__uint16*)stbi__malloc( img_len * 2 ); + if ( enlarged == NULL ) return (stbi__uint16*)stbi__errpuc( "outofmem", "Out of memory" ); + + for ( i = 0; i < img_len; ++i ) + enlarged[i] = (stbi__uint16)( ( orig[i] << 8 ) + orig[i] ); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE( orig ); + return enlarged; +} + +static void stbi__vertical_flip( void* image, int w, int h, int bytes_per_pixel ) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc* bytes = (stbi_uc*)image; + + for ( row = 0; row < ( h >> 1 ); row++ ) { + stbi_uc* row0 = bytes + row * bytes_per_row; + stbi_uc* row1 = bytes + ( h - row - 1 ) * bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while ( bytes_left ) { + size_t bytes_copy = ( bytes_left < sizeof( temp ) ) ? bytes_left : sizeof( temp ); + memcpy( temp, row0, bytes_copy ); + memcpy( row0, row1, bytes_copy ); + memcpy( row1, temp, bytes_copy ); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices( void* image, int w, int h, int z, int bytes_per_pixel ) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc* bytes = (stbi_uc*)image; + for ( slice = 0; slice < z; ++slice ) { + stbi__vertical_flip( bytes, w, h, bytes_per_pixel ); + bytes += slice_size; + } +} +#endif + +static unsigned char* stbi__load_and_postprocess_8bit( stbi__context* s, int* x, int* y, int* comp, int req_comp ) +{ + stbi__result_info ri; + void* result = stbi__load_main( s, x, y, comp, req_comp, &ri, 8 ); + + if ( result == NULL ) + return NULL; + + if ( ri.bits_per_channel != 8 ) { + STBI_ASSERT( ri.bits_per_channel == 16 ); + result = stbi__convert_16_to_8( (stbi__uint16*)result, *x, *y, req_comp == 0 ? *comp : req_comp ); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if ( stbi__vertically_flip_on_load ) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip( result, *x, *y, channels * sizeof( stbi_uc ) ); + } + + return (unsigned char*)result; +} + +static stbi__uint16* stbi__load_and_postprocess_16bit( stbi__context* s, int* x, int* y, int* comp, int req_comp ) +{ + stbi__result_info ri; + void* result = stbi__load_main( s, x, y, comp, req_comp, &ri, 16 ); + + if ( result == NULL ) + return NULL; + + if ( ri.bits_per_channel != 16 ) { + STBI_ASSERT( ri.bits_per_channel == 8 ); + result = stbi__convert_8_to_16( (stbi_uc*)result, *x, *y, req_comp == 0 ? *comp : req_comp ); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if ( stbi__vertically_flip_on_load ) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip( result, *x, *y, channels * sizeof( stbi__uint16 ) ); + } + + return (stbi__uint16*)result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +static void stbi__float_postprocess( float* result, int* x, int* y, int* comp, int req_comp ) +{ + if ( stbi__vertically_flip_on_load && result != NULL ) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip( result, *x, *y, channels * sizeof( float ) ); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec( dllimport ) int __stdcall MultiByteToWideChar( unsigned int cp, unsigned long flags, const char* str, int cbmb, wchar_t* widestr, int cchwide ); +STBI_EXTERN __declspec( dllimport ) int __stdcall WideCharToMultiByte( unsigned int cp, unsigned long flags, const wchar_t* widestr, int cchwide, char* str, int cbmb, const char* defchar, int* used_default ); +#endif + +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8( char* buffer, size_t bufferlen, const wchar_t* input ) +{ + return WideCharToMultiByte( 65001 /* UTF8 */, 0, input, -1, buffer, (int)bufferlen, NULL, NULL ); +} +#endif + +static FILE* stbi__fopen( char const* filename, char const* mode ) +{ + FILE* f; +#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if ( 0 == MultiByteToWideChar( 65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof( wFilename ) ) ) + return 0; + + if ( 0 == MultiByteToWideChar( 65001 /* UTF8 */, 0, mode, -1, wMode, sizeof( wMode ) ) ) + return 0; + +#if _MSC_VER >= 1400 + if ( 0 != _wfopen_s( &f, wFilename, wMode ) ) + f = 0; +#else + f = _wfopen( wFilename, wMode ); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if ( 0 != fopen_s( &f, filename, mode ) ) + f = 0; +#else + f = fopen( filename, mode ); +#endif + return f; +} + + +STBIDEF stbi_uc* stbi_load( char const* filename, int* x, int* y, int* comp, int req_comp ) +{ + FILE* f = stbi__fopen( filename, "rb" ); + unsigned char* result; + if ( !f ) return stbi__errpuc( "can't fopen", "Unable to open file" ); + result = stbi_load_from_file( f, x, y, comp, req_comp ); + fclose( f ); + return result; +} + +STBIDEF stbi_uc* stbi_load_from_file( FILE* f, int* x, int* y, int* comp, int req_comp ) +{ + unsigned char* result; + stbi__context s; + stbi__start_file( &s, f ); + result = stbi__load_and_postprocess_8bit( &s, x, y, comp, req_comp ); + if ( result ) { + // need to 'unget' all the characters in the IO buffer + fseek( f, -(int)( s.img_buffer_end - s.img_buffer ), SEEK_CUR ); + } + return result; +} + +STBIDEF stbi__uint16* stbi_load_from_file_16( FILE* f, int* x, int* y, int* comp, int req_comp ) +{ + stbi__uint16* result; + stbi__context s; + stbi__start_file( &s, f ); + result = stbi__load_and_postprocess_16bit( &s, x, y, comp, req_comp ); + if ( result ) { + // need to 'unget' all the characters in the IO buffer + fseek( f, -(int)( s.img_buffer_end - s.img_buffer ), SEEK_CUR ); + } + return result; +} + +STBIDEF stbi_us* stbi_load_16( char const* filename, int* x, int* y, int* comp, int req_comp ) +{ + FILE* f = stbi__fopen( filename, "rb" ); + stbi__uint16* result; + if ( !f ) return (stbi_us*)stbi__errpuc( "can't fopen", "Unable to open file" ); + result = stbi_load_from_file_16( f, x, y, comp, req_comp ); + fclose( f ); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us* stbi_load_16_from_memory( stbi_uc const* buffer, int len, int* x, int* y, int* channels_in_file, int desired_channels ) +{ + stbi__context s; + stbi__start_mem( &s, buffer, len ); + return stbi__load_and_postprocess_16bit( &s, x, y, channels_in_file, desired_channels ); +} + +STBIDEF stbi_us* stbi_load_16_from_callbacks( stbi_io_callbacks const* clbk, void* user, int* x, int* y, int* channels_in_file, int desired_channels ) +{ + stbi__context s; + stbi__start_callbacks( &s, (stbi_io_callbacks*)clbk, user ); + return stbi__load_and_postprocess_16bit( &s, x, y, channels_in_file, desired_channels ); +} + +STBIDEF stbi_uc* stbi_load_from_memory( stbi_uc const* buffer, int len, int* x, int* y, int* comp, int req_comp ) +{ + stbi__context s; + stbi__start_mem( &s, buffer, len ); + return stbi__load_and_postprocess_8bit( &s, x, y, comp, req_comp ); +} + +STBIDEF stbi_uc* stbi_load_from_callbacks( stbi_io_callbacks const* clbk, void* user, int* x, int* y, int* comp, int req_comp ) +{ + stbi__context s; + stbi__start_callbacks( &s, (stbi_io_callbacks*)clbk, user ); + return stbi__load_and_postprocess_8bit( &s, x, y, comp, req_comp ); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc* stbi_load_gif_from_memory( stbi_uc const* buffer, int len, int** delays, int* x, int* y, int* z, int* comp, int req_comp ) +{ + unsigned char* result; + stbi__context s; + stbi__start_mem( &s, buffer, len ); + + result = (unsigned char*)stbi__load_gif_main( &s, delays, x, y, z, comp, req_comp ); + if ( stbi__vertically_flip_on_load ) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#ifndef STBI_NO_LINEAR +static float* stbi__loadf_main( stbi__context* s, int* x, int* y, int* comp, int req_comp ) +{ + unsigned char* data; +#ifndef STBI_NO_HDR + if ( stbi__hdr_test( s ) ) { + stbi__result_info ri; + float* hdr_data = stbi__hdr_load( s, x, y, comp, req_comp, &ri ); + if ( hdr_data ) + stbi__float_postprocess( hdr_data, x, y, comp, req_comp ); + return hdr_data; + } +#endif + data = stbi__load_and_postprocess_8bit( s, x, y, comp, req_comp ); + if ( data ) + return stbi__ldr_to_hdr( data, *x, *y, req_comp ? req_comp : *comp ); + return stbi__errpf( "unknown image type", "Image not of any known type, or corrupt" ); +} + +STBIDEF float* stbi_loadf_from_memory( stbi_uc const* buffer, int len, int* x, int* y, int* comp, int req_comp ) +{ + stbi__context s; + stbi__start_mem( &s, buffer, len ); + return stbi__loadf_main( &s, x, y, comp, req_comp ); +} + +STBIDEF float* stbi_loadf_from_callbacks( stbi_io_callbacks const* clbk, void* user, int* x, int* y, int* comp, int req_comp ) +{ + stbi__context s; + stbi__start_callbacks( &s, (stbi_io_callbacks*)clbk, user ); + return stbi__loadf_main( &s, x, y, comp, req_comp ); +} + +#ifndef STBI_NO_STDIO +STBIDEF float* stbi_loadf( char const* filename, int* x, int* y, int* comp, int req_comp ) +{ + float* result; + FILE* f = stbi__fopen( filename, "rb" ); + if ( !f ) return stbi__errpf( "can't fopen", "Unable to open file" ); + result = stbi_loadf_from_file( f, x, y, comp, req_comp ); + fclose( f ); + return result; +} + +STBIDEF float* stbi_loadf_from_file( FILE* f, int* x, int* y, int* comp, int req_comp ) +{ + stbi__context s; + stbi__start_file( &s, f ); + return stbi__loadf_main( &s, x, y, comp, req_comp ); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory( stbi_uc const* buffer, int len ) +{ +#ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem( &s, buffer, len ); + return stbi__hdr_test( &s ); +#else + STBI_NOTUSED( buffer ); + STBI_NOTUSED( len ); + return 0; +#endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr( char const* filename ) +{ + FILE* f = stbi__fopen( filename, "rb" ); + int result = 0; + if ( f ) { + result = stbi_is_hdr_from_file( f ); + fclose( f ); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file( FILE* f ) +{ +#ifndef STBI_NO_HDR + long pos = ftell( f ); + int res; + stbi__context s; + stbi__start_file( &s, f ); + res = stbi__hdr_test( &s ); + fseek( f, pos, SEEK_SET ); + return res; +#else + STBI_NOTUSED( f ); + return 0; +#endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks( stbi_io_callbacks const* clbk, void* user ) +{ +#ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks( &s, (stbi_io_callbacks*)clbk, user ); + return stbi__hdr_test( &s ); +#else + STBI_NOTUSED( clbk ); + STBI_NOTUSED( user ); + return 0; +#endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f; + +STBIDEF void stbi_ldr_to_hdr_gamma( float gamma ) { stbi__l2h_gamma = gamma; } +STBIDEF void stbi_ldr_to_hdr_scale( float scale ) { stbi__l2h_scale = scale; } +#endif + +static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f; + +STBIDEF void stbi_hdr_to_ldr_gamma( float gamma ) { stbi__h2l_gamma_i = 1 / gamma; } +STBIDEF void stbi_hdr_to_ldr_scale( float scale ) { stbi__h2l_scale_i = 1 / scale; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load = 0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer( stbi__context* s ) +{ + int n = ( s->io.read )( s->io_user_data, (char*)s->buffer_start, s->buflen ); + if ( n == 0 ) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + 1; + *s->img_buffer = 0; + } + else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8( stbi__context* s ) +{ + if ( s->img_buffer < s->img_buffer_end ) + return *s->img_buffer++; + if ( s->read_from_callbacks ) { + stbi__refill_buffer( s ); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int stbi__at_eof( stbi__context* s ) +{ + if ( s->io.read ) { + if ( !( s->io.eof )( s->io_user_data ) ) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if ( s->read_from_callbacks == 0 ) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip( stbi__context* s, int n ) +{ + if ( n < 0 ) { + s->img_buffer = s->img_buffer_end; + return; + } + if ( s->io.read ) { + int blen = (int)( s->img_buffer_end - s->img_buffer ); + if ( blen < n ) { + s->img_buffer = s->img_buffer_end; + ( s->io.skip )( s->io_user_data, n - blen ); + return; + } + } + s->img_buffer += n; +} + +static int stbi__getn( stbi__context* s, stbi_uc* buffer, int n ) +{ + if ( s->io.read ) { + int blen = (int)( s->img_buffer_end - s->img_buffer ); + if ( blen < n ) { + int res, count; + + memcpy( buffer, s->img_buffer, blen ); + + count = ( s->io.read )( s->io_user_data, (char*)buffer + blen, n - blen ); + res = ( count == ( n - blen ) ); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if ( s->img_buffer + n <= s->img_buffer_end ) { + memcpy( buffer, s->img_buffer, n ); + s->img_buffer += n; + return 1; + } + else + return 0; +} + +static int stbi__get16be( stbi__context* s ) +{ + int z = stbi__get8( s ); + return ( z << 8 ) + stbi__get8( s ); +} + +static stbi__uint32 stbi__get32be( stbi__context* s ) +{ + stbi__uint32 z = stbi__get16be( s ); + return ( z << 16 ) + stbi__get16be( s ); +} + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le( stbi__context* s ) +{ + int z = stbi__get8( s ); + return z + ( stbi__get8( s ) << 8 ); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le( stbi__context* s ) +{ + stbi__uint32 z = stbi__get16le( s ); + return z + ( stbi__get16le( s ) << 16 ); +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y( int r, int g, int b ) +{ + return (stbi_uc)( ( ( r * 77 ) + ( g * 150 ) + ( 29 * b ) ) >> 8 ); +} + +static unsigned char* stbi__convert_format( unsigned char* data, int img_n, int req_comp, unsigned int x, unsigned int y ) +{ + int i, j; + unsigned char* good; + + if ( req_comp == img_n ) return data; + STBI_ASSERT( req_comp >= 1 && req_comp <= 4 ); + + good = (unsigned char*)stbi__malloc_mad3( req_comp, x, y, 0 ); + if ( good == NULL ) { + STBI_FREE( data ); + return stbi__errpuc( "outofmem", "Out of memory" ); + } + + for ( j = 0; j < (int)y; ++j ) { + unsigned char* src = data + j * x * img_n; + unsigned char* dest = good + j * x * req_comp; + +#define STBI__COMBO(a,b) ((a)*8+(b)) +#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch ( STBI__COMBO( img_n, req_comp ) ) { + STBI__CASE( 1, 2 ) { dest[0] = src[0]; dest[1] = 255; } break; + STBI__CASE( 1, 3 ) { dest[0] = dest[1] = dest[2] = src[0]; } break; + STBI__CASE( 1, 4 ) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = 255; } break; + STBI__CASE( 2, 1 ) { dest[0] = src[0]; } break; + STBI__CASE( 2, 3 ) { dest[0] = dest[1] = dest[2] = src[0]; } break; + STBI__CASE( 2, 4 ) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = src[1]; } break; + STBI__CASE( 3, 4 ) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; dest[3] = 255; } break; + STBI__CASE( 3, 1 ) { dest[0] = stbi__compute_y( src[0], src[1], src[2] ); } break; + STBI__CASE( 3, 2 ) { dest[0] = stbi__compute_y( src[0], src[1], src[2] ); dest[1] = 255; } break; + STBI__CASE( 4, 1 ) { dest[0] = stbi__compute_y( src[0], src[1], src[2] ); } break; + STBI__CASE( 4, 2 ) { dest[0] = stbi__compute_y( src[0], src[1], src[2] ); dest[1] = src[3]; } break; + STBI__CASE( 4, 3 ) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; } break; + default: STBI_ASSERT( 0 ); + } +#undef STBI__CASE + } + + STBI_FREE( data ); + return good; +} + +static stbi__uint16 stbi__compute_y_16( int r, int g, int b ) +{ + return (stbi__uint16)( ( ( r * 77 ) + ( g * 150 ) + ( 29 * b ) ) >> 8 ); +} + +static stbi__uint16* stbi__convert_format16( stbi__uint16* data, int img_n, int req_comp, unsigned int x, unsigned int y ) +{ + int i, j; + stbi__uint16* good; + + if ( req_comp == img_n ) return data; + STBI_ASSERT( req_comp >= 1 && req_comp <= 4 ); + + good = (stbi__uint16*)stbi__malloc( req_comp * x * y * 2 ); + if ( good == NULL ) { + STBI_FREE( data ); + return (stbi__uint16*)stbi__errpuc( "outofmem", "Out of memory" ); + } + + for ( j = 0; j < (int)y; ++j ) { + stbi__uint16* src = data + j * x * img_n; + stbi__uint16* dest = good + j * x * req_comp; + +#define STBI__COMBO(a,b) ((a)*8+(b)) +#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch ( STBI__COMBO( img_n, req_comp ) ) { + STBI__CASE( 1, 2 ) { dest[0] = src[0]; dest[1] = 0xffff; } break; + STBI__CASE( 1, 3 ) { dest[0] = dest[1] = dest[2] = src[0]; } break; + STBI__CASE( 1, 4 ) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = 0xffff; } break; + STBI__CASE( 2, 1 ) { dest[0] = src[0]; } break; + STBI__CASE( 2, 3 ) { dest[0] = dest[1] = dest[2] = src[0]; } break; + STBI__CASE( 2, 4 ) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = src[1]; } break; + STBI__CASE( 3, 4 ) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; dest[3] = 0xffff; } break; + STBI__CASE( 3, 1 ) { dest[0] = stbi__compute_y_16( src[0], src[1], src[2] ); } break; + STBI__CASE( 3, 2 ) { dest[0] = stbi__compute_y_16( src[0], src[1], src[2] ); dest[1] = 0xffff; } break; + STBI__CASE( 4, 1 ) { dest[0] = stbi__compute_y_16( src[0], src[1], src[2] ); } break; + STBI__CASE( 4, 2 ) { dest[0] = stbi__compute_y_16( src[0], src[1], src[2] ); dest[1] = src[3]; } break; + STBI__CASE( 4, 3 ) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; } break; + default: STBI_ASSERT( 0 ); + } +#undef STBI__CASE + } + + STBI_FREE( data ); + return good; +} + +#ifndef STBI_NO_LINEAR +static float* stbi__ldr_to_hdr( stbi_uc* data, int x, int y, int comp ) +{ + int i, k, n; + float* output; + if ( !data ) return NULL; + output = (float*)stbi__malloc_mad4( x, y, comp, sizeof( float ), 0 ); + if ( output == NULL ) { STBI_FREE( data ); return stbi__errpf( "outofmem", "Out of memory" ); } + // compute number of non-alpha components + if ( comp & 1 ) n = comp; else n = comp - 1; + for ( i = 0; i < x * y; ++i ) { + for ( k = 0; k < n; ++k ) { + output[i * comp + k] = (float)( pow( data[i * comp + k] / 255.0f, stbi__l2h_gamma ) * stbi__l2h_scale ); + } + } + if ( n < comp ) { + for ( i = 0; i < x * y; ++i ) { + output[i * comp + n] = data[i * comp + n] / 255.0f; + } + } + STBI_FREE( data ); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc* stbi__hdr_to_ldr( float* data, int x, int y, int comp ) +{ + int i, k, n; + stbi_uc* output; + if ( !data ) return NULL; + output = (stbi_uc*)stbi__malloc_mad3( x, y, comp, 0 ); + if ( output == NULL ) { STBI_FREE( data ); return stbi__errpuc( "outofmem", "Out of memory" ); } + // compute number of non-alpha components + if ( comp & 1 ) n = comp; else n = comp - 1; + for ( i = 0; i < x * y; ++i ) { + for ( k = 0; k < n; ++k ) { + float z = (float)pow( data[i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i ) * 255 + 0.5f; + if ( z < 0 ) z = 0; + if ( z > 255 ) z = 255; + output[i * comp + k] = (stbi_uc)stbi__float2int( z ); + } + if ( k < comp ) { + float z = data[i * comp + k] * 255 + 0.5f; + if ( z < 0 ) z = 0; + if ( z > 255 ) z = 255; + output[i * comp + k] = (stbi_uc)stbi__float2int( z ); + } + } + STBI_FREE( data ); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context* s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi__uint16 dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + + // sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + + // definition of jpeg image component + struct + { + int id; + int h, v; + int tq; + int hd, ha; + int dc_pred; + + int x, y, w2, h2; + stbi_uc* data; + void* raw_data, * raw_coeff; + stbi_uc* linebuf; + short* coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int jfif; + int app14_color_transform; // Adobe APP14 tag + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + + // kernels + void ( *idct_block_kernel )( stbi_uc* out, int out_stride, short data[64] ); + void ( *YCbCr_to_RGB_kernel )( stbi_uc* out, const stbi_uc* y, const stbi_uc* pcb, const stbi_uc* pcr, int count, int step ); + stbi_uc* ( *resample_row_hv_2_kernel )( stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far, int w, int hs ); +} stbi__jpeg; + +static int stbi__build_huffman( stbi__huffman* h, int* count ) +{ + int i, j, k = 0; + unsigned int code; + // build size list for each symbol (from JPEG spec) + for ( i = 0; i < 16; ++i ) + for ( j = 0; j < count[i]; ++j ) + h->size[k++] = (stbi_uc)( i + 1 ); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for ( j = 1; j <= 16; ++j ) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if ( h->size[k] == j ) { + while ( h->size[k] == j ) + h->code[k++] = (stbi__uint16)( code++ ); + if ( code - 1 >= ( 1u << j ) ) return stbi__err( "bad code lengths", "Corrupt JPEG" ); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << ( 16 - j ); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset( h->fast, 255, 1 << FAST_BITS ); + for ( i = 0; i < k; ++i ) { + int s = h->size[i]; + if ( s <= FAST_BITS ) { + int c = h->code[i] << ( FAST_BITS - s ); + int m = 1 << ( FAST_BITS - s ); + for ( j = 0; j < m; ++j ) { + h->fast[c + j] = (stbi_uc)i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac( stbi__int16* fast_ac, stbi__huffman* h ) +{ + int i; + for ( i = 0; i < ( 1 << FAST_BITS ); ++i ) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if ( fast < 255 ) { + int rs = h->values[fast]; + int run = ( rs >> 4 ) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if ( magbits && len + magbits <= FAST_BITS ) { + // magnitude code followed by receive_extend code + int k = ( ( i << len ) & ( ( 1 << FAST_BITS ) - 1 ) ) >> ( FAST_BITS - magbits ); + int m = 1 << ( magbits - 1 ); + if ( k < m ) k += ( ~0U << magbits ) + 1; + // if the result is small enough, we can fit it in fast_ac table + if ( k >= -128 && k <= 127 ) + fast_ac[i] = (stbi__int16)( ( k * 256 ) + ( run * 16 ) + ( len + magbits ) ); + } + } + } +} + +static void stbi__grow_buffer_unsafe( stbi__jpeg* j ) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8( j->s ); + if ( b == 0xff ) { + int c = stbi__get8( j->s ); + while ( c == 0xff ) c = stbi__get8( j->s ); // consume fill bytes + if ( c != 0 ) { + j->marker = (unsigned char)c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << ( 24 - j->code_bits ); + j->code_bits += 8; + } while ( j->code_bits <= 24 ); +} + +// (1 << n) - 1 +static const stbi__uint32 stbi__bmask[17] = { 0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535 }; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode( stbi__jpeg* j, stbi__huffman* h ) +{ + unsigned int temp; + int c, k; + + if ( j->code_bits < 16 ) stbi__grow_buffer_unsafe( j ); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = ( j->code_buffer >> ( 32 - FAST_BITS ) ) & ( ( 1 << FAST_BITS ) - 1 ); + k = h->fast[c]; + if ( k < 255 ) { + int s = h->size[k]; + if ( s > j->code_bits ) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for ( k = FAST_BITS + 1; ; ++k ) + if ( temp < h->maxcode[k] ) + break; + if ( k == 17 ) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if ( k > j->code_bits ) + return -1; + + // convert the huffman code to the symbol id + c = ( ( j->code_buffer >> ( 32 - k ) ) & stbi__bmask[k] ) + h->delta[k]; + STBI_ASSERT( ( ( ( j->code_buffer ) >> ( 32 - h->size[c] ) ) & stbi__bmask[h->size[c]] ) == h->code[c] ); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n ) stbi__grow_buffer_unsafe( j ); + + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot( j->code_buffer, n ); + STBI_ASSERT( n >= 0 && n < (int)( sizeof( stbi__bmask ) / sizeof( *stbi__bmask ) ) ); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + ( stbi__jbias[n] & ~sgn ); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits( stbi__jpeg* j, int n ) +{ + unsigned int k; + if ( j->code_bits < n ) stbi__grow_buffer_unsafe( j ); + k = stbi_lrot( j->code_buffer, n ); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit( stbi__jpeg* j ) +{ + unsigned int k; + if ( j->code_bits < 1 ) stbi__grow_buffer_unsafe( j ); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static const stbi_uc stbi__jpeg_dezigzag[64 + 15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block( stbi__jpeg* j, short data[64], stbi__huffman* hdc, stbi__huffman* hac, stbi__int16* fac, int b, stbi__uint16* dequant ) +{ + int diff, dc, k; + int t; + + if ( j->code_bits < 16 ) stbi__grow_buffer_unsafe( j ); + t = stbi__jpeg_huff_decode( j, hdc ); + if ( t < 0 ) return stbi__err( "bad huffman code", "Corrupt JPEG" ); + + // 0 all the ac values now so we can do it 32-bits at a time + memset( data, 0, 64 * sizeof( data[0] ) ); + + diff = t ? stbi__extend_receive( j, t ) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short)( dc * dequant[0] ); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c, r, s; + if ( j->code_bits < 16 ) stbi__grow_buffer_unsafe( j ); + c = ( j->code_buffer >> ( 32 - FAST_BITS ) ) & ( ( 1 << FAST_BITS ) - 1 ); + r = fac[c]; + if ( r ) { // fast-AC path + k += ( r >> 4 ) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)( ( r >> 8 ) * dequant[zig] ); + } + else { + int rs = stbi__jpeg_huff_decode( j, hac ); + if ( rs < 0 ) return stbi__err( "bad huffman code", "Corrupt JPEG" ); + s = rs & 15; + r = rs >> 4; + if ( s == 0 ) { + if ( rs != 0xf0 ) break; // end block + k += 16; + } + else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)( stbi__extend_receive( j, s ) * dequant[zig] ); + } + } + } while ( k < 64 ); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc( stbi__jpeg* j, short data[64], stbi__huffman* hdc, int b ) +{ + int diff, dc; + int t; + if ( j->spec_end != 0 ) return stbi__err( "can't merge dc and ac", "Corrupt JPEG" ); + + if ( j->code_bits < 16 ) stbi__grow_buffer_unsafe( j ); + + if ( j->succ_high == 0 ) { + // first scan for DC coefficient, must be first + memset( data, 0, 64 * sizeof( data[0] ) ); // 0 all the ac values now + t = stbi__jpeg_huff_decode( j, hdc ); + diff = t ? stbi__extend_receive( j, t ) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short)( dc << j->succ_low ); + } + else { + // refinement scan for DC coefficient + if ( stbi__jpeg_get_bit( j ) ) + data[0] += (short)( 1 << j->succ_low ); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac( stbi__jpeg* j, short data[64], stbi__huffman* hac, stbi__int16* fac ) +{ + int k; + if ( j->spec_start == 0 ) return stbi__err( "can't merge dc and ac", "Corrupt JPEG" ); + + if ( j->succ_high == 0 ) { + int shift = j->succ_low; + + if ( j->eob_run ) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c, r, s; + if ( j->code_bits < 16 ) stbi__grow_buffer_unsafe( j ); + c = ( j->code_buffer >> ( 32 - FAST_BITS ) ) & ( ( 1 << FAST_BITS ) - 1 ); + r = fac[c]; + if ( r ) { // fast-AC path + k += ( r >> 4 ) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)( ( r >> 8 ) << shift ); + } + else { + int rs = stbi__jpeg_huff_decode( j, hac ); + if ( rs < 0 ) return stbi__err( "bad huffman code", "Corrupt JPEG" ); + s = rs & 15; + r = rs >> 4; + if ( s == 0 ) { + if ( r < 15 ) { + j->eob_run = ( 1 << r ); + if ( r ) + j->eob_run += stbi__jpeg_get_bits( j, r ); + --j->eob_run; + break; + } + k += 16; + } + else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short)( stbi__extend_receive( j, s ) << shift ); + } + } + } while ( k <= j->spec_end ); + } + else { + // refinement scan for these AC coefficients + + short bit = (short)( 1 << j->succ_low ); + + if ( j->eob_run ) { + --j->eob_run; + for ( k = j->spec_start; k <= j->spec_end; ++k ) { + short* p = &data[stbi__jpeg_dezigzag[k]]; + if ( *p != 0 ) + if ( stbi__jpeg_get_bit( j ) ) + if ( ( *p & bit ) == 0 ) { + if ( *p > 0 ) + * p += bit; + else + *p -= bit; + } + } + } + else { + k = j->spec_start; + do { + int r, s; + int rs = stbi__jpeg_huff_decode( j, hac ); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if ( rs < 0 ) return stbi__err( "bad huffman code", "Corrupt JPEG" ); + s = rs & 15; + r = rs >> 4; + if ( s == 0 ) { + if ( r < 15 ) { + j->eob_run = ( 1 << r ) - 1; + if ( r ) + j->eob_run += stbi__jpeg_get_bits( j, r ); + r = 64; // force end of block + } + else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } + else { + if ( s != 1 ) return stbi__err( "bad huffman code", "Corrupt JPEG" ); + // sign bit + if ( stbi__jpeg_get_bit( j ) ) + s = bit; + else + s = -bit; + } + + // advance by r + while ( k <= j->spec_end ) { + short* p = &data[stbi__jpeg_dezigzag[k++]]; + if ( *p != 0 ) { + if ( stbi__jpeg_get_bit( j ) ) + if ( ( *p & bit ) == 0 ) { + if ( *p > 0 ) + * p += bit; + else + *p -= bit; + } + } + else { + if ( r == 0 ) { + *p = (short)s; + break; + } + --r; + } + } + } while ( k <= j->spec_end ); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp( int x ) +{ + // trick to use a single test to catch both cases + if ( (unsigned int)x > 255 ) { + if ( x < 0 ) return 0; + if ( x > 255 ) return 255; + } + return (stbi_uc)x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) * 4096) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block( stbi_uc* out, int out_stride, short data[64] ) +{ + int i, val[64], * v = val; + stbi_uc* o; + short* d = data; + + // columns + for ( i = 0; i < 8; ++i, ++d, ++v ) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if ( d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0 + && d[40] == 0 && d[48] == 0 && d[56] == 0 ) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] * 4; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } + else { + STBI__IDCT_1D( d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56] ) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[0] = ( x0 + t3 ) >> 10; + v[56] = ( x0 - t3 ) >> 10; + v[8] = ( x1 + t2 ) >> 10; + v[48] = ( x1 - t2 ) >> 10; + v[16] = ( x2 + t1 ) >> 10; + v[40] = ( x2 - t1 ) >> 10; + v[24] = ( x3 + t0 ) >> 10; + v[32] = ( x3 - t0 ) >> 10; + } + } + + for ( i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride ) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D( v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7] ) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + ( 128 << 17 ); + x1 += 65536 + ( 128 << 17 ); + x2 += 65536 + ( 128 << 17 ); + x3 += 65536 + ( 128 << 17 ); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp( ( x0 + t3 ) >> 17 ); + o[7] = stbi__clamp( ( x0 - t3 ) >> 17 ); + o[1] = stbi__clamp( ( x1 + t2 ) >> 17 ); + o[6] = stbi__clamp( ( x1 - t2 ) >> 17 ); + o[2] = stbi__clamp( ( x2 + t1 ) >> 17 ); + o[5] = stbi__clamp( ( x2 - t1 ) >> 17 ); + o[3] = stbi__clamp( ( x3 + t0 ) >> 17 ); + o[4] = stbi__clamp( ( x3 - t0 ) >> 17 ); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd( stbi_uc* out, int out_stride, short data[64] ) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y +#define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + +// out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) +// out(1) = c1[even]*x + c1[odd]*y +#define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) +#define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add +#define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub +#define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack +#define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) +#define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) +#define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + +#define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const( stbi__f2f( 0.5411961f ), stbi__f2f( 0.5411961f ) + stbi__f2f( -1.847759065f ) ); + __m128i rot0_1 = dct_const( stbi__f2f( 0.5411961f ) + stbi__f2f( 0.765366865f ), stbi__f2f( 0.5411961f ) ); + __m128i rot1_0 = dct_const( stbi__f2f( 1.175875602f ) + stbi__f2f( -0.899976223f ), stbi__f2f( 1.175875602f ) ); + __m128i rot1_1 = dct_const( stbi__f2f( 1.175875602f ), stbi__f2f( 1.175875602f ) + stbi__f2f( -2.562915447f ) ); + __m128i rot2_0 = dct_const( stbi__f2f( -1.961570560f ) + stbi__f2f( 0.298631336f ), stbi__f2f( -1.961570560f ) ); + __m128i rot2_1 = dct_const( stbi__f2f( -1.961570560f ), stbi__f2f( -1.961570560f ) + stbi__f2f( 3.072711026f ) ); + __m128i rot3_0 = dct_const( stbi__f2f( -0.390180644f ) + stbi__f2f( 2.053119869f ), stbi__f2f( -0.390180644f ) ); + __m128i rot3_1 = dct_const( stbi__f2f( -0.390180644f ), stbi__f2f( -0.390180644f ) + stbi__f2f( 1.501321110f ) ); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32( 512 ); + __m128i bias_1 = _mm_set1_epi32( 65536 + ( 128 << 17 ) ); + + // load + row0 = _mm_load_si128( ( const __m128i* ) ( data + 0 * 8 ) ); + row1 = _mm_load_si128( ( const __m128i* ) ( data + 1 * 8 ) ); + row2 = _mm_load_si128( ( const __m128i* ) ( data + 2 * 8 ) ); + row3 = _mm_load_si128( ( const __m128i* ) ( data + 3 * 8 ) ); + row4 = _mm_load_si128( ( const __m128i* ) ( data + 4 * 8 ) ); + row5 = _mm_load_si128( ( const __m128i* ) ( data + 5 * 8 ) ); + row6 = _mm_load_si128( ( const __m128i* ) ( data + 6 * 8 ) ); + row7 = _mm_load_si128( ( const __m128i* ) ( data + 7 * 8 ) ); + + // column pass + dct_pass( bias_0, 10 ); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16( row0, row4 ); + dct_interleave16( row1, row5 ); + dct_interleave16( row2, row6 ); + dct_interleave16( row3, row7 ); + + // transpose pass 2 + dct_interleave16( row0, row2 ); + dct_interleave16( row1, row3 ); + dct_interleave16( row4, row6 ); + dct_interleave16( row5, row7 ); + + // transpose pass 3 + dct_interleave16( row0, row1 ); + dct_interleave16( row2, row3 ); + dct_interleave16( row4, row5 ); + dct_interleave16( row6, row7 ); + } + + // row pass + dct_pass( bias_1, 17 ); + + { + // pack + __m128i p0 = _mm_packus_epi16( row0, row1 ); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16( row2, row3 ); + __m128i p2 = _mm_packus_epi16( row4, row5 ); + __m128i p3 = _mm_packus_epi16( row6, row7 ); + + // 8bit 8x8 transpose pass 1 + dct_interleave8( p0, p2 ); // a0e0a1e1... + dct_interleave8( p1, p3 ); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8( p0, p1 ); // a0c0e0g0... + dct_interleave8( p2, p3 ); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8( p0, p2 ); // a0b0c0d0... + dct_interleave8( p1, p3 ); // a4b4c4d4... + + // store + _mm_storel_epi64( ( __m128i* ) out, p0 ); out += out_stride; + _mm_storel_epi64( ( __m128i* ) out, _mm_shuffle_epi32( p0, 0x4e ) ); out += out_stride; + _mm_storel_epi64( ( __m128i* ) out, p2 ); out += out_stride; + _mm_storel_epi64( ( __m128i* ) out, _mm_shuffle_epi32( p2, 0x4e ) ); out += out_stride; + _mm_storel_epi64( ( __m128i* ) out, p1 ); out += out_stride; + _mm_storel_epi64( ( __m128i* ) out, _mm_shuffle_epi32( p1, 0x4e ) ); out += out_stride; + _mm_storel_epi64( ( __m128i* ) out, p3 ); out += out_stride; + _mm_storel_epi64( ( __m128i* ) out, _mm_shuffle_epi32( p3, 0x4e ) ); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd( stbi_uc* out, int out_stride, short data[64] ) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16( stbi__f2f( 0.5411961f ) ); + int16x4_t rot0_1 = vdup_n_s16( stbi__f2f( -1.847759065f ) ); + int16x4_t rot0_2 = vdup_n_s16( stbi__f2f( 0.765366865f ) ); + int16x4_t rot1_0 = vdup_n_s16( stbi__f2f( 1.175875602f ) ); + int16x4_t rot1_1 = vdup_n_s16( stbi__f2f( -0.899976223f ) ); + int16x4_t rot1_2 = vdup_n_s16( stbi__f2f( -2.562915447f ) ); + int16x4_t rot2_0 = vdup_n_s16( stbi__f2f( -1.961570560f ) ); + int16x4_t rot2_1 = vdup_n_s16( stbi__f2f( -0.390180644f ) ); + int16x4_t rot3_0 = vdup_n_s16( stbi__f2f( 0.298631336f ) ); + int16x4_t rot3_1 = vdup_n_s16( stbi__f2f( 2.053119869f ) ); + int16x4_t rot3_2 = vdup_n_s16( stbi__f2f( 3.072711026f ) ); + int16x4_t rot3_3 = vdup_n_s16( stbi__f2f( 1.501321110f ) ); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + + // wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16( data + 0 * 8 ); + row1 = vld1q_s16( data + 1 * 8 ); + row2 = vld1q_s16( data + 2 * 8 ); + row3 = vld1q_s16( data + 3 * 8 ); + row4 = vld1q_s16( data + 4 * 8 ); + row5 = vld1q_s16( data + 5 * 8 ); + row6 = vld1q_s16( data + 6 * 8 ); + row7 = vld1q_s16( data + 7 * 8 ); + + // add DC bias + row0 = vaddq_s16( row0, vsetq_lane_s16( 1024, vdupq_n_s16( 0 ), 0 ) ); + + // column pass + dct_pass( vrshrn_n_s32, 10 ); + + // 16bit 8x8 transpose + { + // these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. + // whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } +#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } + + // pass 1 + dct_trn16( row0, row1 ); // a0b0a2b2a4b4a6b6 + dct_trn16( row2, row3 ); + dct_trn16( row4, row5 ); + dct_trn16( row6, row7 ); + + // pass 2 + dct_trn32( row0, row2 ); // a0b0c0d0a4b4c4d4 + dct_trn32( row1, row3 ); + dct_trn32( row4, row6 ); + dct_trn32( row5, row7 ); + + // pass 3 + dct_trn64( row0, row4 ); // a0b0c0d0e0f0g0h0 + dct_trn64( row1, row5 ); + dct_trn64( row2, row6 ); + dct_trn64( row3, row7 ); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass( vshrn_n_s32, 16 ); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16( row0, 1 ); + uint8x8_t p1 = vqrshrun_n_s16( row1, 1 ); + uint8x8_t p2 = vqrshrun_n_s16( row2, 1 ); + uint8x8_t p3 = vqrshrun_n_s16( row3, 1 ); + uint8x8_t p4 = vqrshrun_n_s16( row4, 1 ); + uint8x8_t p5 = vqrshrun_n_s16( row5, 1 ); + uint8x8_t p6 = vqrshrun_n_s16( row6, 1 ); + uint8x8_t p7 = vqrshrun_n_s16( row7, 1 ); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } +#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8( p0, p1 ); + dct_trn8_8( p2, p3 ); + dct_trn8_8( p4, p5 ); + dct_trn8_8( p6, p7 ); + + // pass 2 + dct_trn8_16( p0, p2 ); + dct_trn8_16( p1, p3 ); + dct_trn8_16( p4, p6 ); + dct_trn8_16( p5, p7 ); + + // pass 3 + dct_trn8_32( p0, p4 ); + dct_trn8_32( p1, p5 ); + dct_trn8_32( p2, p6 ); + dct_trn8_32( p3, p7 ); + + // store + vst1_u8( out, p0 ); out += out_stride; + vst1_u8( out, p1 ); out += out_stride; + vst1_u8( out, p2 ); out += out_stride; + vst1_u8( out, p3 ); out += out_stride; + vst1_u8( out, p4 ); out += out_stride; + vst1_u8( out, p5 ); out += out_stride; + vst1_u8( out, p6 ); out += out_stride; + vst1_u8( out, p7 ); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker( stbi__jpeg * j ) +{ + stbi_uc x; + if ( j->marker != STBI__MARKER_none ) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8( j->s ); + if ( x != 0xff ) return STBI__MARKER_none; + while ( x == 0xff ) + x = stbi__get8( j->s ); // consume repeated 0xff fill bytes + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset( stbi__jpeg* j ) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data( stbi__jpeg* z ) +{ + stbi__jpeg_reset( z ); + if ( !z->progressive ) { + if ( z->scan_n == 1 ) { + int i, j; + STBI_SIMD_ALIGN( short, data[64] ); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = ( z->img_comp[n].x + 7 ) >> 3; + int h = ( z->img_comp[n].y + 7 ) >> 3; + for ( j = 0; j < h; ++j ) { + for ( i = 0; i < w; ++i ) { + int ha = z->img_comp[n].ha; + if ( !stbi__jpeg_decode_block( z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq] ) ) return 0; + z->idct_block_kernel( z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data ); + // every data block is an MCU, so countdown the restart interval + if ( --z->todo <= 0 ) { + if ( z->code_bits < 24 ) stbi__grow_buffer_unsafe( z ); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if ( !STBI__RESTART( z->marker ) ) return 1; + stbi__jpeg_reset( z ); + } + } + } + return 1; + } + else { // interleaved + int i, j, k, x, y; + STBI_SIMD_ALIGN( short, data[64] ); + for ( j = 0; j < z->img_mcu_y; ++j ) { + for ( i = 0; i < z->img_mcu_x; ++i ) { + // scan an interleaved mcu... process scan_n components in order + for ( k = 0; k < z->scan_n; ++k ) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for ( y = 0; y < z->img_comp[n].v; ++y ) { + for ( x = 0; x < z->img_comp[n].h; ++x ) { + int x2 = ( i * z->img_comp[n].h + x ) * 8; + int y2 = ( j * z->img_comp[n].v + y ) * 8; + int ha = z->img_comp[n].ha; + if ( !stbi__jpeg_decode_block( z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq] ) ) return 0; + z->idct_block_kernel( z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2, z->img_comp[n].w2, data ); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if ( --z->todo <= 0 ) { + if ( z->code_bits < 24 ) stbi__grow_buffer_unsafe( z ); + if ( !STBI__RESTART( z->marker ) ) return 1; + stbi__jpeg_reset( z ); + } + } + } + return 1; + } + } + else { + if ( z->scan_n == 1 ) { + int i, j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = ( z->img_comp[n].x + 7 ) >> 3; + int h = ( z->img_comp[n].y + 7 ) >> 3; + for ( j = 0; j < h; ++j ) { + for ( i = 0; i < w; ++i ) { + short* data = z->img_comp[n].coeff + 64 * ( i + j * z->img_comp[n].coeff_w ); + if ( z->spec_start == 0 ) { + if ( !stbi__jpeg_decode_block_prog_dc( z, data, &z->huff_dc[z->img_comp[n].hd], n ) ) + return 0; + } + else { + int ha = z->img_comp[n].ha; + if ( !stbi__jpeg_decode_block_prog_ac( z, data, &z->huff_ac[ha], z->fast_ac[ha] ) ) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if ( --z->todo <= 0 ) { + if ( z->code_bits < 24 ) stbi__grow_buffer_unsafe( z ); + if ( !STBI__RESTART( z->marker ) ) return 1; + stbi__jpeg_reset( z ); + } + } + } + return 1; + } + else { // interleaved + int i, j, k, x, y; + for ( j = 0; j < z->img_mcu_y; ++j ) { + for ( i = 0; i < z->img_mcu_x; ++i ) { + // scan an interleaved mcu... process scan_n components in order + for ( k = 0; k < z->scan_n; ++k ) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for ( y = 0; y < z->img_comp[n].v; ++y ) { + for ( x = 0; x < z->img_comp[n].h; ++x ) { + int x2 = ( i * z->img_comp[n].h + x ); + int y2 = ( j * z->img_comp[n].v + y ); + short* data = z->img_comp[n].coeff + 64 * ( x2 + y2 * z->img_comp[n].coeff_w ); + if ( !stbi__jpeg_decode_block_prog_dc( z, data, &z->huff_dc[z->img_comp[n].hd], n ) ) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if ( --z->todo <= 0 ) { + if ( z->code_bits < 24 ) stbi__grow_buffer_unsafe( z ); + if ( !STBI__RESTART( z->marker ) ) return 1; + stbi__jpeg_reset( z ); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize( short* data, stbi__uint16* dequant ) +{ + int i; + for ( i = 0; i < 64; ++i ) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish( stbi__jpeg* z ) +{ + if ( z->progressive ) { + // dequantize and idct the data + int i, j, n; + for ( n = 0; n < z->s->img_n; ++n ) { + int w = ( z->img_comp[n].x + 7 ) >> 3; + int h = ( z->img_comp[n].y + 7 ) >> 3; + for ( j = 0; j < h; ++j ) { + for ( i = 0; i < w; ++i ) { + short* data = z->img_comp[n].coeff + 64 * ( i + j * z->img_comp[n].coeff_w ); + stbi__jpeg_dequantize( data, z->dequant[z->img_comp[n].tq] ); + z->idct_block_kernel( z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8, z->img_comp[n].w2, data ); + } + } + } + } +} + +static int stbi__process_marker( stbi__jpeg* z, int m ) +{ + int L; + switch ( m ) { + case STBI__MARKER_none: // no marker found + return stbi__err( "expected marker", "Corrupt JPEG" ); + + case 0xDD: // DRI - specify restart interval + if ( stbi__get16be( z->s ) != 4 ) return stbi__err( "bad DRI len", "Corrupt JPEG" ); + z->restart_interval = stbi__get16be( z->s ); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be( z->s ) - 2; + while ( L > 0 ) { + int q = stbi__get8( z->s ); + int p = q >> 4, sixteen = ( p != 0 ); + int t = q & 15, i; + if ( p != 0 && p != 1 ) return stbi__err( "bad DQT type", "Corrupt JPEG" ); + if ( t > 3 ) return stbi__err( "bad DQT table", "Corrupt JPEG" ); + + for ( i = 0; i < 64; ++i ) + z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)( sixteen ? stbi__get16be( z->s ) : stbi__get8( z->s ) ); + L -= ( sixteen ? 129 : 65 ); + } + return L == 0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be( z->s ) - 2; + while ( L > 0 ) { + stbi_uc* v; + int sizes[16], i, n = 0; + int q = stbi__get8( z->s ); + int tc = q >> 4; + int th = q & 15; + if ( tc > 1 || th > 3 ) return stbi__err( "bad DHT header", "Corrupt JPEG" ); + for ( i = 0; i < 16; ++i ) { + sizes[i] = stbi__get8( z->s ); + n += sizes[i]; + } + L -= 17; + if ( tc == 0 ) { + if ( !stbi__build_huffman( z->huff_dc + th, sizes ) ) return 0; + v = z->huff_dc[th].values; + } + else { + if ( !stbi__build_huffman( z->huff_ac + th, sizes ) ) return 0; + v = z->huff_ac[th].values; + } + for ( i = 0; i < n; ++i ) + v[i] = stbi__get8( z->s ); + if ( tc != 0 ) + stbi__build_fast_ac( z->fast_ac[th], z->huff_ac + th ); + L -= n; + } + return L == 0; + } + + // check for comment block or APP blocks + if ( ( m >= 0xE0 && m <= 0xEF ) || m == 0xFE ) { + L = stbi__get16be( z->s ); + if ( L < 2 ) { + if ( m == 0xFE ) + return stbi__err( "bad COM len", "Corrupt JPEG" ); + else + return stbi__err( "bad APP len", "Corrupt JPEG" ); + } + L -= 2; + + if ( m == 0xE0 && L >= 5 ) { // JFIF APP0 segment + static const unsigned char tag[5] = { 'J','F','I','F','\0' }; + int ok = 1; + int i; + for ( i = 0; i < 5; ++i ) + if ( stbi__get8( z->s ) != tag[i] ) + ok = 0; + L -= 5; + if ( ok ) + z->jfif = 1; + } + else if ( m == 0xEE && L >= 12 ) { // Adobe APP14 segment + static const unsigned char tag[6] = { 'A','d','o','b','e','\0' }; + int ok = 1; + int i; + for ( i = 0; i < 6; ++i ) + if ( stbi__get8( z->s ) != tag[i] ) + ok = 0; + L -= 6; + if ( ok ) { + stbi__get8( z->s ); // version + stbi__get16be( z->s ); // flags0 + stbi__get16be( z->s ); // flags1 + z->app14_color_transform = stbi__get8( z->s ); // color transform + L -= 6; + } + } + + stbi__skip( z->s, L ); + return 1; + } + + return stbi__err( "unknown marker", "Corrupt JPEG" ); +} + +// after we see SOS +static int stbi__process_scan_header( stbi__jpeg* z ) +{ + int i; + int Ls = stbi__get16be( z->s ); + z->scan_n = stbi__get8( z->s ); + if ( z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int)z->s->img_n ) return stbi__err( "bad SOS component count", "Corrupt JPEG" ); + if ( Ls != 6 + 2 * z->scan_n ) return stbi__err( "bad SOS len", "Corrupt JPEG" ); + for ( i = 0; i < z->scan_n; ++i ) { + int id = stbi__get8( z->s ), which; + int q = stbi__get8( z->s ); + for ( which = 0; which < z->s->img_n; ++which ) + if ( z->img_comp[which].id == id ) + break; + if ( which == z->s->img_n ) return 0; // no match + z->img_comp[which].hd = q >> 4; if ( z->img_comp[which].hd > 3 ) return stbi__err( "bad DC huff", "Corrupt JPEG" ); + z->img_comp[which].ha = q & 15; if ( z->img_comp[which].ha > 3 ) return stbi__err( "bad AC huff", "Corrupt JPEG" ); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8( z->s ); + z->spec_end = stbi__get8( z->s ); // should be 63, but might be 0 + aa = stbi__get8( z->s ); + z->succ_high = ( aa >> 4 ); + z->succ_low = ( aa & 15 ); + if ( z->progressive ) { + if ( z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13 ) + return stbi__err( "bad SOS", "Corrupt JPEG" ); + } + else { + if ( z->spec_start != 0 ) return stbi__err( "bad SOS", "Corrupt JPEG" ); + if ( z->succ_high != 0 || z->succ_low != 0 ) return stbi__err( "bad SOS", "Corrupt JPEG" ); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__free_jpeg_components( stbi__jpeg* z, int ncomp, int why ) +{ + int i; + for ( i = 0; i < ncomp; ++i ) { + if ( z->img_comp[i].raw_data ) { + STBI_FREE( z->img_comp[i].raw_data ); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if ( z->img_comp[i].raw_coeff ) { + STBI_FREE( z->img_comp[i].raw_coeff ); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if ( z->img_comp[i].linebuf ) { + STBI_FREE( z->img_comp[i].linebuf ); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +static int stbi__process_frame_header( stbi__jpeg* z, int scan ) +{ + stbi__context* s = z->s; + int Lf, p, i, q, h_max = 1, v_max = 1, c; + Lf = stbi__get16be( s ); if ( Lf < 11 ) return stbi__err( "bad SOF len", "Corrupt JPEG" ); // JPEG + p = stbi__get8( s ); if ( p != 8 ) return stbi__err( "only 8-bit", "JPEG format not supported: 8-bit only" ); // JPEG baseline + s->img_y = stbi__get16be( s ); if ( s->img_y == 0 ) return stbi__err( "no header height", "JPEG format not supported: delayed height" ); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be( s ); if ( s->img_x == 0 ) return stbi__err( "0 width", "Corrupt JPEG" ); // JPEG requires + c = stbi__get8( s ); + if ( c != 3 && c != 1 && c != 4 ) return stbi__err( "bad component count", "Corrupt JPEG" ); + s->img_n = c; + for ( i = 0; i < c; ++i ) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if ( Lf != 8 + 3 * s->img_n ) return stbi__err( "bad SOF len", "Corrupt JPEG" ); + + z->rgb = 0; + for ( i = 0; i < s->img_n; ++i ) { + static const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8( s ); + if ( s->img_n == 3 && z->img_comp[i].id == rgb[i] ) + ++z->rgb; + q = stbi__get8( s ); + z->img_comp[i].h = ( q >> 4 ); if ( !z->img_comp[i].h || z->img_comp[i].h > 4 ) return stbi__err( "bad H", "Corrupt JPEG" ); + z->img_comp[i].v = q & 15; if ( !z->img_comp[i].v || z->img_comp[i].v > 4 ) return stbi__err( "bad V", "Corrupt JPEG" ); + z->img_comp[i].tq = stbi__get8( s ); if ( z->img_comp[i].tq > 3 ) return stbi__err( "bad TQ", "Corrupt JPEG" ); + } + + if ( scan != STBI__SCAN_load ) return 1; + + if ( !stbi__mad3sizes_valid( s->img_x, s->img_y, s->img_n, 0 ) ) return stbi__err( "too large", "Image too large to decode" ); + + for ( i = 0; i < s->img_n; ++i ) { + if ( z->img_comp[i].h > h_max ) h_max = z->img_comp[i].h; + if ( z->img_comp[i].v > v_max ) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + // these sizes can't be more than 17 bits + z->img_mcu_x = ( s->img_x + z->img_mcu_w - 1 ) / z->img_mcu_w; + z->img_mcu_y = ( s->img_y + z->img_mcu_h - 1 ) / z->img_mcu_h; + + for ( i = 0; i < s->img_n; ++i ) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = ( s->img_x * z->img_comp[i].h + h_max - 1 ) / h_max; + z->img_comp[i].y = ( s->img_y * z->img_comp[i].v + v_max - 1 ) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2( z->img_comp[i].w2, z->img_comp[i].h2, 15 ); + if ( z->img_comp[i].raw_data == NULL ) + return stbi__free_jpeg_components( z, i + 1, stbi__err( "outofmem", "Out of memory" ) ); + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*)( ( (size_t)z->img_comp[i].raw_data + 15 ) & ~15 ); + if ( z->progressive ) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3( z->img_comp[i].w2, z->img_comp[i].h2, sizeof( short ), 15 ); + if ( z->img_comp[i].raw_coeff == NULL ) + return stbi__free_jpeg_components( z, i + 1, stbi__err( "outofmem", "Out of memory" ) ); + z->img_comp[i].coeff = (short*)( ( (size_t)z->img_comp[i].raw_coeff + 15 ) & ~15 ); + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header( stbi__jpeg* z, int scan ) +{ + int m; + z->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker( z ); + if ( !stbi__SOI( m ) ) return stbi__err( "no SOI", "Corrupt JPEG" ); + if ( scan == STBI__SCAN_type ) return 1; + m = stbi__get_marker( z ); + while ( !stbi__SOF( m ) ) { + if ( !stbi__process_marker( z, m ) ) return 0; + m = stbi__get_marker( z ); + while ( m == STBI__MARKER_none ) { + // some files have extra padding after their blocks, so ok, we'll scan + if ( stbi__at_eof( z->s ) ) return stbi__err( "no SOF", "Corrupt JPEG" ); + m = stbi__get_marker( z ); + } + } + z->progressive = stbi__SOF_progressive( m ); + if ( !stbi__process_frame_header( z, scan ) ) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image( stbi__jpeg* j ) +{ + int m; + for ( m = 0; m < 4; m++ ) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if ( !stbi__decode_jpeg_header( j, STBI__SCAN_load ) ) return 0; + m = stbi__get_marker( j ); + while ( !stbi__EOI( m ) ) { + if ( stbi__SOS( m ) ) { + if ( !stbi__process_scan_header( j ) ) return 0; + if ( !stbi__parse_entropy_coded_data( j ) ) return 0; + if ( j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while ( !stbi__at_eof( j->s ) ) { + int x = stbi__get8( j->s ); + if ( x == 255 ) { + j->marker = stbi__get8( j->s ); + break; + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } + else if ( stbi__DNL( m ) ) { + int Ld = stbi__get16be( j->s ); + stbi__uint32 NL = stbi__get16be( j->s ); + if ( Ld != 4 ) return stbi__err( "bad DNL len", "Corrupt JPEG" ); + if ( NL != j->s->img_y ) return stbi__err( "bad DNL height", "Corrupt JPEG" ); + } + else { + if ( !stbi__process_marker( j, m ) ) return 0; + } + m = stbi__get_marker( j ); + } + if ( j->progressive ) + stbi__jpeg_finish( j ); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc* ( *resample_row_func )( stbi_uc* out, stbi_uc* in0, stbi_uc* in1, + int w, int hs ); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc* resample_row_1( stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far, int w, int hs ) +{ + STBI_NOTUSED( out ); + STBI_NOTUSED( in_far ); + STBI_NOTUSED( w ); + STBI_NOTUSED( hs ); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2( stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far, int w, int hs ) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED( hs ); + for ( i = 0; i < w; ++i ) + out[i] = stbi__div4( 3 * in_near[i] + in_far[i] + 2 ); + return out; +} + +static stbi_uc* stbi__resample_row_h_2( stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far, int w, int hs ) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc* input = in_near; + + if ( w == 1 ) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4( input[0] * 3 + input[1] + 2 ); + for ( i = 1; i < w - 1; ++i ) { + int n = 3 * input[i] + 2; + out[i * 2 + 0] = stbi__div4( n + input[i - 1] ); + out[i * 2 + 1] = stbi__div4( n + input[i + 1] ); + } + out[i * 2 + 0] = stbi__div4( input[w - 2] * 3 + input[w - 1] + 2 ); + out[i * 2 + 1] = input[w - 1]; + + STBI_NOTUSED( in_far ); + STBI_NOTUSED( hs ); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc* stbi__resample_row_hv_2( stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far, int w, int hs ) +{ + // need to generate 2x2 samples for every one in input + int i, t0, t1; + if ( w == 1 ) { + out[0] = out[1] = stbi__div4( 3 * in_near[0] + in_far[0] + 2 ); + return out; + } + + t1 = 3 * in_near[0] + in_far[0]; + out[0] = stbi__div4( t1 + 2 ); + for ( i = 1; i < w; ++i ) { + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2 - 1] = stbi__div16( 3 * t0 + t1 + 8 ); + out[i * 2] = stbi__div16( 3 * t1 + t0 + 8 ); + } + out[w * 2 - 1] = stbi__div4( t1 + 2 ); + + STBI_NOTUSED( hs ); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc* stbi__resample_row_hv_2_simd( stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far, int w, int hs ) +{ + // need to generate 2x2 samples for every one in input + int i = 0, t0, t1; + + if ( w == 1 ) { + out[0] = out[1] = stbi__div4( 3 * in_near[0] + in_far[0] + 2 ); + return out; + } + + t1 = 3 * in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for ( ; i < ( ( w - 1 ) & ~7 ); i += 8 ) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64( ( __m128i* ) ( in_far + i ) ); + __m128i nearb = _mm_loadl_epi64( ( __m128i* ) ( in_near + i ) ); + __m128i farw = _mm_unpacklo_epi8( farb, zero ); + __m128i nearw = _mm_unpacklo_epi8( nearb, zero ); + __m128i diff = _mm_sub_epi16( farw, nearw ); + __m128i nears = _mm_slli_epi16( nearw, 2 ); + __m128i curr = _mm_add_epi16( nears, diff ); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128( curr, 2 ); + __m128i nxt0 = _mm_srli_si128( curr, 2 ); + __m128i prev = _mm_insert_epi16( prv0, t1, 0 ); + __m128i next = _mm_insert_epi16( nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7 ); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16( 8 ); + __m128i curs = _mm_slli_epi16( curr, 2 ); + __m128i prvd = _mm_sub_epi16( prev, curr ); + __m128i nxtd = _mm_sub_epi16( next, curr ); + __m128i curb = _mm_add_epi16( curs, bias ); + __m128i even = _mm_add_epi16( prvd, curb ); + __m128i odd = _mm_add_epi16( nxtd, curb ); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16( even, odd ); + __m128i int1 = _mm_unpackhi_epi16( even, odd ); + __m128i de0 = _mm_srli_epi16( int0, 4 ); + __m128i de1 = _mm_srli_epi16( int1, 4 ); + + // pack and write output + __m128i outv = _mm_packus_epi16( de0, de1 ); + _mm_storeu_si128( ( __m128i* ) ( out + i * 2 ), outv ); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8( in_far + i ); + uint8x8_t nearb = vld1_u8( in_near + i ); + int16x8_t diff = vreinterpretq_s16_u16( vsubl_u8( farb, nearb ) ); + int16x8_t nears = vreinterpretq_s16_u16( vshll_n_u8( nearb, 2 ) ); + int16x8_t curr = vaddq_s16( nears, diff ); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16( curr, curr, 7 ); + int16x8_t nxt0 = vextq_s16( curr, curr, 1 ); + int16x8_t prev = vsetq_lane_s16( t1, prv0, 0 ); + int16x8_t next = vsetq_lane_s16( 3 * in_near[i + 8] + in_far[i + 8], nxt0, 7 ); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16( curr, 2 ); + int16x8_t prvd = vsubq_s16( prev, curr ); + int16x8_t nxtd = vsubq_s16( next, curr ); + int16x8_t even = vaddq_s16( curs, prvd ); + int16x8_t odd = vaddq_s16( curs, nxtd ); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16( even, 4 ); + o.val[1] = vqrshrun_n_s16( odd, 4 ); + vst2_u8( out + i * 2, o ); +#endif + + // "previous" value for next iter + t1 = 3 * in_near[i + 7] + in_far[i + 7]; + } + + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2] = stbi__div16( 3 * t1 + t0 + 8 ); + + for ( ++i; i < w; ++i ) { + t0 = t1; + t1 = 3 * in_near[i] + in_far[i]; + out[i * 2 - 1] = stbi__div16( 3 * t0 + t1 + 8 ); + out[i * 2] = stbi__div16( 3 * t1 + t0 + 8 ); + } + out[w * 2 - 1] = stbi__div4( t1 + 2 ); + + STBI_NOTUSED( hs ); + + return out; +} +#endif + +static stbi_uc* stbi__resample_row_generic( stbi_uc* out, stbi_uc* in_near, stbi_uc* in_far, int w, int hs ) +{ + // resample with nearest-neighbor + int i, j; + STBI_NOTUSED( in_far ); + for ( i = 0; i < w; ++i ) + for ( j = 0; j < hs; ++j ) + out[i * hs + j] = in_near[i]; + return out; +} + +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static void stbi__YCbCr_to_RGB_row( stbi_uc* out, const stbi_uc* y, const stbi_uc* pcb, const stbi_uc* pcr, int count, int step ) +{ + int i; + for ( i = 0; i < count; ++i ) { + int y_fixed = ( y[i] << 20 ) + ( 1 << 19 ); // rounding + int r, g, b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr * stbi__float2fixed( 1.40200f ); + g = y_fixed + ( cr * -stbi__float2fixed( 0.71414f ) ) + ( ( cb * -stbi__float2fixed( 0.34414f ) ) & 0xffff0000 ); + b = y_fixed + cb * stbi__float2fixed( 1.77200f ); + r >>= 20; + g >>= 20; + b >>= 20; + if ( (unsigned)r > 255 ) { if ( r < 0 ) r = 0; else r = 255; } + if ( (unsigned)g > 255 ) { if ( g < 0 ) g = 0; else g = 255; } + if ( (unsigned)b > 255 ) { if ( b < 0 ) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static void stbi__YCbCr_to_RGB_simd( stbi_uc* out, stbi_uc const* y, stbi_uc const* pcb, stbi_uc const* pcr, int count, int step ) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if ( step == 4 ) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8( -0x80 ); + __m128i cr_const0 = _mm_set1_epi16( (short)( 1.40200f * 4096.0f + 0.5f ) ); + __m128i cr_const1 = _mm_set1_epi16( -(short)( 0.71414f * 4096.0f + 0.5f ) ); + __m128i cb_const0 = _mm_set1_epi16( -(short)( 0.34414f * 4096.0f + 0.5f ) ); + __m128i cb_const1 = _mm_set1_epi16( (short)( 1.77200f * 4096.0f + 0.5f ) ); + __m128i y_bias = _mm_set1_epi8( (char)(unsigned char)128 ); + __m128i xw = _mm_set1_epi16( 255 ); // alpha channel + + for ( ; i + 7 < count; i += 8 ) { + // load + __m128i y_bytes = _mm_loadl_epi64( ( __m128i* ) ( y + i ) ); + __m128i cr_bytes = _mm_loadl_epi64( ( __m128i* ) ( pcr + i ) ); + __m128i cb_bytes = _mm_loadl_epi64( ( __m128i* ) ( pcb + i ) ); + __m128i cr_biased = _mm_xor_si128( cr_bytes, signflip ); // -128 + __m128i cb_biased = _mm_xor_si128( cb_bytes, signflip ); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8( y_bias, y_bytes ); + __m128i crw = _mm_unpacklo_epi8( _mm_setzero_si128(), cr_biased ); + __m128i cbw = _mm_unpacklo_epi8( _mm_setzero_si128(), cb_biased ); + + // color transform + __m128i yws = _mm_srli_epi16( yw, 4 ); + __m128i cr0 = _mm_mulhi_epi16( cr_const0, crw ); + __m128i cb0 = _mm_mulhi_epi16( cb_const0, cbw ); + __m128i cb1 = _mm_mulhi_epi16( cbw, cb_const1 ); + __m128i cr1 = _mm_mulhi_epi16( crw, cr_const1 ); + __m128i rws = _mm_add_epi16( cr0, yws ); + __m128i gwt = _mm_add_epi16( cb0, yws ); + __m128i bws = _mm_add_epi16( yws, cb1 ); + __m128i gws = _mm_add_epi16( gwt, cr1 ); + + // descale + __m128i rw = _mm_srai_epi16( rws, 4 ); + __m128i bw = _mm_srai_epi16( bws, 4 ); + __m128i gw = _mm_srai_epi16( gws, 4 ); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16( rw, bw ); + __m128i gxb = _mm_packus_epi16( gw, xw ); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8( brb, gxb ); + __m128i t1 = _mm_unpackhi_epi8( brb, gxb ); + __m128i o0 = _mm_unpacklo_epi16( t0, t1 ); + __m128i o1 = _mm_unpackhi_epi16( t0, t1 ); + + // store + _mm_storeu_si128( ( __m128i* ) ( out + 0 ), o0 ); + _mm_storeu_si128( ( __m128i* ) ( out + 16 ), o1 ); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if ( step == 4 ) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8( 0x80 ); + int16x8_t cr_const0 = vdupq_n_s16( (short)( 1.40200f * 4096.0f + 0.5f ) ); + int16x8_t cr_const1 = vdupq_n_s16( -(short)( 0.71414f * 4096.0f + 0.5f ) ); + int16x8_t cb_const0 = vdupq_n_s16( -(short)( 0.34414f * 4096.0f + 0.5f ) ); + int16x8_t cb_const1 = vdupq_n_s16( (short)( 1.77200f * 4096.0f + 0.5f ) ); + + for ( ; i + 7 < count; i += 8 ) { + // load + uint8x8_t y_bytes = vld1_u8( y + i ); + uint8x8_t cr_bytes = vld1_u8( pcr + i ); + uint8x8_t cb_bytes = vld1_u8( pcb + i ); + int8x8_t cr_biased = vreinterpret_s8_u8( vsub_u8( cr_bytes, signflip ) ); + int8x8_t cb_biased = vreinterpret_s8_u8( vsub_u8( cb_bytes, signflip ) ); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16( vshll_n_u8( y_bytes, 4 ) ); + int16x8_t crw = vshll_n_s8( cr_biased, 7 ); + int16x8_t cbw = vshll_n_s8( cb_biased, 7 ); + + // color transform + int16x8_t cr0 = vqdmulhq_s16( crw, cr_const0 ); + int16x8_t cb0 = vqdmulhq_s16( cbw, cb_const0 ); + int16x8_t cr1 = vqdmulhq_s16( crw, cr_const1 ); + int16x8_t cb1 = vqdmulhq_s16( cbw, cb_const1 ); + int16x8_t rws = vaddq_s16( yws, cr0 ); + int16x8_t gws = vaddq_s16( vaddq_s16( yws, cb0 ), cr1 ); + int16x8_t bws = vaddq_s16( yws, cb1 ); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16( rws, 4 ); + o.val[1] = vqrshrun_n_s16( gws, 4 ); + o.val[2] = vqrshrun_n_s16( bws, 4 ); + o.val[3] = vdup_n_u8( 255 ); + + // store, interleaving r/g/b/a + vst4_u8( out, o ); + out += 8 * 4; + } + } +#endif + + for ( ; i < count; ++i ) { + int y_fixed = ( y[i] << 20 ) + ( 1 << 19 ); // rounding + int r, g, b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr * stbi__float2fixed( 1.40200f ); + g = y_fixed + cr * -stbi__float2fixed( 0.71414f ) + ( ( cb * -stbi__float2fixed( 0.34414f ) ) & 0xffff0000 ); + b = y_fixed + cb * stbi__float2fixed( 1.77200f ); + r >>= 20; + g >>= 20; + b >>= 20; + if ( (unsigned)r > 255 ) { if ( r < 0 ) r = 0; else r = 255; } + if ( (unsigned)g > 255 ) { if ( g < 0 ) g = 0; else g = 255; } + if ( (unsigned)b > 255 ) { if ( b < 0 ) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg( stbi__jpeg* j ) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if ( stbi__sse2_available() ) { + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg( stbi__jpeg* j ) +{ + stbi__free_jpeg_components( j, j->s->img_n, 0 ); +} + +typedef struct +{ + resample_row_func resample; + stbi_uc* line0, * line1; + int hs, vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8( stbi_uc x, stbi_uc y ) +{ + unsigned int t = x * y + 128; + return (stbi_uc)( ( t + ( t >> 8 ) ) >> 8 ); +} + +static stbi_uc* load_jpeg_image( stbi__jpeg* z, int* out_x, int* out_y, int* comp, int req_comp ) +{ + int n, decode_n, is_rgb; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if ( req_comp < 0 || req_comp > 4 ) return stbi__errpuc( "bad req_comp", "Internal error" ); + + // load a jpeg image from whichever source, but leave in YCbCr format + if ( !stbi__decode_jpeg_image( z ) ) { stbi__cleanup_jpeg( z ); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && ( z->rgb == 3 || ( z->app14_color_transform == 0 && !z->jfif ) ); + + if ( z->s->img_n == 3 && n < 3 && !is_rgb ) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i, j; + stbi_uc* output; + stbi_uc* coutput[4] = { NULL, NULL, NULL, NULL }; + + stbi__resample res_comp[4]; + + for ( k = 0; k < decode_n; ++k ) { + stbi__resample* r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc*)stbi__malloc( z->s->img_x + 3 ); + if ( !z->img_comp[k].linebuf ) { stbi__cleanup_jpeg( z ); return stbi__errpuc( "outofmem", "Out of memory" ); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = ( z->s->img_x + r->hs - 1 ) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if ( r->hs == 1 && r->vs == 1 ) r->resample = resample_row_1; + else if ( r->hs == 1 && r->vs == 2 ) r->resample = stbi__resample_row_v_2; + else if ( r->hs == 2 && r->vs == 1 ) r->resample = stbi__resample_row_h_2; + else if ( r->hs == 2 && r->vs == 2 ) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc*)stbi__malloc_mad3( n, z->s->img_x, z->s->img_y, 1 ); + if ( !output ) { stbi__cleanup_jpeg( z ); return stbi__errpuc( "outofmem", "Out of memory" ); } + + // now go ahead and resample + for ( j = 0; j < z->s->img_y; ++j ) { + stbi_uc* out = output + n * z->s->img_x * j; + for ( k = 0; k < decode_n; ++k ) { + stbi__resample* r = &res_comp[k]; + int y_bot = r->ystep >= ( r->vs >> 1 ); + coutput[k] = r->resample( z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs ); + if ( ++r->ystep >= r->vs ) { + r->ystep = 0; + r->line0 = r->line1; + if ( ++r->ypos < z->img_comp[k].y ) + r->line1 += z->img_comp[k].w2; + } + } + if ( n >= 3 ) { + stbi_uc* y = coutput[0]; + if ( z->s->img_n == 3 ) { + if ( is_rgb ) { + for ( i = 0; i < z->s->img_x; ++i ) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } + else { + z->YCbCr_to_RGB_kernel( out, y, coutput[1], coutput[2], z->s->img_x, n ); + } + } + else if ( z->s->img_n == 4 ) { + if ( z->app14_color_transform == 0 ) { // CMYK + for ( i = 0; i < z->s->img_x; ++i ) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8( coutput[0][i], m ); + out[1] = stbi__blinn_8x8( coutput[1][i], m ); + out[2] = stbi__blinn_8x8( coutput[2][i], m ); + out[3] = 255; + out += n; + } + } + else if ( z->app14_color_transform == 2 ) { // YCCK + z->YCbCr_to_RGB_kernel( out, y, coutput[1], coutput[2], z->s->img_x, n ); + for ( i = 0; i < z->s->img_x; ++i ) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8( 255 - out[0], m ); + out[1] = stbi__blinn_8x8( 255 - out[1], m ); + out[2] = stbi__blinn_8x8( 255 - out[2], m ); + out += n; + } + } + else { // YCbCr + alpha? Ignore the fourth channel for now + z->YCbCr_to_RGB_kernel( out, y, coutput[1], coutput[2], z->s->img_x, n ); + } + } + else + for ( i = 0; i < z->s->img_x; ++i ) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } + else { + if ( is_rgb ) { + if ( n == 1 ) + for ( i = 0; i < z->s->img_x; ++i ) + * out++ = stbi__compute_y( coutput[0][i], coutput[1][i], coutput[2][i] ); + else { + for ( i = 0; i < z->s->img_x; ++i, out += 2 ) { + out[0] = stbi__compute_y( coutput[0][i], coutput[1][i], coutput[2][i] ); + out[1] = 255; + } + } + } + else if ( z->s->img_n == 4 && z->app14_color_transform == 0 ) { + for ( i = 0; i < z->s->img_x; ++i ) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8( coutput[0][i], m ); + stbi_uc g = stbi__blinn_8x8( coutput[1][i], m ); + stbi_uc b = stbi__blinn_8x8( coutput[2][i], m ); + out[0] = stbi__compute_y( r, g, b ); + out[1] = 255; + out += n; + } + } + else if ( z->s->img_n == 4 && z->app14_color_transform == 2 ) { + for ( i = 0; i < z->s->img_x; ++i ) { + out[0] = stbi__blinn_8x8( 255 - coutput[0][i], coutput[3][i] ); + out[1] = 255; + out += n; + } + } + else { + stbi_uc* y = coutput[0]; + if ( n == 1 ) + for ( i = 0; i < z->s->img_x; ++i ) out[i] = y[i]; + else + for ( i = 0; i < z->s->img_x; ++i ) { *out++ = y[i]; *out++ = 255; } + } + } + } + stbi__cleanup_jpeg( z ); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if ( comp )* comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void* stbi__jpeg_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc( sizeof( stbi__jpeg ) ); + STBI_NOTUSED( ri ); + j->s = s; + stbi__setup_jpeg( j ); + result = load_jpeg_image( j, x, y, comp, req_comp ); + STBI_FREE( j ); + return result; +} + +static int stbi__jpeg_test( stbi__context* s ) +{ + int r; + stbi__jpeg* j = (stbi__jpeg*)stbi__malloc( sizeof( stbi__jpeg ) ); + j->s = s; + stbi__setup_jpeg( j ); + r = stbi__decode_jpeg_header( j, STBI__SCAN_type ); + stbi__rewind( s ); + STBI_FREE( j ); + return r; +} + +static int stbi__jpeg_info_raw( stbi__jpeg* j, int* x, int* y, int* comp ) +{ + if ( !stbi__decode_jpeg_header( j, STBI__SCAN_header ) ) { + stbi__rewind( j->s ); + return 0; + } + if ( x )* x = j->s->img_x; + if ( y )* y = j->s->img_y; + if ( comp )* comp = j->s->img_n >= 3 ? 3 : 1; + return 1; +} + +static int stbi__jpeg_info( stbi__context* s, int* x, int* y, int* comp ) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*)( stbi__malloc( sizeof( stbi__jpeg ) ) ); + j->s = s; + result = stbi__jpeg_info_raw( j, x, y, comp ); + STBI_FREE( j ); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// fast-way is faster to check than jpeg huffman, but slow way is slower +#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables +#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16( int n ) +{ + n = ( ( n & 0xAAAA ) >> 1 ) | ( ( n & 0x5555 ) << 1 ); + n = ( ( n & 0xCCCC ) >> 2 ) | ( ( n & 0x3333 ) << 2 ); + n = ( ( n & 0xF0F0 ) >> 4 ) | ( ( n & 0x0F0F ) << 4 ); + n = ( ( n & 0xFF00 ) >> 8 ) | ( ( n & 0x00FF ) << 8 ); + return n; +} + +stbi_inline static int stbi__bit_reverse( int v, int bits ) +{ + STBI_ASSERT( bits <= 16 ); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16( v ) >> ( 16 - bits ); +} + +static int stbi__zbuild_huffman( stbi__zhuffman* z, const stbi_uc* sizelist, int num ) +{ + int i, k = 0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset( sizes, 0, sizeof( sizes ) ); + memset( z->fast, 0, sizeof( z->fast ) ); + for ( i = 0; i < num; ++i ) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for ( i = 1; i < 16; ++i ) + if ( sizes[i] > ( 1 << i ) ) + return stbi__err( "bad sizes", "Corrupt PNG" ); + code = 0; + for ( i = 1; i < 16; ++i ) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16)code; + z->firstsymbol[i] = (stbi__uint16)k; + code = ( code + sizes[i] ); + if ( sizes[i] ) + if ( code - 1 >= ( 1 << i ) ) return stbi__err( "bad codelengths", "Corrupt PNG" ); + z->maxcode[i] = code << ( 16 - i ); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for ( i = 0; i < num; ++i ) { + int s = sizelist[i]; + if ( s ) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16)( ( s << 9 ) | i ); + z->size[c] = (stbi_uc)s; + z->value[c] = (stbi__uint16)i; + if ( s <= STBI__ZFAST_BITS ) { + int j = stbi__bit_reverse( next_code[s], s ); + while ( j < ( 1 << STBI__ZFAST_BITS ) ) { + z->fast[j] = fastv; + j += ( 1 << s ); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc* zbuffer, * zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char* zout; + char* zout_start; + char* zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static stbi_uc stbi__zget8( stbi__zbuf* z ) +{ + if ( z->zbuffer >= z->zbuffer_end ) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits( stbi__zbuf* z ) +{ + do { + STBI_ASSERT( z->code_buffer < ( 1U << z->num_bits ) ); + z->code_buffer |= (unsigned int)stbi__zget8( z ) << z->num_bits; + z->num_bits += 8; + } while ( z->num_bits <= 24 ); +} + +stbi_inline static unsigned int stbi__zreceive( stbi__zbuf* z, int n ) +{ + unsigned int k; + if ( z->num_bits < n ) stbi__fill_bits( z ); + k = z->code_buffer & ( ( 1 << n ) - 1 ); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath( stbi__zbuf* a, stbi__zhuffman* z ) +{ + int b, s, k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse( a->code_buffer, 16 ); + for ( s = STBI__ZFAST_BITS + 1; ; ++s ) + if ( k < z->maxcode[s] ) + break; + if ( s == 16 ) return -1; // invalid code! + // code size is s, so: + b = ( k >> ( 16 - s ) ) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT( z->size[b] == s ); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode( stbi__zbuf* a, stbi__zhuffman* z ) +{ + int b, s; + if ( a->num_bits < 16 ) stbi__fill_bits( a ); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if ( b ) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath( a, z ); +} + +static int stbi__zexpand( stbi__zbuf* z, char* zout, int n ) // need to make room for n bytes +{ + char* q; + int cur, limit, old_limit; + z->zout = zout; + if ( !z->z_expandable ) return stbi__err( "output buffer limit", "Corrupt PNG" ); + cur = (int)( z->zout - z->zout_start ); + limit = old_limit = (int)( z->zout_end - z->zout_start ); + while ( cur + n > limit ) + limit *= 2; + q = (char*)STBI_REALLOC_SIZED( z->zout_start, old_limit, limit ); + STBI_NOTUSED( old_limit ); + if ( q == NULL ) return stbi__err( "outofmem", "Out of memory" ); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static const int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static const int stbi__zlength_extra[31] = +{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + +static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0 }; + +static const int stbi__zdist_extra[32] = +{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + +static int stbi__parse_huffman_block( stbi__zbuf* a ) +{ + char* zout = a->zout; + for ( ;;) { + int z = stbi__zhuffman_decode( a, &a->z_length ); + if ( z < 256 ) { + if ( z < 0 ) return stbi__err( "bad huffman code", "Corrupt PNG" ); // error in huffman codes + if ( zout >= a->zout_end ) { + if ( !stbi__zexpand( a, zout, 1 ) ) return 0; + zout = a->zout; + } + *zout++ = (char)z; + } + else { + stbi_uc* p; + int len, dist; + if ( z == 256 ) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if ( stbi__zlength_extra[z] ) len += stbi__zreceive( a, stbi__zlength_extra[z] ); + z = stbi__zhuffman_decode( a, &a->z_distance ); + if ( z < 0 ) return stbi__err( "bad huffman code", "Corrupt PNG" ); + dist = stbi__zdist_base[z]; + if ( stbi__zdist_extra[z] ) dist += stbi__zreceive( a, stbi__zdist_extra[z] ); + if ( zout - a->zout_start < dist ) return stbi__err( "bad dist", "Corrupt PNG" ); + if ( zout + len > a->zout_end ) { + if ( !stbi__zexpand( a, zout, len ) ) return 0; + zout = a->zout; + } + p = (stbi_uc*)( zout - dist ); + if ( dist == 1 ) { // run of one byte; common in images. + stbi_uc v = *p; + if ( len ) { do *zout++ = v; while ( --len ); } + } + else { + if ( len ) { do *zout++ = *p++; while ( --len ); } + } + } + } +} + +static int stbi__compute_huffman_codes( stbi__zbuf* a ) +{ + static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286 + 32 + 137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i, n; + + int hlit = stbi__zreceive( a, 5 ) + 257; + int hdist = stbi__zreceive( a, 5 ) + 1; + int hclen = stbi__zreceive( a, 4 ) + 4; + int ntot = hlit + hdist; + + memset( codelength_sizes, 0, sizeof( codelength_sizes ) ); + for ( i = 0; i < hclen; ++i ) { + int s = stbi__zreceive( a, 3 ); + codelength_sizes[length_dezigzag[i]] = (stbi_uc)s; + } + if ( !stbi__zbuild_huffman( &z_codelength, codelength_sizes, 19 ) ) return 0; + + n = 0; + while ( n < ntot ) { + int c = stbi__zhuffman_decode( a, &z_codelength ); + if ( c < 0 || c >= 19 ) return stbi__err( "bad codelengths", "Corrupt PNG" ); + if ( c < 16 ) + lencodes[n++] = (stbi_uc)c; + else { + stbi_uc fill = 0; + if ( c == 16 ) { + c = stbi__zreceive( a, 2 ) + 3; + if ( n == 0 ) return stbi__err( "bad codelengths", "Corrupt PNG" ); + fill = lencodes[n - 1]; + } + else if ( c == 17 ) + c = stbi__zreceive( a, 3 ) + 3; + else { + STBI_ASSERT( c == 18 ); + c = stbi__zreceive( a, 7 ) + 11; + } + if ( ntot - n < c ) return stbi__err( "bad codelengths", "Corrupt PNG" ); + memset( lencodes + n, fill, c ); + n += c; + } + } + if ( n != ntot ) return stbi__err( "bad codelengths", "Corrupt PNG" ); + if ( !stbi__zbuild_huffman( &a->z_length, lencodes, hlit ) ) return 0; + if ( !stbi__zbuild_huffman( &a->z_distance, lencodes + hlit, hdist ) ) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block( stbi__zbuf* a ) +{ + stbi_uc header[4]; + int len, nlen, k; + if ( a->num_bits & 7 ) + stbi__zreceive( a, a->num_bits & 7 ); // discard + // drain the bit-packed data into header + k = 0; + while ( a->num_bits > 0 ) { + header[k++] = (stbi_uc)( a->code_buffer & 255 ); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT( a->num_bits == 0 ); + // now fill header the normal way + while ( k < 4 ) + header[k++] = stbi__zget8( a ); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if ( nlen != ( len ^ 0xffff ) ) return stbi__err( "zlib corrupt", "Corrupt PNG" ); + if ( a->zbuffer + len > a->zbuffer_end ) return stbi__err( "read past buffer", "Corrupt PNG" ); + if ( a->zout + len > a->zout_end ) + if ( !stbi__zexpand( a, a->zout, len ) ) return 0; + memcpy( a->zout, a->zbuffer, len ); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header( stbi__zbuf* a ) +{ + int cmf = stbi__zget8( a ); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8( a ); + if ( ( cmf * 256 + flg ) % 31 != 0 ) return stbi__err( "bad zlib header", "Corrupt PNG" ); // zlib spec + if ( flg & 32 ) return stbi__err( "no preset dict", "Corrupt PNG" ); // preset dictionary not allowed in png + if ( cm != 8 ) return stbi__err( "bad compression", "Corrupt PNG" ); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +static const stbi_uc stbi__zdefault_length[288] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} +*/ + +static int stbi__parse_zlib( stbi__zbuf* a, int parse_header ) +{ + int final, type; + if ( parse_header ) + if ( !stbi__parse_zlib_header( a ) ) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive( a, 1 ); + type = stbi__zreceive( a, 2 ); + if ( type == 0 ) { + if ( !stbi__parse_uncompressed_block( a ) ) return 0; + } + else if ( type == 3 ) { + return 0; + } + else { + if ( type == 1 ) { + // use fixed code lengths + if ( !stbi__zbuild_huffman( &a->z_length, stbi__zdefault_length, 288 ) ) return 0; + if ( !stbi__zbuild_huffman( &a->z_distance, stbi__zdefault_distance, 32 ) ) return 0; + } + else { + if ( !stbi__compute_huffman_codes( a ) ) return 0; + } + if ( !stbi__parse_huffman_block( a ) ) return 0; + } + } while ( !final ); + return 1; +} + +static int stbi__do_zlib( stbi__zbuf* a, char* obuf, int olen, int exp, int parse_header ) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib( a, parse_header ); +} + +STBIDEF char* stbi_zlib_decode_malloc_guesssize( const char* buffer, int len, int initial_size, int* outlen ) +{ + stbi__zbuf a; + char* p = (char*)stbi__malloc( initial_size ); + if ( p == NULL ) return NULL; + a.zbuffer = (stbi_uc*)buffer; + a.zbuffer_end = (stbi_uc*)buffer + len; + if ( stbi__do_zlib( &a, p, initial_size, 1, 1 ) ) { + if ( outlen )* outlen = (int)( a.zout - a.zout_start ); + return a.zout_start; + } + else { + STBI_FREE( a.zout_start ); + return NULL; + } +} + +STBIDEF char* stbi_zlib_decode_malloc( char const* buffer, int len, int* outlen ) +{ + return stbi_zlib_decode_malloc_guesssize( buffer, len, 16384, outlen ); +} + +STBIDEF char* stbi_zlib_decode_malloc_guesssize_headerflag( const char* buffer, int len, int initial_size, int* outlen, int parse_header ) +{ + stbi__zbuf a; + char* p = (char*)stbi__malloc( initial_size ); + if ( p == NULL ) return NULL; + a.zbuffer = (stbi_uc*)buffer; + a.zbuffer_end = (stbi_uc*)buffer + len; + if ( stbi__do_zlib( &a, p, initial_size, 1, parse_header ) ) { + if ( outlen )* outlen = (int)( a.zout - a.zout_start ); + return a.zout_start; + } + else { + STBI_FREE( a.zout_start ); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer( char* obuffer, int olen, char const* ibuffer, int ilen ) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc*)ibuffer; + a.zbuffer_end = (stbi_uc*)ibuffer + ilen; + if ( stbi__do_zlib( &a, obuffer, olen, 0, 1 ) ) + return (int)( a.zout - a.zout_start ); + else + return -1; +} + +STBIDEF char* stbi_zlib_decode_noheader_malloc( char const* buffer, int len, int* outlen ) +{ + stbi__zbuf a; + char* p = (char*)stbi__malloc( 16384 ); + if ( p == NULL ) return NULL; + a.zbuffer = (stbi_uc*)buffer; + a.zbuffer_end = (stbi_uc*)buffer + len; + if ( stbi__do_zlib( &a, p, 16384, 1, 0 ) ) { + if ( outlen )* outlen = (int)( a.zout - a.zout_start ); + return a.zout_start; + } + else { + STBI_FREE( a.zout_start ); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer( char* obuffer, int olen, const char* ibuffer, int ilen ) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc*)ibuffer; + a.zbuffer_end = (stbi_uc*)ibuffer + ilen; + if ( stbi__do_zlib( &a, obuffer, olen, 0, 0 ) ) + return (int)( a.zout - a.zout_start ); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header( stbi__context* s ) +{ + stbi__pngchunk c; + c.length = stbi__get32be( s ); + c.type = stbi__get32be( s ); + return c; +} + +static int stbi__check_png_header( stbi__context* s ) +{ + static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for ( i = 0; i < 8; ++i ) + if ( stbi__get8( s ) != png_sig[i] ) return stbi__err( "bad png sig", "Not a PNG" ); + return 1; +} + +typedef struct +{ + stbi__context* s; + stbi_uc* idata, * expanded, * out; + int depth; +} stbi__png; + + +enum { + STBI__F_none = 0, + STBI__F_sub = 1, + STBI__F_up = 2, + STBI__F_avg = 3, + STBI__F_paeth = 4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth( int a, int b, int c ) +{ + int p = a + b - c; + int pa = abs( p - a ); + int pb = abs( p - b ); + int pc = abs( p - c ); + if ( pa <= pb && pa <= pc ) return a; + if ( pb <= pc ) return b; + return c; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw( stbi__png* a, stbi_uc* raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color ) +{ + int bytes = ( depth == 16 ? 2 : 1 ); + stbi__context* s = a->s; + stbi__uint32 i, j, stride = x * out_n * bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n * bytes; + int filter_bytes = img_n * bytes; + int width = x; + + STBI_ASSERT( out_n == s->img_n || out_n == s->img_n + 1 ); + a->out = (stbi_uc*)stbi__malloc_mad3( x, y, output_bytes, 0 ); // extra bytes to write off the end into + if ( !a->out ) return stbi__err( "outofmem", "Out of memory" ); + + if ( !stbi__mad3sizes_valid( img_n, x, depth, 7 ) ) return stbi__err( "too large", "Corrupt PNG" ); + img_width_bytes = ( ( ( img_n * x * depth ) + 7 ) >> 3 ); + img_len = ( img_width_bytes + 1 ) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if ( raw_len < img_len ) return stbi__err( "not enough pixels", "Corrupt PNG" ); + + for ( j = 0; j < y; ++j ) { + stbi_uc* cur = a->out + stride * j; + stbi_uc* prior; + int filter = *raw++; + + if ( filter > 4 ) + return stbi__err( "invalid filter", "Corrupt PNG" ); + + if ( depth < 8 ) { + STBI_ASSERT( img_width_bytes <= x ); + cur += x * out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if ( j == 0 ) filter = first_row_filter[filter]; + + // handle first byte explicitly + for ( k = 0; k < filter_bytes; ++k ) { + switch ( filter ) { + case STBI__F_none: cur[k] = raw[k]; break; + case STBI__F_sub: cur[k] = raw[k]; break; + case STBI__F_up: cur[k] = STBI__BYTECAST( raw[k] + prior[k] ); break; + case STBI__F_avg: cur[k] = STBI__BYTECAST( raw[k] + ( prior[k] >> 1 ) ); break; + case STBI__F_paeth: cur[k] = STBI__BYTECAST( raw[k] + stbi__paeth( 0, prior[k], 0 ) ); break; + case STBI__F_avg_first: cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if ( depth == 8 ) { + if ( img_n != out_n ) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } + else if ( depth == 16 ) { + if ( img_n != out_n ) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes + 1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } + else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if ( depth < 8 || img_n == out_n ) { + int nk = ( width - 1 ) * filter_bytes; +#define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch ( filter ) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy( cur, raw, nk ); break; + STBI__CASE( STBI__F_sub ) { cur[k] = STBI__BYTECAST( raw[k] + cur[k - filter_bytes] ); } break; + STBI__CASE( STBI__F_up ) { cur[k] = STBI__BYTECAST( raw[k] + prior[k] ); } break; + STBI__CASE( STBI__F_avg ) { cur[k] = STBI__BYTECAST( raw[k] + ( ( prior[k] + cur[k - filter_bytes] ) >> 1 ) ); } break; + STBI__CASE( STBI__F_paeth ) { cur[k] = STBI__BYTECAST( raw[k] + stbi__paeth( cur[k - filter_bytes], prior[k], prior[k - filter_bytes] ) ); } break; + STBI__CASE( STBI__F_avg_first ) { cur[k] = STBI__BYTECAST( raw[k] + ( cur[k - filter_bytes] >> 1 ) ); } break; + STBI__CASE( STBI__F_paeth_first ) { cur[k] = STBI__BYTECAST( raw[k] + stbi__paeth( cur[k - filter_bytes], 0, 0 ) ); } break; + } +#undef STBI__CASE + raw += nk; + } + else { + STBI_ASSERT( img_n + 1 == out_n ); +#define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch ( filter ) { + STBI__CASE( STBI__F_none ) { cur[k] = raw[k]; } break; + STBI__CASE( STBI__F_sub ) { cur[k] = STBI__BYTECAST( raw[k] + cur[k - output_bytes] ); } break; + STBI__CASE( STBI__F_up ) { cur[k] = STBI__BYTECAST( raw[k] + prior[k] ); } break; + STBI__CASE( STBI__F_avg ) { cur[k] = STBI__BYTECAST( raw[k] + ( ( prior[k] + cur[k - output_bytes] ) >> 1 ) ); } break; + STBI__CASE( STBI__F_paeth ) { cur[k] = STBI__BYTECAST( raw[k] + stbi__paeth( cur[k - output_bytes], prior[k], prior[k - output_bytes] ) ); } break; + STBI__CASE( STBI__F_avg_first ) { cur[k] = STBI__BYTECAST( raw[k] + ( cur[k - output_bytes] >> 1 ) ); } break; + STBI__CASE( STBI__F_paeth_first ) { cur[k] = STBI__BYTECAST( raw[k] + stbi__paeth( cur[k - output_bytes], 0, 0 ) ); } break; + } +#undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if ( depth == 16 ) { + cur = a->out + stride * j; // start at the beginning of the row again + for ( i = 0; i < x; ++i, cur += output_bytes ) { + cur[filter_bytes + 1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if ( depth < 8 ) { + for ( j = 0; j < y; ++j ) { + stbi_uc* cur = a->out + stride * j; + stbi_uc* in = a->out + stride * j + x * out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = ( color == 0 ) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if ( depth == 4 ) { + for ( k = x * img_n; k >= 2; k -= 2, ++in ) { + *cur++ = scale * ( ( *in >> 4 ) ); + *cur++ = scale * ( ( *in ) & 0x0f ); + } + if ( k > 0 )* cur++ = scale * ( ( *in >> 4 ) ); + } + else if ( depth == 2 ) { + for ( k = x * img_n; k >= 4; k -= 4, ++in ) { + *cur++ = scale * ( ( *in >> 6 ) ); + *cur++ = scale * ( ( *in >> 4 ) & 0x03 ); + *cur++ = scale * ( ( *in >> 2 ) & 0x03 ); + *cur++ = scale * ( ( *in ) & 0x03 ); + } + if ( k > 0 )* cur++ = scale * ( ( *in >> 6 ) ); + if ( k > 1 )* cur++ = scale * ( ( *in >> 4 ) & 0x03 ); + if ( k > 2 )* cur++ = scale * ( ( *in >> 2 ) & 0x03 ); + } + else if ( depth == 1 ) { + for ( k = x * img_n; k >= 8; k -= 8, ++in ) { + *cur++ = scale * ( ( *in >> 7 ) ); + *cur++ = scale * ( ( *in >> 6 ) & 0x01 ); + *cur++ = scale * ( ( *in >> 5 ) & 0x01 ); + *cur++ = scale * ( ( *in >> 4 ) & 0x01 ); + *cur++ = scale * ( ( *in >> 3 ) & 0x01 ); + *cur++ = scale * ( ( *in >> 2 ) & 0x01 ); + *cur++ = scale * ( ( *in >> 1 ) & 0x01 ); + *cur++ = scale * ( ( *in ) & 0x01 ); + } + if ( k > 0 )* cur++ = scale * ( ( *in >> 7 ) ); + if ( k > 1 )* cur++ = scale * ( ( *in >> 6 ) & 0x01 ); + if ( k > 2 )* cur++ = scale * ( ( *in >> 5 ) & 0x01 ); + if ( k > 3 )* cur++ = scale * ( ( *in >> 4 ) & 0x01 ); + if ( k > 4 )* cur++ = scale * ( ( *in >> 3 ) & 0x01 ); + if ( k > 5 )* cur++ = scale * ( ( *in >> 2 ) & 0x01 ); + if ( k > 6 )* cur++ = scale * ( ( *in >> 1 ) & 0x01 ); + } + if ( img_n != out_n ) { + int q; + // insert alpha = 255 + cur = a->out + stride * j; + if ( img_n == 1 ) { + for ( q = x - 1; q >= 0; --q ) { + cur[q * 2 + 1] = 255; + cur[q * 2 + 0] = cur[q]; + } + } + else { + STBI_ASSERT( img_n == 3 ); + for ( q = x - 1; q >= 0; --q ) { + cur[q * 4 + 3] = 255; + cur[q * 4 + 2] = cur[q * 3 + 2]; + cur[q * 4 + 1] = cur[q * 3 + 1]; + cur[q * 4 + 0] = cur[q * 3 + 0]; + } + } + } + } + } + else if ( depth == 16 ) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc* cur = a->out; + stbi__uint16* cur16 = (stbi__uint16*)cur; + + for ( i = 0; i < x * y * out_n; ++i, cur16++, cur += 2 ) { + *cur16 = ( cur[0] << 8 ) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image( stbi__png* a, stbi_uc* image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced ) +{ + int bytes = ( depth == 16 ? 2 : 1 ); + int out_bytes = out_n * bytes; + stbi_uc* final; + int p; + if ( !interlaced ) + return stbi__create_png_image_raw( a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color ); + + // de-interlacing + final = (stbi_uc*)stbi__malloc_mad3( a->s->img_x, a->s->img_y, out_bytes, 0 ); + for ( p = 0; p < 7; ++p ) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i, j, x, y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = ( a->s->img_x - xorig[p] + xspc[p] - 1 ) / xspc[p]; + y = ( a->s->img_y - yorig[p] + yspc[p] - 1 ) / yspc[p]; + if ( x && y ) { + stbi__uint32 img_len = ( ( ( ( a->s->img_n * x * depth ) + 7 ) >> 3 ) + 1 ) * y; + if ( !stbi__create_png_image_raw( a, image_data, image_data_len, out_n, x, y, depth, color ) ) { + STBI_FREE( final ); + return 0; + } + for ( j = 0; j < y; ++j ) { + for ( i = 0; i < x; ++i ) { + int out_y = j * yspc[p] + yorig[p]; + int out_x = i * xspc[p] + xorig[p]; + memcpy( final + out_y * a->s->img_x * out_bytes + out_x * out_bytes, + a->out + ( j * x + i ) * out_bytes, out_bytes ); + } + } + STBI_FREE( a->out ); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency( stbi__png* z, stbi_uc tc[3], int out_n ) +{ + stbi__context* s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc* p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT( out_n == 2 || out_n == 4 ); + + if ( out_n == 2 ) { + for ( i = 0; i < pixel_count; ++i ) { + p[1] = ( p[0] == tc[0] ? 0 : 255 ); + p += 2; + } + } + else { + for ( i = 0; i < pixel_count; ++i ) { + if ( p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2] ) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16( stbi__png* z, stbi__uint16 tc[3], int out_n ) +{ + stbi__context* s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16* p = (stbi__uint16*)z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT( out_n == 2 || out_n == 4 ); + + if ( out_n == 2 ) { + for ( i = 0; i < pixel_count; ++i ) { + p[1] = ( p[0] == tc[0] ? 0 : 65535 ); + p += 2; + } + } + else { + for ( i = 0; i < pixel_count; ++i ) { + if ( p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2] ) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette( stbi__png* a, stbi_uc* palette, int len, int pal_img_n ) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc* p, * temp_out, * orig = a->out; + + p = (stbi_uc*)stbi__malloc_mad2( pixel_count, pal_img_n, 0 ); + if ( p == NULL ) return stbi__err( "outofmem", "Out of memory" ); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if ( pal_img_n == 3 ) { + for ( i = 0; i < pixel_count; ++i ) { + int n = orig[i] * 4; + p[0] = palette[n]; + p[1] = palette[n + 1]; + p[2] = palette[n + 2]; + p += 3; + } + } + else { + for ( i = 0; i < pixel_count; ++i ) { + int n = orig[i] * 4; + p[0] = palette[n]; + p[1] = palette[n + 1]; + p[2] = palette[n + 2]; + p[3] = palette[n + 3]; + p += 4; + } + } + STBI_FREE( a->out ); + a->out = temp_out; + + STBI_NOTUSED( len ); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load( int flag_true_if_should_unpremultiply ) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb( int flag_true_if_should_convert ) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone( stbi__png* z ) +{ + stbi__context* s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc* p = z->out; + + if ( s->img_out_n == 3 ) { // convert bgr to rgb + for ( i = 0; i < pixel_count; ++i ) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } + else { + STBI_ASSERT( s->img_out_n == 4 ); + if ( stbi__unpremultiply_on_load ) { + // convert bgr to rgb and unpremultiply + for ( i = 0; i < pixel_count; ++i ) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if ( a ) { + stbi_uc half = a / 2; + p[0] = ( p[2] * 255 + half ) / a; + p[1] = ( p[1] * 255 + half ) / a; + p[2] = ( t * 255 + half ) / a; + } + else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } + else { + // convert bgr to rgb + for ( i = 0; i < pixel_count; ++i ) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) + +static int stbi__parse_png_file( stbi__png* z, int scan, int req_comp ) +{ + stbi_uc palette[1024], pal_img_n = 0; + stbi_uc has_trans = 0, tc[3] = { 0 }; + stbi__uint16 tc16[3]; + stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0; + int first = 1, k, interlace = 0, color = 0, is_iphone = 0; + stbi__context* s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if ( !stbi__check_png_header( s ) ) return 0; + + if ( scan == STBI__SCAN_type ) return 1; + + for ( ;;) { + stbi__pngchunk c = stbi__get_chunk_header( s ); + switch ( c.type ) { + case STBI__PNG_TYPE( 'C', 'g', 'B', 'I' ): + is_iphone = 1; + stbi__skip( s, c.length ); + break; + case STBI__PNG_TYPE( 'I', 'H', 'D', 'R' ): { + int comp, filter; + if ( !first ) return stbi__err( "multiple IHDR", "Corrupt PNG" ); + first = 0; + if ( c.length != 13 ) return stbi__err( "bad IHDR len", "Corrupt PNG" ); + s->img_x = stbi__get32be( s ); if ( s->img_x > ( 1 << 24 ) ) return stbi__err( "too large", "Very large image (corrupt?)" ); + s->img_y = stbi__get32be( s ); if ( s->img_y > ( 1 << 24 ) ) return stbi__err( "too large", "Very large image (corrupt?)" ); + z->depth = stbi__get8( s ); if ( z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16 ) return stbi__err( "1/2/4/8/16-bit only", "PNG not supported: 1/2/4/8/16-bit only" ); + color = stbi__get8( s ); if ( color > 6 ) return stbi__err( "bad ctype", "Corrupt PNG" ); + if ( color == 3 && z->depth == 16 ) return stbi__err( "bad ctype", "Corrupt PNG" ); + if ( color == 3 ) pal_img_n = 3; else if ( color & 1 ) return stbi__err( "bad ctype", "Corrupt PNG" ); + comp = stbi__get8( s ); if ( comp ) return stbi__err( "bad comp method", "Corrupt PNG" ); + filter = stbi__get8( s ); if ( filter ) return stbi__err( "bad filter method", "Corrupt PNG" ); + interlace = stbi__get8( s ); if ( interlace > 1 ) return stbi__err( "bad interlace method", "Corrupt PNG" ); + if ( !s->img_x || !s->img_y ) return stbi__err( "0-pixel image", "Corrupt PNG" ); + if ( !pal_img_n ) { + s->img_n = ( color & 2 ? 3 : 1 ) + ( color & 4 ? 1 : 0 ); + if ( ( 1 << 30 ) / s->img_x / s->img_n < s->img_y ) return stbi__err( "too large", "Image too large to decode" ); + if ( scan == STBI__SCAN_header ) return 1; + } + else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ( ( 1 << 30 ) / s->img_x / 4 < s->img_y ) return stbi__err( "too large", "Corrupt PNG" ); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE( 'P', 'L', 'T', 'E' ): { + if ( first ) return stbi__err( "first not IHDR", "Corrupt PNG" ); + if ( c.length > 256 * 3 ) return stbi__err( "invalid PLTE", "Corrupt PNG" ); + pal_len = c.length / 3; + if ( pal_len * 3 != c.length ) return stbi__err( "invalid PLTE", "Corrupt PNG" ); + for ( i = 0; i < pal_len; ++i ) { + palette[i * 4 + 0] = stbi__get8( s ); + palette[i * 4 + 1] = stbi__get8( s ); + palette[i * 4 + 2] = stbi__get8( s ); + palette[i * 4 + 3] = 255; + } + break; + } + + case STBI__PNG_TYPE( 't', 'R', 'N', 'S' ): { + if ( first ) return stbi__err( "first not IHDR", "Corrupt PNG" ); + if ( z->idata ) return stbi__err( "tRNS after IDAT", "Corrupt PNG" ); + if ( pal_img_n ) { + if ( scan == STBI__SCAN_header ) { s->img_n = 4; return 1; } + if ( pal_len == 0 ) return stbi__err( "tRNS before PLTE", "Corrupt PNG" ); + if ( c.length > pal_len ) return stbi__err( "bad tRNS len", "Corrupt PNG" ); + pal_img_n = 4; + for ( i = 0; i < c.length; ++i ) + palette[i * 4 + 3] = stbi__get8( s ); + } + else { + if ( !( s->img_n & 1 ) ) return stbi__err( "tRNS with alpha", "Corrupt PNG" ); + if ( c.length != (stbi__uint32)s->img_n * 2 ) return stbi__err( "bad tRNS len", "Corrupt PNG" ); + has_trans = 1; + if ( z->depth == 16 ) { + for ( k = 0; k < s->img_n; ++k ) tc16[k] = (stbi__uint16)stbi__get16be( s ); // copy the values as-is + } + else { + for ( k = 0; k < s->img_n; ++k ) tc[k] = (stbi_uc)( stbi__get16be( s ) & 255 ) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE( 'I', 'D', 'A', 'T' ): { + if ( first ) return stbi__err( "first not IHDR", "Corrupt PNG" ); + if ( pal_img_n && !pal_len ) return stbi__err( "no PLTE", "Corrupt PNG" ); + if ( scan == STBI__SCAN_header ) { s->img_n = pal_img_n; return 1; } + if ( (int)( ioff + c.length ) < (int)ioff ) return 0; + if ( ioff + c.length > idata_limit ) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc* p; + if ( idata_limit == 0 ) idata_limit = c.length > 4096 ? c.length : 4096; + while ( ioff + c.length > idata_limit ) + idata_limit *= 2; + STBI_NOTUSED( idata_limit_old ); + p = (stbi_uc*)STBI_REALLOC_SIZED( z->idata, idata_limit_old, idata_limit ); if ( p == NULL ) return stbi__err( "outofmem", "Out of memory" ); + z->idata = p; + } + if ( !stbi__getn( s, z->idata + ioff, c.length ) ) return stbi__err( "outofdata", "Corrupt PNG" ); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE( 'I', 'E', 'N', 'D' ): { + stbi__uint32 raw_len, bpl; + if ( first ) return stbi__err( "first not IHDR", "Corrupt PNG" ); + if ( scan != STBI__SCAN_load ) return 1; + if ( z->idata == NULL ) return stbi__err( "no IDAT", "Corrupt PNG" ); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = ( s->img_x * z->depth + 7 ) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc*)stbi_zlib_decode_malloc_guesssize_headerflag( (char*)z->idata, ioff, raw_len, (int*)& raw_len, !is_iphone ); + if ( z->expanded == NULL ) return 0; // zlib should set error + STBI_FREE( z->idata ); z->idata = NULL; + if ( ( req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n ) || has_trans ) + s->img_out_n = s->img_n + 1; + else + s->img_out_n = s->img_n; + if ( !stbi__create_png_image( z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace ) ) return 0; + if ( has_trans ) { + if ( z->depth == 16 ) { + if ( !stbi__compute_transparency16( z, tc16, s->img_out_n ) ) return 0; + } + else { + if ( !stbi__compute_transparency( z, tc, s->img_out_n ) ) return 0; + } + } + if ( is_iphone && stbi__de_iphone_flag && s->img_out_n > 2 ) + stbi__de_iphone( z ); + if ( pal_img_n ) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if ( req_comp >= 3 ) s->img_out_n = req_comp; + if ( !stbi__expand_png_palette( z, palette, pal_len, s->img_out_n ) ) + return 0; + } + else if ( has_trans ) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE( z->expanded ); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if ( first ) return stbi__err( "first not IHDR", "Corrupt PNG" ); + if ( ( c.type & ( 1 << 29 ) ) == 0 ) { +#ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST( c.type >> 24 ); + invalid_chunk[1] = STBI__BYTECAST( c.type >> 16 ); + invalid_chunk[2] = STBI__BYTECAST( c.type >> 8 ); + invalid_chunk[3] = STBI__BYTECAST( c.type >> 0 ); +#endif + return stbi__err( invalid_chunk, "PNG not supported: unknown PNG chunk type" ); + } + stbi__skip( s, c.length ); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be( s ); + } +} + +static void* stbi__do_png( stbi__png* p, int* x, int* y, int* n, int req_comp, stbi__result_info* ri ) +{ + void* result = NULL; + if ( req_comp < 0 || req_comp > 4 ) return stbi__errpuc( "bad req_comp", "Internal error" ); + if ( stbi__parse_png_file( p, STBI__SCAN_load, req_comp ) ) { + if ( p->depth < 8 ) + ri->bits_per_channel = 8; + else + ri->bits_per_channel = p->depth; + result = p->out; + p->out = NULL; + if ( req_comp && req_comp != p->s->img_out_n ) { + if ( ri->bits_per_channel == 8 ) + result = stbi__convert_format( (unsigned char*)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y ); + else + result = stbi__convert_format16( (stbi__uint16*)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y ); + p->s->img_out_n = req_comp; + if ( result == NULL ) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if ( n )* n = p->s->img_n; + } + STBI_FREE( p->out ); p->out = NULL; + STBI_FREE( p->expanded ); p->expanded = NULL; + STBI_FREE( p->idata ); p->idata = NULL; + + return result; +} + +static void* stbi__png_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ) +{ + stbi__png p; + p.s = s; + return stbi__do_png( &p, x, y, comp, req_comp, ri ); +} + +static int stbi__png_test( stbi__context* s ) +{ + int r; + r = stbi__check_png_header( s ); + stbi__rewind( s ); + return r; +} + +static int stbi__png_info_raw( stbi__png* p, int* x, int* y, int* comp ) +{ + if ( !stbi__parse_png_file( p, STBI__SCAN_header, 0 ) ) { + stbi__rewind( p->s ); + return 0; + } + if ( x )* x = p->s->img_x; + if ( y )* y = p->s->img_y; + if ( comp )* comp = p->s->img_n; + return 1; +} + +static int stbi__png_info( stbi__context* s, int* x, int* y, int* comp ) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw( &p, x, y, comp ); +} + +static int stbi__png_is16( stbi__context* s ) +{ + stbi__png p; + p.s = s; + if ( !stbi__png_info_raw( &p, NULL, NULL, NULL ) ) + return 0; + if ( p.depth != 16 ) { + stbi__rewind( p.s ); + return 0; + } + return 1; +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw( stbi__context* s ) +{ + int r; + int sz; + if ( stbi__get8( s ) != 'B' ) return 0; + if ( stbi__get8( s ) != 'M' ) return 0; + stbi__get32le( s ); // discard filesize + stbi__get16le( s ); // discard reserved + stbi__get16le( s ); // discard reserved + stbi__get32le( s ); // discard data offset + sz = stbi__get32le( s ); + r = ( sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124 ); + return r; +} + +static int stbi__bmp_test( stbi__context* s ) +{ + int r = stbi__bmp_test_raw( s ); + stbi__rewind( s ); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit( unsigned int z ) +{ + int n = 0; + if ( z == 0 ) return -1; + if ( z >= 0x10000 ) { n += 16; z >>= 16; } + if ( z >= 0x00100 ) { n += 8; z >>= 8; } + if ( z >= 0x00010 ) { n += 4; z >>= 4; } + if ( z >= 0x00004 ) { n += 2; z >>= 2; } + if ( z >= 0x00002 ) { n += 1;/* >>= 1;*/ } + return n; +} + +static int stbi__bitcount( unsigned int a ) +{ + a = ( a & 0x55555555 ) + ( ( a >> 1 ) & 0x55555555 ); // max 2 + a = ( a & 0x33333333 ) + ( ( a >> 2 ) & 0x33333333 ); // max 4 + a = ( a + ( a >> 4 ) ) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = ( a + ( a >> 8 ) ); // max 16 per 8 bits + a = ( a + ( a >> 16 ) ); // max 32 per 8 bits + return a & 0xff; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned( unsigned int v, int shift, int bits ) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if ( shift < 0 ) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT( v >= 0 && v < 256 ); + v >>= ( 8 - bits ); + STBI_ASSERT( bits >= 0 && bits <= 8 ); + return (int)( (unsigned)v * mul_table[bits] ) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr, mg, mb, ma, all_a; +} stbi__bmp_data; + +static void* stbi__bmp_parse_header( stbi__context* s, stbi__bmp_data* info ) +{ + int hsz; + if ( stbi__get8( s ) != 'B' || stbi__get8( s ) != 'M' ) return stbi__errpuc( "not BMP", "Corrupt BMP" ); + stbi__get32le( s ); // discard filesize + stbi__get16le( s ); // discard reserved + stbi__get16le( s ); // discard reserved + info->offset = stbi__get32le( s ); + info->hsz = hsz = stbi__get32le( s ); + info->mr = info->mg = info->mb = info->ma = 0; + + if ( hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124 ) return stbi__errpuc( "unknown BMP", "BMP type not supported: unknown" ); + if ( hsz == 12 ) { + s->img_x = stbi__get16le( s ); + s->img_y = stbi__get16le( s ); + } + else { + s->img_x = stbi__get32le( s ); + s->img_y = stbi__get32le( s ); + } + if ( stbi__get16le( s ) != 1 ) return stbi__errpuc( "bad BMP", "bad BMP" ); + info->bpp = stbi__get16le( s ); + if ( hsz != 12 ) { + int compress = stbi__get32le( s ); + if ( compress == 1 || compress == 2 ) return stbi__errpuc( "BMP RLE", "BMP type not supported: RLE" ); + stbi__get32le( s ); // discard sizeof + stbi__get32le( s ); // discard hres + stbi__get32le( s ); // discard vres + stbi__get32le( s ); // discard colorsused + stbi__get32le( s ); // discard max important + if ( hsz == 40 || hsz == 56 ) { + if ( hsz == 56 ) { + stbi__get32le( s ); + stbi__get32le( s ); + stbi__get32le( s ); + stbi__get32le( s ); + } + if ( info->bpp == 16 || info->bpp == 32 ) { + if ( compress == 0 ) { + if ( info->bpp == 32 ) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } + else { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } + } + else if ( compress == 3 ) { + info->mr = stbi__get32le( s ); + info->mg = stbi__get32le( s ); + info->mb = stbi__get32le( s ); + // not documented, but generated by photoshop and handled by mspaint + if ( info->mr == info->mg && info->mg == info->mb ) { + // ?!?!? + return stbi__errpuc( "bad BMP", "bad BMP" ); + } + } + else + return stbi__errpuc( "bad BMP", "bad BMP" ); + } + } + else { + int i; + if ( hsz != 108 && hsz != 124 ) + return stbi__errpuc( "bad BMP", "bad BMP" ); + info->mr = stbi__get32le( s ); + info->mg = stbi__get32le( s ); + info->mb = stbi__get32le( s ); + info->ma = stbi__get32le( s ); + stbi__get32le( s ); // discard color space + for ( i = 0; i < 12; ++i ) + stbi__get32le( s ); // discard color space parameters + if ( hsz == 124 ) { + stbi__get32le( s ); // discard rendering intent + stbi__get32le( s ); // discard offset of profile data + stbi__get32le( s ); // discard size of profile data + stbi__get32le( s ); // discard reserved + } + } + } + return (void*)1; +} + + +static void* stbi__bmp_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ) +{ + stbi_uc* out; + unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a; + stbi_uc pal[256][4]; + int psize = 0, i, j, width; + int flip_vertically, pad, target; + stbi__bmp_data info; + STBI_NOTUSED( ri ); + + info.all_a = 255; + if ( stbi__bmp_parse_header( s, &info ) == NULL ) + return NULL; // error code already set + + flip_vertically = ( (int)s->img_y ) > 0; + s->img_y = abs( (int)s->img_y ); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if ( info.hsz == 12 ) { + if ( info.bpp < 24 ) + psize = ( info.offset - 14 - 24 ) / 3; + } + else { + if ( info.bpp < 16 ) + psize = ( info.offset - 14 - info.hsz ) >> 2; + } + + if ( info.bpp == 24 && ma == 0xff000000 ) + s->img_n = 3; + else + s->img_n = ma ? 4 : 3; + if ( req_comp && req_comp >= 3 ) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + // sanity-check size + if ( !stbi__mad3sizes_valid( target, s->img_x, s->img_y, 0 ) ) + return stbi__errpuc( "too large", "Corrupt BMP" ); + + out = (stbi_uc*)stbi__malloc_mad3( target, s->img_x, s->img_y, 0 ); + if ( !out ) return stbi__errpuc( "outofmem", "Out of memory" ); + if ( info.bpp < 16 ) { + int z = 0; + if ( psize == 0 || psize > 256 ) { STBI_FREE( out ); return stbi__errpuc( "invalid", "Corrupt BMP" ); } + for ( i = 0; i < psize; ++i ) { + pal[i][2] = stbi__get8( s ); + pal[i][1] = stbi__get8( s ); + pal[i][0] = stbi__get8( s ); + if ( info.hsz != 12 ) stbi__get8( s ); + pal[i][3] = 255; + } + stbi__skip( s, info.offset - 14 - info.hsz - psize * ( info.hsz == 12 ? 3 : 4 ) ); + if ( info.bpp == 1 ) width = ( s->img_x + 7 ) >> 3; + else if ( info.bpp == 4 ) width = ( s->img_x + 1 ) >> 1; + else if ( info.bpp == 8 ) width = s->img_x; + else { STBI_FREE( out ); return stbi__errpuc( "bad bpp", "Corrupt BMP" ); } + pad = ( -width ) & 3; + if ( info.bpp == 1 ) { + for ( j = 0; j < (int)s->img_y; ++j ) { + int bit_offset = 7, v = stbi__get8( s ); + for ( i = 0; i < (int)s->img_x; ++i ) { + int color = ( v >> bit_offset ) & 0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if ( target == 4 ) out[z++] = 255; + if ( i + 1 == (int)s->img_x ) break; + if ( ( --bit_offset ) < 0 ) { + bit_offset = 7; + v = stbi__get8( s ); + } + } + stbi__skip( s, pad ); + } + } + else { + for ( j = 0; j < (int)s->img_y; ++j ) { + for ( i = 0; i < (int)s->img_x; i += 2 ) { + int v = stbi__get8( s ), v2 = 0; + if ( info.bpp == 4 ) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if ( target == 4 ) out[z++] = 255; + if ( i + 1 == (int)s->img_x ) break; + v = ( info.bpp == 8 ) ? stbi__get8( s ) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if ( target == 4 ) out[z++] = 255; + } + stbi__skip( s, pad ); + } + } + } + else { + int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0; + int z = 0; + int easy = 0; + stbi__skip( s, info.offset - 14 - info.hsz ); + if ( info.bpp == 24 ) width = 3 * s->img_x; + else if ( info.bpp == 16 ) width = 2 * s->img_x; + else /* bpp = 32 and pad = 0 */ width = 0; + pad = ( -width ) & 3; + if ( info.bpp == 24 ) { + easy = 1; + } + else if ( info.bpp == 32 ) { + if ( mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000 ) + easy = 2; + } + if ( !easy ) { + if ( !mr || !mg || !mb ) { STBI_FREE( out ); return stbi__errpuc( "bad masks", "Corrupt BMP" ); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit( mr ) - 7; rcount = stbi__bitcount( mr ); + gshift = stbi__high_bit( mg ) - 7; gcount = stbi__bitcount( mg ); + bshift = stbi__high_bit( mb ) - 7; bcount = stbi__bitcount( mb ); + ashift = stbi__high_bit( ma ) - 7; acount = stbi__bitcount( ma ); + } + for ( j = 0; j < (int)s->img_y; ++j ) { + if ( easy ) { + for ( i = 0; i < (int)s->img_x; ++i ) { + unsigned char a; + out[z + 2] = stbi__get8( s ); + out[z + 1] = stbi__get8( s ); + out[z + 0] = stbi__get8( s ); + z += 3; + a = ( easy == 2 ? stbi__get8( s ) : 255 ); + all_a |= a; + if ( target == 4 ) out[z++] = a; + } + } + else { + int bpp = info.bpp; + for ( i = 0; i < (int)s->img_x; ++i ) { + stbi__uint32 v = ( bpp == 16 ? (stbi__uint32)stbi__get16le( s ) : stbi__get32le( s ) ); + unsigned int a; + out[z++] = STBI__BYTECAST( stbi__shiftsigned( v & mr, rshift, rcount ) ); + out[z++] = STBI__BYTECAST( stbi__shiftsigned( v & mg, gshift, gcount ) ); + out[z++] = STBI__BYTECAST( stbi__shiftsigned( v & mb, bshift, bcount ) ); + a = ( ma ? stbi__shiftsigned( v & ma, ashift, acount ) : 255 ); + all_a |= a; + if ( target == 4 ) out[z++] = STBI__BYTECAST( a ); + } + } + stbi__skip( s, pad ); + } + } + + // if alpha channel is all 0s, replace with all 255s + if ( target == 4 && all_a == 0 ) + for ( i = 4 * s->img_x * s->img_y - 1; i >= 0; i -= 4 ) + out[i] = 255; + + if ( flip_vertically ) { + stbi_uc t; + for ( j = 0; j < (int)s->img_y >> 1; ++j ) { + stbi_uc* p1 = out + j * s->img_x * target; + stbi_uc* p2 = out + ( s->img_y - 1 - j ) * s->img_x * target; + for ( i = 0; i < (int)s->img_x * target; ++i ) { + t = p1[i]; p1[i] = p2[i]; p2[i] = t; + } + } + } + + if ( req_comp && req_comp != target ) { + out = stbi__convert_format( out, target, req_comp, s->img_x, s->img_y ); + if ( out == NULL ) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if ( comp )* comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp( int bits_per_pixel, int is_grey, int* is_rgb16 ) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if ( is_rgb16 )* is_rgb16 = 0; + switch ( bits_per_pixel ) { + case 8: return STBI_grey; + case 16: if ( is_grey ) return STBI_grey_alpha; + // fallthrough + case 15: if ( is_rgb16 ) * is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + case 32: return bits_per_pixel / 8; + default: return 0; + } +} + +static int stbi__tga_info( stbi__context* s, int* x, int* y, int* comp ) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8( s ); // discard Offset + tga_colormap_type = stbi__get8( s ); // colormap type + if ( tga_colormap_type > 1 ) { + stbi__rewind( s ); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8( s ); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if ( tga_image_type != 1 && tga_image_type != 9 ) { + stbi__rewind( s ); + return 0; + } + stbi__skip( s, 4 ); // skip index of first colormap entry and number of entries + sz = stbi__get8( s ); // check bits per palette color entry + if ( ( sz != 8 ) && ( sz != 15 ) && ( sz != 16 ) && ( sz != 24 ) && ( sz != 32 ) ) { + stbi__rewind( s ); + return 0; + } + stbi__skip( s, 4 ); // skip image x and y origin + tga_colormap_bpp = sz; + } + else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( ( tga_image_type != 2 ) && ( tga_image_type != 3 ) && ( tga_image_type != 10 ) && ( tga_image_type != 11 ) ) { + stbi__rewind( s ); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip( s, 9 ); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le( s ); + if ( tga_w < 1 ) { + stbi__rewind( s ); + return 0; // test width + } + tga_h = stbi__get16le( s ); + if ( tga_h < 1 ) { + stbi__rewind( s ); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8( s ); // bits per pixel + stbi__get8( s ); // ignore alpha bits + if ( tga_colormap_bpp != 0 ) { + if ( ( tga_bits_per_pixel != 8 ) && ( tga_bits_per_pixel != 16 ) ) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind( s ); + return 0; + } + tga_comp = stbi__tga_get_comp( tga_colormap_bpp, 0, NULL ); + } + else { + tga_comp = stbi__tga_get_comp( tga_bits_per_pixel, ( tga_image_type == 3 ) || ( tga_image_type == 11 ), NULL ); + } + if ( !tga_comp ) { + stbi__rewind( s ); + return 0; + } + if ( x )* x = tga_w; + if ( y )* y = tga_h; + if ( comp )* comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test( stbi__context* s ) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8( s ); // discard Offset + tga_color_type = stbi__get8( s ); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8( s ); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if ( sz != 1 && sz != 9 ) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip( s, 4 ); // skip index of first colormap entry and number of entries + sz = stbi__get8( s ); // check bits per palette color entry + if ( ( sz != 8 ) && ( sz != 15 ) && ( sz != 16 ) && ( sz != 24 ) && ( sz != 32 ) ) goto errorEnd; + stbi__skip( s, 4 ); // skip image x and y origin + } + else { // "normal" image w/o colormap + if ( ( sz != 2 ) && ( sz != 3 ) && ( sz != 10 ) && ( sz != 11 ) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip( s, 9 ); // skip colormap specification and image x/y origin + } + if ( stbi__get16le( s ) < 1 ) goto errorEnd; // test width + if ( stbi__get16le( s ) < 1 ) goto errorEnd; // test height + sz = stbi__get8( s ); // bits per pixel + if ( ( tga_color_type == 1 ) && ( sz != 8 ) && ( sz != 16 ) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( ( sz != 8 ) && ( sz != 15 ) && ( sz != 16 ) && ( sz != 24 ) && ( sz != 32 ) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind( s ); + return res; +} + +// read 16bit value and convert to 24bit RGB +static void stbi__tga_read_rgb16( stbi__context* s, stbi_uc* out ) +{ + stbi__uint16 px = (stbi__uint16)stbi__get16le( s ); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = ( px >> 10 ) & fiveBitMask; + int g = ( px >> 5 ) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (stbi_uc)( ( r * 255 ) / 31 ); + out[1] = (stbi_uc)( ( g * 255 ) / 31 ); + out[2] = (stbi_uc)( ( b * 255 ) / 31 ); + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static void* stbi__tga_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8( s ); + int tga_indexed = stbi__get8( s ); + int tga_image_type = stbi__get8( s ); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le( s ); + int tga_palette_len = stbi__get16le( s ); + int tga_palette_bits = stbi__get8( s ); + int tga_x_origin = stbi__get16le( s ); + int tga_y_origin = stbi__get16le( s ); + int tga_width = stbi__get16le( s ); + int tga_height = stbi__get16le( s ); + int tga_bits_per_pixel = stbi__get8( s ); + int tga_comp, tga_rgb16 = 0; + int tga_inverted = stbi__get8( s ); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char* tga_data; + unsigned char* tga_palette = NULL; + int i, j; + unsigned char raw_data[4] = { 0 }; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED( ri ); + STBI_NOTUSED( tga_x_origin ); // @TODO + STBI_NOTUSED( tga_y_origin ); // @TODO + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ( ( tga_inverted >> 5 ) & 1 ); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp( tga_palette_bits, 0, &tga_rgb16 ); + else tga_comp = stbi__tga_get_comp( tga_bits_per_pixel, ( tga_image_type == 3 ), &tga_rgb16 ); + + if ( !tga_comp ) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc( "bad format", "Can't find out TGA pixelformat" ); + + // tga info + *x = tga_width; + *y = tga_height; + if ( comp )* comp = tga_comp; + + if ( !stbi__mad3sizes_valid( tga_width, tga_height, tga_comp, 0 ) ) + return stbi__errpuc( "too large", "Corrupt TGA" ); + + tga_data = (unsigned char*)stbi__malloc_mad3( tga_width, tga_height, tga_comp, 0 ); + if ( !tga_data ) return stbi__errpuc( "outofmem", "Out of memory" ); + + // skip to the data's starting position (offset usually = 0) + stbi__skip( s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for ( i = 0; i < tga_height; ++i ) { + int row = tga_inverted ? tga_height - i - 1 : i; + stbi_uc* tga_row = tga_data + row * tga_width * tga_comp; + stbi__getn( s, tga_row, tga_width * tga_comp ); + } + } + else { + // do I need to load a palette? + if ( tga_indexed ) + { + // any data to skip? (offset usually = 0) + stbi__skip( s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2( tga_palette_len, tga_comp, 0 ); + if ( !tga_palette ) { + STBI_FREE( tga_data ); + return stbi__errpuc( "outofmem", "Out of memory" ); + } + if ( tga_rgb16 ) { + stbi_uc* pal_entry = tga_palette; + STBI_ASSERT( tga_comp == STBI_rgb ); + for ( i = 0; i < tga_palette_len; ++i ) { + stbi__tga_read_rgb16( s, pal_entry ); + pal_entry += tga_comp; + } + } + else if ( !stbi__getn( s, tga_palette, tga_palette_len * tga_comp ) ) { + STBI_FREE( tga_data ); + STBI_FREE( tga_palette ); + return stbi__errpuc( "bad palette", "Corrupt TGA" ); + } + } + // load the data + for ( i = 0; i < tga_width * tga_height; ++i ) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8( s ); + RLE_count = 1 + ( RLE_cmd & 127 ); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } + else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } + else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = ( tga_bits_per_pixel == 8 ) ? stbi__get8( s ) : stbi__get16le( s ); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for ( j = 0; j < tga_comp; ++j ) { + raw_data[j] = tga_palette[pal_idx + j]; + } + } + else if ( tga_rgb16 ) { + STBI_ASSERT( tga_comp == STBI_rgb ); + stbi__tga_read_rgb16( s, raw_data ); + } + else { + // read in the data raw + for ( j = 0; j < tga_comp; ++j ) { + raw_data[j] = stbi__get8( s ); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for ( j = 0; j < tga_comp; ++j ) + tga_data[i * tga_comp + j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for ( j = 0; j * 2 < tga_height; ++j ) + { + int index1 = j * tga_width * tga_comp; + int index2 = ( tga_height - 1 - j ) * tga_width * tga_comp; + for ( i = tga_width * tga_comp; i > 0; --i ) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if ( tga_comp >= 3 && !tga_rgb16 ) + { + unsigned char* tga_pixel = tga_data; + for ( i = 0; i < tga_width * tga_height; ++i ) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if ( req_comp && req_comp != tga_comp ) + tga_data = stbi__convert_format( tga_data, tga_comp, req_comp, tga_width, tga_height ); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + STBI_NOTUSED( tga_palette_start ); + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB + +#ifndef STBI_NO_PSD +static int stbi__psd_test( stbi__context* s ) +{ + int r = ( stbi__get32be( s ) == 0x38425053 ); + stbi__rewind( s ); + return r; +} + +static int stbi__psd_decode_rle( stbi__context* s, stbi_uc* p, int pixelCount ) +{ + int count, nleft, len; + + count = 0; + while ( ( nleft = pixelCount - count ) > 0 ) { + len = stbi__get8( s ); + if ( len == 128 ) { + // No-op. + } + else if ( len < 128 ) { + // Copy next len+1 bytes literally. + len++; + if ( len > nleft ) return 0; // corrupt data + count += len; + while ( len ) { + *p = stbi__get8( s ); + p += 4; + len--; + } + } + else if ( len > 128 ) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len = 257 - len; + if ( len > nleft ) return 0; // corrupt data + val = stbi__get8( s ); + count += len; + while ( len ) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void* stbi__psd_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri, int bpc ) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w, h; + stbi_uc* out; + STBI_NOTUSED( ri ); + + // Check identifier + if ( stbi__get32be( s ) != 0x38425053 ) // "8BPS" + return stbi__errpuc( "not PSD", "Corrupt PSD image" ); + + // Check file type version. + if ( stbi__get16be( s ) != 1 ) + return stbi__errpuc( "wrong version", "Unsupported version of PSD image" ); + + // Skip 6 reserved bytes. + stbi__skip( s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be( s ); + if ( channelCount < 0 || channelCount > 16 ) + return stbi__errpuc( "wrong channel count", "Unsupported number of channels in PSD image" ); + + // Read the rows and columns of the image. + h = stbi__get32be( s ); + w = stbi__get32be( s ); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be( s ); + if ( bitdepth != 8 && bitdepth != 16 ) + return stbi__errpuc( "unsupported bit depth", "PSD bit depth is not 8 or 16 bit" ); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if ( stbi__get16be( s ) != 3 ) + return stbi__errpuc( "wrong color format", "PSD is not in RGB color format" ); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip( s, stbi__get32be( s ) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip( s, stbi__get32be( s ) ); + + // Skip the reserved data. + stbi__skip( s, stbi__get32be( s ) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be( s ); + if ( compression > 1 ) + return stbi__errpuc( "bad compression", "PSD has an unknown compression format" ); + + // Check size + if ( !stbi__mad3sizes_valid( 4, w, h, 0 ) ) + return stbi__errpuc( "too large", "Corrupt PSD" ); + + // Create the destination image. + + if ( !compression && bitdepth == 16 && bpc == 16 ) { + out = (stbi_uc*)stbi__malloc_mad3( 8, w, h, 0 ); + ri->bits_per_channel = 16; + } + else + out = (stbi_uc*)stbi__malloc( 4 * w * h ); + + if ( !out ) return stbi__errpuc( "outofmem", "Out of memory" ); + pixelCount = w * h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if ( compression ) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip( s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for ( channel = 0; channel < 4; channel++ ) { + stbi_uc* p; + + p = out + channel; + if ( channel >= channelCount ) { + // Fill this channel with default data. + for ( i = 0; i < pixelCount; i++, p += 4 ) + * p = ( channel == 3 ? 255 : 0 ); + } + else { + // Read the RLE data. + if ( !stbi__psd_decode_rle( s, p, pixelCount ) ) { + STBI_FREE( out ); + return stbi__errpuc( "corrupt", "bad RLE data" ); + } + } + } + + } + else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for ( channel = 0; channel < 4; channel++ ) { + if ( channel >= channelCount ) { + // Fill this channel with default data. + if ( bitdepth == 16 && bpc == 16 ) { + stbi__uint16* q = ( (stbi__uint16*)out ) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for ( i = 0; i < pixelCount; i++, q += 4 ) + * q = val; + } + else { + stbi_uc* p = out + channel; + stbi_uc val = channel == 3 ? 255 : 0; + for ( i = 0; i < pixelCount; i++, p += 4 ) + * p = val; + } + } + else { + if ( ri->bits_per_channel == 16 ) { // output bpc + stbi__uint16* q = ( (stbi__uint16*)out ) + channel; + for ( i = 0; i < pixelCount; i++, q += 4 ) + * q = (stbi__uint16)stbi__get16be( s ); + } + else { + stbi_uc* p = out + channel; + if ( bitdepth == 16 ) { // input bpc + for ( i = 0; i < pixelCount; i++, p += 4 ) + * p = (stbi_uc)( stbi__get16be( s ) >> 8 ); + } + else { + for ( i = 0; i < pixelCount; i++, p += 4 ) + * p = stbi__get8( s ); + } + } + } + } + } + + // remove weird white matte from PSD + if ( channelCount >= 4 ) { + if ( ri->bits_per_channel == 16 ) { + for ( i = 0; i < w * h; ++i ) { + stbi__uint16* pixel = (stbi__uint16*)out + 4 * i; + if ( pixel[3] != 0 && pixel[3] != 65535 ) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * ( 1 - ra ); + pixel[0] = (stbi__uint16)( pixel[0] * ra + inv_a ); + pixel[1] = (stbi__uint16)( pixel[1] * ra + inv_a ); + pixel[2] = (stbi__uint16)( pixel[2] * ra + inv_a ); + } + } + } + else { + for ( i = 0; i < w * h; ++i ) { + unsigned char* pixel = out + 4 * i; + if ( pixel[3] != 0 && pixel[3] != 255 ) { + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * ( 1 - ra ); + pixel[0] = (unsigned char)( pixel[0] * ra + inv_a ); + pixel[1] = (unsigned char)( pixel[1] * ra + inv_a ); + pixel[2] = (unsigned char)( pixel[2] * ra + inv_a ); + } + } + } + } + + // convert to desired output format + if ( req_comp && req_comp != 4 ) { + if ( ri->bits_per_channel == 16 ) + out = (stbi_uc*)stbi__convert_format16( (stbi__uint16*)out, 4, req_comp, w, h ); + else + out = stbi__convert_format( out, 4, req_comp, w, h ); + if ( out == NULL ) return out; // stbi__convert_format frees input on failure + } + + if ( comp )* comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ + +#ifndef STBI_NO_PIC +static int stbi__pic_is4( stbi__context* s, const char* str ) +{ + int i; + for ( i = 0; i < 4; ++i ) + if ( stbi__get8( s ) != (stbi_uc)str[i] ) + return 0; + + return 1; +} + +static int stbi__pic_test_core( stbi__context* s ) +{ + int i; + + if ( !stbi__pic_is4( s, "\x53\x80\xF6\x34" ) ) + return 0; + + for ( i = 0; i < 84; ++i ) + stbi__get8( s ); + + if ( !stbi__pic_is4( s, "PICT" ) ) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size, type, channel; +} stbi__pic_packet; + +static stbi_uc* stbi__readval( stbi__context* s, int channel, stbi_uc* dest ) +{ + int mask = 0x80, i; + + for ( i = 0; i < 4; ++i, mask >>= 1 ) { + if ( channel & mask ) { + if ( stbi__at_eof( s ) ) return stbi__errpuc( "bad file", "PIC file too short" ); + dest[i] = stbi__get8( s ); + } + } + + return dest; +} + +static void stbi__copyval( int channel, stbi_uc* dest, const stbi_uc* src ) +{ + int mask = 0x80, i; + + for ( i = 0; i < 4; ++i, mask >>= 1 ) + if ( channel & mask ) + dest[i] = src[i]; +} + +static stbi_uc* stbi__pic_load_core( stbi__context* s, int width, int height, int* comp, stbi_uc* result ) +{ + int act_comp = 0, num_packets = 0, y, chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet* packet; + + if ( num_packets == sizeof( packets ) / sizeof( packets[0] ) ) + return stbi__errpuc( "bad format", "too many packets" ); + + packet = &packets[num_packets++]; + + chained = stbi__get8( s ); + packet->size = stbi__get8( s ); + packet->type = stbi__get8( s ); + packet->channel = stbi__get8( s ); + + act_comp |= packet->channel; + + if ( stbi__at_eof( s ) ) return stbi__errpuc( "bad file", "file too short (reading packets)" ); + if ( packet->size != 8 ) return stbi__errpuc( "bad format", "packet isn't 8bpp" ); + } while ( chained ); + + *comp = ( act_comp & 0x10 ? 4 : 3 ); // has alpha channel? + + for ( y = 0; y < height; ++y ) { + int packet_idx; + + for ( packet_idx = 0; packet_idx < num_packets; ++packet_idx ) { + stbi__pic_packet* packet = &packets[packet_idx]; + stbi_uc* dest = result + y * width * 4; + + switch ( packet->type ) { + default: + return stbi__errpuc( "bad format", "packet has bad compression type" ); + + case 0: {//uncompressed + int x; + + for ( x = 0; x < width; ++x, dest += 4 ) + if ( !stbi__readval( s, packet->channel, dest ) ) + return 0; + break; + } + + case 1://Pure RLE + { + int left = width, i; + + while ( left > 0 ) { + stbi_uc count, value[4]; + + count = stbi__get8( s ); + if ( stbi__at_eof( s ) ) return stbi__errpuc( "bad file", "file too short (pure read count)" ); + + if ( count > left ) + count = (stbi_uc)left; + + if ( !stbi__readval( s, packet->channel, value ) ) return 0; + + for ( i = 0; i < count; ++i, dest += 4 ) + stbi__copyval( packet->channel, dest, value ); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left = width; + while ( left > 0 ) { + int count = stbi__get8( s ), i; + if ( stbi__at_eof( s ) ) return stbi__errpuc( "bad file", "file too short (mixed read count)" ); + + if ( count >= 128 ) { // Repeated + stbi_uc value[4]; + + if ( count == 128 ) + count = stbi__get16be( s ); + else + count -= 127; + if ( count > left ) + return stbi__errpuc( "bad file", "scanline overrun" ); + + if ( !stbi__readval( s, packet->channel, value ) ) + return 0; + + for ( i = 0; i < count; ++i, dest += 4 ) + stbi__copyval( packet->channel, dest, value ); + } + else { // Raw + ++count; + if ( count > left ) return stbi__errpuc( "bad file", "scanline overrun" ); + + for ( i = 0; i < count; ++i, dest += 4 ) + if ( !stbi__readval( s, packet->channel, dest ) ) + return 0; + } + left -= count; + } + break; + } + } + } + } + + return result; +} + +static void* stbi__pic_load( stbi__context* s, int* px, int* py, int* comp, int req_comp, stbi__result_info* ri ) +{ + stbi_uc* result; + int i, x, y, internal_comp; + STBI_NOTUSED( ri ); + + if ( !comp ) comp = &internal_comp; + + for ( i = 0; i < 92; ++i ) + stbi__get8( s ); + + x = stbi__get16be( s ); + y = stbi__get16be( s ); + if ( stbi__at_eof( s ) ) return stbi__errpuc( "bad file", "file too short (pic header)" ); + if ( !stbi__mad3sizes_valid( x, y, 4, 0 ) ) return stbi__errpuc( "too large", "PIC image too large to decode" ); + + stbi__get32be( s ); //skip `ratio' + stbi__get16be( s ); //skip `fields' + stbi__get16be( s ); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc*)stbi__malloc_mad3( x, y, 4, 0 ); + memset( result, 0xff, x * y * 4 ); + + if ( !stbi__pic_load_core( s, x, y, comp, result ) ) { + STBI_FREE( result ); + result = 0; + } + *px = x; + *py = y; + if ( req_comp == 0 ) req_comp = *comp; + result = stbi__convert_format( result, 4, req_comp, x, y ); + + return result; +} + +static int stbi__pic_test( stbi__context* s ) +{ + int r = stbi__pic_test_core( s ); + stbi__rewind( s ); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w, h; + stbi_uc* out; // output buffer (always 4 components) + stbi_uc* background; // The current "background" as far as a gif is concerned + stbi_uc* history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + stbi_uc* color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; + int delay; +} stbi__gif; + +static int stbi__gif_test_raw( stbi__context* s ) +{ + int sz; + if ( stbi__get8( s ) != 'G' || stbi__get8( s ) != 'I' || stbi__get8( s ) != 'F' || stbi__get8( s ) != '8' ) return 0; + sz = stbi__get8( s ); + if ( sz != '9' && sz != '7' ) return 0; + if ( stbi__get8( s ) != 'a' ) return 0; + return 1; +} + +static int stbi__gif_test( stbi__context* s ) +{ + int r = stbi__gif_test_raw( s ); + stbi__rewind( s ); + return r; +} + +static void stbi__gif_parse_colortable( stbi__context* s, stbi_uc pal[256][4], int num_entries, int transp ) +{ + int i; + for ( i = 0; i < num_entries; ++i ) { + pal[i][2] = stbi__get8( s ); + pal[i][1] = stbi__get8( s ); + pal[i][0] = stbi__get8( s ); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header( stbi__context* s, stbi__gif* g, int* comp, int is_info ) +{ + stbi_uc version; + if ( stbi__get8( s ) != 'G' || stbi__get8( s ) != 'I' || stbi__get8( s ) != 'F' || stbi__get8( s ) != '8' ) + return stbi__err( "not GIF", "Corrupt GIF" ); + + version = stbi__get8( s ); + if ( version != '7' && version != '9' ) return stbi__err( "not GIF", "Corrupt GIF" ); + if ( stbi__get8( s ) != 'a' ) return stbi__err( "not GIF", "Corrupt GIF" ); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le( s ); + g->h = stbi__get16le( s ); + g->flags = stbi__get8( s ); + g->bgindex = stbi__get8( s ); + g->ratio = stbi__get8( s ); + g->transparent = -1; + + if ( comp != 0 )* comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if ( is_info ) return 1; + + if ( g->flags & 0x80 ) + stbi__gif_parse_colortable( s, g->pal, 2 << ( g->flags & 7 ), -1 ); + + return 1; +} + +static int stbi__gif_info_raw( stbi__context* s, int* x, int* y, int* comp ) +{ + stbi__gif* g = (stbi__gif*)stbi__malloc( sizeof( stbi__gif ) ); + if ( !stbi__gif_header( s, g, comp, 1 ) ) { + STBI_FREE( g ); + stbi__rewind( s ); + return 0; + } + if ( x )* x = g->w; + if ( y )* y = g->h; + STBI_FREE( g ); + return 1; +} + +static void stbi__out_gif_code( stbi__gif* g, stbi__uint16 code ) +{ + stbi_uc* p, * c; + int idx; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if ( g->codes[code].prefix >= 0 ) + stbi__out_gif_code( g, g->codes[code].prefix ); + + if ( g->cur_y >= g->max_y ) return; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if ( c[3] > 128 ) { // don't render transparent pixels; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if ( g->cur_x >= g->max_x ) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while ( g->cur_y >= g->max_y && g->parse > 0 ) { + g->step = ( 1 << g->parse ) * g->line_size; + g->cur_y = g->start_y + ( g->step >> 1 ); + --g->parse; + } + } +} + +static stbi_uc* stbi__process_gif_raster( stbi__context* s, stbi__gif* g ) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw* p; + + lzw_cs = stbi__get8( s ); + if ( lzw_cs > 12 ) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = ( 1 << codesize ) - 1; + bits = 0; + valid_bits = 0; + for ( init_code = 0; init_code < clear; init_code++ ) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc)init_code; + g->codes[init_code].suffix = (stbi_uc)init_code; + } + + // support no starting clear code + avail = clear + 2; + oldcode = -1; + + len = 0; + for ( ;;) { + if ( valid_bits < codesize ) { + if ( len == 0 ) { + len = stbi__get8( s ); // start new block + if ( len == 0 ) + return g->out; + } + --len; + bits |= (stbi__int32)stbi__get8( s ) << valid_bits; + valid_bits += 8; + } + else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if ( code == clear ) { // clear code + codesize = lzw_cs + 1; + codemask = ( 1 << codesize ) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } + else if ( code == clear + 1 ) { // end of stream code + stbi__skip( s, len ); + while ( ( len = stbi__get8( s ) ) > 0 ) + stbi__skip( s, len ); + return g->out; + } + else if ( code <= avail ) { + if ( first ) { + return stbi__errpuc( "no clear code", "Corrupt GIF" ); + } + + if ( oldcode >= 0 ) { + p = &g->codes[avail++]; + if ( avail > 8192 ) { + return stbi__errpuc( "too many codes", "Corrupt GIF" ); + } + + p->prefix = (stbi__int16)oldcode; + p->first = g->codes[oldcode].first; + p->suffix = ( code == avail ) ? p->first : g->codes[code].first; + } + else if ( code == avail ) + return stbi__errpuc( "illegal code in raster", "Corrupt GIF" ); + + stbi__out_gif_code( g, (stbi__uint16)code ); + + if ( ( avail & codemask ) == 0 && avail <= 0x0FFF ) { + codesize++; + codemask = ( 1 << codesize ) - 1; + } + + oldcode = code; + } + else { + return stbi__errpuc( "illegal code in raster", "Corrupt GIF" ); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc* stbi__gif_load_next( stbi__context* s, stbi__gif* g, int* comp, int req_comp, stbi_uc* two_back ) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED( req_comp ); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if ( g->out == 0 ) { + if ( !stbi__gif_header( s, g, comp, 0 ) ) return 0; // stbi__g_failure_reason set by stbi__gif_header + if ( !stbi__mad3sizes_valid( 4, g->w, g->h, 0 ) ) + return stbi__errpuc( "too large", "GIF image is too large" ); + pcount = g->w * g->h; + g->out = (stbi_uc*)stbi__malloc( 4 * pcount ); + g->background = (stbi_uc*)stbi__malloc( 4 * pcount ); + g->history = (stbi_uc*)stbi__malloc( pcount ); + if ( !g->out || !g->background || !g->history ) + return stbi__errpuc( "outofmem", "Out of memory" ); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset( g->out, 0x00, 4 * pcount ); + memset( g->background, 0x00, 4 * pcount ); // state of the background (starts transparent) + memset( g->history, 0x00, pcount ); // pixels that were affected previous frame + first_frame = 1; + } + else { + // second frame - how do we dispoase of the previous one? + dispose = ( g->eflags & 0x1C ) >> 2; + pcount = g->w * g->h; + + if ( ( dispose == 3 ) && ( two_back == 0 ) ) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if ( dispose == 3 ) { // use previous graphic + for ( pi = 0; pi < pcount; ++pi ) { + if ( g->history[pi] ) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } + else if ( dispose == 2 ) { + // restore what was changed last frame to background before that frame; + for ( pi = 0; pi < pcount; ++pi ) { + if ( g->history[pi] ) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } + else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for ( ;;) { + int tag = stbi__get8( s ); + switch ( tag ) { + case 0x2C: /* Image Descriptor */ + { + stbi__int32 x, y, w, h; + stbi_uc* o; + + x = stbi__get16le( s ); + y = stbi__get16le( s ); + w = stbi__get16le( s ); + h = stbi__get16le( s ); + if ( ( ( x + w ) > ( g->w ) ) || ( ( y + h ) > ( g->h ) ) ) + return stbi__errpuc( "bad Image Descriptor", "Corrupt GIF" ); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if ( w == 0 ) + g->cur_y = g->max_y; + + g->lflags = stbi__get8( s ); + + if ( g->lflags & 0x40 ) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } + else { + g->step = g->line_size; + g->parse = 0; + } + + if ( g->lflags & 0x80 ) { + stbi__gif_parse_colortable( s, g->lpal, 2 << ( g->lflags & 7 ), g->eflags & 0x01 ? g->transparent : -1 ); + g->color_table = (stbi_uc*)g->lpal; + } + else if ( g->flags & 0x80 ) { + g->color_table = (stbi_uc*)g->pal; + } + else + return stbi__errpuc( "missing color table", "Corrupt GIF" ); + + o = stbi__process_gif_raster( s, g ); + if ( !o ) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if ( first_frame && ( g->bgindex > 0 ) ) { + // if first frame, any pixel not drawn to gets the background color + for ( pi = 0; pi < pcount; ++pi ) { + if ( g->history[pi] == 0 ) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8( s ); + if ( ext == 0xF9 ) { // Graphic Control Extension. + len = stbi__get8( s ); + if ( len == 4 ) { + g->eflags = stbi__get8( s ); + g->delay = 10 * stbi__get16le( s ); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if ( g->transparent >= 0 ) { + g->pal[g->transparent][3] = 255; + } + if ( g->eflags & 0x01 ) { + g->transparent = stbi__get8( s ); + if ( g->transparent >= 0 ) { + g->pal[g->transparent][3] = 0; + } + } + else { + // don't need transparent + stbi__skip( s, 1 ); + g->transparent = -1; + } + } + else { + stbi__skip( s, len ); + break; + } + } + while ( ( len = stbi__get8( s ) ) != 0 ) { + stbi__skip( s, len ); + } + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc*)s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc( "unknown code", "Corrupt GIF" ); + } + } +} + +static void* stbi__load_gif_main( stbi__context* s, int** delays, int* x, int* y, int* z, int* comp, int req_comp ) +{ + if ( stbi__gif_test( s ) ) { + int layers = 0; + stbi_uc* u = 0; + stbi_uc* out = 0; + stbi_uc* two_back = 0; + stbi__gif g; + int stride; + memset( &g, 0, sizeof( g ) ); + if ( delays ) { + *delays = 0; + } + + do { + u = stbi__gif_load_next( s, &g, comp, req_comp, two_back ); + if ( u == (stbi_uc*)s ) u = 0; // end of animated gif marker + + if ( u ) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if ( out ) { + out = (stbi_uc*)STBI_REALLOC( out, layers * stride ); + if ( delays ) { + *delays = (int*)STBI_REALLOC( *delays, sizeof( int ) * layers ); + } + } + else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if ( delays ) { + *delays = (int*)stbi__malloc( layers * sizeof( int ) ); + } + } + memcpy( out + ( ( layers - 1 ) * stride ), u, stride ); + if ( layers >= 2 ) { + two_back = out - 2 * stride; + } + + if ( delays ) { + ( *delays )[layers - 1U] = g.delay; + } + } + } while ( u != 0 ); + + // free temp buffer; + STBI_FREE( g.out ); + STBI_FREE( g.history ); + STBI_FREE( g.background ); + + // do the final conversion after loading everything; + if ( req_comp && req_comp != 4 ) + out = stbi__convert_format( out, 4, req_comp, layers * g.w, g.h ); + + *z = layers; + return out; + } + else { + return stbi__errpuc( "not GIF", "Image was not as a gif type." ); + } +} + +static void* stbi__gif_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ) +{ + stbi_uc* u = 0; + stbi__gif g; + memset( &g, 0, sizeof( g ) ); + STBI_NOTUSED( ri ); + + u = stbi__gif_load_next( s, &g, comp, req_comp, 0 ); + if ( u == (stbi_uc*)s ) u = 0; // end of animated gif marker + if ( u ) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if ( req_comp && req_comp != 4 ) + u = stbi__convert_format( u, 4, req_comp, g.w, g.h ); + } + else if ( g.out ) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE( g.out ); + } + + // free buffers needed for multiple frame loading; + STBI_FREE( g.history ); + STBI_FREE( g.background ); + + return u; +} + +static int stbi__gif_info( stbi__context* s, int* x, int* y, int* comp ) +{ + return stbi__gif_info_raw( s, x, y, comp ); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core( stbi__context* s, const char* signature ) +{ + int i; + for ( i = 0; signature[i]; ++i ) + if ( stbi__get8( s ) != signature[i] ) + return 0; + stbi__rewind( s ); + return 1; +} + +static int stbi__hdr_test( stbi__context* s ) +{ + int r = stbi__hdr_test_core( s, "#?RADIANCE\n" ); + stbi__rewind( s ); + if ( !r ) { + r = stbi__hdr_test_core( s, "#?RGBE\n" ); + stbi__rewind( s ); + } + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char* stbi__hdr_gettoken( stbi__context * z, char* buffer ) +{ + int len = 0; + char c = '\0'; + + c = (char)stbi__get8( z ); + + while ( !stbi__at_eof( z ) && c != '\n' ) { + buffer[len++] = c; + if ( len == STBI__HDR_BUFLEN - 1 ) { + // flush to end of line + while ( !stbi__at_eof( z ) && stbi__get8( z ) != '\n' ) + ; + break; + } + c = (char)stbi__get8( z ); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert( float* output, stbi_uc* input, int req_comp ) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float)ldexp( 1.0f, input[3] - (int)( 128 + 8 ) ); + if ( req_comp <= 2 ) + output[0] = ( input[0] + input[1] + input[2] ) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if ( req_comp == 2 ) output[1] = 1; + if ( req_comp == 4 ) output[3] = 1; + } + else { + switch ( req_comp ) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float* stbi__hdr_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ) +{ + char buffer[STBI__HDR_BUFLEN]; + char* token; + int valid = 0; + int width, height; + stbi_uc* scanline; + float* hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1, c2, z; + const char* headerToken; + STBI_NOTUSED( ri ); + + // Check identifier + headerToken = stbi__hdr_gettoken( s, buffer ); + if ( strcmp( headerToken, "#?RADIANCE" ) != 0 && strcmp( headerToken, "#?RGBE" ) != 0 ) + return stbi__errpf( "not HDR", "Corrupt HDR image" ); + + // Parse header + for ( ;;) { + token = stbi__hdr_gettoken( s, buffer ); + if ( token[0] == 0 ) break; + if ( strcmp( token, "FORMAT=32-bit_rle_rgbe" ) == 0 ) valid = 1; + } + + if ( !valid ) return stbi__errpf( "unsupported format", "Unsupported HDR format" ); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken( s, buffer ); + if ( strncmp( token, "-Y ", 3 ) ) return stbi__errpf( "unsupported data layout", "Unsupported HDR format" ); + token += 3; + height = (int)strtol( token, &token, 10 ); + while ( *token == ' ' ) ++token; + if ( strncmp( token, "+X ", 3 ) ) return stbi__errpf( "unsupported data layout", "Unsupported HDR format" ); + token += 3; + width = (int)strtol( token, NULL, 10 ); + + *x = width; + *y = height; + + if ( comp )* comp = 3; + if ( req_comp == 0 ) req_comp = 3; + + if ( !stbi__mad4sizes_valid( width, height, req_comp, sizeof( float ), 0 ) ) + return stbi__errpf( "too large", "HDR image is too large" ); + + // Read data + hdr_data = (float*)stbi__malloc_mad4( width, height, req_comp, sizeof( float ), 0 ); + if ( !hdr_data ) + return stbi__errpf( "outofmem", "Out of memory" ); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768 ) { + // Read flat data + for ( j = 0; j < height; ++j ) { + for ( i = 0; i < width; ++i ) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn( s, rgbe, 4 ); + stbi__hdr_convert( hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp ); + } + } + } + else { + // Read RLE-encoded data + scanline = NULL; + + for ( j = 0; j < height; ++j ) { + c1 = stbi__get8( s ); + c2 = stbi__get8( s ); + len = stbi__get8( s ); + if ( c1 != 2 || c2 != 2 || ( len & 0x80 ) ) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc)c1; + rgbe[1] = (stbi_uc)c2; + rgbe[2] = (stbi_uc)len; + rgbe[3] = (stbi_uc)stbi__get8( s ); + stbi__hdr_convert( hdr_data, rgbe, req_comp ); + i = 1; + j = 0; + STBI_FREE( scanline ); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8( s ); + if ( len != width ) { STBI_FREE( hdr_data ); STBI_FREE( scanline ); return stbi__errpf( "invalid decoded scanline length", "corrupt HDR" ); } + if ( scanline == NULL ) { + scanline = (stbi_uc*)stbi__malloc_mad2( width, 4, 0 ); + if ( !scanline ) { + STBI_FREE( hdr_data ); + return stbi__errpf( "outofmem", "Out of memory" ); + } + } + + for ( k = 0; k < 4; ++k ) { + int nleft; + i = 0; + while ( ( nleft = width - i ) > 0 ) { + count = stbi__get8( s ); + if ( count > 128 ) { + // Run + value = stbi__get8( s ); + count -= 128; + if ( count > nleft ) { STBI_FREE( hdr_data ); STBI_FREE( scanline ); return stbi__errpf( "corrupt", "bad RLE data in HDR" ); } + for ( z = 0; z < count; ++z ) + scanline[i++ * 4 + k] = value; + } + else { + // Dump + if ( count > nleft ) { STBI_FREE( hdr_data ); STBI_FREE( scanline ); return stbi__errpf( "corrupt", "bad RLE data in HDR" ); } + for ( z = 0; z < count; ++z ) + scanline[i++ * 4 + k] = stbi__get8( s ); + } + } + } + for ( i = 0; i < width; ++i ) + stbi__hdr_convert( hdr_data + ( j * width + i ) * req_comp, scanline + i * 4, req_comp ); + } + if ( scanline ) + STBI_FREE( scanline ); + } + + return hdr_data; +} + +static int stbi__hdr_info( stbi__context* s, int* x, int* y, int* comp ) +{ + char buffer[STBI__HDR_BUFLEN]; + char* token; + int valid = 0; + int dummy; + + if ( !x ) x = &dummy; + if ( !y ) y = &dummy; + if ( !comp ) comp = &dummy; + + if ( stbi__hdr_test( s ) == 0 ) { + stbi__rewind( s ); + return 0; + } + + for ( ;;) { + token = stbi__hdr_gettoken( s, buffer ); + if ( token[0] == 0 ) break; + if ( strcmp( token, "FORMAT=32-bit_rle_rgbe" ) == 0 ) valid = 1; + } + + if ( !valid ) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken( s, buffer ); + if ( strncmp( token, "-Y ", 3 ) ) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int)strtol( token, &token, 10 ); + while ( *token == ' ' ) ++token; + if ( strncmp( token, "+X ", 3 ) ) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int)strtol( token, NULL, 10 ); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info( stbi__context* s, int* x, int* y, int* comp ) +{ + void* p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header( s, &info ); + stbi__rewind( s ); + if ( p == NULL ) + return 0; + if ( x )* x = s->img_x; + if ( y )* y = s->img_y; + if ( comp ) { + if ( info.bpp == 24 && info.ma == 0xff000000 ) + * comp = 3; + else + *comp = info.ma ? 4 : 3; + } + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info( stbi__context* s, int* x, int* y, int* comp ) +{ + int channelCount, dummy, depth; + if ( !x ) x = &dummy; + if ( !y ) y = &dummy; + if ( !comp ) comp = &dummy; + if ( stbi__get32be( s ) != 0x38425053 ) { + stbi__rewind( s ); + return 0; + } + if ( stbi__get16be( s ) != 1 ) { + stbi__rewind( s ); + return 0; + } + stbi__skip( s, 6 ); + channelCount = stbi__get16be( s ); + if ( channelCount < 0 || channelCount > 16 ) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be( s ); + *x = stbi__get32be( s ); + depth = stbi__get16be( s ); + if ( depth != 8 && depth != 16 ) { + stbi__rewind( s ); + return 0; + } + if ( stbi__get16be( s ) != 3 ) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16( stbi__context* s ) +{ + int channelCount, depth; + if ( stbi__get32be( s ) != 0x38425053 ) { + stbi__rewind( s ); + return 0; + } + if ( stbi__get16be( s ) != 1 ) { + stbi__rewind( s ); + return 0; + } + stbi__skip( s, 6 ); + channelCount = stbi__get16be( s ); + if ( channelCount < 0 || channelCount > 16 ) { + stbi__rewind( s ); + return 0; + } + (void)stbi__get32be( s ); + (void)stbi__get32be( s ); + depth = stbi__get16be( s ); + if ( depth != 16 ) { + stbi__rewind( s ); + return 0; + } + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info( stbi__context* s, int* x, int* y, int* comp ) +{ + int act_comp = 0, num_packets = 0, chained, dummy; + stbi__pic_packet packets[10]; + + if ( !x ) x = &dummy; + if ( !y ) y = &dummy; + if ( !comp ) comp = &dummy; + + if ( !stbi__pic_is4( s, "\x53\x80\xF6\x34" ) ) { + stbi__rewind( s ); + return 0; + } + + stbi__skip( s, 88 ); + + *x = stbi__get16be( s ); + *y = stbi__get16be( s ); + if ( stbi__at_eof( s ) ) { + stbi__rewind( s ); + return 0; + } + if ( ( *x ) != 0 && ( 1 << 28 ) / ( *x ) < ( *y ) ) { + stbi__rewind( s ); + return 0; + } + + stbi__skip( s, 8 ); + + do { + stbi__pic_packet* packet; + + if ( num_packets == sizeof( packets ) / sizeof( packets[0] ) ) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8( s ); + packet->size = stbi__get8( s ); + packet->type = stbi__get8( s ); + packet->channel = stbi__get8( s ); + act_comp |= packet->channel; + + if ( stbi__at_eof( s ) ) { + stbi__rewind( s ); + return 0; + } + if ( packet->size != 8 ) { + stbi__rewind( s ); + return 0; + } + } while ( chained ); + + *comp = ( act_comp & 0x10 ? 4 : 3 ); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test( stbi__context* s ) +{ + char p, t; + p = (char)stbi__get8( s ); + t = (char)stbi__get8( s ); + if ( p != 'P' || ( t != '5' && t != '6' ) ) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static void* stbi__pnm_load( stbi__context* s, int* x, int* y, int* comp, int req_comp, stbi__result_info* ri ) +{ + stbi_uc* out; + STBI_NOTUSED( ri ); + + if ( !stbi__pnm_info( s, (int*)& s->img_x, (int*)& s->img_y, (int*)& s->img_n ) ) + return 0; + + *x = s->img_x; + *y = s->img_y; + if ( comp )* comp = s->img_n; + + if ( !stbi__mad3sizes_valid( s->img_n, s->img_x, s->img_y, 0 ) ) + return stbi__errpuc( "too large", "PNM too large" ); + + out = (stbi_uc*)stbi__malloc_mad3( s->img_n, s->img_x, s->img_y, 0 ); + if ( !out ) return stbi__errpuc( "outofmem", "Out of memory" ); + stbi__getn( s, out, s->img_n * s->img_x * s->img_y ); + + if ( req_comp && req_comp != s->img_n ) { + out = stbi__convert_format( out, s->img_n, req_comp, s->img_x, s->img_y ); + if ( out == NULL ) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace( char c ) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace( stbi__context* s, char* c ) +{ + for ( ;;) { + while ( !stbi__at_eof( s ) && stbi__pnm_isspace( *c ) ) + * c = (char)stbi__get8( s ); + + if ( stbi__at_eof( s ) || *c != '#' ) + break; + + while ( !stbi__at_eof( s ) && *c != '\n' && *c != '\r' ) + * c = (char)stbi__get8( s ); + } +} + +static int stbi__pnm_isdigit( char c ) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger( stbi__context* s, char* c ) +{ + int value = 0; + + while ( !stbi__at_eof( s ) && stbi__pnm_isdigit( *c ) ) { + value = value * 10 + ( *c - '0' ); + *c = (char)stbi__get8( s ); + } + + return value; +} + +static int stbi__pnm_info( stbi__context* s, int* x, int* y, int* comp ) +{ + int maxv, dummy; + char c, p, t; + + if ( !x ) x = &dummy; + if ( !y ) y = &dummy; + if ( !comp ) comp = &dummy; + + stbi__rewind( s ); + + // Get identifier + p = (char)stbi__get8( s ); + t = (char)stbi__get8( s ); + if ( p != 'P' || ( t != '5' && t != '6' ) ) { + stbi__rewind( s ); + return 0; + } + + *comp = ( t == '6' ) ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char)stbi__get8( s ); + stbi__pnm_skip_whitespace( s, &c ); + + *x = stbi__pnm_getinteger( s, &c ); // read width + stbi__pnm_skip_whitespace( s, &c ); + + *y = stbi__pnm_getinteger( s, &c ); // read height + stbi__pnm_skip_whitespace( s, &c ); + + maxv = stbi__pnm_getinteger( s, &c ); // read max value + + if ( maxv > 255 ) + return stbi__err( "max value > 255", "PPM image not 8-bit" ); + else + return 1; +} +#endif + +static int stbi__info_main( stbi__context* s, int* x, int* y, int* comp ) +{ +#ifndef STBI_NO_JPEG + if ( stbi__jpeg_info( s, x, y, comp ) ) return 1; +#endif + +#ifndef STBI_NO_PNG + if ( stbi__png_info( s, x, y, comp ) ) return 1; +#endif + +#ifndef STBI_NO_GIF + if ( stbi__gif_info( s, x, y, comp ) ) return 1; +#endif + +#ifndef STBI_NO_BMP + if ( stbi__bmp_info( s, x, y, comp ) ) return 1; +#endif + +#ifndef STBI_NO_PSD + if ( stbi__psd_info( s, x, y, comp ) ) return 1; +#endif + +#ifndef STBI_NO_PIC + if ( stbi__pic_info( s, x, y, comp ) ) return 1; +#endif + +#ifndef STBI_NO_PNM + if ( stbi__pnm_info( s, x, y, comp ) ) return 1; +#endif + +#ifndef STBI_NO_HDR + if ( stbi__hdr_info( s, x, y, comp ) ) return 1; +#endif + + // test tga last because it's a crappy test! +#ifndef STBI_NO_TGA + if ( stbi__tga_info( s, x, y, comp ) ) + return 1; +#endif + return stbi__err( "unknown image type", "Image not of any known type, or corrupt" ); +} + +static int stbi__is_16_main( stbi__context* s ) +{ +#ifndef STBI_NO_PNG + if ( stbi__png_is16( s ) ) return 1; +#endif + +#ifndef STBI_NO_PSD + if ( stbi__psd_is16( s ) ) return 1; +#endif + + return 0; +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info( char const* filename, int* x, int* y, int* comp ) +{ + FILE* f = stbi__fopen( filename, "rb" ); + int result; + if ( !f ) return stbi__err( "can't fopen", "Unable to open file" ); + result = stbi_info_from_file( f, x, y, comp ); + fclose( f ); + return result; +} + +STBIDEF int stbi_info_from_file( FILE* f, int* x, int* y, int* comp ) +{ + int r; + stbi__context s; + long pos = ftell( f ); + stbi__start_file( &s, f ); + r = stbi__info_main( &s, x, y, comp ); + fseek( f, pos, SEEK_SET ); + return r; +} + +STBIDEF int stbi_is_16_bit( char const* filename ) +{ + FILE* f = stbi__fopen( filename, "rb" ); + int result; + if ( !f ) return stbi__err( "can't fopen", "Unable to open file" ); + result = stbi_is_16_bit_from_file( f ); + fclose( f ); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file( FILE* f ) +{ + int r; + stbi__context s; + long pos = ftell( f ); + stbi__start_file( &s, f ); + r = stbi__is_16_main( &s ); + fseek( f, pos, SEEK_SET ); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory( stbi_uc const* buffer, int len, int* x, int* y, int* comp ) +{ + stbi__context s; + stbi__start_mem( &s, buffer, len ); + return stbi__info_main( &s, x, y, comp ); +} + +STBIDEF int stbi_info_from_callbacks( stbi_io_callbacks const* c, void* user, int* x, int* y, int* comp ) +{ + stbi__context s; + stbi__start_callbacks( &s, (stbi_io_callbacks*)c, user ); + return stbi__info_main( &s, x, y, comp ); +} + +STBIDEF int stbi_is_16_bit_from_memory( stbi_uc const* buffer, int len ) +{ + stbi__context s; + stbi__start_mem( &s, buffer, len ); + return stbi__is_16_main( &s ); +} + +STBIDEF int stbi_is_16_bit_from_callbacks( stbi_io_callbacks const* c, void* user ) +{ + stbi__context s; + stbi__start_callbacks( &s, (stbi_io_callbacks*)c, user ); + return stbi__is_16_main( &s ); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 1.48 (2014-12-14) fix incorrectly-named assert() + 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 1.29 (2010-08-16) + various warning fixes from Aurelien Pocheville + 1.28 (2010-08-01) + fix bug in GIF palette transparency (SpartanJ) + 1.27 (2010-08-01) + cast-to-stbi_uc to fix warnings + 1.26 (2010-07-24) + fix bug in file buffering for PNG reported by SpartanJ + 1.25 (2010-07-17) + refix trans_data warning (Won Chun) + 1.24 (2010-07-12) + perf improvements reading from files on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + stbi_info support from Jetro Lauha + GIF support from Jean-Marc Lienher + iPhone PNG-extensions from James Brown + warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/