diff --git a/.hgignore b/.hgignore
index 2b3ec57ee..1020b75c6 100644
--- a/.hgignore
+++ b/.hgignore
@@ -19,6 +19,7 @@ build/
debug/
release/
doc/doxygen/html/
+doxygenoutput
xcuserdata/
*.xcworkspace/
@@ -34,3 +35,18 @@ cppcheck-output
**exposed_decl.pypp.txt
glob:CEGUI-DEPS-0.8.x-beta3
+
+android/CEGUISampleFramework/AndroidManifest.xml
+android/CEGUISampleFramework/ant.properties
+android/CEGUISampleFramework/local.properties
+android/CEGUISampleFramework/bin
+android/CEGUISampleFramework/gen
+android/CEGUISampleFramework/libs
+android/CEGUISampleFramework/obj
+android/CEGUISampleFramework/jni/Android.mk
+android/CEGUISampleFramework/jni/Application.mk
+android/CEGUISampleFramework/jni/deps/Android.mk
+android/CEGUISampleFramework/res/drawable-hdpi/logo.png
+android/CEGUISampleFramework/res/drawable-mdpi/logo.png
+android/CEGUISampleFramework/res/drawable-xhdpi/logo.png
+android/CEGUISampleFramework/res/drawable-xxhdpi/logo.png
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 758906a22..6e7746494 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,7 @@
################################################################################
# Top-level CMakeLists.txt file for Crazy Eddie's GUI System
################################################################################
-cmake_minimum_required(VERSION 2.8)
+cmake_minimum_required(VERSION 2.8.12)
if (POLICY CMP0017)
cmake_policy(SET CMP0017 OLD)
endif()
@@ -10,10 +10,6 @@ if (POLICY CMP0045)
cmake_policy(SET CMP0045 OLD)
endif()
-set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
-include(CEGUIMacros)
-include(CMakeDependentOption)
-
if (APPLE AND NOT CMAKE_OSX_ARCHITECTURES)
set( CMAKE_OSX_ARCHITECTURES x86_64 CACHE STRING "Build architectures for Mac OS X")
endif()
@@ -28,12 +24,16 @@ endif()
################################################################################
project(cegui)
+set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
+include(CEGUIMacros)
+include(CMakeDependentOption)
+
################################################################################
# Set up version information
################################################################################
set( CEGUI_VERSION_MAJOR 0)
set( CEGUI_VERSION_MINOR 8)
-set( CEGUI_VERSION_PATCH 4)
+set( CEGUI_VERSION_PATCH 7)
set( CEGUI_VERSION ${CEGUI_VERSION_MAJOR}.${CEGUI_VERSION_MINOR}.${CEGUI_VERSION_PATCH} )
#
@@ -48,28 +48,37 @@ set( CEGUI_VERSION ${CEGUI_VERSION_MAJOR}.${CEGUI_VERSION_MINOR}.${CEGUI_VERSION
# - AGE: Number of previous binary interfaces this library is compatible with.
#
# Prior to issuing a release, modify the values as follows:
-# - If there were any changes in the source, increase REVISION.
-# - If the interface changed at all, increase CURRENT and set REVISION to 0
-# - If the interface had binary compabilbe additions only (so no ABI breaking
-# changes) increase AGE, else set AGE to 0.
+# - If there were no changes to the source, do not change any values.
+# - If there were changes to the implementation, but no changes to the ABI at all (that is, nothing was added, removed, or changed that affects ABI), increase REVISION.
+# - If there were changes that modified the ABI, but the ABI remains compatible with the previous release, increase CURRENT, increase AGE, and set REVISION to 0.
+# - If there were ABI breaking changes, increase CURRENT, set AGE to 0 and set REVISION to 0.
#
-set( CEGUI_ABI_CURRENT 5)
-set( CEGUI_ABI_REVISION 0)
-set( CEGUI_ABI_AGE 3)
+set( CEGUI_ABI_CURRENT 6)
+set( CEGUI_ABI_REVISION 2)
+set( CEGUI_ABI_AGE 4)
MATH( EXPR CEGUI_SOVERSION ${CEGUI_ABI_CURRENT}-${CEGUI_ABI_AGE} )
set( CEGUI_ABI_VERSION ${CEGUI_SOVERSION}.${CEGUI_ABI_AGE}.${CEGUI_ABI_REVISION} )
+cegui_check_mingw()
################################################################################
# Check for libs and other packages we might use.
################################################################################
# be sure to search the provided dependencies on Win32 and Mac OS X platforms
if ((WIN32 OR APPLE) AND NOT CMAKE_PREFIX_PATH)
- set (CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/dependencies" CACHE PATH "Path to dependencies")
+ set (CMAKE_PREFIX_PATH "${PROJECT_SOURCE_DIR}/dependencies" CACHE PATH "Path to dependencies")
# prefer the dylib deps in the dependencies over some other framework
set (CMAKE_FIND_FRAMEWORK LAST)
endif()
+if (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
+ set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03")
+elseif (NOT CMAKE_VERSION VERSION_LESS "3.1")
+ set (CMAKE_C_STANDARD_REQUIRED TRUE)
+ set (CMAKE_C_STANDARD "99")
+endif ()
+
# Look for packages
find_package(PCRE)
find_package(Freetype)
@@ -83,6 +92,9 @@ find_package(OpenGL)
find_package(GLEW)
find_package(GLM)
find_package(GLFW)
+find_package(GLFW3)
+find_package(SDL2)
+find_package(SDL2_image)
find_package(DirectXSDK)
find_package(D3DX11Effects)
find_package(Irrlicht)
@@ -90,6 +102,7 @@ find_package(Ogre)
find_package(OIS)
find_package(DirectFB)
find_package(OpenGLES)
+find_package(Epoxy)
find_package(EXPAT)
find_package(XercesC)
@@ -106,7 +119,14 @@ find_package(PVRTools)
find_package(Lua51)
find_package(TOLUAPP)
find_package(PythonInterp)
-find_package(PythonLibs)
+
+## ensure python3 not picked up as default
+find_package(PythonVersion)
+if (UNIX AND PYTHON_VERSION_FOUND)
+ find_package(PythonLibs ${PYTHON_VERSION_STRING} EXACT)
+else()
+ find_package(PythonLibs)
+endif()
find_package(Boost 1.36.0 COMPONENTS python unit_test_framework system timer)
find_package(Doxygen)
@@ -114,6 +134,19 @@ find_package(GTK2 COMPONENTS gtk)
# set for consistency with other deps
set (GTK2_INCLUDE_DIR ${GTK2_INCLUDE_DIRS})
+## Search for ccache
+find_program(CCACHE_FOUND ccache)
+if(CCACHE_FOUND)
+ set(ENV(CCACHE_CPP2) "yes")
+ set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+ set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
+endif(CCACHE_FOUND)
+
+if (GLEW_FOUND OR EPOXY_FOUND)
+ set (OPENGL_LOADER_FOUND TRUE)
+else ()
+ set (OPENGL_LOADER_FOUND FALSE)
+endif ()
################################################################################
# Define the configurable options
@@ -166,9 +199,10 @@ option( CEGUI_BUILD_IMAGECODEC_CORONA "Specifies whether to build the Corona bas
option( CEGUI_BUILD_IMAGECODEC_STB "Specifies whether to build the STB based ImageCodec module" FALSE )
option( CEGUI_BUILD_IMAGECODEC_TGA "Specifies whether to build the based TGA only ImageCodec module" FALSE )
option( CEGUI_BUILD_IMAGECODEC_PVR "Specifies whether to build the PVR only ImageCodec module" ${PVRTOOLS_FOUND} )
+cegui_dependent_option( CEGUI_BUILD_IMAGECODEC_SDL2 "Specifies whether to build the SDL2 ImageCodec module" "SDL2_FOUND;SDL2IMAGE_FOUND" )
-cegui_dependent_option( CEGUI_BUILD_RENDERER_OPENGL "Specifies whether to build the OpenGL renderer module" "OPENGL_FOUND;GLM_FOUND;GLEW_FOUND" )
-cegui_dependent_option( CEGUI_BUILD_RENDERER_OPENGL3 "Specifies whether to build the OpenGL 3+ (core profile) renderer module" "OPENGL_FOUND;GLM_FOUND;GLEW_FOUND")
+cegui_dependent_option( CEGUI_BUILD_RENDERER_OPENGL "Specifies whether to build the old OpenGL renderer module" "OPENGL_gl_LIBRARY;GLM_FOUND;GLEW_FOUND" )
+cegui_dependent_option( CEGUI_BUILD_RENDERER_OPENGL3 "Specifies whether to build the renderer module that supports OpenGL 3.2 (core profile) and OpenGL ES 2.0." "OPENGL_gl_LIBRARY;GLM_FOUND;OPENGL_LOADER_FOUND")
option( CEGUI_BUILD_RENDERER_OGRE "Specifies whether to build the Ogre renderer module" ${OGRE_FOUND} )
option( CEGUI_BUILD_RENDERER_IRRLICHT "Specifies whether to build the Irrlicht renderer module" ${IRRLICHT_FOUND} )
option( CEGUI_BUILD_RENDERER_DIRECTFB "Specifies whether to build the DirectFB renderer module (not supported!)" FALSE )
@@ -176,8 +210,7 @@ cegui_dependent_option( CEGUI_BUILD_RENDERER_DIRECT3D9 "Specifies whether to bui
cegui_dependent_option( CEGUI_BUILD_RENDERER_DIRECT3D10 "Specifies whether to build the Direct3D 10 renderer module" "DIRECTXSDK_FOUND;NOT DIRECTXSDK_MAX_D3D LESS 10" )
cegui_dependent_option( CEGUI_BUILD_RENDERER_DIRECT3D11 "Specifies whether to build the Direct3D 11 renderer module" "DIRECTXSDK_FOUND;D3DX11EFFECTS_FOUND;NOT DIRECTXSDK_MAX_D3D LESS 11" )
option( CEGUI_BUILD_RENDERER_NULL "Specifies whether to build the null renderer module" FALSE )
-option( CEGUI_BUILD_RENDERER_OPENGLES "Specifies whether to build the OpenGLES renderer module" ${OPENGLES_FOUND} )
-
+option( CEGUI_BUILD_RENDERER_OPENGLES "Specifies whether to build the OpenGL ES 1 renderer module" ${OPENGLES_FOUND} )
cegui_dependent_option( CEGUI_BUILD_LUA_MODULE "Specifies whether to build the Lua based script module" "LUA51_FOUND;TOLUAPP_FOUND" )
cegui_dependent_option( CEGUI_BUILD_LUA_GENERATOR "Specifies whether to build the custom tolua binding generator 'toluappcegui'" "LUA51_FOUND;TOLUAPP_FOUND" )
@@ -193,10 +226,78 @@ if (CEGUI_USE_MINIBIDI AND CEGUI_USE_FRIBIDI)
message(SEND_ERROR "You may not enable both CEGUI_USE_FRIBIDI and CEGUI_USE_MINIBIDI. Please choose only one of these options.")
endif()
+if (CEGUI_BUILD_RENDERER_OPENGL OR CEGUI_BUILD_RENDERER_OPENGL3)
+ if (GLEW_FOUND AND EPOXY_FOUND)
+ option (CEGUI_USE_GLEW "Specifies whether to use GLEW as an OpenGL loading library." TRUE)
+ option (CEGUI_USE_EPOXY "Specifies whether to use Epoxy as an OpenGL loading library." FALSE)
+ if (CEGUI_USE_GLEW AND CEGUI_USE_EPOXY)
+ message (FATAL_ERROR "You may not enable both \"CEGUI_USE_GLEW\" and \"CEGUI_USE_EPOXY\". Please choose only one of these options.")
+ endif ()
+ else ()
+ set (CEGUI_USE_GLEW "${GLEW_FOUND}")
+ set (CEGUI_USE_EPOXY "${EPOXY_FOUND}")
+ endif ()
+ if (CEGUI_BUILD_RENDERER_OPENGL AND NOT CEGUI_USE_GLEW)
+ message (FATAL_ERROR "Building the old OpenGL renderer module is only supported using GLEW.")
+ endif ()
+ if (NOT ANDROID)
+ set (CEGUI_GLFW_VER "" CACHE STRING "Specifies which major version of GLFW to use for the samples (2 or 3). The default is to look for both, giving priority to version 2.")
+
+ if (((CEGUI_GLFW_VER STREQUAL "2") OR (CEGUI_GLFW_VER STREQUAL "")) AND GLFW_FOUND)
+ set (CEGUI_USE_GLFW_VER "2")
+ elseif (((CEGUI_GLFW_VER STREQUAL "3") OR (CEGUI_GLFW_VER STREQUAL "")) AND GLFW3_FOUND)
+ set (CEGUI_USE_GLFW_VER "3")
+ endif ()
+ endif ()
+endif ()
+
+if (CEGUI_BUILD_RENDERER_OPENGL3 AND CEGUI_USE_EPOXY)
+ set (CEGUI_SUPPORT_RENDERER_OPENGLES2 TRUE)
+ set (CEGUI_OPENGL_VER_MAJOR_FORCE "" CACHE STRING "Run the samples as if a specific OpenGL (desktop or ES) major version is used. Useful for testing.")
+ mark_as_advanced (CEGUI_OPENGL_VER_MAJOR_FORCE)
+ set (CEGUI_OPENGL_VER_MINOR_FORCE "0" CACHE STRING "Run the samples as if a specific OpenGL (desktop or ES) minor version is used. Useful for testing.")
+ mark_as_advanced (CEGUI_OPENGL_VER_MINOR_FORCE)
+else ()
+ set (CEGUI_SUPPORT_RENDERER_OPENGLES2 FALSE)
+endif ()
+
+if (CEGUI_SUPPORT_RENDERER_OPENGLES2 AND ((CEGUI_USE_GLFW_VER STREQUAL "3") OR ANDROID))
+ set (CEGUI_SAMPLES_SUPPORT_RENDERER_OPENGLES2 TRUE)
+else ()
+ set (CEGUI_SAMPLES_SUPPORT_RENDERER_OPENGLES2 FALSE)
+endif ()
+
+option (CEGUI_WARNINGS_AS_ERRORS "Specifies whether to treat warnings as errors. Recommended if you're developing CEGUI itself." OFF)
+
+set (CEGUI_EXTRA_FLAGS "")
+
+if (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
+ set (CEGUI_EXTRA_FLAGS "${CEGUI_EXTRA_FLAGS} -fsigned-char")
+endif ()
+
+if (CMAKE_COMPILER_IS_GNUCXX)
+ set (CEGUI_EXTRA_FLAGS "${CEGUI_EXTRA_FLAGS} -Wall -Wextra -Wundef")
+endif ()
+
+if (CEGUI_WARNINGS_AS_ERRORS)
+ if (CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
+ set (CEGUI_EXTRA_FLAGS "${CEGUI_EXTRA_FLAGS} -Werror")
+ elseif (MSVC)
+ set (CEGUI_EXTRA_FLAGS "${CEGUI_EXTRA_FLAGS} /WX")
+ else ()
+ message (WARNING "You've specified \"CEGUI_WARNINGS_AS_ERRORS\" as \"ON\", but we don't know how to make it for your compiler. If you wish you can specifiy the required flags manually.")
+ endif ()
+endif ()
+
+set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CEGUI_EXTRA_FLAGS}")
+set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CEGUI_EXTRA_FLAGS}")
+set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CEGUI_EXTRA_FLAGS}")
+set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CEGUI_EXTRA_FLAGS}")
+set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CEGUI_EXTRA_FLAGS}")
+
# Here we check if Ogre is built to use boost, and if yes, if the necessary dependencies are available and found by CEGUI
set (CEGUI_OGRE_DEPS_AVAILABLE FALSE)
set (CEGUI_OGRE_SAMPLES_EXTRALIBS)
-
if (CEGUI_BUILD_RENDERER_OGRE AND OIS_FOUND)
if (NOT Boost_VERSION LESS 105000 AND "${OGRE_THREAD_PROVIDER}" STREQUAL "1") #Check additionally if we use boost as thread provider at all
if (Boost_SYSTEM_FOUND)
@@ -231,11 +332,9 @@ if (CEGUI_BUILD_RENDERER_OGRE AND NOT CEGUI_OGRE_DEPS_AVAILABLE)
set (CEGUI_SAMPLES_RENDERER_OGRE_ACTIVE FALSE)
endif()
-if (CEGUI_SAMPLES_RENDERER_OPENGL_ACTIVE)
- if(NOT GLFW_FOUND)
- set (CEGUI_SAMPLES_RENDERER_OPENGL_ACTIVE FALSE)
- message(STATUS "Info: The OpenGL- and/or OpenGL3 Renderers are disabled in the SampleBrowser because of missing dependencies (GLFW library). Please add the GFLW dependency and run 'Configure' in CMake again, in case you want to run the SampleBrowser using the OpenGL or OpenGL3 Renderers.")
- endif()
+if (CEGUI_SAMPLES_RENDERER_OPENGL_ACTIVE AND NOT (CEGUI_USE_GLFW_VER OR ANDROID))
+ set (CEGUI_SAMPLES_RENDERER_OPENGL_ACTIVE FALSE)
+ message(STATUS "Info: The OpenGL-, OpenGL3 and/or OpenGL ES 2 Renderers are disabled in the SampleBrowser because of missing dependencies (GLFW 2/3 library). Please add the GFLW dependency and run 'Configure' in CMake again, in case you want to run the SampleBrowser using the OpenGL, OpenGL3 or OpenGL ES 2 Renderers.")
endif()
# If we use a Renderer then our samples should be ON by default
@@ -252,6 +351,9 @@ if (UNIX AND NOT APPLE AND NOT WIN32)
option( CEGUI_SAMPLES_USE_GTK2 "Specifies whether the sample applications will make use of the GTK2 UI for renderer selection." FALSE )
endif()
+# Option wether to build application templates; default off
+option(CEGUI_BUILD_APPLICATION_TEMPLATES "Specifies whether to build the application templates." TRUE)
+
if (WIN32 OR APPLE)
set (CEGUI_BUILD_SUFFIX "_d" CACHE STRING "String holding a suffix appended to the name of output binaries (under CMake build, only used for debug).")
else()
@@ -287,6 +389,16 @@ cmake_dependent_option( CEGUI_BUILD_DATAFILES_TEST "Specifies whether to build t
option( CEGUI_INSTALL_WITH_RPATH "Specifies whether to install with RPATH set to the install location (TRUE) or with no RPATH set (FALSE)." FALSE )
+# custom install locations
+option( CEGUI_LIB_INSTALL_DIR "Specifies custom location for CEGUI_LIB_INSTALL_DIR" )
+option( CEGUI_DATA_INSTALL_DIR "Specifies custom location for CEGUI_DATA_INSTALL_DIR" )
+option( CEGUI_DOC_INSTALL_DIR "Specifies custom location for CEGUI_DOC_INSTALL_DIR" )
+option( CEGUI_PKGCONFIG_INSTALL_DIR "Specifies custom location for CEGUI_PKGCONFIG_INSTALL_DIR" )
+option( CEGUI_MODULE_INSTALL_DIR "Specifies custom location for CEGUI_MODULE_INSTALL_DIR" )
+option( CEGUI_SAMPLE_INSTALL_DIR "Specifies custom location for CEGUI_SAMPLE_INSTALL_DIR" ) # TODO: put into /samples subdir!
+option( CEGUI_INCLUDE_INSTALL_DIR "Specifies custom location for CEGUI_INCLUDE_INSTALL_DIR" )
+
+
################################################################################
# Define vars holding the names for all the libs we can build for CEGUI.
################################################################################
@@ -295,7 +407,6 @@ cegui_set_library_name( CEGUI_BASE_LIBNAME CEGUIBase )
# Renderer module names.
cegui_set_library_name( CEGUI_OPENGL_RENDERER_LIBNAME CEGUIOpenGLRenderer )
-cegui_set_library_name( CEGUI_OPENGL3_RENDERER_LIBNAME CEGUIOpenGL3Renderer )
cegui_set_library_name( CEGUI_OGRE_RENDERER_LIBNAME CEGUIOgreRenderer)
cegui_set_library_name( CEGUI_IRRLICHT_RENDERER_LIBNAME CEGUIIrrlichtRenderer )
cegui_set_library_name( CEGUI_DIRECT3D9_RENDERER_LIBNAME CEGUIDirect3D9Renderer )
@@ -320,6 +431,7 @@ cegui_set_module_name( CEGUI_CORONA_IMAGECODEC_LIBNAME CEGUICoronaImageCodec )
cegui_set_module_name( CEGUI_TGA_IMAGECODEC_LIBNAME CEGUITGAImageCodec )
cegui_set_module_name( CEGUI_STB_IMAGECODEC_LIBNAME CEGUISTBImageCodec )
cegui_set_module_name( CEGUI_PVR_IMAGECODEC_LIBNAME CEGUIPVRImageCodec )
+cegui_set_module_name( CEGUI_SDL2_IMAGECODEC_LIBNAME CEGUISDL2ImageCodec )
# WindowRenderer set module names
cegui_set_module_name( CEGUI_CORE_WR_LIBNAME CEGUICoreWindowRendererSet )
@@ -397,6 +509,9 @@ elseif (CEGUI_BUILD_IMAGECODEC_STB)
elseif (CEGUI_BUILD_IMAGECODEC_CORONA)
set( CEGUI_OPTION_DEFAULT_IMAGECODEC "CoronaImageCodec" CACHE STRING "Specifies the ImageCodec module to use as the default" )
set( CEGUI_STATIC_IMAGECODEC_MODULE ${CEGUI_CORONA_IMAGECODEC_LIBNAME} CACHE STRING "Specifies image codec library to link to samples in static builds." )
+elseif (CEGUI_BUILD_IMAGECODEC_SDL2)
+ set( CEGUI_OPTION_DEFAULT_IMAGECODEC "SDL2ImageCodec" CACHE STRING "Specifies the ImageCodec module to use as the default" )
+ set( CEGUI_STATIC_IMAGECODEC_MODULE ${CEGUI_SDL2_IMAGECODEC_LIBNAME} CACHE STRING "Specifies image codec library to link to samples in static builds." )
elseif (CEGUI_BUILD_IMAGECODEC_TGA)
set( CEGUI_OPTION_DEFAULT_IMAGECODEC "TGAImageCodec" CACHE STRING "Specifies the ImageCodec module to use as the default" )
set( CEGUI_STATIC_IMAGECODEC_MODULE ${CEGUI_TGA_IMAGECODEC_LIBNAME} CACHE STRING "Specifies image codec library to link to samples in static builds." )
@@ -412,6 +527,7 @@ cegui_defaultmodule_sanity_test(CEGUI_OPTION_DEFAULT_IMAGECODEC "FreeImageImageC
cegui_defaultmodule_sanity_test(CEGUI_OPTION_DEFAULT_IMAGECODEC "STBImageCodec" CEGUI_BUILD_IMAGECODEC_STB)
cegui_defaultmodule_sanity_test(CEGUI_OPTION_DEFAULT_IMAGECODEC "CoronaImageCodec" CEGUI_BUILD_IMAGECODEC_CORONA)
cegui_defaultmodule_sanity_test(CEGUI_OPTION_DEFAULT_IMAGECODEC "TGAImageCodec" CEGUI_BUILD_IMAGECODEC_TGA)
+cegui_defaultmodule_sanity_test(CEGUI_OPTION_DEFAULT_IMAGECODEC "SDL2ImageCodec" CEGUI_BUILD_IMAGECODEC_SDL2)
if (CEGUI_BUILD_STATIC_CONFIGURATION)
cegui_defaultmodule_sanity_test(CEGUI_STATIC_IMAGECODEC_MODULE ${CEGUI_SILLY_IMAGECODEC_LIBNAME} CEGUI_BUILD_IMAGECODEC_SILLY)
@@ -420,14 +536,15 @@ if (CEGUI_BUILD_STATIC_CONFIGURATION)
cegui_defaultmodule_sanity_test(CEGUI_STATIC_IMAGECODEC_MODULE ${CEGUI_STB_IMAGECODEC_LIBNAME} CEGUI_BUILD_IMAGECODEC_STB)
cegui_defaultmodule_sanity_test(CEGUI_STATIC_IMAGECODEC_MODULE ${CEGUI_CORONA_IMAGECODEC_LIBNAME} CEGUI_BUILD_IMAGECODEC_CORONA)
cegui_defaultmodule_sanity_test(CEGUI_STATIC_IMAGECODEC_MODULE ${CEGUI_TGA_IMAGECODEC_LIBNAME} CEGUI_BUILD_IMAGECODEC_TGA)
+ cegui_defaultmodule_sanity_test(CEGUI_STATIC_IMAGECODEC_MODULE ${CEGUI_SDL2_IMAGECODEC_LIBNAME} CEGUI_BUILD_IMAGECODEC_SDL2)
endif()
################################################################################
# Add main header locations (for everything we build)
################################################################################
include_directories(
- ${CMAKE_CURRENT_BINARY_DIR}/cegui/include
- ${CMAKE_CURRENT_SOURCE_DIR}/cegui/include
+ ${PROJECT_BINARY_DIR}/cegui/include
+ ${PROJECT_SOURCE_DIR}/cegui/include
)
@@ -444,45 +561,64 @@ if (WIN32)
endif()
# set build output locations
-set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
+set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
if (WIN32)
- set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
else()
- set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
endif()
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
-set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
+set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
# set up install sub-directories
-if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND EXISTS "${CMAKE_INSTALL_PREFIX}/lib64")
+if (NOT CEGUI_LIB_INSTALL_DIR)
+ if (CMAKE_SIZEOF_VOID_P EQUAL 8 AND EXISTS "${CMAKE_INSTALL_PREFIX}/lib64")
set( CEGUI_LIB_INSTALL_DIR lib64 )
-elseif (CMAKE_SIZEOF_VOID_P EQUAL 4 AND EXISTS "${CMAKE_INSTALL_PREFIX}/lib32")
+ elseif (CMAKE_SIZEOF_VOID_P EQUAL 4 AND EXISTS "${CMAKE_INSTALL_PREFIX}/lib32")
set( CEGUI_LIB_INSTALL_DIR lib32 )
-else()
+ else()
set( CEGUI_LIB_INSTALL_DIR lib )
+ endif()
endif()
set( CEGUI_VER_INSTALL_SUBDIR "/${CMAKE_PROJECT_NAME}-${CEGUI_VERSION_MAJOR}" )
-set( CEGUI_DATA_INSTALL_DIR "share${CEGUI_VER_INSTALL_SUBDIR}" )
-set( CEGUI_DOC_INSTALL_DIR "share/doc${CEGUI_VER_INSTALL_SUBDIR}" )
-set( CEGUI_PKGCONFIG_INSTALL_DIR "${CEGUI_LIB_INSTALL_DIR}/pkgconfig" )
-set( CEGUI_MODULE_INSTALL_DIR "${CEGUI_LIB_INSTALL_DIR}/${CMAKE_PROJECT_NAME}-${CEGUI_VERSION_MAJOR}.${CEGUI_VERSION_MINOR}" )
-set( CEGUI_SAMPLE_INSTALL_DIR "${CEGUI_MODULE_INSTALL_DIR}" ) # TODO: put into /samples subdir!
-set( CEGUI_INCLUDE_INSTALL_DIR "include${CEGUI_VER_INSTALL_SUBDIR}" )
+if (NOT CEGUI_DATA_INSTALL_DIR)
+ set( CEGUI_DATA_INSTALL_DIR "share${CEGUI_VER_INSTALL_SUBDIR}" )
+endif()
+
+if (NOT CEGUI_DOC_INSTALL_DIR)
+ set( CEGUI_DOC_INSTALL_DIR "share/doc${CEGUI_VER_INSTALL_SUBDIR}" )
+endif()
+
+if (NOT CEGUI_PKGCONFIG_INSTALL_DIR)
+ set( CEGUI_PKGCONFIG_INSTALL_DIR "${CEGUI_LIB_INSTALL_DIR}/pkgconfig" )
+endif()
+
+if (NOT CEGUI_MODULE_INSTALL_DIR)
+ set( CEGUI_MODULE_INSTALL_DIR "${CEGUI_LIB_INSTALL_DIR}/${CMAKE_PROJECT_NAME}-${CEGUI_VERSION_MAJOR}.${CEGUI_VERSION_MINOR}" )
+endif()
+
+if (NOT CEGUI_SAMPLE_INSTALL_DIR)
+ set( CEGUI_SAMPLE_INSTALL_DIR "${CEGUI_MODULE_INSTALL_DIR}" ) # TODO: put into /samples subdir!
+endif()
+
+if (NOT CEGUI_INCLUDE_INSTALL_DIR)
+ set( CEGUI_INCLUDE_INSTALL_DIR "include${CEGUI_VER_INSTALL_SUBDIR}" )
+endif()
################################################################################
# Deal with files we generate from template files
@@ -495,31 +631,31 @@ configure_file( doc/doxygen/doxyfile.in doc/doxygen/doxyfile )
if (UNIX AND NOT APPLE)
configure_file( cegui/CEGUI.pc.in cegui/CEGUI-${CEGUI_VERSION_MAJOR}.pc @ONLY )
- install(FILES ${CMAKE_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR})
+ install(FILES ${PROJECT_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR} COMPONENT cegui_devel)
if (CEGUI_BUILD_RENDERER_NULL)
configure_file( cegui/CEGUI-NULL.pc.in cegui/CEGUI-${CEGUI_VERSION_MAJOR}-NULL.pc @ONLY )
- install(FILES ${CMAKE_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-NULL.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR})
+ install(FILES ${PROJECT_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-NULL.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR} COMPONENT cegui_devel)
endif()
if (CEGUI_BUILD_RENDERER_IRRLICHT)
configure_file( cegui/CEGUI-IRRLICHT.pc.in cegui/CEGUI-${CEGUI_VERSION_MAJOR}-IRRLICHT.pc @ONLY )
- install(FILES ${CMAKE_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-IRRLICHT.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR})
+ install(FILES ${PROJECT_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-IRRLICHT.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR} COMPONENT cegui_devel)
endif()
if (CEGUI_BUILD_RENDERER_OGRE)
configure_file( cegui/CEGUI-OGRE.pc.in cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OGRE.pc @ONLY )
- install(FILES ${CMAKE_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OGRE.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR})
+ install(FILES ${PROJECT_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OGRE.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR} COMPONENT cegui_devel)
endif()
if (CEGUI_BUILD_RENDERER_OPENGL)
configure_file( cegui/CEGUI-OPENGL.pc.in cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OPENGL.pc @ONLY )
- install(FILES ${CMAKE_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OPENGL.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR})
+ install(FILES ${PROJECT_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OPENGL.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR} COMPONENT cegui_devel)
endif()
if (CEGUI_BUILD_RENDERER_OPENGL3)
configure_file( cegui/CEGUI-OPENGL3.pc.in cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OPENGL3.pc @ONLY )
- install(FILES ${CMAKE_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OPENGL3.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR})
+ install(FILES ${PROJECT_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-OPENGL3.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR} COMPONENT cegui_devel)
endif()
if (CEGUI_BUILD_LUA_MODULE)
configure_file( cegui/CEGUI-LUA.pc.in cegui/CEGUI-${CEGUI_VERSION_MAJOR}-LUA.pc @ONLY )
- install(FILES ${CMAKE_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-LUA.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR})
+ install(FILES ${PROJECT_BINARY_DIR}/cegui/CEGUI-${CEGUI_VERSION_MAJOR}-LUA.pc DESTINATION ${CEGUI_PKGCONFIG_INSTALL_DIR} COMPONENT cegui_devel)
endif()
endif()
@@ -546,12 +682,16 @@ if (CEGUI_SAMPLES_ENABLED)
add_subdirectory(samples)
endif()
+if (CEGUI_BUILD_APPLICATION_TEMPLATES)
+ add_subdirectory(application_templates)
+endif()
+
add_subdirectory(datafiles)
if (DOXYGEN_FOUND)
add_custom_target(html
"${DOXYGEN_EXECUTABLE}"
- WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/doc/doxygen"
+ WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/doc/doxygen"
COMMENT "Generating documentation" VERBATIM)
endif()
@@ -566,8 +706,8 @@ endif()
################################################################################
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Crazy Eddie's Gui System")
set(CPACK_PACKAGE_VENDOR "CEGUI team")
-set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md")
-set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
+set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md")
+set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/COPYING")
set(CPACK_PACKAGE_VERSION_MAJOR "${CEGUI_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${CEGUI_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${CEGUI_VERSION_PATCH}")
diff --git a/README.md b/README.md
index a628d17cf..e50c6f580 100644
--- a/README.md
+++ b/README.md
@@ -2,18 +2,18 @@
[](http://www.cegui.org.uk)
http://www.cegui.org.uk
-Copyright ©2004 - 2014 Paul D Turner, The CEGUI Development Team and Contributing Authors
+Copyright ©2004 - 2015 Paul D Turner, The CEGUI Development Team and Contributing Authors
-The majority of the auxiliary files for CEGUI, that used to be plain text, are now kept in a "doxygenised" format within the doc/doxygen directory - please see those files, or generate the documentation for a more friendly format. Alternativelly, visit http://static.cegui.org.uk/docs for all your documentation needs!
+The majority of the auxiliary files for CEGUI, that used to be plain text, are now kept in a "doxygenised" format within the doc/doxygen directory - please see those files, or generate the documentation for a more friendly format. Alternatively, visit http://static.cegui.org.uk/docs for all your documentation needs!
What follows is just a quick-start guide, go to our doxygen docs for more detailed documentation.
## Available branches and versions
- The CEGUI repository consists of multiple branches:
- - `v0-8` provides the latest stable ABI compatible (to 0.8.X releases) version of CEGUI. This allows you to replace older 0.8.X versions with newer 0.8.X versions and vice-versa, without having to recompile your project. This branch is also the base for new 0.8.X releases.
- - `v0` Provides the latest stable API compatible version of CEGUI and contains changes that break the ABI. Versions from this branch will be used for the next minor version release.
- - `default` contains changes that will only be used in the next major version. This branch is highly unstable, will introduce fundamental changes and **breaks ABI and API** compatibility. We do not recommend you to use this in production, unless you heavily depend on a feature and discussed this with a developer of CEGUI before: This is recommended so that you are aware of all potential risks. In the general case you are advised to use one of the stable branches, to save you a lot of headache.
+ - `v0-8` provides the latest stable ABI compatible (to 0.8.X releases) version of CEGUI. Based on the C++03 standard and compatible with most common compilers, including Visual Studio 2008-2015. As this branch is ABI compatible, it is possible to replace CEGUI dynamic libraries of version 0.8.X with newer 0.8.X versions, or vice-versa, without having to recompile project. This branch is also the base for new 0.8.X releases.
+ - `v0` Provides the latest stable API compatible version of CEGUI and contains changes that break the ABI. Based on the C++03 standard and compatible with most common compilers, including Visual Studio 2008-2015. Versions from this branch will be used for the next minor version release.
+ - `default` contains changes that will only be used in the next major version. Based on the C++11 standard and compatible with most common up-to date compilers, including Visual Studio 2013 or newer. This branch is highly unstable, will introduce fundamental changes and **breaks ABI and API** compatibility. We do not recommend you to use this in production, unless you heavily depend on a feature and discussed this with a developer of CEGUI before: This is recommended so that you are aware of all potential risks. In the general case you are advised to use one of the stable branches, to save you a lot of headache.
The `v0-8` and `v0` branches are considered stable but do undergo bug-fixes and small changes, which do not break ABI and API respectively. These changes of course introduce a small risk that there might be temporary issues for the moment in the branches. If you notice any bugs in those branches, please report them to us as soon as possible - use the [forum](http://cegui.org.uk/forum/index.php) and/or our IRC channels `#cegui` and `#cegui-devel` on `irc.freenode.net` to inform us. Please consider that we are not available on IRC 24 hours per day, but feel free to idle there until we respond. If in doubt which branch to use, also feel free to ask us this way. For production usage we generally recommend to use a stable release version. A list of releases can be found on the [on our website](cegui.org.uk/download).
@@ -82,25 +82,28 @@ cd build/bin/
CEGUI_SAMPLE_DATAPATH=../../datafiles ./CEGUISampleFramework-0 ../datafiles/samples/samples.xml
```
-## We want to clarify some common misconceptions about CEGUI:
+## We want to answer some questions and misconceptions:
-### "It causes a DLL hell" or "Oh no, so many dll files!"
-First off, the term "DLL hell" is used wrongly by users in this context. It does not mean "I see many DLL files, this must be hell!". Dynamically linking the CEGUI library is the best way to have things working as they are supposed to and guaranteeing good compatibility and a low chance of issues arising with dependencies. On Windows we heavily recommend to never use static linking with CEGUI and past experience has proven us right. A short summary of static vs dynamic linking can be found here: http://stackoverflow.com/questions/1993390/static-linking-vs-dynamic-linking
+### Why are there so many dependencies?
+CEGUI has relatively few **required** dependencies (currently only glm) and many **optional** dependencies. The fact that it supports many different rendering libraries and engines, many different image loaders/codecs (with pass through options) and many different xml parsers is a good thing and only an uninformed person would tell you otherwise.
-### "It has useless version numbers in the dlls and executables"
+### CMake tells me something was not found, is this a problem?
+If CMake tells you that **something** was not found, you **shall not panic** ;) ! Most probably it's a harmless message. You should only worry if a dependency you know you need is not found or if no dependencies are found at all. In the latter case, on Windows and Mac OS X, you probably did not put the "dependencies" folder (including the dependencies compiled in Debug/Release/whatever-else-you-need) into the folder containing all CEGUI files and folders. You can also specify another folder in CMake using the variable CMAKE_PREFIX_PATH.
+
+### What are the version numbers in the dlls and executables good for? How to remove them?
This numbering system does actually serve a very important purpose! Please let us keep them. It allows Linux distributions (and others) to install multiple CEGUI API versions alongside which eases migration and speeds up adoption of new CEGUI versions. On Windows this will allow us to provide you with precompiled CEGUI dependencies using Nuget in the future.
-### "It has a killion dependencies"
-CEGUI has relatively few **required** dependencies (currently only glm) and many optional dependencies. The fact that it supports many different rendering libraries and engines, many different image loaders/codecs (with pass through options) and many different xml parsers is a good thing and only an uninformed person would tell you otherwise.
+### In my application, the OS cursors that is shown above the CEGUI cursor is a lot faster, why?
+This is expected behaviour. First of all you should always test performance in Release mode, but even there the cursor will be slower. The reason is simply that it is very unlikely any application will have a cursor as fast as the OS cursor. Also remember that the speed is closely tied to your frame rate, so if you run the HelloWorld demo at 5000 FPS, the difference will be less but still noticable. Any game, simulation or other application out there that renders its own cursor via OpenGL/Direct3D functions similarly. However, the cursor speed is not an issue for users if your application runs at rasonable frame rates (>60 FPS) without frame drops and will not be perceived as such. Once you hide the OS cursor then the delay will probably not be noticable to you anymore.
-### "CMake tells me something was not found"
-If CMake tells you that **something** was not found, you **shall not panic** ;) ! Most probably it's a harmless message. You should only worry if not a single dependency was found. On Windows and Mac OS X, you should however make sure you placed the dependency folder correctly before running Cmake.
+### So many DLLs, why does CEGUI cause a "DLL hell"? What about static linking?
+First off, the term "DLL hell" is used wrongly in this context. It does not mean "I see many DLL files, this must be hell!". Dynamically linking the CEGUI library is the best way to have things working as they are supposed to and guaranteeing good compatibility and a low chance of issues arising with dependencies. On Windows we recommend to use dynamic linking with CEGUI rather than static linking, as past experience (some of the users ran into technical issues) has shown us that this is safer. However, if you know what you are doing you can definitely use static linking. Be aware though that we only test dynamic linking regularly, so the CMake files might be outdated and you might have to add linked libraries to your IDE yourself etc. On a positive note: in the upcoming 1.0 version we will reduce the amount of DLLs CEGUI creates by merging some of them into the Base library. A short but definitely not complete summary of advantages and disadvantages of static vs dynamic linking can be found here: http://stackoverflow.com/questions/1993390/static-linking-vs-dynamic-linking
-### "It is slow"
-Whenever users complained in the forums about CEGUI's speed it turned out to be that they either ran the application in Debug configuration (which, clearly, the compiler does not compile with full optimisations) or did something wrong (such as updating CEGUI the wrong way or causing unnecessary amounts of events or creating event handling functions that cause the issues on the user's side). Only occasionally it can be tracked down to a bug, but mostly that is connected to specific usage.
+### Is CEGUI slower/faster than other libraries? Why is it slow in my case?
+Mostly when users complained in the forums about CEGUI's speed, it turned out to be that they either ran the application in Debug config or did something wrong: It can be slow if you are loading layout resources/files every frame or causing unnecessary updates and events. Or it can be slow if you are unnecessarily updating CEGUI multiple times per frame in your program. If you cannot find the issue then it is best to perform a forum/google search and - if you do not find anything helpful - to describe your setup in detail and what issues you have. When CEGUI gets slow it can also be due to a very specific usage of specific features, which we did not expect or test. In this case we would like you to describe your use-case in the forum so we can find a solution or, if you are capable of solving the issue yourself, create a pull-request on bitbucket.
-While no complex library out there will ever be perfectly optimised, CEGUI is still to be considered highly performant. CEGUI can easily compete with other GUI libraries in speed. This is true for the computations done on the CPU as well as those on the GPU and the resulting rendering speed. It still runs optimally when hundreds of windows are opened and rendered at the same time.
+In general CEGUI is very fast and can easily compete with other GUI libraries in speed (especially Flash-based ones, since they do not access OpenGL or Direct3D directly). While no complex library out there will ever be perfectly optimised, CEGUI can be considered highly performant. This is true for the computations done on the CPU as well as those on the GPU. It still runs optimally when hundreds of windows are opened and rendered at the same time.
-The best proof that CEGUI is fast is that big proprietary games, which displays hundreds of widgets and use complex hierarchies, have been made using CEGUI (Torchlight 1, Torchlight 2, Venetica, etc.). CEGUI is definitely not *too slow to use*. It could be too slow if you are doing something wrong - like loading layout files every frame or causing unnecessary updates and events. In this case it is best to do a forum search and - if you do not find anything helpful - to describe your setup in detail and what issues you have.
+The best proof that CEGUI is fast is that big proprietary games, which displays hundreds of widgets and use complex hierarchies, have been made using CEGUI (Torchlight 1, Torchlight 2, Venetica, etc.).
-We expect CEGUI to perform very well, and in a lot of cases faster than other libraries. This is epecially true for GUI libraries and toolkits that depend on Flash or similar techniques for rendering and do not access OpenGL or Direct3D directly. Most of our samples, if started in Release mode, will render at speeds above 3000 frames per second on a modern CPU and GPU. As an additional note for people who like to cite or look at benchmarks, we want you to keep in mind that benchmarks are often very situation-dependent and could easily misrepresent a library's actual speed by wrong or unusual usage.
+Most of our samples, if started in Release mode, will render at speeds above 3000 frames per second on a modern CPU and GPU. As an additional note for some people who liked to cite dubious benchmarks regarding such speed comparisons: benchmarks are situation-dependent and could easily misrepresent a library's actual speed by wrong, inefficient or unusual usage. If used correctly and inside the bounds of expected usage, CEGUI performs extremely well.
\ No newline at end of file
diff --git a/android/CEGUISampleFramework/.classpath b/android/CEGUISampleFramework/.classpath
new file mode 100644
index 000000000..d9c5f0ee3
--- /dev/null
+++ b/android/CEGUISampleFramework/.classpath
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/CEGUISampleFramework/AndroidManifest.xml.in b/android/CEGUISampleFramework/AndroidManifest.xml.in
new file mode 100644
index 000000000..ebee5ca31
--- /dev/null
+++ b/android/CEGUISampleFramework/AndroidManifest.xml.in
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/CEGUISampleFramework/ant.properties.in b/android/CEGUISampleFramework/ant.properties.in
new file mode 100644
index 000000000..475745ac6
--- /dev/null
+++ b/android/CEGUISampleFramework/ant.properties.in
@@ -0,0 +1,2 @@
+java.target=$javaVerMajor.$javaVerMinor
+java.source=$javaVerMajor.$javaVerMinor
diff --git a/android/CEGUISampleFramework/build.xml b/android/CEGUISampleFramework/build.xml
new file mode 100644
index 000000000..a10a91491
--- /dev/null
+++ b/android/CEGUISampleFramework/build.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/CEGUISampleFramework/jni/Android.mk.in b/android/CEGUISampleFramework/jni/Android.mk.in
new file mode 100644
index 000000000..07bbfcea8
--- /dev/null
+++ b/android/CEGUISampleFramework/jni/Android.mk.in
@@ -0,0 +1,6 @@
+ceguiDepsInstallDir := $ceguiDepsInstallDir
+ceguiVerMajor := $ceguiVerMajor
+ceguiVerMajorMinor := $ceguiVerMajor.$ceguiVerMinor
+ceguiInstallDir := $ceguiInstallDir
+
+include \$(call all-subdir-makefiles)
diff --git a/android/CEGUISampleFramework/jni/Application.mk.in b/android/CEGUISampleFramework/jni/Application.mk.in
new file mode 100644
index 000000000..601d667ab
--- /dev/null
+++ b/android/CEGUISampleFramework/jni/Application.mk.in
@@ -0,0 +1,5 @@
+APP_PLATFORM := android-$androidNdkApiLevel
+APP_ABI := $androidAbi
+NDK_TOOLCHAIN_VERSION := $androidToolchainVer
+APP_STL := gnustl_shared
+APP_CPPFLAGS := -Wall -Wextra -fexceptions -frtti
diff --git a/android/CEGUISampleFramework/jni/CEGUI/Android.mk b/android/CEGUISampleFramework/jni/CEGUI/Android.mk
new file mode 100644
index 000000000..675f9050d
--- /dev/null
+++ b/android/CEGUISampleFramework/jni/CEGUI/Android.mk
@@ -0,0 +1,51 @@
+LOCAL_PATH := $(call my-dir)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIBase
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/libCEGUIBase-$(ceguiVerMajor).so
+LOCAL_EXPORT_C_INCLUDES := $(ceguiInstallDir)/include/cegui-$(ceguiVerMajor)
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUICommonDialogs
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/libCEGUICommonDialogs-$(ceguiVerMajor).so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUICoreWindowRendererSet
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUICoreWindowRendererSet.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIOpenGLRenderer
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/libCEGUIOpenGLRenderer-$(ceguiVerMajor).so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUISampleFramework
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/libCEGUISampleFramework-$(ceguiVerMajorMinor).so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIFreeImageImageCodec
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIFreeImageImageCodec.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUITinyXMLParser
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUITinyXMLParser.so
+include $(PREBUILT_SHARED_LIBRARY)
diff --git a/android/CEGUISampleFramework/jni/deps/Android.mk.in b/android/CEGUISampleFramework/jni/deps/Android.mk.in
new file mode 100644
index 000000000..71cb8bf71
--- /dev/null
+++ b/android/CEGUISampleFramework/jni/deps/Android.mk.in
@@ -0,0 +1,56 @@
+LOCAL_PATH := $(call my-dir)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := ndk-missing
+LOCAL_SRC_FILES := '"$ndkMissing_libFilePath"'
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := tinyxml
+LOCAL_SRC_FILES := '"$tinyxmlLibFilePath"'
+LOCAL_EXPORT_C_INCLUDES := '"$tinyxmlIncludePath"'
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := freeimage
+LOCAL_SRC_FILES := '"$freeimageLibFilePath"'
+LOCAL_EXPORT_C_INCLUDES := '"$freeimageIncludePath"'
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := pcre
+LOCAL_SRC_FILES := '"$pcreLibFilePath"'
+LOCAL_EXPORT_C_INCLUDES := '"$pcreIncludePath"'
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := freetype
+LOCAL_SRC_FILES := '"$freetypeLibFilePath"'
+LOCAL_EXPORT_C_INCLUDES := '"$freetypeIncludePath"'
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := epoxy
+LOCAL_SRC_FILES := '"$epoxyLibFilePath"'
+LOCAL_EXPORT_C_INCLUDES := '"$epoxyIncludePath"'
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := fribidi
+LOCAL_SRC_FILES := '"$fribidiLibFilePath"'
+LOCAL_EXPORT_C_INCLUDES := '"$fribidiIncludePath"'
+include $(PREBUILT_SHARED_LIBRARY)
diff --git a/android/CEGUISampleFramework/jni/samples/Android.mk b/android/CEGUISampleFramework/jni/samples/Android.mk
new file mode 100644
index 000000000..ae6711cf0
--- /dev/null
+++ b/android/CEGUISampleFramework/jni/samples/Android.mk
@@ -0,0 +1,120 @@
+LOCAL_PATH := $(call my-dir)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIHelloWorldDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIHelloWorldDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUILookNFeelOverviewDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUILookNFeelOverviewDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIGameMenuDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIGameMenuDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIHUDDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIHUDDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIDragDropDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIDragDropDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIInventoryDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIInventoryDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIEffectsDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIEffectsDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIFontDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIFontDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIDemo6
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIDemo6.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIEditboxValidationDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIEditboxValidationDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIMinesweeper
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIMinesweeper.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIScrollablePaneDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIScrollablePaneDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUITabControlDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUITabControlDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUICommonDialogsDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUICommonDialogsDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUIWidgetDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUIWidgetDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUITextDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUITextDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := CEGUITreeDemo
+LOCAL_SRC_FILES := $(ceguiInstallDir)/lib/cegui-$(ceguiVerMajorMinor)/libCEGUITreeDemo.so
+include $(PREBUILT_SHARED_LIBRARY)
diff --git a/android/CEGUISampleFramework/jni/unloadLibs/Android.mk b/android/CEGUISampleFramework/jni/unloadLibs/Android.mk
new file mode 100644
index 000000000..63ddeda38
--- /dev/null
+++ b/android/CEGUISampleFramework/jni/unloadLibs/Android.mk
@@ -0,0 +1,7 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := unloadPreloadedConflictingNativeLibs
+LOCAL_SRC_FILES := main.cpp
+LOCAL_C_INCLUDES := $(ceguiInstallDir)/include/cegui-$(ceguiVerMajor)
+include $(BUILD_SHARED_LIBRARY)
diff --git a/android/CEGUISampleFramework/jni/unloadLibs/main.cpp b/android/CEGUISampleFramework/jni/unloadLibs/main.cpp
new file mode 100644
index 000000000..6342886cb
--- /dev/null
+++ b/android/CEGUISampleFramework/jni/unloadLibs/main.cpp
@@ -0,0 +1,64 @@
+#include "CEGUI/Base.h"
+
+#include
+#include
+#include
+
+extern "C"
+{
+
+/*!
+\brief
+ A function for unloading a set of native libraries in an Android
+ application.
+
+ This is useful in the following scenario: say that our application needs to
+ use a version of e.g. the PCRE library built especially for it. Now say,
+ that Android already contains a system version of this library (e.g.
+ "/system/lib/libpcre.so"), and say that this system version is already
+ loaded by the application. If we don't unload the system version of PCRE,
+ then our version (which is included in the APK) will not be used.
+
+ So at the beginning of our Android activity we load this helper library (the
+ one that contains this source file), and use the following function to
+ unload any version of any native library included in our APK, which is not
+ the version included in our APK. We can find the set of full paths to the
+ loaded libraries by examining the file "/proc/self/maps".
+*/
+
+JNIEXPORT void JNICALL Java_sample_1framework_cegui_MainActivity_unloadLibs
+ (JNIEnv* env, jclass /*class_*/, jobjectArray libs)
+{
+ jsize libs_n(env->GetArrayLength(libs));
+ for (jsize lib_idx(0); lib_idx < libs_n; ++lib_idx)
+ {
+ jstring lib_java(static_cast(env->GetObjectArrayElement(libs, lib_idx)));
+ const char* lib(env->GetStringUTFChars(lib_java, 0));
+ void* lib_handle(0);
+
+ /* You'll probably notice, in the folliwing code, that we call "dlclose"
+ twice. This is not a mistake. If "lib" is already loaded, "dlopen"
+ increases its reference count by 1. Therefore, now to eventually
+ decrease the reference count by 1, we need to decrease it by 2. Each
+ call to "dlclose" decreases it by 1, so we need to call it twice. */
+#if defined __ANDROID_API__ && __ANDROID_API__ >= 21
+ for ( int lib_unload_iteration(0); lib_unload_iteration < 0x100;
+ ++lib_unload_iteration)
+ {
+ if ( !(lib_handle = dlopen(lib, RTLD_LAZY |RTLD_NOLOAD))
+ || dlclose(lib_handle)
+ || dlclose(lib_handle))
+ break;
+ }
+#else
+ // No, this is not a mistake.
+ (lib_handle = dlopen(lib, RTLD_LAZY))
+ && !dlclose(lib_handle)
+ && !dlclose(lib_handle);
+#endif
+ env->ReleaseStringUTFChars(lib_java, lib);
+ env->DeleteLocalRef(lib_java);
+ }
+}
+
+} // extern "C"
diff --git a/android/CEGUISampleFramework/proguard-project.txt b/android/CEGUISampleFramework/proguard-project.txt
new file mode 100644
index 000000000..f2fe1559a
--- /dev/null
+++ b/android/CEGUISampleFramework/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/android/CEGUISampleFramework/project.properties b/android/CEGUISampleFramework/project.properties
new file mode 100644
index 000000000..6e18427a4
--- /dev/null
+++ b/android/CEGUISampleFramework/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-21
diff --git a/android/CEGUISampleFramework/res/layout/activity_main.xml b/android/CEGUISampleFramework/res/layout/activity_main.xml
new file mode 100644
index 000000000..eaea07c94
--- /dev/null
+++ b/android/CEGUISampleFramework/res/layout/activity_main.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/android/CEGUISampleFramework/res/menu/main.xml b/android/CEGUISampleFramework/res/menu/main.xml
new file mode 100644
index 000000000..59fa2a994
--- /dev/null
+++ b/android/CEGUISampleFramework/res/menu/main.xml
@@ -0,0 +1,11 @@
+
diff --git a/android/CEGUISampleFramework/res/values-v11/styles.xml b/android/CEGUISampleFramework/res/values-v11/styles.xml
new file mode 100644
index 000000000..3c02242ad
--- /dev/null
+++ b/android/CEGUISampleFramework/res/values-v11/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/android/CEGUISampleFramework/res/values-v14/styles.xml b/android/CEGUISampleFramework/res/values-v14/styles.xml
new file mode 100644
index 000000000..a91fd0372
--- /dev/null
+++ b/android/CEGUISampleFramework/res/values-v14/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/android/CEGUISampleFramework/res/values-w820dp/dimens.xml b/android/CEGUISampleFramework/res/values-w820dp/dimens.xml
new file mode 100644
index 000000000..f3e70203b
--- /dev/null
+++ b/android/CEGUISampleFramework/res/values-w820dp/dimens.xml
@@ -0,0 +1,10 @@
+
+
+
+ 64dp
+
+
diff --git a/android/CEGUISampleFramework/res/values/dimens.xml b/android/CEGUISampleFramework/res/values/dimens.xml
new file mode 100644
index 000000000..55c1e5908
--- /dev/null
+++ b/android/CEGUISampleFramework/res/values/dimens.xml
@@ -0,0 +1,7 @@
+
+
+
+ 16dp
+ 16dp
+
+
diff --git a/android/CEGUISampleFramework/res/values/strings.xml b/android/CEGUISampleFramework/res/values/strings.xml
new file mode 100644
index 000000000..2916c0896
--- /dev/null
+++ b/android/CEGUISampleFramework/res/values/strings.xml
@@ -0,0 +1,8 @@
+
+
+
+ CEGUI Sample Framework
+ Hello world!
+ Settings
+
+
diff --git a/android/CEGUISampleFramework/res/values/styles.xml b/android/CEGUISampleFramework/res/values/styles.xml
new file mode 100644
index 000000000..6ce89c7ba
--- /dev/null
+++ b/android/CEGUISampleFramework/res/values/styles.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
diff --git a/android/CEGUISampleFramework/src/sample_framework/cegui/MainActivity.java b/android/CEGUISampleFramework/src/sample_framework/cegui/MainActivity.java
new file mode 100644
index 000000000..05aa80370
--- /dev/null
+++ b/android/CEGUISampleFramework/src/sample_framework/cegui/MainActivity.java
@@ -0,0 +1,145 @@
+package sample_framework.cegui;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.util.Log;
+import android.opengl.GLSurfaceView;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Scanner;
+import java.util.HashSet;
+
+public class MainActivity extends Activity
+{
+
+ public static String extractFileNameFromPath(String path)
+ {
+ final int dir_seperator_idx = path.lastIndexOf(File.separator);
+ return dir_seperator_idx >= 0
+ ? path.substring(dir_seperator_idx +File.separator.length())
+ : null;
+ }
+
+ public void exceptionOccured(Throwable throwable)
+ {
+ Log.e ("MainActivity", "Exception thrown; aborting.");
+ Throwable throwableI = throwable;
+ do
+ {
+ Log.e ("MainActivity", "Exception type: "
+ + throwableI.getClass().getName());
+ Log.e ("MainActivity", "Exception Message: "
+ + throwableI.getMessage());
+ throwableI = throwableI.getCause();
+ } while (throwableI != null);
+ finish();
+ }
+
+ public static final String s_ceguiVerMajorMinor = "0.8";
+ public static final String s_unloadLibsName =
+ "unloadPreloadedConflictingNativeLibs";
+ public static final String s_loadedLibsFilePath = "/proc/self/maps";
+ public static final String s_loadedLibsFileEncoding = "UTF-8";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ try {
+ unloadLibs();
+ System.loadLibrary("CEGUISampleFramework-" +s_ceguiVerMajorMinor);
+ d_openglSurfaceView = new GLSurfaceView(this);
+ d_openglSurfaceView.setEGLContextClientVersion(2);
+ d_openglSurfaceView.setRenderer(new Renderer(this));
+ setContentView(d_openglSurfaceView);
+ }
+ catch (Throwable throwable)
+ {
+ exceptionOccured(throwable);
+ }
+ }
+
+ @Override
+ protected void onDestroy()
+ {
+ nativeFinish(this);
+ super.onDestroy();
+ }
+
+ @Override
+ protected void onPause()
+ {
+ d_openglSurfaceView.onPause();
+ super.onPause();
+ }
+
+ @Override
+ protected void onResume()
+ {
+ super.onResume();
+ d_openglSurfaceView.onResume();
+ }
+
+ private static native void unloadLibs(String[] libs);
+ private static native void nativeFinish(Activity activity);
+ static native void init(Activity activity, String log_file,
+ String data_path_prefix);
+ static native void render(Activity activity);
+
+ /* Please refer to "jni/unloadLibs/main.cpp" under the root of the project
+ directory for an explanation what this function does and why it's
+ necessary. */
+ private void unloadLibs() throws IOException, FileNotFoundException
+ {
+ final String native_libs_dir = getApplicationContext()
+ .getApplicationInfo().nativeLibraryDir;
+ final File []native_libs_dir_contents =
+ new File(native_libs_dir).listFiles();
+ HashSet native_libs = new HashSet();
+ HashSet native_libs_canonical_paths = new HashSet();
+ for (File file : native_libs_dir_contents)
+ {
+ final String path = file.getCanonicalPath();
+ final String file_name = extractFileNameFromPath(path);
+ if ( file_name != null
+ && file_name.matches("^lib.*\\.so$")
+ && !file_name.equals("lib" +s_unloadLibsName +".so"))
+ {
+ native_libs.add(file_name);
+ native_libs_canonical_paths.add(path);
+ }
+ }
+ System.loadLibrary(s_unloadLibsName);
+ for ( int libs_unload_iteration=0; libs_unload_iteration < 0x100;
+ ++libs_unload_iteration)
+ {
+ HashSet native_libs_loaded = new HashSet();
+ Scanner loaded_libs_scanner = new Scanner(new File
+ (s_loadedLibsFilePath), s_loadedLibsFileEncoding);
+ while (loaded_libs_scanner.hasNext())
+ {
+ final String full_path = loaded_libs_scanner.next();
+ final String canonical_path =
+ new File(full_path) .getCanonicalPath();
+ final String file_name =
+ extractFileNameFromPath(canonical_path);
+ if ( file_name != null
+ && native_libs.contains(file_name)
+ && !native_libs_canonical_paths
+ .contains(canonical_path))
+ native_libs_loaded.add(canonical_path);
+ }
+ loaded_libs_scanner.close();
+ if (native_libs_loaded.isEmpty())
+ break;
+ String[] libs = new String[native_libs_loaded.size()];
+ native_libs_loaded.toArray(libs);
+ unloadLibs(libs);
+ }
+ }
+
+ private GLSurfaceView d_openglSurfaceView = null;
+
+}
diff --git a/android/CEGUISampleFramework/src/sample_framework/cegui/Renderer.java b/android/CEGUISampleFramework/src/sample_framework/cegui/Renderer.java
new file mode 100644
index 000000000..09a6d0c30
--- /dev/null
+++ b/android/CEGUISampleFramework/src/sample_framework/cegui/Renderer.java
@@ -0,0 +1,41 @@
+package sample_framework.cegui;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import android.opengl.GLSurfaceView;
+import android.os.Environment;
+
+public class Renderer implements GLSurfaceView.Renderer {
+ private boolean d_isInitialised = false;
+ private MainActivity d_activity = null;
+
+ public Renderer(MainActivity activity)
+ {
+ d_activity = activity;
+ }
+
+ @Override
+ public void onSurfaceCreated(GL10 gl, EGLConfig config)
+ {
+ }
+
+ @Override
+ public void onSurfaceChanged(GL10 gl, int width, int height)
+ {
+ }
+
+ @Override
+ public void onDrawFrame(GL10 gl)
+ {
+ if (!d_isInitialised)
+ {
+ d_isInitialised = true;
+ final String cegui_dir = Environment.getExternalStorageDirectory()
+ .getAbsolutePath() +"/CEGUI";
+ MainActivity.init(d_activity, cegui_dir +"/CEGUI.log",
+ cegui_dir +"/datafiles");
+ }
+ MainActivity.render(d_activity);
+ }
+}
diff --git a/android/android-ndk-r10e_RELEASE.TXT b/android/android-ndk-r10e_RELEASE.TXT
new file mode 100644
index 000000000..39be80140
--- /dev/null
+++ b/android/android-ndk-r10e_RELEASE.TXT
@@ -0,0 +1 @@
+r10e-rc4 (64-bit)
diff --git a/android/android.toolchain.cmake.patch b/android/android.toolchain.cmake.patch
new file mode 100644
index 000000000..267eeae66
--- /dev/null
+++ b/android/android.toolchain.cmake.patch
@@ -0,0 +1,42 @@
+--- android.toolchain.cmake.orig 2015-08-22 10:26:58.827289800 +0300
++++ android.toolchain.cmake 2015-08-19 17:52:48.594447000 +0300
+@@ -1324,6 +1324,8 @@
+ # linker flags
+ set( ANDROID_LINKER_FLAGS "" )
+
++set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -L${ANDROID_NDK}/sources/crystax/libs/${ANDROID_ABI}" )
++
+ if( ARMEABI_V7A )
+ # this is *required* to use the following linker flags that routes around
+ # a CPU bug in some Cortex-A8 implementations:
+@@ -1523,10 +1525,9 @@
+ set( BUILD_ANDROID True )
+
+ # where is the target environment
+-set( CMAKE_FIND_ROOT_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin" "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" "${ANDROID_SYSROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" )
++set( CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} "${ANDROID_TOOLCHAIN_ROOT}/bin" "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" "${ANDROID_SYSROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" )
+
+-# only search for libraries and includes in the ndk toolchain
+-set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
++set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
+ set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+ set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+
+@@ -1547,7 +1548,7 @@
+ SET( WIN32 )
+ SET( APPLE )
+ SET( UNIX 1 )
+- set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
++ set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
+ set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+ set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+ endmacro()
+@@ -1569,7 +1570,7 @@
+ SET( WIN32 )
+ SET( APPLE )
+ SET( UNIX 1 )
+- set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
++ set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
+ set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+ set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+ endmacro()
diff --git a/android/android.toolchain.cmake__orig b/android/android.toolchain.cmake__orig
new file mode 100644
index 000000000..ffa26126a
--- /dev/null
+++ b/android/android.toolchain.cmake__orig
@@ -0,0 +1,1693 @@
+# Copyright (c) 2010-2011, Ethan Rublee
+# Copyright (c) 2011-2014, Andrey Kamaev
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its
+# contributors may be used to endorse or promote products derived from this
+# software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# ------------------------------------------------------------------------------
+# Android CMake toolchain file, for use with the Android NDK r5-r10d
+# Requires cmake 2.6.3 or newer (2.8.9 or newer is recommended).
+# See home page: https://github.com/taka-no-me/android-cmake
+#
+# Usage Linux:
+# $ export ANDROID_NDK=/absolute/path/to/the/android-ndk
+# $ mkdir build && cd build
+# $ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/android.toolchain.cmake ..
+# $ make -j8
+#
+# Usage Windows:
+# You need native port of make to build your project.
+# Android NDK r7 (and newer) already has make.exe on board.
+# For older NDK you have to install it separately.
+# For example, this one: http://gnuwin32.sourceforge.net/packages/make.htm
+#
+# $ SET ANDROID_NDK=C:\absolute\path\to\the\android-ndk
+# $ mkdir build && cd build
+# $ cmake.exe -G"MinGW Makefiles"
+# -DCMAKE_TOOLCHAIN_FILE=path\to\the\android.toolchain.cmake
+# -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows\bin\make.exe" ..
+# $ cmake.exe --build .
+#
+#
+# Options (can be set as cmake parameters: -D=):
+# ANDROID_NDK=/opt/android-ndk - path to the NDK root.
+# Can be set as environment variable. Can be set only at first cmake run.
+#
+# ANDROID_ABI=armeabi-v7a - specifies the target Application Binary
+# Interface (ABI). This option nearly matches to the APP_ABI variable
+# used by ndk-build tool from Android NDK.
+#
+# Possible targets are:
+# "armeabi" - ARMv5TE based CPU with software floating point operations
+# "armeabi-v7a" - ARMv7 based devices with hardware FPU instructions
+# this ABI target is used by default
+# "armeabi-v7a with NEON" - same as armeabi-v7a, but
+# sets NEON as floating-point unit
+# "armeabi-v7a with VFPV3" - same as armeabi-v7a, but
+# sets VFPV3 as floating-point unit (has 32 registers instead of 16)
+# "armeabi-v6 with VFP" - tuned for ARMv6 processors having VFP
+# "x86" - IA-32 instruction set
+# "mips" - MIPS32 instruction set
+#
+# 64-bit ABIs for NDK r10 and newer:
+# "arm64-v8a" - ARMv8 AArch64 instruction set
+# "x86_64" - Intel64 instruction set (r1)
+# "mips64" - MIPS64 instruction set (r6)
+#
+# ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for.
+# Option is read-only when standalone toolchain is used.
+# Note: building for "android-L" requires explicit configuration.
+#
+# ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 - the name of compiler
+# toolchain to be used. The list of possible values depends on the NDK
+# version. For NDK r10c the possible values are:
+#
+# * aarch64-linux-android-4.9
+# * aarch64-linux-android-clang3.4
+# * aarch64-linux-android-clang3.5
+# * arm-linux-androideabi-4.6
+# * arm-linux-androideabi-4.8
+# * arm-linux-androideabi-4.9 (default)
+# * arm-linux-androideabi-clang3.4
+# * arm-linux-androideabi-clang3.5
+# * mips64el-linux-android-4.9
+# * mips64el-linux-android-clang3.4
+# * mips64el-linux-android-clang3.5
+# * mipsel-linux-android-4.6
+# * mipsel-linux-android-4.8
+# * mipsel-linux-android-4.9
+# * mipsel-linux-android-clang3.4
+# * mipsel-linux-android-clang3.5
+# * x86-4.6
+# * x86-4.8
+# * x86-4.9
+# * x86-clang3.4
+# * x86-clang3.5
+# * x86_64-4.9
+# * x86_64-clang3.4
+# * x86_64-clang3.5
+#
+# ANDROID_FORCE_ARM_BUILD=OFF - set ON to generate 32-bit ARM instructions
+# instead of Thumb. Is not available for "armeabi-v6 with VFP"
+# (is forced to be ON) ABI.
+#
+# ANDROID_NO_UNDEFINED=ON - set ON to show all undefined symbols as linker
+# errors even if they are not used.
+#
+# ANDROID_SO_UNDEFINED=OFF - set ON to allow undefined symbols in shared
+# libraries. Automatically turned for NDK r5x and r6x due to GLESv2
+# problems.
+#
+# ANDROID_STL=gnustl_static - specify the runtime to use.
+#
+# Possible values are:
+# none -> Do not configure the runtime.
+# system -> Use the default minimal system C++ runtime library.
+# Implies -fno-rtti -fno-exceptions.
+# Is not available for standalone toolchain.
+# system_re -> Use the default minimal system C++ runtime library.
+# Implies -frtti -fexceptions.
+# Is not available for standalone toolchain.
+# gabi++_static -> Use the GAbi++ runtime as a static library.
+# Implies -frtti -fno-exceptions.
+# Available for NDK r7 and newer.
+# Is not available for standalone toolchain.
+# gabi++_shared -> Use the GAbi++ runtime as a shared library.
+# Implies -frtti -fno-exceptions.
+# Available for NDK r7 and newer.
+# Is not available for standalone toolchain.
+# stlport_static -> Use the STLport runtime as a static library.
+# Implies -fno-rtti -fno-exceptions for NDK before r7.
+# Implies -frtti -fno-exceptions for NDK r7 and newer.
+# Is not available for standalone toolchain.
+# stlport_shared -> Use the STLport runtime as a shared library.
+# Implies -fno-rtti -fno-exceptions for NDK before r7.
+# Implies -frtti -fno-exceptions for NDK r7 and newer.
+# Is not available for standalone toolchain.
+# gnustl_static -> Use the GNU STL as a static library.
+# Implies -frtti -fexceptions.
+# gnustl_shared -> Use the GNU STL as a shared library.
+# Implies -frtti -fno-exceptions.
+# Available for NDK r7b and newer.
+# Silently degrades to gnustl_static if not available.
+#
+# ANDROID_STL_FORCE_FEATURES=ON - turn rtti and exceptions support based on
+# chosen runtime. If disabled, then the user is responsible for settings
+# these options.
+#
+# What?:
+# android-cmake toolchain searches for NDK/toolchain in the following order:
+# ANDROID_NDK - cmake parameter
+# ANDROID_NDK - environment variable
+# ANDROID_STANDALONE_TOOLCHAIN - cmake parameter
+# ANDROID_STANDALONE_TOOLCHAIN - environment variable
+# ANDROID_NDK - default locations
+# ANDROID_STANDALONE_TOOLCHAIN - default locations
+#
+# Make sure to do the following in your scripts:
+# SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${my_cxx_flags}" )
+# SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${my_cxx_flags}" )
+# The flags will be prepopulated with critical flags, so don't loose them.
+# Also be aware that toolchain also sets configuration-specific compiler
+# flags and linker flags.
+#
+# ANDROID and BUILD_ANDROID will be set to true, you may test any of these
+# variables to make necessary Android-specific configuration changes.
+#
+# Also ARMEABI or ARMEABI_V7A or X86 or MIPS or ARM64_V8A or X86_64 or MIPS64
+# will be set true, mutually exclusive. NEON option will be set true
+# if VFP is set to NEON.
+#
+# ------------------------------------------------------------------------------
+
+cmake_minimum_required( VERSION 2.6.3 )
+
+if( DEFINED CMAKE_CROSSCOMPILING )
+ # subsequent toolchain loading is not really needed
+ return()
+endif()
+
+if( CMAKE_TOOLCHAIN_FILE )
+ # touch toolchain variable to suppress "unused variable" warning
+endif()
+
+# inherit settings in recursive loads
+get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
+if( _CMAKE_IN_TRY_COMPILE )
+ include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL )
+endif()
+
+# this one is important
+if( CMAKE_VERSION VERSION_GREATER "3.0.99" )
+ set( CMAKE_SYSTEM_NAME Android )
+else()
+ set( CMAKE_SYSTEM_NAME Linux )
+endif()
+
+# this one not so much
+set( CMAKE_SYSTEM_VERSION 1 )
+
+# rpath makes low sense for Android
+set( CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "" )
+set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )
+
+# NDK search paths
+set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r10d -r10c -r10b -r10 -r9d -r9c -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
+if( NOT DEFINED ANDROID_NDK_SEARCH_PATHS )
+ if( CMAKE_HOST_WIN32 )
+ file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
+ set( ANDROID_NDK_SEARCH_PATHS "${ANDROID_NDK_SEARCH_PATHS}" "$ENV{SystemDrive}/NVPACK" )
+ else()
+ file( TO_CMAKE_PATH "$ENV{HOME}" ANDROID_NDK_SEARCH_PATHS )
+ set( ANDROID_NDK_SEARCH_PATHS /opt "${ANDROID_NDK_SEARCH_PATHS}/NVPACK" )
+ endif()
+endif()
+if( NOT DEFINED ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
+ set( ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH /opt/android-toolchain )
+endif()
+
+# known ABIs
+set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armeabi-v7a with VFPV3;armeabi-v6 with VFP" )
+set( ANDROID_SUPPORTED_ABIS_arm64 "arm64-v8a" )
+set( ANDROID_SUPPORTED_ABIS_x86 "x86" )
+set( ANDROID_SUPPORTED_ABIS_x86_64 "x86_64" )
+set( ANDROID_SUPPORTED_ABIS_mips "mips" )
+set( ANDROID_SUPPORTED_ABIS_mips64 "mips64" )
+
+# API level defaults
+set( ANDROID_DEFAULT_NDK_API_LEVEL 8 )
+set( ANDROID_DEFAULT_NDK_API_LEVEL_arm64 21 )
+set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 9 )
+set( ANDROID_DEFAULT_NDK_API_LEVEL_x86_64 21 )
+set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 9 )
+set( ANDROID_DEFAULT_NDK_API_LEVEL_mips64 21 )
+
+
+macro( __LIST_FILTER listvar regex )
+ if( ${listvar} )
+ foreach( __val ${${listvar}} )
+ if( __val MATCHES "${regex}" )
+ list( REMOVE_ITEM ${listvar} "${__val}" )
+ endif()
+ endforeach()
+ endif()
+endmacro()
+
+macro( __INIT_VARIABLE var_name )
+ set( __test_path 0 )
+ foreach( __var ${ARGN} )
+ if( __var STREQUAL "PATH" )
+ set( __test_path 1 )
+ break()
+ endif()
+ endforeach()
+
+ if( __test_path AND NOT EXISTS "${${var_name}}" )
+ unset( ${var_name} CACHE )
+ endif()
+
+ if( " ${${var_name}}" STREQUAL " " )
+ set( __values 0 )
+ foreach( __var ${ARGN} )
+ if( __var STREQUAL "VALUES" )
+ set( __values 1 )
+ elseif( NOT __var STREQUAL "PATH" )
+ if( __var MATCHES "^ENV_.*$" )
+ string( REPLACE "ENV_" "" __var "${__var}" )
+ set( __value "$ENV{${__var}}" )
+ elseif( DEFINED ${__var} )
+ set( __value "${${__var}}" )
+ elseif( __values )
+ set( __value "${__var}" )
+ else()
+ set( __value "" )
+ endif()
+
+ if( NOT " ${__value}" STREQUAL " " AND (NOT __test_path OR EXISTS "${__value}") )
+ set( ${var_name} "${__value}" )
+ break()
+ endif()
+ endif()
+ endforeach()
+ unset( __value )
+ unset( __values )
+ endif()
+
+ if( __test_path )
+ file( TO_CMAKE_PATH "${${var_name}}" ${var_name} )
+ endif()
+ unset( __test_path )
+endmacro()
+
+macro( __DETECT_NATIVE_API_LEVEL _var _path )
+ set( __ndkApiLevelRegex "^[\t ]*#define[\t ]+__ANDROID_API__[\t ]+([0-9]+)[\t ]*.*$" )
+ file( STRINGS ${_path} __apiFileContent REGEX "${__ndkApiLevelRegex}" )
+ if( NOT __apiFileContent )
+ message( SEND_ERROR "Could not get Android native API level. Probably you have specified invalid level value, or your copy of NDK/toolchain is broken." )
+ endif()
+ string( REGEX REPLACE "${__ndkApiLevelRegex}" "\\1" ${_var} "${__apiFileContent}" )
+ unset( __apiFileContent )
+ unset( __ndkApiLevelRegex )
+endmacro()
+
+macro( __DETECT_TOOLCHAIN_MACHINE_NAME _var _root )
+ if( EXISTS "${_root}" )
+ file( GLOB __gccExePath RELATIVE "${_root}/bin/" "${_root}/bin/*-gcc${TOOL_OS_SUFFIX}" )
+ __LIST_FILTER( __gccExePath "^[.].*" )
+ list( LENGTH __gccExePath __gccExePathsCount )
+ if( NOT __gccExePathsCount EQUAL 1 AND NOT _CMAKE_IN_TRY_COMPILE )
+ message( WARNING "Could not determine machine name for compiler from ${_root}" )
+ set( ${_var} "" )
+ else()
+ get_filename_component( __gccExeName "${__gccExePath}" NAME_WE )
+ string( REPLACE "-gcc" "" ${_var} "${__gccExeName}" )
+ endif()
+ unset( __gccExePath )
+ unset( __gccExePathsCount )
+ unset( __gccExeName )
+ else()
+ set( ${_var} "" )
+ endif()
+endmacro()
+
+
+# fight against cygwin
+set( ANDROID_FORBID_SYGWIN TRUE CACHE BOOL "Prevent cmake from working under cygwin and using cygwin tools")
+mark_as_advanced( ANDROID_FORBID_SYGWIN )
+if( ANDROID_FORBID_SYGWIN )
+ if( CYGWIN )
+ message( FATAL_ERROR "Android NDK and android-cmake toolchain are not welcome Cygwin. It is unlikely that this cmake toolchain will work under cygwin. But if you want to try then you can set cmake variable ANDROID_FORBID_SYGWIN to FALSE and rerun cmake." )
+ endif()
+
+ if( CMAKE_HOST_WIN32 )
+ # remove cygwin from PATH
+ set( __new_path "$ENV{PATH}")
+ __LIST_FILTER( __new_path "cygwin" )
+ set(ENV{PATH} "${__new_path}")
+ unset(__new_path)
+ endif()
+endif()
+
+
+# detect current host platform
+if( NOT DEFINED ANDROID_NDK_HOST_X64 AND (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64" OR CMAKE_HOST_APPLE) )
+ set( ANDROID_NDK_HOST_X64 1 CACHE BOOL "Try to use 64-bit compiler toolchain" )
+ mark_as_advanced( ANDROID_NDK_HOST_X64 )
+endif()
+
+set( TOOL_OS_SUFFIX "" )
+if( CMAKE_HOST_APPLE )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME "darwin-x86_64" )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME2 "darwin-x86" )
+elseif( CMAKE_HOST_WIN32 )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME "windows-x86_64" )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME2 "windows" )
+ set( TOOL_OS_SUFFIX ".exe" )
+elseif( CMAKE_HOST_UNIX )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME "linux-x86_64" )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME2 "linux-x86" )
+else()
+ message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" )
+endif()
+
+if( NOT ANDROID_NDK_HOST_X64 )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
+endif()
+
+# see if we have path to Android NDK
+if( NOT ANDROID_NDK AND NOT ANDROID_STANDALONE_TOOLCHAIN )
+ __INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK )
+endif()
+if( NOT ANDROID_NDK )
+ # see if we have path to Android standalone toolchain
+ __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ENV_ANDROID_STANDALONE_TOOLCHAIN )
+
+ if( NOT ANDROID_STANDALONE_TOOLCHAIN )
+ #try to find Android NDK in one of the the default locations
+ set( __ndkSearchPaths )
+ foreach( __ndkSearchPath ${ANDROID_NDK_SEARCH_PATHS} )
+ foreach( suffix ${ANDROID_SUPPORTED_NDK_VERSIONS} )
+ list( APPEND __ndkSearchPaths "${__ndkSearchPath}/android-ndk${suffix}" )
+ endforeach()
+ endforeach()
+ __INIT_VARIABLE( ANDROID_NDK PATH VALUES ${__ndkSearchPaths} )
+ unset( __ndkSearchPaths )
+
+ if( ANDROID_NDK )
+ message( STATUS "Using default path for Android NDK: ${ANDROID_NDK}" )
+ message( STATUS " If you prefer to use a different location, please define a cmake or environment variable: ANDROID_NDK" )
+ else()
+ #try to find Android standalone toolchain in one of the the default locations
+ __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
+
+ if( ANDROID_STANDALONE_TOOLCHAIN )
+ message( STATUS "Using default path for standalone toolchain ${ANDROID_STANDALONE_TOOLCHAIN}" )
+ message( STATUS " If you prefer to use a different location, please define the variable: ANDROID_STANDALONE_TOOLCHAIN" )
+ endif( ANDROID_STANDALONE_TOOLCHAIN )
+ endif( ANDROID_NDK )
+ endif( NOT ANDROID_STANDALONE_TOOLCHAIN )
+endif( NOT ANDROID_NDK )
+
+# remember found paths
+if( ANDROID_NDK )
+ get_filename_component( ANDROID_NDK "${ANDROID_NDK}" ABSOLUTE )
+ set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE )
+ set( BUILD_WITH_ANDROID_NDK True )
+ if( EXISTS "${ANDROID_NDK}/RELEASE.TXT" )
+ file( STRINGS "${ANDROID_NDK}/RELEASE.TXT" ANDROID_NDK_RELEASE_FULL LIMIT_COUNT 1 REGEX "r[0-9]+[a-z]?" )
+ string( REGEX MATCH "r([0-9]+)([a-z]?)" ANDROID_NDK_RELEASE "${ANDROID_NDK_RELEASE_FULL}" )
+ else()
+ set( ANDROID_NDK_RELEASE "r1x" )
+ set( ANDROID_NDK_RELEASE_FULL "unreleased" )
+ endif()
+ string( REGEX REPLACE "r([0-9]+)([a-z]?)" "\\1*1000" ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE}" )
+ string( FIND " abcdefghijklmnopqastuvwxyz" "${CMAKE_MATCH_2}" __ndkReleaseLetterNum )
+ math( EXPR ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE_NUM}+${__ndkReleaseLetterNum}" )
+elseif( ANDROID_STANDALONE_TOOLCHAIN )
+ get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE )
+ # try to detect change
+ if( CMAKE_AR )
+ string( LENGTH "${ANDROID_STANDALONE_TOOLCHAIN}" __length )
+ string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidStandaloneToolchainPreviousPath )
+ if( NOT __androidStandaloneToolchainPreviousPath STREQUAL ANDROID_STANDALONE_TOOLCHAIN )
+ message( FATAL_ERROR "It is not possible to change path to the Android standalone toolchain on subsequent run." )
+ endif()
+ unset( __androidStandaloneToolchainPreviousPath )
+ unset( __length )
+ endif()
+ set( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" CACHE INTERNAL "Path of the Android standalone toolchain" FORCE )
+ set( BUILD_WITH_STANDALONE_TOOLCHAIN True )
+else()
+ list(GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH)
+ message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolchain.
+ You should either set an environment variable:
+ export ANDROID_NDK=~/my-android-ndk
+ or
+ export ANDROID_STANDALONE_TOOLCHAIN=~/my-android-toolchain
+ or put the toolchain or NDK in the default path:
+ sudo ln -s ~/my-android-ndk ${ANDROID_NDK_SEARCH_PATH}/android-ndk
+ sudo ln -s ~/my-android-toolchain ${ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH}" )
+endif()
+
+# android NDK layout
+if( BUILD_WITH_ANDROID_NDK )
+ if( NOT DEFINED ANDROID_NDK_LAYOUT )
+ # try to automatically detect the layout
+ if( EXISTS "${ANDROID_NDK}/RELEASE.TXT")
+ set( ANDROID_NDK_LAYOUT "RELEASE" )
+ elseif( EXISTS "${ANDROID_NDK}/../../linux-x86/toolchain/" )
+ set( ANDROID_NDK_LAYOUT "LINARO" )
+ elseif( EXISTS "${ANDROID_NDK}/../../gcc/" )
+ set( ANDROID_NDK_LAYOUT "ANDROID" )
+ endif()
+ endif()
+ set( ANDROID_NDK_LAYOUT "${ANDROID_NDK_LAYOUT}" CACHE STRING "The inner layout of NDK" )
+ mark_as_advanced( ANDROID_NDK_LAYOUT )
+ if( ANDROID_NDK_LAYOUT STREQUAL "LINARO" )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment
+ set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../${ANDROID_NDK_HOST_SYSTEM_NAME}/toolchain" )
+ set( ANDROID_NDK_TOOLCHAINS_SUBPATH "" )
+ set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" )
+ elseif( ANDROID_NDK_LAYOUT STREQUAL "ANDROID" )
+ set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment
+ set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../gcc/${ANDROID_NDK_HOST_SYSTEM_NAME}/arm" )
+ set( ANDROID_NDK_TOOLCHAINS_SUBPATH "" )
+ set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" )
+ else() # ANDROID_NDK_LAYOUT STREQUAL "RELEASE"
+ set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/toolchains" )
+ set( ANDROID_NDK_TOOLCHAINS_SUBPATH "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" )
+ set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME2}" )
+ endif()
+ get_filename_component( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK_TOOLCHAINS_PATH}" ABSOLUTE )
+
+ # try to detect change of NDK
+ if( CMAKE_AR )
+ string( LENGTH "${ANDROID_NDK_TOOLCHAINS_PATH}" __length )
+ string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidNdkPreviousPath )
+ if( NOT __androidNdkPreviousPath STREQUAL ANDROID_NDK_TOOLCHAINS_PATH )
+ message( FATAL_ERROR "It is not possible to change the path to the NDK on subsequent CMake run. You must remove all generated files from your build folder first.
+ " )
+ endif()
+ unset( __androidNdkPreviousPath )
+ unset( __length )
+ endif()
+endif()
+
+
+# get all the details about standalone toolchain
+if( BUILD_WITH_STANDALONE_TOOLCHAIN )
+ __DETECT_NATIVE_API_LEVEL( ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot/usr/include/android/api-level.h" )
+ set( ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
+ set( __availableToolchains "standalone" )
+ __DETECT_TOOLCHAIN_MACHINE_NAME( __availableToolchainMachines "${ANDROID_STANDALONE_TOOLCHAIN}" )
+ if( NOT __availableToolchainMachines )
+ message( FATAL_ERROR "Could not determine machine name of your toolchain. Probably your Android standalone toolchain is broken." )
+ endif()
+ if( __availableToolchainMachines MATCHES x86_64 )
+ set( __availableToolchainArchs "x86_64" )
+ elseif( __availableToolchainMachines MATCHES i686 )
+ set( __availableToolchainArchs "x86" )
+ elseif( __availableToolchainMachines MATCHES aarch64 )
+ set( __availableToolchainArchs "arm64" )
+ elseif( __availableToolchainMachines MATCHES arm )
+ set( __availableToolchainArchs "arm" )
+ elseif( __availableToolchainMachines MATCHES mips64el )
+ set( __availableToolchainArchs "mips64" )
+ elseif( __availableToolchainMachines MATCHES mipsel )
+ set( __availableToolchainArchs "mips" )
+ endif()
+ execute_process( COMMAND "${ANDROID_STANDALONE_TOOLCHAIN}/bin/${__availableToolchainMachines}-gcc${TOOL_OS_SUFFIX}" -dumpversion
+ OUTPUT_VARIABLE __availableToolchainCompilerVersions OUTPUT_STRIP_TRAILING_WHITESPACE )
+ string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?" __availableToolchainCompilerVersions "${__availableToolchainCompilerVersions}" )
+ if( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/bin/clang${TOOL_OS_SUFFIX}" )
+ list( APPEND __availableToolchains "standalone-clang" )
+ list( APPEND __availableToolchainMachines ${__availableToolchainMachines} )
+ list( APPEND __availableToolchainArchs ${__availableToolchainArchs} )
+ list( APPEND __availableToolchainCompilerVersions ${__availableToolchainCompilerVersions} )
+ endif()
+endif()
+
+macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst __toolchain_subpath )
+ foreach( __toolchain ${${__availableToolchainsLst}} )
+ if( "${__toolchain}" MATCHES "-clang3[.][0-9]$" AND NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}${__toolchain_subpath}" )
+ SET( __toolchainVersionRegex "^TOOLCHAIN_VERSION[\t ]+:=[\t ]+(.*)$" )
+ FILE( STRINGS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}/setup.mk" __toolchainVersionStr REGEX "${__toolchainVersionRegex}" )
+ if( __toolchainVersionStr )
+ string( REGEX REPLACE "${__toolchainVersionRegex}" "\\1" __toolchainVersionStr "${__toolchainVersionStr}" )
+ string( REGEX REPLACE "-clang3[.][0-9]$" "-${__toolchainVersionStr}" __gcc_toolchain "${__toolchain}" )
+ else()
+ string( REGEX REPLACE "-clang3[.][0-9]$" "-4.6" __gcc_toolchain "${__toolchain}" )
+ endif()
+ unset( __toolchainVersionStr )
+ unset( __toolchainVersionRegex )
+ else()
+ set( __gcc_toolchain "${__toolchain}" )
+ endif()
+ __DETECT_TOOLCHAIN_MACHINE_NAME( __machine "${ANDROID_NDK_TOOLCHAINS_PATH}/${__gcc_toolchain}${__toolchain_subpath}" )
+ if( __machine )
+ string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9x]+)?$" __version "${__gcc_toolchain}" )
+ if( __machine MATCHES x86_64 )
+ set( __arch "x86_64" )
+ elseif( __machine MATCHES i686 )
+ set( __arch "x86" )
+ elseif( __machine MATCHES aarch64 )
+ set( __arch "arm64" )
+ elseif( __machine MATCHES arm )
+ set( __arch "arm" )
+ elseif( __machine MATCHES mips64el )
+ set( __arch "mips64" )
+ elseif( __machine MATCHES mipsel )
+ set( __arch "mips" )
+ else()
+ set( __arch "" )
+ endif()
+ #message("machine: !${__machine}!\narch: !${__arch}!\nversion: !${__version}!\ntoolchain: !${__toolchain}!\n")
+ if (__arch)
+ list( APPEND __availableToolchainMachines "${__machine}" )
+ list( APPEND __availableToolchainArchs "${__arch}" )
+ list( APPEND __availableToolchainCompilerVersions "${__version}" )
+ list( APPEND ${__availableToolchainsVar} "${__toolchain}" )
+ endif()
+ endif()
+ unset( __gcc_toolchain )
+ endforeach()
+endmacro()
+
+# get all the details about NDK
+if( BUILD_WITH_ANDROID_NDK )
+ file( GLOB ANDROID_SUPPORTED_NATIVE_API_LEVELS RELATIVE "${ANDROID_NDK}/platforms" "${ANDROID_NDK}/platforms/android-*" )
+ string( REPLACE "android-" "" ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_SUPPORTED_NATIVE_API_LEVELS}" )
+ set( __availableToolchains "" )
+ set( __availableToolchainMachines "" )
+ set( __availableToolchainArchs "" )
+ set( __availableToolchainCompilerVersions "" )
+ if( ANDROID_TOOLCHAIN_NAME AND EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_TOOLCHAIN_NAME}/" )
+ # do not go through all toolchains if we know the name
+ set( __availableToolchainsLst "${ANDROID_TOOLCHAIN_NAME}" )
+ __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
+ if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
+ __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
+ if( __availableToolchains )
+ set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} )
+ endif()
+ endif()
+ endif()
+ if( NOT __availableToolchains )
+ file( GLOB __availableToolchainsLst RELATIVE "${ANDROID_NDK_TOOLCHAINS_PATH}" "${ANDROID_NDK_TOOLCHAINS_PATH}/*" )
+ if( __availableToolchainsLst )
+ list(SORT __availableToolchainsLst) # we need clang to go after gcc
+ endif()
+ __LIST_FILTER( __availableToolchainsLst "^[.]" )
+ __LIST_FILTER( __availableToolchainsLst "llvm" )
+ __LIST_FILTER( __availableToolchainsLst "renderscript" )
+ __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
+ if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
+ __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
+ if( __availableToolchains )
+ set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} )
+ endif()
+ endif()
+ endif()
+ if( NOT __availableToolchains )
+ message( FATAL_ERROR "Could not find any working toolchain in the NDK. Probably your Android NDK is broken." )
+ endif()
+endif()
+
+# build list of available ABIs
+set( ANDROID_SUPPORTED_ABIS "" )
+set( __uniqToolchainArchNames ${__availableToolchainArchs} )
+list( REMOVE_DUPLICATES __uniqToolchainArchNames )
+list( SORT __uniqToolchainArchNames )
+foreach( __arch ${__uniqToolchainArchNames} )
+ list( APPEND ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${__arch}} )
+endforeach()
+unset( __uniqToolchainArchNames )
+if( NOT ANDROID_SUPPORTED_ABIS )
+ message( FATAL_ERROR "No one of known Android ABIs is supported by this cmake toolchain." )
+endif()
+
+# choose target ABI
+__INIT_VARIABLE( ANDROID_ABI VALUES ${ANDROID_SUPPORTED_ABIS} )
+# verify that target ABI is supported
+list( FIND ANDROID_SUPPORTED_ABIS "${ANDROID_ABI}" __androidAbiIdx )
+if( __androidAbiIdx EQUAL -1 )
+ string( REPLACE ";" "\", \"" PRINTABLE_ANDROID_SUPPORTED_ABIS "${ANDROID_SUPPORTED_ABIS}" )
+ message( FATAL_ERROR "Specified ANDROID_ABI = \"${ANDROID_ABI}\" is not supported by this cmake toolchain or your NDK/toolchain.
+ Supported values are: \"${PRINTABLE_ANDROID_SUPPORTED_ABIS}\"
+ " )
+endif()
+unset( __androidAbiIdx )
+
+# set target ABI options
+if( ANDROID_ABI STREQUAL "x86" )
+ set( X86 true )
+ set( ANDROID_NDK_ABI_NAME "x86" )
+ set( ANDROID_ARCH_NAME "x86" )
+ set( ANDROID_LLVM_TRIPLE "i686-none-linux-android" )
+ set( CMAKE_SYSTEM_PROCESSOR "i686" )
+elseif( ANDROID_ABI STREQUAL "x86_64" )
+ set( X86 true )
+ set( X86_64 true )
+ set( ANDROID_NDK_ABI_NAME "x86_64" )
+ set( ANDROID_ARCH_NAME "x86_64" )
+ set( CMAKE_SYSTEM_PROCESSOR "x86_64" )
+ set( ANDROID_LLVM_TRIPLE "x86_64-none-linux-android" )
+elseif( ANDROID_ABI STREQUAL "mips64" )
+ set( MIPS64 true )
+ set( ANDROID_NDK_ABI_NAME "mips64" )
+ set( ANDROID_ARCH_NAME "mips64" )
+ set( ANDROID_LLVM_TRIPLE "mips64el-none-linux-android" )
+ set( CMAKE_SYSTEM_PROCESSOR "mips64" )
+elseif( ANDROID_ABI STREQUAL "mips" )
+ set( MIPS true )
+ set( ANDROID_NDK_ABI_NAME "mips" )
+ set( ANDROID_ARCH_NAME "mips" )
+ set( ANDROID_LLVM_TRIPLE "mipsel-none-linux-android" )
+ set( CMAKE_SYSTEM_PROCESSOR "mips" )
+elseif( ANDROID_ABI STREQUAL "arm64-v8a" )
+ set( ARM64_V8A true )
+ set( ANDROID_NDK_ABI_NAME "arm64-v8a" )
+ set( ANDROID_ARCH_NAME "arm64" )
+ set( ANDROID_LLVM_TRIPLE "aarch64-none-linux-android" )
+ set( CMAKE_SYSTEM_PROCESSOR "aarch64" )
+ set( VFPV3 true )
+ set( NEON true )
+elseif( ANDROID_ABI STREQUAL "armeabi" )
+ set( ARMEABI true )
+ set( ANDROID_NDK_ABI_NAME "armeabi" )
+ set( ANDROID_ARCH_NAME "arm" )
+ set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" )
+ set( CMAKE_SYSTEM_PROCESSOR "armv5te" )
+elseif( ANDROID_ABI STREQUAL "armeabi-v6 with VFP" )
+ set( ARMEABI_V6 true )
+ set( ANDROID_NDK_ABI_NAME "armeabi" )
+ set( ANDROID_ARCH_NAME "arm" )
+ set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" )
+ set( CMAKE_SYSTEM_PROCESSOR "armv6" )
+ # need always fallback to older platform
+ set( ARMEABI true )
+elseif( ANDROID_ABI STREQUAL "armeabi-v7a")
+ set( ARMEABI_V7A true )
+ set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
+ set( ANDROID_ARCH_NAME "arm" )
+ set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
+ set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
+elseif( ANDROID_ABI STREQUAL "armeabi-v7a with VFPV3" )
+ set( ARMEABI_V7A true )
+ set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
+ set( ANDROID_ARCH_NAME "arm" )
+ set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
+ set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
+ set( VFPV3 true )
+elseif( ANDROID_ABI STREQUAL "armeabi-v7a with NEON" )
+ set( ARMEABI_V7A true )
+ set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
+ set( ANDROID_ARCH_NAME "arm" )
+ set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
+ set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
+ set( VFPV3 true )
+ set( NEON true )
+else()
+ message( SEND_ERROR "Unknown ANDROID_ABI=\"${ANDROID_ABI}\" is specified." )
+endif()
+
+if( CMAKE_BINARY_DIR AND EXISTS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" )
+ # really dirty hack
+ # it is not possible to change CMAKE_SYSTEM_PROCESSOR after the first run...
+ file( APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" "SET(CMAKE_SYSTEM_PROCESSOR \"${CMAKE_SYSTEM_PROCESSOR}\")\n" )
+endif()
+
+if( ANDROID_ARCH_NAME STREQUAL "arm" AND NOT ARMEABI_V6 )
+ __INIT_VARIABLE( ANDROID_FORCE_ARM_BUILD VALUES OFF )
+ set( ANDROID_FORCE_ARM_BUILD ${ANDROID_FORCE_ARM_BUILD} CACHE BOOL "Use 32-bit ARM instructions instead of Thumb-1" FORCE )
+ mark_as_advanced( ANDROID_FORCE_ARM_BUILD )
+else()
+ unset( ANDROID_FORCE_ARM_BUILD CACHE )
+endif()
+
+# choose toolchain
+if( ANDROID_TOOLCHAIN_NAME )
+ list( FIND __availableToolchains "${ANDROID_TOOLCHAIN_NAME}" __toolchainIdx )
+ if( __toolchainIdx EQUAL -1 )
+ list( SORT __availableToolchains )
+ string( REPLACE ";" "\n * " toolchains_list "${__availableToolchains}" )
+ set( toolchains_list " * ${toolchains_list}")
+ message( FATAL_ERROR "Specified toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is missing in your NDK or broken. Please verify that your NDK is working or select another compiler toolchain.
+To configure the toolchain set CMake variable ANDROID_TOOLCHAIN_NAME to one of the following values:\n${toolchains_list}\n" )
+ endif()
+ list( GET __availableToolchainArchs ${__toolchainIdx} __toolchainArch )
+ if( NOT __toolchainArch STREQUAL ANDROID_ARCH_NAME )
+ message( SEND_ERROR "Selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is not able to compile binaries for the \"${ANDROID_ARCH_NAME}\" platform." )
+ endif()
+else()
+ set( __toolchainIdx -1 )
+ set( __applicableToolchains "" )
+ set( __toolchainMaxVersion "0.0.0" )
+ list( LENGTH __availableToolchains __availableToolchainsCount )
+ math( EXPR __availableToolchainsCount "${__availableToolchainsCount}-1" )
+ foreach( __idx RANGE ${__availableToolchainsCount} )
+ list( GET __availableToolchainArchs ${__idx} __toolchainArch )
+ if( __toolchainArch STREQUAL ANDROID_ARCH_NAME )
+ list( GET __availableToolchainCompilerVersions ${__idx} __toolchainVersion )
+ string( REPLACE "x" "99" __toolchainVersion "${__toolchainVersion}")
+ if( __toolchainVersion VERSION_GREATER __toolchainMaxVersion )
+ set( __toolchainMaxVersion "${__toolchainVersion}" )
+ set( __toolchainIdx ${__idx} )
+ endif()
+ endif()
+ endforeach()
+ unset( __availableToolchainsCount )
+ unset( __toolchainMaxVersion )
+ unset( __toolchainVersion )
+endif()
+unset( __toolchainArch )
+if( __toolchainIdx EQUAL -1 )
+ message( FATAL_ERROR "No one of available compiler toolchains is able to compile for ${ANDROID_ARCH_NAME} platform." )
+endif()
+list( GET __availableToolchains ${__toolchainIdx} ANDROID_TOOLCHAIN_NAME )
+list( GET __availableToolchainMachines ${__toolchainIdx} ANDROID_TOOLCHAIN_MACHINE_NAME )
+list( GET __availableToolchainCompilerVersions ${__toolchainIdx} ANDROID_COMPILER_VERSION )
+
+unset( __toolchainIdx )
+unset( __availableToolchains )
+unset( __availableToolchainMachines )
+unset( __availableToolchainArchs )
+unset( __availableToolchainCompilerVersions )
+
+# choose native API level
+__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL )
+string( REPLACE "android-" "" ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" )
+string( STRIP "${ANDROID_NATIVE_API_LEVEL}" ANDROID_NATIVE_API_LEVEL )
+# adjust API level
+set( __real_api_level ${ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME}} )
+foreach( __level ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
+ if( (__level LESS ANDROID_NATIVE_API_LEVEL OR __level STREQUAL ANDROID_NATIVE_API_LEVEL) AND NOT __level LESS __real_api_level )
+ set( __real_api_level ${__level} )
+ endif()
+endforeach()
+if( __real_api_level AND NOT ANDROID_NATIVE_API_LEVEL STREQUAL __real_api_level )
+ message( STATUS "Adjusting Android API level 'android-${ANDROID_NATIVE_API_LEVEL}' to 'android-${__real_api_level}'")
+ set( ANDROID_NATIVE_API_LEVEL ${__real_api_level} )
+endif()
+unset(__real_api_level)
+# validate
+list( FIND ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_NATIVE_API_LEVEL}" __levelIdx )
+if( __levelIdx EQUAL -1 )
+ message( SEND_ERROR "Specified Android native API level 'android-${ANDROID_NATIVE_API_LEVEL}' is not supported by your NDK/toolchain." )
+else()
+ if( BUILD_WITH_ANDROID_NDK )
+ __DETECT_NATIVE_API_LEVEL( __realApiLevel "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include/android/api-level.h" )
+ if( NOT __realApiLevel EQUAL ANDROID_NATIVE_API_LEVEL AND NOT __realApiLevel GREATER 9000 )
+ message( SEND_ERROR "Specified Android API level (${ANDROID_NATIVE_API_LEVEL}) does not match to the level found (${__realApiLevel}). Probably your copy of NDK is broken." )
+ endif()
+ unset( __realApiLevel )
+ endif()
+ set( ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" CACHE STRING "Android API level for native code" FORCE )
+ set( CMAKE_ANDROID_API ${ANDROID_NATIVE_API_LEVEL} )
+ if( CMAKE_VERSION VERSION_GREATER "2.8" )
+ list( SORT ANDROID_SUPPORTED_NATIVE_API_LEVELS )
+ set_property( CACHE ANDROID_NATIVE_API_LEVEL PROPERTY STRINGS ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
+ endif()
+endif()
+unset( __levelIdx )
+
+
+# remember target ABI
+set( ANDROID_ABI "${ANDROID_ABI}" CACHE STRING "The target ABI for Android. If arm, then armeabi-v7a is recommended for hardware floating point." FORCE )
+if( CMAKE_VERSION VERSION_GREATER "2.8" )
+ list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME} )
+ set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} )
+endif()
+
+
+# runtime choice (STL, rtti, exceptions)
+if( NOT ANDROID_STL )
+ set( ANDROID_STL gnustl_static )
+endif()
+set( ANDROID_STL "${ANDROID_STL}" CACHE STRING "C++ runtime" )
+set( ANDROID_STL_FORCE_FEATURES ON CACHE BOOL "automatically configure rtti and exceptions support based on C++ runtime" )
+mark_as_advanced( ANDROID_STL ANDROID_STL_FORCE_FEATURES )
+
+if( BUILD_WITH_ANDROID_NDK )
+ if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared)$")
+ message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\".
+The possible values are:
+ none -> Do not configure the runtime.
+ system -> Use the default minimal system C++ runtime library.
+ system_re -> Same as system but with rtti and exceptions.
+ gabi++_static -> Use the GAbi++ runtime as a static library.
+ gabi++_shared -> Use the GAbi++ runtime as a shared library.
+ stlport_static -> Use the STLport runtime as a static library.
+ stlport_shared -> Use the STLport runtime as a shared library.
+ gnustl_static -> (default) Use the GNU STL as a static library.
+ gnustl_shared -> Use the GNU STL as a shared library.
+" )
+ endif()
+elseif( BUILD_WITH_STANDALONE_TOOLCHAIN )
+ if( NOT "${ANDROID_STL}" MATCHES "^(none|gnustl_static|gnustl_shared)$")
+ message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\".
+The possible values are:
+ none -> Do not configure the runtime.
+ gnustl_static -> (default) Use the GNU STL as a static library.
+ gnustl_shared -> Use the GNU STL as a shared library.
+" )
+ endif()
+endif()
+
+unset( ANDROID_RTTI )
+unset( ANDROID_EXCEPTIONS )
+unset( ANDROID_STL_INCLUDE_DIRS )
+unset( __libstl )
+unset( __libsupcxx )
+
+if( NOT _CMAKE_IN_TRY_COMPILE AND ANDROID_NDK_RELEASE STREQUAL "r7b" AND ARMEABI_V7A AND NOT VFPV3 AND ANDROID_STL MATCHES "gnustl" )
+ message( WARNING "The GNU STL armeabi-v7a binaries from NDK r7b can crash non-NEON devices. The files provided with NDK r7b were not configured properly, resulting in crashes on Tegra2-based devices and others when trying to use certain floating-point functions (e.g., cosf, sinf, expf).
+You are strongly recommended to switch to another NDK release.
+" )
+endif()
+
+if( NOT _CMAKE_IN_TRY_COMPILE AND X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" )
+ message( WARNING "The x86 system header file from NDK r6 has incorrect definition for ptrdiff_t. You are recommended to upgrade to a newer NDK release or manually patch the header:
+See https://android.googlesource.com/platform/development.git f907f4f9d4e56ccc8093df6fee54454b8bcab6c2
+ diff --git a/ndk/platforms/android-9/arch-x86/include/machine/_types.h b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
+ index 5e28c64..65892a1 100644
+ --- a/ndk/platforms/android-9/arch-x86/include/machine/_types.h
+ +++ b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
+ @@ -51,7 +51,11 @@ typedef long int ssize_t;
+ #endif
+ #ifndef _PTRDIFF_T
+ #define _PTRDIFF_T
+ -typedef long ptrdiff_t;
+ +# ifdef __ANDROID__
+ + typedef int ptrdiff_t;
+ +# else
+ + typedef long ptrdiff_t;
+ +# endif
+ #endif
+" )
+endif()
+
+
+# setup paths and STL for standalone toolchain
+if( BUILD_WITH_STANDALONE_TOOLCHAIN )
+ set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" )
+ set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" )
+ set( ANDROID_SYSROOT "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot" )
+
+ if( NOT ANDROID_STL STREQUAL "none" )
+ set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/include/c++/${ANDROID_COMPILER_VERSION}" )
+ if( NOT EXISTS "${ANDROID_STL_INCLUDE_DIRS}" )
+ # old location ( pre r8c )
+ set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}" )
+ endif()
+ if( ARMEABI_V7A AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" )
+ list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}" )
+ elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits" )
+ list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb" )
+ else()
+ list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" )
+ endif()
+ # always search static GNU STL to get the location of libsupc++.a
+ if( ARMEABI_V7A AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" )
+ set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb" )
+ elseif( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" )
+ set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}" )
+ elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libstdc++.a" )
+ set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb" )
+ elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libstdc++.a" )
+ set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" )
+ endif()
+ if( __libstl )
+ set( __libsupcxx "${__libstl}/libsupc++.a" )
+ set( __libstl "${__libstl}/libstdc++.a" )
+ endif()
+ if( NOT EXISTS "${__libsupcxx}" )
+ message( FATAL_ERROR "The required libstdsupc++.a is missing in your standalone toolchain.
+ Usually it happens because of bug in make-standalone-toolchain.sh script from NDK r7, r7b and r7c.
+ You need to either upgrade to newer NDK or manually copy
+ $ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a
+ to
+ ${__libsupcxx}
+ " )
+ endif()
+ if( ANDROID_STL STREQUAL "gnustl_shared" )
+ if( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
+ set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
+ elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
+ set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
+ elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" )
+ set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" )
+ endif()
+ endif()
+ endif()
+endif()
+
+# clang
+if( "${ANDROID_TOOLCHAIN_NAME}" STREQUAL "standalone-clang" )
+ set( ANDROID_COMPILER_IS_CLANG 1 )
+ execute_process( COMMAND "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/clang${TOOL_OS_SUFFIX}" --version OUTPUT_VARIABLE ANDROID_CLANG_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE )
+ string( REGEX MATCH "[0-9]+[.][0-9]+" ANDROID_CLANG_VERSION "${ANDROID_CLANG_VERSION}")
+elseif( "${ANDROID_TOOLCHAIN_NAME}" MATCHES "-clang3[.][0-9]?$" )
+ string( REGEX MATCH "3[.][0-9]$" ANDROID_CLANG_VERSION "${ANDROID_TOOLCHAIN_NAME}")
+ string( REGEX REPLACE "-clang${ANDROID_CLANG_VERSION}$" "-${ANDROID_COMPILER_VERSION}" ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
+ if( NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}/bin/clang${TOOL_OS_SUFFIX}" )
+ message( FATAL_ERROR "Could not find the Clang compiler driver" )
+ endif()
+ set( ANDROID_COMPILER_IS_CLANG 1 )
+ set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
+else()
+ set( ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
+ unset( ANDROID_COMPILER_IS_CLANG CACHE )
+endif()
+
+string( REPLACE "." "" _clang_name "clang${ANDROID_CLANG_VERSION}" )
+if( NOT EXISTS "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" )
+ set( _clang_name "clang" )
+endif()
+
+
+# setup paths and STL for NDK
+if( BUILD_WITH_ANDROID_NDK )
+ set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
+ set( ANDROID_SYSROOT "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}" )
+
+ if( ANDROID_STL STREQUAL "none" )
+ # do nothing
+ elseif( ANDROID_STL STREQUAL "system" )
+ set( ANDROID_RTTI OFF )
+ set( ANDROID_EXCEPTIONS OFF )
+ set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" )
+ elseif( ANDROID_STL STREQUAL "system_re" )
+ set( ANDROID_RTTI ON )
+ set( ANDROID_EXCEPTIONS ON )
+ set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" )
+ elseif( ANDROID_STL MATCHES "gabi" )
+ if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
+ message( FATAL_ERROR "gabi++ is not available in your NDK. You have to upgrade to NDK r7 or newer to use gabi++.")
+ endif()
+ set( ANDROID_RTTI ON )
+ set( ANDROID_EXCEPTIONS OFF )
+ set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/gabi++/include" )
+ set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gabi++/libs/${ANDROID_NDK_ABI_NAME}/libgabi++_static.a" )
+ elseif( ANDROID_STL MATCHES "stlport" )
+ if( NOT ANDROID_NDK_RELEASE_NUM LESS 8004 ) # before r8d
+ set( ANDROID_EXCEPTIONS ON )
+ else()
+ set( ANDROID_EXCEPTIONS OFF )
+ endif()
+ if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
+ set( ANDROID_RTTI OFF )
+ else()
+ set( ANDROID_RTTI ON )
+ endif()
+ set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/stlport/stlport" )
+ set( __libstl "${ANDROID_NDK}/sources/cxx-stl/stlport/libs/${ANDROID_NDK_ABI_NAME}/libstlport_static.a" )
+ elseif( ANDROID_STL MATCHES "gnustl" )
+ set( ANDROID_EXCEPTIONS ON )
+ set( ANDROID_RTTI ON )
+ if( EXISTS "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" )
+ if( ARMEABI_V7A AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.7" AND ANDROID_NDK_RELEASE STREQUAL "r8d" )
+ # gnustl binary for 4.7 compiler is buggy :(
+ # TODO: look for right fix
+ set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.6" )
+ else()
+ set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" )
+ endif()
+ else()
+ set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++" )
+ endif()
+ set( ANDROID_STL_INCLUDE_DIRS "${__libstl}/include" "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/include" "${__libstl}/include/backward" )
+ if( EXISTS "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" )
+ set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" )
+ else()
+ set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
+ endif()
+ else()
+ message( FATAL_ERROR "Unknown runtime: ${ANDROID_STL}" )
+ endif()
+ # find libsupc++.a - rtti & exceptions
+ if( ANDROID_STL STREQUAL "system_re" OR ANDROID_STL MATCHES "gnustl" )
+ set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r8b or newer
+ if( NOT EXISTS "${__libsupcxx}" )
+ set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r7-r8
+ endif()
+ if( NOT EXISTS "${__libsupcxx}" ) # before r7
+ if( ARMEABI_V7A )
+ if( ANDROID_FORCE_ARM_BUILD )
+ set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" )
+ else()
+ set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" )
+ endif()
+ elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD )
+ set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" )
+ else()
+ set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" )
+ endif()
+ endif()
+ if( NOT EXISTS "${__libsupcxx}")
+ message( ERROR "Could not find libsupc++.a for a chosen platform. Either your NDK is not supported or is broken.")
+ endif()
+ endif()
+endif()
+
+
+# case of shared STL linkage
+if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl )
+ string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" )
+ # TODO: check if .so file exists before the renaming
+endif()
+
+
+# ccache support
+__INIT_VARIABLE( _ndk_ccache NDK_CCACHE ENV_NDK_CCACHE )
+if( _ndk_ccache )
+ if( DEFINED NDK_CCACHE AND NOT EXISTS NDK_CCACHE )
+ unset( NDK_CCACHE CACHE )
+ endif()
+ find_program( NDK_CCACHE "${_ndk_ccache}" DOC "The path to ccache binary")
+else()
+ unset( NDK_CCACHE CACHE )
+endif()
+unset( _ndk_ccache )
+
+
+# setup the cross-compiler
+if( NOT CMAKE_C_COMPILER )
+ if( NDK_CCACHE AND NOT ANDROID_SYSROOT MATCHES "[ ;\"]" )
+ set( CMAKE_C_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C compiler" )
+ set( CMAKE_CXX_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C++ compiler" )
+ if( ANDROID_COMPILER_IS_CLANG )
+ set( CMAKE_C_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
+ set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
+ else()
+ set( CMAKE_C_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
+ set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
+ endif()
+ else()
+ if( ANDROID_COMPILER_IS_CLANG )
+ set( CMAKE_C_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
+ set( CMAKE_CXX_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
+ else()
+ set( CMAKE_C_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler" )
+ set( CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler" )
+ endif()
+ endif()
+ set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "assembler" )
+ set( CMAKE_STRIP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-strip${TOOL_OS_SUFFIX}" CACHE PATH "strip" )
+ if( EXISTS "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc-ar${TOOL_OS_SUFFIX}" )
+ # Use gcc-ar if we have it for better LTO support.
+ set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" )
+ else()
+ set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" )
+ endif()
+ set( CMAKE_LINKER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ld${TOOL_OS_SUFFIX}" CACHE PATH "linker" )
+ set( CMAKE_NM "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-nm${TOOL_OS_SUFFIX}" CACHE PATH "nm" )
+ set( CMAKE_OBJCOPY "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objcopy${TOOL_OS_SUFFIX}" CACHE PATH "objcopy" )
+ set( CMAKE_OBJDUMP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objdump${TOOL_OS_SUFFIX}" CACHE PATH "objdump" )
+ set( CMAKE_RANLIB "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ranlib${TOOL_OS_SUFFIX}" CACHE PATH "ranlib" )
+endif()
+
+set( _CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_MACHINE_NAME}-" )
+if( CMAKE_VERSION VERSION_LESS 2.8.5 )
+ set( CMAKE_ASM_COMPILER_ARG1 "-c" )
+endif()
+if( APPLE )
+ find_program( CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool )
+ if( NOT CMAKE_INSTALL_NAME_TOOL )
+ message( FATAL_ERROR "Could not find install_name_tool, please check your installation." )
+ endif()
+ mark_as_advanced( CMAKE_INSTALL_NAME_TOOL )
+endif()
+
+# Force set compilers because standard identification works badly for us
+include( CMakeForceCompiler )
+CMAKE_FORCE_C_COMPILER( "${CMAKE_C_COMPILER}" GNU )
+if( ANDROID_COMPILER_IS_CLANG )
+ set( CMAKE_C_COMPILER_ID Clang )
+endif()
+set( CMAKE_C_PLATFORM_ID Linux )
+if( X86_64 OR MIPS64 OR ARM64_V8A )
+ set( CMAKE_C_SIZEOF_DATA_PTR 8 )
+else()
+ set( CMAKE_C_SIZEOF_DATA_PTR 4 )
+endif()
+set( CMAKE_C_HAS_ISYSROOT 1 )
+set( CMAKE_C_COMPILER_ABI ELF )
+CMAKE_FORCE_CXX_COMPILER( "${CMAKE_CXX_COMPILER}" GNU )
+if( ANDROID_COMPILER_IS_CLANG )
+ set( CMAKE_CXX_COMPILER_ID Clang)
+endif()
+set( CMAKE_CXX_PLATFORM_ID Linux )
+set( CMAKE_CXX_SIZEOF_DATA_PTR ${CMAKE_C_SIZEOF_DATA_PTR} )
+set( CMAKE_CXX_HAS_ISYSROOT 1 )
+set( CMAKE_CXX_COMPILER_ABI ELF )
+set( CMAKE_CXX_SOURCE_FILE_EXTENSIONS cc cp cxx cpp CPP c++ C )
+# force ASM compiler (required for CMake < 2.8.5)
+set( CMAKE_ASM_COMPILER_ID_RUN TRUE )
+set( CMAKE_ASM_COMPILER_ID GNU )
+set( CMAKE_ASM_COMPILER_WORKS TRUE )
+set( CMAKE_ASM_COMPILER_FORCED TRUE )
+set( CMAKE_COMPILER_IS_GNUASM 1)
+set( CMAKE_ASM_SOURCE_FILE_EXTENSIONS s S asm )
+
+foreach( lang C CXX ASM )
+ if( ANDROID_COMPILER_IS_CLANG )
+ set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_CLANG_VERSION} )
+ else()
+ set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_COMPILER_VERSION} )
+ endif()
+endforeach()
+
+# flags and definitions
+remove_definitions( -DANDROID )
+add_definitions( -DANDROID )
+
+if( ANDROID_SYSROOT MATCHES "[ ;\"]" )
+ if( CMAKE_HOST_WIN32 )
+ # try to convert path to 8.3 form
+ file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cvt83.cmd" "@echo %~s1" )
+ execute_process( COMMAND "$ENV{ComSpec}" /c "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cvt83.cmd" "${ANDROID_SYSROOT}"
+ OUTPUT_VARIABLE __path OUTPUT_STRIP_TRAILING_WHITESPACE
+ RESULT_VARIABLE __result ERROR_QUIET )
+ if( __result EQUAL 0 )
+ file( TO_CMAKE_PATH "${__path}" ANDROID_SYSROOT )
+ set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" )
+ else()
+ set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" )
+ endif()
+ else()
+ set( ANDROID_CXX_FLAGS "'--sysroot=${ANDROID_SYSROOT}'" )
+ endif()
+ if( NOT _CMAKE_IN_TRY_COMPILE )
+ # quotes can break try_compile and compiler identification
+ message(WARNING "Path to your Android NDK (or toolchain) has non-alphanumeric symbols.\nThe build might be broken.\n")
+ endif()
+else()
+ set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" )
+endif()
+
+# NDK flags
+if (ARM64_V8A )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
+ set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
+ set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" )
+ if( NOT ANDROID_COMPILER_IS_CLANG )
+ set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
+ endif()
+elseif( ARMEABI OR ARMEABI_V7A)
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
+ if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 )
+ set( ANDROID_CXX_FLAGS_RELEASE "-mthumb -fomit-frame-pointer -fno-strict-aliasing" )
+ set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
+ if( NOT ANDROID_COMPILER_IS_CLANG )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -finline-limit=64" )
+ endif()
+ else()
+ # always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI
+ set( ANDROID_CXX_FLAGS_RELEASE "-marm -fomit-frame-pointer -fstrict-aliasing" )
+ set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
+ if( NOT ANDROID_COMPILER_IS_CLANG )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
+ endif()
+ endif()
+elseif( X86 OR X86_64 )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
+ if( NOT ANDROID_COMPILER_IS_CLANG )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
+ endif()
+ set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
+ set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" )
+elseif( MIPS OR MIPS64 )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-strict-aliasing -finline-functions -funwind-tables -fmessage-length=0" )
+ set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer" )
+ set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer" )
+ if( NOT ANDROID_COMPILER_IS_CLANG )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" )
+ set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
+ endif()
+elseif()
+ set( ANDROID_CXX_FLAGS_RELEASE "" )
+ set( ANDROID_CXX_FLAGS_DEBUG "" )
+endif()
+
+set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) # good/necessary when porting desktop libraries
+
+if( NOT X86 AND NOT ANDROID_COMPILER_IS_CLANG )
+ set( ANDROID_CXX_FLAGS "-Wno-psabi ${ANDROID_CXX_FLAGS}" )
+endif()
+
+if( NOT ANDROID_COMPILER_VERSION VERSION_LESS "4.6" )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -no-canonical-prefixes" ) # see https://android-review.googlesource.com/#/c/47564/
+endif()
+
+# ABI-specific flags
+if( ARMEABI_V7A )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp" )
+ if( NEON )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=neon" )
+ elseif( VFPV3 )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3" )
+ else()
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3-d16" )
+ endif()
+elseif( ARMEABI_V6 )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv6 -mfloat-abi=softfp -mfpu=vfp" ) # vfp == vfpv2
+elseif( ARMEABI )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv5te -mtune=xscale -msoft-float" )
+endif()
+
+if( ANDROID_STL MATCHES "gnustl" AND (EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}") )
+ set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o " )
+ set( CMAKE_CXX_CREATE_SHARED_MODULE " -o " )
+ set( CMAKE_CXX_LINK_EXECUTABLE " -o " )
+else()
+ set( CMAKE_CXX_CREATE_SHARED_LIBRARY " -o " )
+ set( CMAKE_CXX_CREATE_SHARED_MODULE " -o " )
+ set( CMAKE_CXX_LINK_EXECUTABLE " -o " )
+endif()
+
+# STL
+if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" )
+ if( EXISTS "${__libstl}" )
+ set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"" )
+ set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"" )
+ set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"" )
+ endif()
+ if( EXISTS "${__libsupcxx}" )
+ set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" )
+ set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" )
+ set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"" )
+ # C objects:
+ set( CMAKE_C_CREATE_SHARED_LIBRARY " -o " )
+ set( CMAKE_C_CREATE_SHARED_MODULE " -o " )
+ set( CMAKE_C_LINK_EXECUTABLE " -o " )
+ set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" )
+ set( CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" )
+ set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"" )
+ endif()
+ if( ANDROID_STL MATCHES "gnustl" )
+ if( NOT EXISTS "${ANDROID_LIBM_PATH}" )
+ set( ANDROID_LIBM_PATH -lm )
+ endif()
+ set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} ${ANDROID_LIBM_PATH}" )
+ set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} ${ANDROID_LIBM_PATH}" )
+ set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} ${ANDROID_LIBM_PATH}" )
+ endif()
+endif()
+
+# variables controlling optional build flags
+if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
+ # libGLESv2.so in NDK's prior to r7 refers to missing external symbols.
+ # So this flag option is required for all projects using OpenGL from native.
+ __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES ON )
+else()
+ __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES OFF )
+endif()
+__INIT_VARIABLE( ANDROID_NO_UNDEFINED VALUES ON )
+__INIT_VARIABLE( ANDROID_FUNCTION_LEVEL_LINKING VALUES ON )
+__INIT_VARIABLE( ANDROID_GOLD_LINKER VALUES ON )
+__INIT_VARIABLE( ANDROID_NOEXECSTACK VALUES ON )
+__INIT_VARIABLE( ANDROID_RELRO VALUES ON )
+
+set( ANDROID_NO_UNDEFINED ${ANDROID_NO_UNDEFINED} CACHE BOOL "Show all undefined symbols as linker errors" )
+set( ANDROID_SO_UNDEFINED ${ANDROID_SO_UNDEFINED} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" )
+set( ANDROID_FUNCTION_LEVEL_LINKING ${ANDROID_FUNCTION_LEVEL_LINKING} CACHE BOOL "Put each function in separate section and enable garbage collection of unused input sections at link time" )
+set( ANDROID_GOLD_LINKER ${ANDROID_GOLD_LINKER} CACHE BOOL "Enables gold linker" )
+set( ANDROID_NOEXECSTACK ${ANDROID_NOEXECSTACK} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" )
+set( ANDROID_RELRO ${ANDROID_RELRO} CACHE BOOL "Enables RELRO - a memory corruption mitigation technique" )
+mark_as_advanced( ANDROID_NO_UNDEFINED ANDROID_SO_UNDEFINED ANDROID_FUNCTION_LEVEL_LINKING ANDROID_GOLD_LINKER ANDROID_NOEXECSTACK ANDROID_RELRO )
+
+# linker flags
+set( ANDROID_LINKER_FLAGS "" )
+
+if( ARMEABI_V7A )
+ # this is *required* to use the following linker flags that routes around
+ # a CPU bug in some Cortex-A8 implementations:
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--fix-cortex-a8" )
+endif()
+
+if( ANDROID_NO_UNDEFINED )
+ if( MIPS )
+ # there is some sysroot-related problem in mips linker...
+ if( NOT ANDROID_SYSROOT MATCHES "[ ;\"]" )
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined -Wl,-rpath-link,${ANDROID_SYSROOT}/usr/lib" )
+ endif()
+ else()
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined" )
+ endif()
+endif()
+
+if( ANDROID_SO_UNDEFINED )
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-allow-shlib-undefined" )
+endif()
+
+if( ANDROID_FUNCTION_LEVEL_LINKING )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fdata-sections -ffunction-sections" )
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--gc-sections" )
+endif()
+
+if( ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
+ if( ANDROID_GOLD_LINKER AND (CMAKE_HOST_UNIX OR ANDROID_NDK_RELEASE_NUM GREATER 8002) AND (ARMEABI OR ARMEABI_V7A OR X86) )
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
+ elseif( ANDROID_NDK_RELEASE_NUM GREATER 8002 ) # after r8b
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=bfd" )
+ elseif( ANDROID_NDK_RELEASE STREQUAL "r8b" AND ARMEABI AND NOT _CMAKE_IN_TRY_COMPILE )
+ message( WARNING "The default bfd linker from arm GCC 4.6 toolchain can fail with 'unresolvable R_ARM_THM_CALL relocation' error message. See https://code.google.com/p/android/issues/detail?id=35342
+ On Linux and OS X host platform you can workaround this problem using gold linker (default).
+ Rerun cmake with -DANDROID_GOLD_LINKER=ON option in case of problems.
+" )
+ endif()
+endif() # version 4.6
+
+if( ANDROID_NOEXECSTACK )
+ if( ANDROID_COMPILER_IS_CLANG )
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Xclang -mnoexecstack" )
+ else()
+ set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Wa,--noexecstack" )
+ endif()
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,noexecstack" )
+endif()
+
+if( ANDROID_RELRO )
+ set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now" )
+endif()
+
+if( ANDROID_COMPILER_IS_CLANG )
+ set( ANDROID_CXX_FLAGS "-target ${ANDROID_LLVM_TRIPLE} -Qunused-arguments ${ANDROID_CXX_FLAGS}" )
+ if( BUILD_WITH_ANDROID_NDK )
+ set( ANDROID_CXX_FLAGS "-gcc-toolchain ${ANDROID_TOOLCHAIN_ROOT} ${ANDROID_CXX_FLAGS}" )
+ endif()
+endif()
+
+# cache flags
+set( CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags" )
+set( CMAKE_C_FLAGS "" CACHE STRING "c flags" )
+set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c++ Release flags" )
+set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c Release flags" )
+set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c++ Debug flags" )
+set( CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c Debug flags" )
+set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags" )
+set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags" )
+set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags" )
+
+# put flags to cache (for debug purpose only)
+set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Android specific c/c++ flags" )
+set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE}" CACHE INTERNAL "Android specific c/c++ Release flags" )
+set( ANDROID_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG}" CACHE INTERNAL "Android specific c/c++ Debug flags" )
+set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Android specific c/c++ linker flags" )
+
+# finish flags
+set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" )
+set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" )
+set( CMAKE_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}" )
+set( CMAKE_C_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}" )
+set( CMAKE_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}" )
+set( CMAKE_C_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}" )
+set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" )
+set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" )
+set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" )
+
+if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK_RELEASE STREQUAL "r8" )
+ set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_SHARED_LINKER_FLAGS}" )
+ set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_MODULE_LINKER_FLAGS}" )
+ set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.x ${CMAKE_EXE_LINKER_FLAGS}" )
+endif()
+
+# pie/pic
+if( NOT (ANDROID_NATIVE_API_LEVEL LESS 16) AND (NOT DEFINED ANDROID_APP_PIE OR ANDROID_APP_PIE) AND (CMAKE_VERSION VERSION_GREATER 2.8.8) )
+ set( CMAKE_POSITION_INDEPENDENT_CODE TRUE )
+ set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
+else()
+ set( CMAKE_POSITION_INDEPENDENT_CODE FALSE )
+ set( CMAKE_CXX_FLAGS "-fpic ${CMAKE_CXX_FLAGS}" )
+ set( CMAKE_C_FLAGS "-fpic ${CMAKE_C_FLAGS}" )
+endif()
+
+# configure rtti
+if( DEFINED ANDROID_RTTI AND ANDROID_STL_FORCE_FEATURES )
+ if( ANDROID_RTTI )
+ set( CMAKE_CXX_FLAGS "-frtti ${CMAKE_CXX_FLAGS}" )
+ else()
+ set( CMAKE_CXX_FLAGS "-fno-rtti ${CMAKE_CXX_FLAGS}" )
+ endif()
+endif()
+
+# configure exceptios
+if( DEFINED ANDROID_EXCEPTIONS AND ANDROID_STL_FORCE_FEATURES )
+ if( ANDROID_EXCEPTIONS )
+ set( CMAKE_CXX_FLAGS "-fexceptions ${CMAKE_CXX_FLAGS}" )
+ set( CMAKE_C_FLAGS "-fexceptions ${CMAKE_C_FLAGS}" )
+ else()
+ set( CMAKE_CXX_FLAGS "-fno-exceptions ${CMAKE_CXX_FLAGS}" )
+ set( CMAKE_C_FLAGS "-fno-exceptions ${CMAKE_C_FLAGS}" )
+ endif()
+endif()
+
+# global includes and link directories
+include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} )
+get_filename_component(__android_install_path "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ABSOLUTE) # avoid CMP0015 policy warning
+link_directories( "${__android_install_path}" )
+
+# detect if need link crtbegin_so.o explicitly
+if( NOT DEFINED ANDROID_EXPLICIT_CRT_LINK )
+ set( __cmd "${CMAKE_CXX_CREATE_SHARED_LIBRARY}" )
+ string( REPLACE "" "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" __cmd "${__cmd}" )
+ string( REPLACE "" "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}" __cmd "${__cmd}" )
+ string( REPLACE "" "${CMAKE_CXX_FLAGS}" __cmd "${__cmd}" )
+ string( REPLACE "" "" __cmd "${__cmd}" )
+ string( REPLACE "" "${CMAKE_SHARED_LINKER_FLAGS}" __cmd "${__cmd}" )
+ string( REPLACE "" "-shared" __cmd "${__cmd}" )
+ string( REPLACE "" "" __cmd "${__cmd}" )
+ string( REPLACE "" "" __cmd "${__cmd}" )
+ string( REPLACE "" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toolchain_crtlink_test.so" __cmd "${__cmd}" )
+ string( REPLACE "" "\"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" __cmd "${__cmd}" )
+ string( REPLACE "" "" __cmd "${__cmd}" )
+ separate_arguments( __cmd )
+ foreach( __var ANDROID_NDK ANDROID_NDK_TOOLCHAINS_PATH ANDROID_STANDALONE_TOOLCHAIN )
+ if( ${__var} )
+ set( __tmp "${${__var}}" )
+ separate_arguments( __tmp )
+ string( REPLACE "${__tmp}" "${${__var}}" __cmd "${__cmd}")
+ endif()
+ endforeach()
+ string( REPLACE "'" "" __cmd "${__cmd}" )
+ string( REPLACE "\"" "" __cmd "${__cmd}" )
+ execute_process( COMMAND ${__cmd} RESULT_VARIABLE __cmd_result OUTPUT_QUIET ERROR_QUIET )
+ if( __cmd_result EQUAL 0 )
+ set( ANDROID_EXPLICIT_CRT_LINK ON )
+ else()
+ set( ANDROID_EXPLICIT_CRT_LINK OFF )
+ endif()
+endif()
+
+if( ANDROID_EXPLICIT_CRT_LINK )
+ set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
+ set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
+endif()
+
+# setup output directories
+set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" )
+
+if( DEFINED LIBRARY_OUTPUT_PATH_ROOT
+ OR EXISTS "${CMAKE_SOURCE_DIR}/AndroidManifest.xml"
+ OR (EXISTS "${CMAKE_SOURCE_DIR}/../AndroidManifest.xml" AND EXISTS "${CMAKE_SOURCE_DIR}/../jni/") )
+ set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "Root for binaries output, set this to change where Android libs are installed to" )
+ if( NOT _CMAKE_IN_TRY_COMPILE )
+ if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" )
+ set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" )
+ else()
+ set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" )
+ endif()
+ set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for Android libs" )
+ endif()
+endif()
+
+# copy shaed stl library to build directory
+if( NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES "[.]so$" AND DEFINED LIBRARY_OUTPUT_PATH )
+ get_filename_component( __libstlname "${__libstl}" NAME )
+ execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess )
+ if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}")
+ message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" )
+ endif()
+ unset( __fileCopyProcess )
+ unset( __libstlname )
+endif()
+
+
+# set these global flags for cmake client scripts to change behavior
+set( ANDROID True )
+set( BUILD_ANDROID True )
+
+# where is the target environment
+set( CMAKE_FIND_ROOT_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin" "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" "${ANDROID_SYSROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" )
+
+# only search for libraries and includes in the ndk toolchain
+set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
+set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+
+
+# macro to find packages on the host OS
+macro( find_host_package )
+ set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
+ set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
+ set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
+ if( CMAKE_HOST_WIN32 )
+ SET( WIN32 1 )
+ SET( UNIX )
+ elseif( CMAKE_HOST_APPLE )
+ SET( APPLE 1 )
+ SET( UNIX )
+ endif()
+ find_package( ${ARGN} )
+ SET( WIN32 )
+ SET( APPLE )
+ SET( UNIX 1 )
+ set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
+ set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+ set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+endmacro()
+
+
+# macro to find programs on the host OS
+macro( find_host_program )
+ set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
+ set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
+ set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
+ if( CMAKE_HOST_WIN32 )
+ SET( WIN32 1 )
+ SET( UNIX )
+ elseif( CMAKE_HOST_APPLE )
+ SET( APPLE 1 )
+ SET( UNIX )
+ endif()
+ find_program( ${ARGN} )
+ SET( WIN32 )
+ SET( APPLE )
+ SET( UNIX 1 )
+ set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
+ set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
+ set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
+endmacro()
+
+
+# export toolchain settings for the try_compile() command
+if( NOT _CMAKE_IN_TRY_COMPILE )
+ set( __toolchain_config "")
+ foreach( __var NDK_CCACHE LIBRARY_OUTPUT_PATH_ROOT ANDROID_FORBID_SYGWIN
+ ANDROID_NDK_HOST_X64
+ ANDROID_NDK
+ ANDROID_NDK_LAYOUT
+ ANDROID_STANDALONE_TOOLCHAIN
+ ANDROID_TOOLCHAIN_NAME
+ ANDROID_ABI
+ ANDROID_NATIVE_API_LEVEL
+ ANDROID_STL
+ ANDROID_STL_FORCE_FEATURES
+ ANDROID_FORCE_ARM_BUILD
+ ANDROID_NO_UNDEFINED
+ ANDROID_SO_UNDEFINED
+ ANDROID_FUNCTION_LEVEL_LINKING
+ ANDROID_GOLD_LINKER
+ ANDROID_NOEXECSTACK
+ ANDROID_RELRO
+ ANDROID_LIBM_PATH
+ ANDROID_EXPLICIT_CRT_LINK
+ ANDROID_APP_PIE
+ )
+ if( DEFINED ${__var} )
+ if( ${__var} MATCHES " ")
+ set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" CACHE INTERNAL \"\" )\n" )
+ else()
+ set( __toolchain_config "${__toolchain_config}set( ${__var} ${${__var}} CACHE INTERNAL \"\" )\n" )
+ endif()
+ endif()
+ endforeach()
+ file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/android.toolchain.config.cmake" "${__toolchain_config}" )
+ unset( __toolchain_config )
+endif()
+
+
+# force cmake to produce / instead of \ in build commands for Ninja generator
+if( CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_HOST_WIN32 )
+ # it is a bad hack after all
+ # CMake generates Ninja makefiles with UNIX paths only if it thinks that we are going to build with MinGW
+ set( CMAKE_COMPILER_IS_MINGW TRUE ) # tell CMake that we are MinGW
+ set( CMAKE_CROSSCOMPILING TRUE ) # stop recursion
+ enable_language( C )
+ enable_language( CXX )
+ # unset( CMAKE_COMPILER_IS_MINGW ) # can't unset because CMake does not convert back-slashes in response files without it
+ unset( MINGW )
+endif()
+
+
+# Variables controlling behavior or set by cmake toolchain:
+# ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips", "arm64-v8a", "x86_64", "mips64"
+# ANDROID_NATIVE_API_LEVEL : 3,4,5,8,9,14,15,16,17,18,19,21 (depends on NDK version)
+# ANDROID_STL : gnustl_static/gnustl_shared/stlport_static/stlport_shared/gabi++_static/gabi++_shared/system_re/system/none
+# ANDROID_FORBID_SYGWIN : ON/OFF
+# ANDROID_NO_UNDEFINED : ON/OFF
+# ANDROID_SO_UNDEFINED : OFF/ON (default depends on NDK version)
+# ANDROID_FUNCTION_LEVEL_LINKING : ON/OFF
+# ANDROID_GOLD_LINKER : ON/OFF
+# ANDROID_NOEXECSTACK : ON/OFF
+# ANDROID_RELRO : ON/OFF
+# ANDROID_FORCE_ARM_BUILD : ON/OFF
+# ANDROID_STL_FORCE_FEATURES : ON/OFF
+# ANDROID_LIBM_PATH : path to libm.so (set to something like $(TOP)/out/target/product//obj/lib/libm.so) to workaround unresolved `sincos`
+# Can be set only at the first run:
+# ANDROID_NDK : path to your NDK install
+# NDK_CCACHE : path to your ccache executable
+# ANDROID_TOOLCHAIN_NAME : the NDK name of compiler toolchain
+# ANDROID_NDK_HOST_X64 : try to use x86_64 toolchain (default for x64 host systems)
+# ANDROID_NDK_LAYOUT : the inner NDK structure (RELEASE, LINARO, ANDROID)
+# LIBRARY_OUTPUT_PATH_ROOT :
+# ANDROID_STANDALONE_TOOLCHAIN
+#
+# Primary read-only variables:
+# ANDROID : always TRUE
+# ARMEABI : TRUE for arm v6 and older devices
+# ARMEABI_V6 : TRUE for arm v6
+# ARMEABI_V7A : TRUE for arm v7a
+# ARM64_V8A : TRUE for arm64-v8a
+# NEON : TRUE if NEON unit is enabled
+# VFPV3 : TRUE if VFP version 3 is enabled
+# X86 : TRUE if configured for x86
+# X86_64 : TRUE if configured for x86_64
+# MIPS : TRUE if configured for mips
+# MIPS64 : TRUE if configured for mips64
+# BUILD_WITH_ANDROID_NDK : TRUE if NDK is used
+# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
+# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
+# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86", "mips", "arm64-v8a", "x86_64", "mips64" depending on ANDROID_ABI
+# ANDROID_NDK_RELEASE : from r5 to r10d; set only for NDK
+# ANDROID_NDK_RELEASE_NUM : numeric ANDROID_NDK_RELEASE version (1000*major+minor)
+# ANDROID_ARCH_NAME : "arm", "x86", "mips", "arm64", "x86_64", "mips64" depending on ANDROID_ABI
+# ANDROID_SYSROOT : path to the compiler sysroot
+# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
+# ANDROID_COMPILER_IS_CLANG : TRUE if clang compiler is used
+#
+# Secondary (less stable) read-only variables:
+# ANDROID_COMPILER_VERSION : GCC version used (not Clang version)
+# ANDROID_CLANG_VERSION : version of clang compiler if clang is used
+# ANDROID_CXX_FLAGS : C/C++ compiler flags required by Android platform
+# ANDROID_SUPPORTED_ABIS : list of currently allowed values for ANDROID_ABI
+# ANDROID_TOOLCHAIN_MACHINE_NAME : "arm-linux-androideabi", "arm-eabi" or "i686-android-linux"
+# ANDROID_TOOLCHAIN_ROOT : path to the top level of toolchain (standalone or placed inside NDK)
+# ANDROID_CLANG_TOOLCHAIN_ROOT : path to clang tools
+# ANDROID_SUPPORTED_NATIVE_API_LEVELS : list of native API levels found inside NDK
+# ANDROID_STL_INCLUDE_DIRS : stl include paths
+# ANDROID_RTTI : if rtti is enabled by the runtime
+# ANDROID_EXCEPTIONS : if exceptions are enabled by the runtime
+# ANDROID_GCC_TOOLCHAIN_NAME : read-only, differs from ANDROID_TOOLCHAIN_NAME only if clang is used
+#
+# Defaults:
+# ANDROID_DEFAULT_NDK_API_LEVEL
+# ANDROID_DEFAULT_NDK_API_LEVEL_${ARCH}
+# ANDROID_NDK_SEARCH_PATHS
+# ANDROID_SUPPORTED_ABIS_${ARCH}
+# ANDROID_SUPPORTED_NDK_VERSIONS
diff --git a/android/build_cegui b/android/build_cegui
new file mode 100755
index 000000000..c46fa931d
--- /dev/null
+++ b/android/build_cegui
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+myScriptsDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+. "$myScriptsDir/common"
+
+"$myScriptsDir/build_deps"
+
+if [ $? -eq 0 ]; then
+
+ dirRequiresSudo "$ceguiInstallDir" ceguiInstallDirMaybeSudo
+
+ depsInstallDirsElements=('$tinyxmlInstallDir' \
+ '$freeimageInstallDir' \
+ '$glmInstallDir' \
+ '$pcreInstallDir' \
+ '$freetypeInstallDir' \
+ '$epoxyInstallDir' \
+ '$fribidiInstallDir')
+
+ depsInstallDirs()
+ {
+ if [ ${#depsInstallDirsElements[@]} -ne 0 ]; then
+ declare -i depIndex
+ depIndex=0
+ while true; do
+ echo -n "${depsInstallDirsElements[$depIndex]}"
+ depIndex=$(($depIndex+1))
+ if [ $depIndex -eq ${#depsInstallDirsElements[@]} ]; then
+ break;
+ fi
+ echo -n \;
+ done
+ fi
+ }
+
+ ceguiCmakeOptionsElements=('-DCEGUI_SAMPLES_ENABLED=ON' \
+ '-DCEGUI_BUILD_RENDERER_OPENGL=OFF' \
+ '-DCEGUI_BUILD_RENDERER_OPENGL3=ON' \
+ '-DCEGUI_USE_EPOXY=ON' \
+ '-DCEGUI_USE_GLEW=OFF' \
+ '-DCEGUI_TINYXML_HAS_2_6_API=TRUE' \
+ '-DCEGUI_USE_MINIBIDI=OFF' \
+ '-DCEGUI_USE_FRIBIDI=ON' \
+ "-DCMAKE_FIND_ROOT_PATH=\"$(depsInstallDirs)\"")
+ ceguiCmakeOptions="${ceguiCmakeOptionsElements[*]}"
+
+ ceguiBuild()
+ {
+
+ if [ ! -d "$ceguiInstallDir" ]; then
+
+ if [ ! -d "$ceguiSrcDir" ]; then
+ echo "Error: CEGUI source dir \"$ceguiSrcDir\" doesn't exist."
+ exit -1
+ fi
+
+ if [ ! -d "$ceguiBuildDir" ]; then
+ mkdir -p "$ceguiBuildDir"
+ cd "$ceguiBuildDir"
+ eval myCmake '""' $androidCmakeOptions $ceguiCmakeOptions \
+ '-DCMAKE_INSTALL_PREFIX="$ceguiInstallDir"' \
+ '-DCMAKE_BUILD_TYPE="$ceguiBuildType" "$ceguiSrcDir"'
+ fi
+
+ cd "$ceguiBuildDir"
+ myMake "" "-j$buildNumOfProcesses"
+
+ fi
+
+ }
+
+ ceguiInstall()
+ {
+ if [ ! -d "$ceguiInstallDir" ]; then
+ cd "$ceguiBuildDir"
+ myMake "$ceguiInstallDirMaybeSudo" install
+ fi
+ }
+
+ ceguiBuild && ceguiInstall
+ if [ $? -eq 0 ]; then
+ echo $'\n'"Building CEGUI succeeded!"
+ true;
+ else
+ echo $'\n'"Building CEGUI failed!"
+ false;
+ fi
+
+fi
diff --git a/android/build_deps b/android/build_deps
new file mode 100755
index 000000000..bb3bdef7f
--- /dev/null
+++ b/android/build_deps
@@ -0,0 +1,358 @@
+#!/usr/bin/env bash
+myScriptsDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+. "$myScriptsDir/common"
+
+"$myScriptsDir/prepare_ndk"
+
+if [ $? -eq 0 ]; then
+
+ mkdir -p "$ceguiDepsDownloadsDir" "$ceguiDepsSrcDir" "$ceguiDepsBuildDir"
+ dirRequiresSudo "$ceguiDepsInstallDir" depsInstallDirMaybeSudo
+
+ buildNdkMissing()
+ {
+
+ if [ ! -d "$ndkMissing_installDir" ]; then
+
+ if [ ! -d "$ndkMissing_buildDir" ]; then
+ mkdir -p "$ndkMissing_buildDir"
+ cd "$ndkMissing_buildDir"
+ eval myCmake '""' $androidCmakeOptions \
+ '-DCMAKE_INSTALL_PREFIX="$ndkMissing_installDir"' \
+ '-DCMAKE_BUILD_TYPE="$ceguiDepsBuildType"' \
+ '"$ndkMissing_srcDir"'
+ fi
+
+ cd "$ndkMissing_buildDir"
+ myMake "" "-j$buildNumOfProcesses"
+
+ fi
+
+ }
+
+ installNdkMissing()
+ {
+ if [ ! -d "$ndkMissing_installDir" ]; then
+ cd "$ndkMissing_buildDir"
+ myMake "$depsInstallDirMaybeSudo" install
+ fi
+ }
+
+ buildTinyxml()
+ {
+
+ if [ ! -d "$tinyxmlInstallDir" ]; then
+
+ if [ ! -d "$tinyxmlSrcDir" ]; then
+ cd "$ceguiDepsSrcDir"
+ if [ ! -f "$ceguiDepsDownloadsDir/$tinyxmlPackageArchive" ]; \
+ then
+ myWget "" "$ceguiDepsDownloadsDir/$tinyxmlPackageArchive" \
+ "$tinyxmlPackageUri"
+ fi
+ myUnpackTarGz "" "$ceguiDepsDownloadsDir/$tinyxmlPackageArchive"
+ mv "$tinyxmlPackageDir" "$tinyxmlSrcDir"
+ cp "$myScriptsDir/tinyxml-CMakeLists.txt" \
+ "$tinyxmlSrcDir/CMakeLists.txt"
+ fi
+
+ if [ ! -d "$tinyxmlBuildDir" ]; then
+ mkdir -p "$tinyxmlBuildDir"
+ cd "$tinyxmlBuildDir"
+ eval myCmake '""' $androidCmakeOptions \
+ '-DCMAKE_INSTALL_PREFIX="$tinyxmlInstallDir"' \
+ '-DCMAKE_BUILD_TYPE="$ceguiDepsBuildType"' \
+ '"$tinyxmlSrcDir"'
+ fi
+
+ cd "$tinyxmlBuildDir"
+ myMake "" "-j$buildNumOfProcesses"
+
+ fi
+
+ }
+
+ installTinyxml()
+ {
+ if [ ! -d "$tinyxmlInstallDir" ]; then
+ cd "$tinyxmlBuildDir"
+ myMake "$depsInstallDirMaybeSudo" install
+ fi
+ }
+
+ freeimageMakeParams="-f Makefile.gnu $androidToolchainConfiguration $androidBuildOptions DESTDIR=\"\$freeimageInstallDir\" ndkMissing_dir=\"\$ndkMissing_installDir\""
+
+ buildFreeimage()
+ {
+
+ addToolchainToPath
+
+ if [ ! -d "$freeimageInstallDir" ]; then
+
+ if [ ! -d "$freeimageSrcDir" ]; then
+ cd "$ceguiDepsSrcDir"
+ if [ ! -f "$ceguiDepsDownloadsDir/$freeimagePackageArchive" ]; \
+ then
+ myWget "" \
+ "$ceguiDepsDownloadsDir/$freeimagePackageArchive" \
+ "$freeimagePackageUri"
+ fi
+ myUnpackZip "" "$ceguiDepsDownloadsDir/$freeimagePackageArchive"
+ mv "$freeimagePackageDir" "$freeimageSrcDir"
+ myPatchDir "" "$freeimageSrcDir" "$myScriptsDir/freeimage.patch"
+ fi
+
+ if [ ! -d "$freeimageBuildDir" ]; then
+ cp -r "$freeimageSrcDir" "$freeimageBuildDir"
+ fi
+
+ cd "$freeimageBuildDir"
+ eval myMake '""' "-j$buildNumOfProcesses" $freeimageMakeParams
+
+ fi
+ }
+
+ installFreeimage()
+ {
+ addToolchainToPath
+ if [ ! -d "$freeimageInstallDir" ]; then
+ cd "$freeimageBuildDir"
+ eval myMake '"$depsInstallDirMaybeSudo"' $freeimageMakeParams \
+ install
+ fi
+ }
+
+ buildGlm()
+ {
+
+ if [ ! -d "$glmInstallDir" ]; then
+
+ if [ ! -d "$glmSrcDir" ]; then
+ cd "$ceguiDepsSrcDir"
+ if [ ! -f "$ceguiDepsDownloadsDir/$glmPackageArchive" ]; then
+ myWget "" "$ceguiDepsDownloadsDir/$glmPackageArchive" \
+ "$glmPackageUri"
+ fi
+ myUnpack7z "" "$ceguiDepsDownloadsDir/$glmPackageArchive"
+ mv "$glmPackageDir" "$glmSrcDir"
+ fi
+
+ if [ ! -d "$glmBuildDir" ]; then
+ mkdir -p "$glmBuildDir"
+ cd "$glmBuildDir"
+ eval myCmake '""' $androidCmakeOptions \
+ '-DCMAKE_INSTALL_PREFIX="$glmInstallDir"' \
+ '-DCMAKE_BUILD_TYPE="$ceguiDepsBuildType"' \
+ '"$glmSrcDir"'
+ fi
+
+ cd "$glmBuildDir"
+ myMake "" "-j$buildNumOfProcesses"
+
+ fi
+
+ }
+
+ installGlm()
+ {
+ if [ ! -d "$glmInstallDir" ]; then
+ cd "$glmBuildDir"
+ myMake "$depsInstallDirMaybeSudo" install
+ fi
+ }
+
+ buildPcre()
+ {
+
+ addToolchainToPath
+
+ if [ ! -d "$pcreInstallDir" ]; then
+
+ if [ ! -d "$pcreSrcDir" ]; then
+ cd "$ceguiDepsSrcDir"
+ if [ ! -f "$ceguiDepsDownloadsDir/$pcrePackageArchive" ]; then
+ myWget "" "$ceguiDepsDownloadsDir/$pcrePackageArchive" \
+ "$pcrePackageUri"
+ fi
+ myUnpackTarBz2 "" "$ceguiDepsDownloadsDir/$pcrePackageArchive"
+ mv "$pcrePackageDir" "$pcreSrcDir"
+ fi
+
+ if [ ! -d "$pcreBuildDir" ]; then
+ mkdir -p "$pcreBuildDir"
+ cd "$pcreBuildDir"
+ eval '"$pcreSrcDir/configure" --prefix="$pcreInstallDir"' \
+ '--host="$androidToolchainName" --enable-unicode-properties'
+ '--disable-rebuild-chartables' $androidAutotoolsOptions
+ fi
+
+ cd "$pcreBuildDir"
+ myMake "" "-j$buildNumOfProcesses" V=1
+
+ fi
+
+ }
+
+ installPcre()
+ {
+ addToolchainToPath
+ if [ ! -d "$pcreInstallDir" ]; then
+ cd "$pcreBuildDir"
+ myMake "$depsInstallDirMaybeSudo" install V=1
+ fi
+ }
+
+ buildFreetype()
+ {
+
+ addToolchainToPath
+
+ if [ ! -d "$freetypeInstallDir" ]; then
+
+ if [ ! -d "$freetypeSrcDir" ]; then
+ cd "$ceguiDepsSrcDir"
+ if [ ! -f "$ceguiDepsDownloadsDir/$freetypePackageArchive" ]; \
+ then
+ myWget "" "$ceguiDepsDownloadsDir/$freetypePackageArchive" \
+ "$freetypePackageUri"
+ fi
+ myUnpackTarBz2 "" \
+ "$ceguiDepsDownloadsDir/$freetypePackageArchive"
+ mv "$freetypePackageDir" "$freetypeSrcDir"
+ fi
+
+ if [ ! -d "$freetypeBuildDir" ]; then
+ mkdir -p "$freetypeBuildDir"
+ cd "$freetypeBuildDir"
+ eval '"$freetypeSrcDir/configure"' \
+ '--prefix="$freetypeInstallDir"' \
+ '--host="$androidToolchainName" --with-zlib=yes' \
+ '--with-bzip2=no --with-png=no --with-harfbuzz=no' \
+ $androidAutotoolsOptions
+ fi
+
+ cd "$freetypeBuildDir"
+ myMake "" "-j$buildNumOfProcesses"
+
+ fi
+
+ }
+
+ installFreetype()
+ {
+ addToolchainToPath
+ if [ ! -d "$freetypeInstallDir" ]; then
+ cd "$freetypeBuildDir"
+ myMake "$depsInstallDirMaybeSudo" install
+ fi
+ }
+
+ buildEpoxy()
+ {
+
+ if [ ! -d "$epoxyInstallDir" ]; then
+
+ if [ ! -d "$epoxySrcDir" ]; then
+ cd "$ceguiDepsSrcDir"
+ if [ ! -f "$ceguiDepsDownloadsDir/$epoxyPackageArchive" ]; then
+ myWget "" "$ceguiDepsDownloadsDir/$epoxyPackageArchive" \
+ "$epoxyPackageUri"
+ fi
+ myUnpackTarGz "" "$ceguiDepsDownloadsDir/$epoxyPackageArchive"
+ mv "$epoxyPackageDir" "$epoxySrcDir"
+ fi
+
+ if [ ! -d "$epoxyBuildDir" ]; then
+ mkdir -p "$epoxyBuildDir"
+ cd "$epoxyBuildDir"
+ eval myCmake '""' $androidCmakeOptions \
+ '-DCMAKE_INSTALL_PREFIX="$epoxyInstallDir"' \
+ '-DCMAKE_BUILD_TYPE="$ceguiDepsBuildType" "$epoxySrcDir"'
+ fi
+
+ cd "$epoxyBuildDir"
+ myMake "" "-j$buildNumOfProcesses"
+
+ fi
+ }
+
+ installEpoxy()
+ {
+ if [ ! -d "$epoxyInstallDir" ]; then
+ cd "$epoxyBuildDir"
+ myMake "$depsInstallDirMaybeSudo" install
+ fi
+ }
+
+ buildFribidi()
+ {
+
+ addToolchainToPath
+
+ if [ ! -d "$fribidiInstallDir" ]; then
+
+ if [ ! -d "$fribidiSrcDir" ]; then
+ cd "$ceguiDepsSrcDir"
+ if [ ! -f "$ceguiDepsDownloadsDir/$fribidiPackageArchive" ]; \
+ then
+ myWget "" "$ceguiDepsDownloadsDir/$fribidiPackageArchive" \
+ "$fribidiPackageUri"
+ fi
+ myUnpackTarBz2 "" \
+ "$ceguiDepsDownloadsDir/$fribidiPackageArchive"
+ mv "$fribidiPackageDir" "$fribidiSrcDir"
+ fi
+
+ if [ ! -d "$fribidiBuildDir" ]; then
+ mkdir -p "$fribidiBuildDir"
+ cd "$fribidiBuildDir"
+ eval '"$fribidiSrcDir/configure"' \
+ '--prefix="$fribidiInstallDir"' \
+ '--host="$androidToolchainName" --with-glib=no' \
+ $androidAutotoolsOptions
+ fi
+
+ cd "$fribidiBuildDir"
+ myMake "" "-j$buildNumOfProcesses"
+
+ fi
+
+ }
+
+ installFribidi()
+ {
+ addToolchainToPath
+ if [ ! -d "$fribidiInstallDir" ]; then
+ cd "$fribidiBuildDir"
+ myMake "$depsInstallDirMaybeSudo" install
+ fi
+ }
+
+
+ : \
+ && (buildNdkMissing) \
+ && (installNdkMissing) \
+ && (buildTinyxml) \
+ && (buildFreeimage) \
+ && (buildGlm) \
+ && (buildPcre) \
+ && (buildFreetype) \
+ && (buildEpoxy) \
+ && (buildFribidi) \
+ && (installTinyxml) \
+ && (installFreeimage) \
+ && (installGlm) \
+ && (installPcre) \
+ && (installFreetype) \
+ && (installEpoxy) \
+ && (installFribidi)
+
+ if [ $? -eq 0 ]; then
+ echo $'\n'"Building CEGUI dependencies succeeded!"
+ true;
+ else
+ echo $'\n'"Building CEGUI dependencies failed!"
+ false;
+ fi
+
+fi
diff --git a/android/build_sample-framework b/android/build_sample-framework
new file mode 100755
index 000000000..1eff3d91a
--- /dev/null
+++ b/android/build_sample-framework
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+myScriptsDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+. "$myScriptsDir/sample-framework_common"
+
+cd "$androidSampleFrameworkDir"
+eval echo -n "'$(AndroidManifest.xml
+eval echo -n "\"$(ant.properties
+eval echo -n "\"$(jni/Application.mk
+eval echo -n "\"$(jni/Android.mk
+eval echo -n "'$(jni/deps/Android.mk
+for resolution in h m xh xxh; do
+ dest="res/drawable-${resolution}dpi"
+ mkdir -p "$dest"
+ cp "$ceguiSrcDir/datafiles/imagesets/logo.png" "$dest/"
+done
+if [ -f project.properties ] && [ -f local.properties ]; then
+ ant clean
+ ndk-build clean
+fi
+: \
+ && android update project --path . --target "android-$androidBuildTargetApiLevel" \
+ && ndk-build "-j$buildNumOfProcesses"
+if [ $? -eq 0 ]; then
+ case "$sampleFrameworkAndroidProjectBuildType" in
+ Debug)
+ ant debug && ant installd
+ ;;
+ Release)
+ ant release && ant installr
+ ;;
+ *)
+ echo 'Error: invalid "$sampleFrameworkAndroidProjectBuildType"'
+ exit 1
+ ;;
+ esac
+fi
diff --git a/android/common b/android/common
new file mode 100644
index 000000000..01b5542fa
--- /dev/null
+++ b/android/common
@@ -0,0 +1,65 @@
+#!/usr/bin/env bash
+. "$myScriptsDir/conf"
+androidSampleFrameworkDir="$myScriptsDir/CEGUISampleFramework"
+export PKG_CONFIG_SYSROOT_DIR="$androidStandaloneToolchainDir/sysroot"
+
+maybeSudo()
+{
+ "$@" 2>/dev/null
+ if [ $? -ne 0 ]; then
+ mySudo "$@"
+ fi
+}
+
+dirRequiresSudo()
+{
+ myDir="$1"
+ myMaybeSudo="$2"
+ declare -i dirExists
+ [ -d "$myDir" ]
+ dirExists=$?
+ maybeSudo mkdir -p "$myDir"
+ touch "$myDir/file_to_test_permission" 2>/dev/null
+ eval '{ [ $? -eq 0 ] && '"$myMaybeSudo"'=""; } || '"$myMaybeSudo"'="mySudo "'
+ rm -f "$myDir/file_to_test_permission" 2>/dev/null
+ if [ $dirExists -ne 0 ]; then
+ eval '${'"$myMaybeSudo"'}rmdir "$myDir"'
+ fi
+}
+
+addToolchainToPath()
+{
+ export PATH="$androidStandaloneToolchainDir/bin${PATH+:}$PATH"
+}
+
+androidCmakeOptionsElements=('-G "Unix Makefiles"' \
+ '-DCMAKE_TOOLCHAIN_FILE="$androidToolchainCmakeFile"' \
+ '-DANDROID_NDK="$androidNdkDir"' \
+ '-DANDROID_ABI="$androidAbi"' \
+ '-DANDROID_NATIVE_API_LEVEL=android-"$androidNdkApiLevel"' \
+ '-DANDROID_TOOLCHAIN_NAME="$androidToolchain"' \
+ '-DANDROID_STL=gnustl_shared')
+androidCmakeOptions="${androidCmakeOptionsElements[*]}"
+
+declare -A androidBuildFlags
+androidBuildFlags=([Debug]="-O0 -g -DDEBUG -D_DEBUG" \
+ [Release]="-O3 -DNDEBUG" \
+ [RelWithDebInfo]="-O2 -g -DNDEBUG" \
+ [MinSizeRel]="-Os -DNDEBUG")
+androidAutotoolsOptionsElements=('CFLAGS="${androidBuildFlags[$myBuildType]}"' \
+ 'CXXFLAGS="${androidBuildFlags[$myBuildType]}"')
+androidAutotoolsOptions="${androidAutotoolsOptionsElements[*]}"
+androidBuildOptionsElements=('user_CFLAGS="${androidBuildFlags[$myBuildType]}"' \
+ 'user_CXXFLAGS="${androidBuildFlags[$myBuildType]}"')
+androidBuildOptions="${androidBuildOptionsElements[*]}"
+
+androidToolchainConfigurationElements=('CC="$androidToolchainName-gcc"' \
+ 'CXX="$androidToolchainName-g++"' \
+ 'AR="$androidToolchainName-ar"' \
+ 'LD="$androidToolchainName-ld"' \
+ 'AS="$androidToolchainName-as"' \
+ 'NM="$androidToolchainName-nm"' \
+ 'STRIP="$androidToolchainName-strip"' \
+ 'RANLIB="$androidToolchainName-ranlib"' \
+ 'OBJDUMP="$androidToolchainName-objdump"')
+androidToolchainConfiguration="${androidToolchainConfigurationElements[*]}"
diff --git a/android/conf b/android/conf
new file mode 100644
index 000000000..9182c276b
--- /dev/null
+++ b/android/conf
@@ -0,0 +1,175 @@
+#!/usr/bin/env bash
+
+################################################################################
+# General Configuration
+################################################################################
+
+androidSdkDir=/opt/android/android-sdk-linux
+buildNumOfProcesses=4 # Number of concurrent processes to use when building.
+
+################################################################################
+# Java Configuration
+################################################################################
+
+# The location of the Java installation to use for building the Android sample
+# framework project
+javaHomeDir=/opt/java/jdk1.7.0_79
+
+# The target Java version to build the Android sample framework project for:
+# ${javaVerMajor}.${javaVerMinor}
+javaVerMajor=1
+javaVerMinor=7
+
+################################################################################
+# Android NDK Configuration
+################################################################################
+
+# E.g. for the official Android NDK version r10e, set "androidNdkType" to
+# "Google", "androidNdkVerMajor" to "10", "androidNdkVerMinor" to "e" and
+# "androidNdkVerPatch" to "". E.g. For Crystax NDK version 10.2.1 set
+# "androidNdkType" to "Crystax", "androidNdkVerMajor" to "10",
+# "androidNdkVerMinor" to "2" and "androidNdkVerPatch" to "1".
+androidNdkType=Crystax
+androidNdkVerMajor=10
+androidNdkVerMinor=2
+androidNdkVerPatch=1
+
+androidNdkName=crystax-ndk-10.2.1
+androidNdkDir="/opt/android/$androidNdkName"
+
+# Value passed to "--system" when running "make-standalone-toolchain.sh".
+mySystemName=linux-x86_64
+
+# Value passed to "--arch" when running "make-standalone-toolchain.sh".
+androidArch=arm
+
+# The following variable determines 3 things:
+# 1) Passed to "--abis" when running "make-standalone-toolchain.sh".
+# 2) Determines "APP_ABI" in "Application.mk".
+# 3) Determines value of "ANDROID_ABI" passed to CMake.
+androidAbi=armeabi-v7a
+
+androidToolchainAbi=armv7-a
+androidToolchainVer=4.9 # Version of GCC to use with the NDK.
+androidToolchainName=arm-linux-androideabi
+androidToolchain="$androidToolchainName-$androidToolchainVer"
+
+################################################################################
+# Android Sample Framework Project Version Configuration
+################################################################################
+
+# Determines "android:minSdkVersion" in "AndroidManifest.xml".
+androidMinSdkVersion=21
+
+# Determines "android:androidSdkVersion" in "AndroidManifest.xml".
+androidTargetSdkVersion=22
+
+# Determines the value passed to "--target" when running
+# "android update project".
+androidBuildTargetApiLevel=21
+
+androidNdkApiLevel=21 # Determines the "APP_PLATFORM" in "Android.mk".
+
+################################################################################
+# CEGUI Specific Configuration
+################################################################################
+
+# Cegui version: "${ceguiVerMajor}.${ceguiVerMinor}.${ceguiVerPatch}".
+ceguiVerMajor=0
+ceguiVerMinor=8
+ceguiVerPatch=5
+
+ceguiPackageName="cegui_${ceguiVerMajor}_${ceguiVerMinor}_${ceguiVerPatch}"
+
+# Directory where the CEGUI source is located.
+ceguiSrcDir="$HOME/src/$ceguiPackageName"
+
+################################################################################
+# Build types
+################################################################################
+
+# Can be either "Debug" or "Release". Controls whether to build the sample
+# framework android project with "ant debug" or "ant release". Note: for
+# "Release" to work, the APK must be signed!
+sampleFrameworkAndroidProjectBuildType=Debug
+
+# Each can be each of "Debug", "Release", "RelWithDebInfo" or "MinSizeRel". This
+# is equivalent to CMake's variable "CMAKE_BUILD_TYPE".
+ceguiBuildType=Debug
+ceguiDepsBuildType=Release
+
+################################################################################
+# Files and Directories Paths
+# ----------------------------
+# Note: all the files and directories named by the following variables will be
+# automatically created; there's no need to create them manually.
+################################################################################
+
+# Directory where to download CEGUI dependencies. Remove this directory to force
+# re-download of all packages.
+ceguiDepsDownloadsDir="$HOME/Downloads/cegui_deps_android"
+
+# Directory where to store the source code for CEGUI dependencies. Remove this
+# directory to force re-retrieval of all CEGUI dependencies source code.
+ceguiDepsSrcDir="$HOME/src/cegui_deps_android"
+
+# Directory where to build the CEGUI dependencies. Remove this directory to
+# force a rebuild of all CEGUI dependencies.
+ceguiDepsBuildDir="$HOME/build/android/cegui_deps"
+
+# Directory where to install the CEGUI dependencies. Remove this directory to
+# force re-installation of all CEGUI dependencies.
+#
+# ** Note **
+# Path must not contain any spaces! (Because "Android.mk" doesn't know how to
+# handle them right, or at least I don't know how to make it handle them right.)
+ceguiDepsInstallDir="/usr/local/android/cegui-deps"
+
+# Directory where to create the Android NDK standalone toolchain. Remove this
+# directory to force a regeneration of the standalone toolchain.
+androidStandaloneToolchainDir="/opt/android/${androidNdkName}_${androidAbi}_${androidToolchainVer}_$androidNdkApiLevel"
+
+# A path where to create the CMake Android toolchain file.
+androidToolchainCmakeFile="$HOME/src/android.toolchain.cmake"
+
+# Directory where CEGUI will be built. Remove this directory to force a rebuild
+ceguiBuildDir="$HOME/build/android/$ceguiPackageName"
+# of CEGUI.
+
+# Directory where CEGUI will be installed. Remove this directory to force a
+# re-installation of CEGUI.
+#
+# ** Note **
+# Path must not contain any spaces! (Because "Android.mk" doesn't know how to
+# handle them right, or at least I don't know how to make it handle them right.)
+ceguiInstallDir="/usr/local/android/$ceguiPackageName"
+
+################################################################################
+# Helper programs
+# ----------------
+# Normally, you wouldn't have to touch these functions. Adjust them in case you
+# have some unusual installations of these programs:
+################################################################################
+
+mySudo() { sudo env PATH="$PATH" "$@"; }
+mySymLink() { myArgs=("$@"); ${1}ln -s "${myArgs[@]:1}"; }
+myPatchFile() { ${1}patch -o "${3}" -d "${2}" "${4}" "${5}"; }
+myPatchDir() { ${1}patch -p1 -d "${2}" -i "${3}"; }
+myWget() { ${1}wget -O "$2" "$3"; }
+myCmake() { myArgs=("$@"); ${1}cmake "${myArgs[@]:1}"; }
+myMake() { myArgs=("$@"); ${1}make "${myArgs[@]:1}"; }
+myUnpackTarGz() { ${1}tar -xzf "$2"; }
+myUnpackTarBz2() { ${1}tar -xjf "$2"; }
+myUnpack7z() { ${1}7z x "$2"; }
+myUnpackZip() { ${1}unzip "$2"; }
+myBash() { myArgs=("$@"); ${1}bash "${myArgs[@]:1}"; }
+
+################################################################################
+# Package-Specific Configuration
+# -------------------------------
+# For finer tuning of each CEGUI dependency package individually, you might want
+# to have a loot at "deps_conf.sh". Normally you wouldn't have to touch it,
+# though.
+################################################################################
+
+. "$myScriptsDir/deps_conf"
diff --git a/android/deps_conf b/android/deps_conf
new file mode 100644
index 000000000..b18194ca8
--- /dev/null
+++ b/android/deps_conf
@@ -0,0 +1,104 @@
+#!/usr/bin/env bash
+
+################################################################################
+# Package-Specific configuration
+# -------------------------------
+# For finer tuning of each CEGUI dependency package individually, you might want
+# to have a look at this file. Normally you wouldn't have to touch it,
+# though.
+#
+# * The "packageArchive" of each package is the name in which to save its downloaded
+# source archive.
+# tarball) to be downloaded.
+# * The "packageUri" of each package is the URI from which to download its
+# source archive.
+# * The "packageDir" of each package is the top level directory in its source
+# acrhive.
+# * The "srcDir" of each package is where to store its source code. Remove this
+# directoryTo force re-retrieval of its source code.
+# * The "buildDir" of each package is where to build it. Remove this directory
+# to force a rebuild of it.
+# * The "installDir" of each package is where to install it. Remove this
+# directory to force a re-installation of it.
+# * The "libFilePath" of each package is a full path to its shared library
+# ("lib.so"), including the file name.
+# * The "includePath" of each package is a full path to its include directory.
+################################################################################
+
+# "ndkMissing" is a package that its source is included with the CEGUI source,
+# which provides functions of the standard C/C++ library which are absent from
+# the Android NDK.
+ndkMissing_packageName=ndk-missing_1_0_0
+ndkMissing_srcDir="$myScriptsDir/$ndkMissing_packageName"
+ndkMissing_buildDir="$ceguiDepsBuildDir/$ndkMissing_packageName"
+ndkMissing_installDir="$ceguiDepsInstallDir/$ndkMissing_packageName"
+ndkMissing_libFilePath="$ndkMissing_installDir/lib/libndk-missing_1.so"
+
+tinyxmlPackageName=tinyxml_2_6_2
+tinyxmlPackageArchive=tinyxml_2_6_2.tar.gz
+tinyxmlPackageDir=tinyxml
+tinyxmlPackageUri="http://downloads.sourceforge.net/project/tinyxml/tinyxml/2.6.2/$tinyxmlPackageArchive?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Ftinyxml%2Ffiles%2Ftinyxml%2F2.6.2%2F&ts=1439024597&use_mirror=garr"
+tinyxmlSrcDir="$ceguiDepsSrcDir/$tinyxmlPackageName"
+tinyxmlBuildDir="$ceguiDepsBuildDir/$tinyxmlPackageName"
+tinyxmlInstallDir="$ceguiDepsInstallDir/$tinyxmlPackageName"
+tinyxmlLibFilePath="$tinyxmlInstallDir/lib/libtinyxml.so"
+tinyxmlIncludePath="$tinyxmlInstallDir/include"
+
+freeimagePackageName=FreeImage_3_17_0
+freeimagePackageArchive=FreeImage3170.zip
+freeimagePackageDir=FreeImage
+freeimagePackageUri="http://downloads.sourceforge.net/project/freeimage/Source%20Distribution/3.17.0/$freeimagePackageArchive?r=http%3A%2F%2Ffreeimage.sourceforge.net%2Fdownload.html&ts=1439040407&use_mirror=garr"
+freeimageSrcDir="$ceguiDepsSrcDir/$freeimagePackageName"
+freeimageBuildDir="$ceguiDepsBuildDir/$freeimagePackageName"
+freeimageInstallDir="$ceguiDepsInstallDir/$freeimagePackageName"
+freeimageLibFilePath="$freeimageInstallDir/lib/libfreeimage_3.so"
+freeimageIncludePath="$freeimageInstallDir/include"
+
+glmPackageName=glm_0_9_7_0
+glmPackageArchive=glm-0.9.7.0.7z
+glmPackageDir=glm
+glmPackageUri="https://github.com/g-truc/glm/releases/download/0.9.7.0/$glmPackageArchive"
+glmSrcDir="$ceguiDepsSrcDir/$glmPackageName"
+glmBuildDir="$ceguiDepsBuildDir/$glmPackageName"
+glmInstallDir="$ceguiDepsInstallDir/$glmPackageName"
+glmIncludePath="$glmInstallDir/include"
+
+pcrePackageName=pcre_8_37
+pcrePackageArchive=pcre-8.37.tar.bz2
+pcrePackageDir=pcre-8.37
+pcrePackageUri="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/$pcrePackageArchive"
+pcreSrcDir="$ceguiDepsSrcDir/$pcrePackageName"
+pcreBuildDir="$ceguiDepsBuildDir/$pcrePackageName"
+pcreInstallDir="$ceguiDepsInstallDir/$pcrePackageName"
+pcreLibFilePath="$pcreInstallDir/lib/libpcre.so"
+pcreIncludePath="$pcreInstallDir/include"
+
+freetypePackageName=freetype_2_6
+freetypePackageArchive=freetype-2.6.tar.bz2
+freetypePackageDir=freetype-2.6
+freetypePackageUri="http://download.savannah.gnu.org/releases/freetype/$freetypePackageArchive"
+freetypeSrcDir="$ceguiDepsSrcDir/$freetypePackageName"
+freetypeBuildDir="$ceguiDepsBuildDir/$freetypePackageName"
+freetypeInstallDir="$ceguiDepsInstallDir/$freetypePackageName"
+freetypeLibFilePath="$freetypeInstallDir/lib/libfreetype.so"
+freetypeIncludePath="$freetypeInstallDir/include/freetype2"
+
+epoxyPackageName=epoxy_1_3_1_yaronct-4
+epoxyPackageArchive=libepoxy-v1.3.1_yaronct-4.tar.gz
+epoxyPackageDir=libepoxy-1.3.1_yaronct-4
+epoxyPackageUri=https://github.com/yaronct/libepoxy/archive/v1.3.1_yaronct-4.tar.gz
+epoxySrcDir="$ceguiDepsSrcDir/$epoxyPackageName"
+epoxyBuildDir="$ceguiDepsBuildDir/$epoxyPackageName"
+epoxyInstallDir="$ceguiDepsInstallDir/$epoxyPackageName"
+epoxyLibFilePath="$epoxyInstallDir/lib/libepoxy_0.so"
+epoxyIncludePath="$epoxyInstallDir/include"
+
+fribidiPackageName=fribidi_0_19_7
+fribidiPackageArchive=fribidi-0.19.7.tar.bz2
+fribidiPackageDir=fribidi-0.19.7
+fribidiPackageUri="http://fribidi.org/download/$fribidiPackageArchive"
+fribidiSrcDir="$ceguiDepsSrcDir/$fribidiPackageName"
+fribidiBuildDir="$ceguiDepsBuildDir/$fribidiPackageName"
+fribidiInstallDir="$ceguiDepsInstallDir/$fribidiPackageName"
+fribidiLibFilePath="$fribidiInstallDir/lib/libfribidi.so"
+fribidiIncludePath="$fribidiInstallDir/include/fribidi"
diff --git a/android/freeimage.patch b/android/freeimage.patch
new file mode 100644
index 000000000..078ac12d4
--- /dev/null
+++ b/android/freeimage.patch
@@ -0,0 +1,191 @@
+diff -rupN FreeImage_3_17_0_orig/Makefile.gnu FreeImage_3_17_0_new/Makefile.gnu
+--- FreeImage_3_17_0_orig/Makefile.gnu 2015-03-08 18:04:00.000000000 +0200
++++ FreeImage_3_17_0_new/Makefile.gnu 2015-08-22 14:16:36.068525956 +0300
+@@ -5,17 +5,19 @@ include Makefile.srcs
+
+ # General configuration variables:
+ DESTDIR ?= /
+-INCDIR ?= $(DESTDIR)/usr/include
+-INSTALLDIR ?= $(DESTDIR)/usr/lib
++INCDIR ?= $(DESTDIR)/include
++INSTALLDIR ?= $(DESTDIR)/lib
+
+ # Converts cr/lf to just lf
+ DOS2UNIX = dos2unix
+
+-LIBRARIES = -lstdc++
++LIBRARIES = -lgnustl_shared -lndk-missing_1
++LDFLAGS = -L$(ndkMissing_dir)/lib
+
+ MODULES = $(SRCS:.c=.o)
+ MODULES := $(MODULES:.cpp=.o)
+-CFLAGS ?= -O3 -fPIC -fexceptions -fvisibility=hidden
++CFLAGS = $(user_CFLAGS)
++CFLAGS += -fPIC -fexceptions -fvisibility=hidden
+ # OpenJPEG
+ CFLAGS += -DOPJ_STATIC
+ # LibRaw
+@@ -23,28 +25,27 @@ CFLAGS += -DNO_LCMS
+ # LibJXR
+ CFLAGS += -DDISABLE_PERF_MEASUREMENT -D__ANSI__
+ CFLAGS += $(INCLUDE)
+-CXXFLAGS ?= -O3 -fPIC -fexceptions -fvisibility=hidden -Wno-ctor-dtor-privacy
++CXXFLAGS = $(user_CXXFLAGS)
++CXXFLAGS += -fPIC -fexceptions -fvisibility=hidden -Wno-ctor-dtor-privacy
+ # LibJXR
+ CXXFLAGS += -D__ANSI__
+ CXXFLAGS += $(INCLUDE)
+
+-ifeq ($(shell sh -c 'uname -m 2>/dev/null || echo not'),x86_64)
+- CFLAGS += -fPIC
+- CXXFLAGS += -fPIC
+-endif
+-
+ TARGET = freeimage
+ STATICLIB = lib$(TARGET).a
+ SHAREDLIB = lib$(TARGET)-$(VER_MAJOR).$(VER_MINOR).so
+ LIBNAME = lib$(TARGET).so
+-VERLIBNAME = $(LIBNAME).$(VER_MAJOR)
++VERLIBNAME = lib$(TARGET)_$(VER_MAJOR).so
+ HEADER = Source/FreeImage.h
+
+
+
+ default: all
+
+-all: dist
++all: foo dist
++
++foo:
++ echo "my CFLAGS = " $(CFLAGS)
+
+ dist: FreeImage
+ mkdir -p Dist
+@@ -71,12 +72,11 @@ $(SHAREDLIB): $(MODULES)
+
+ install:
+ install -d $(INCDIR) $(INSTALLDIR)
+- install -m 644 -o root -g root $(HEADER) $(INCDIR)
+- install -m 644 -o root -g root $(STATICLIB) $(INSTALLDIR)
+- install -m 755 -o root -g root $(SHAREDLIB) $(INSTALLDIR)
++ install -m 644 $(HEADER) $(INCDIR)
++ install -m 644 $(STATICLIB) $(INSTALLDIR)
++ install -m 755 $(SHAREDLIB) $(INSTALLDIR)
+ ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(VERLIBNAME)
+- ln -sf $(VERLIBNAME) $(INSTALLDIR)/$(LIBNAME)
+-# ldconfig
++ ln -sf $(VERLIBNAME) $(INSTALLDIR)/$(LIBNAME)
+
+ clean:
+ rm -f core Dist/*.* u2dtmp* $(MODULES) $(STATICLIB) $(SHAREDLIB) $(LIBNAME)
+diff -rupN FreeImage_3_17_0_orig/Makefile.gnu~ FreeImage_3_17_0_new/Makefile.gnu~
+--- FreeImage_3_17_0_orig/Makefile.gnu~ 1970-01-01 02:00:00.000000000 +0200
++++ FreeImage_3_17_0_new/Makefile.gnu~ 2015-08-22 14:16:36.068525956 +0300
+@@ -0,0 +1,82 @@
++# Linux makefile for FreeImage
++
++# This file can be generated by ./gensrclist.sh
++include Makefile.srcs
++
++# General configuration variables:
++DESTDIR ?= /
++INCDIR ?= $(DESTDIR)/include
++INSTALLDIR ?= $(DESTDIR)/lib
++
++# Converts cr/lf to just lf
++DOS2UNIX = dos2unix
++
++LIBRARIES = -lgnustl_shared -lndk-missing
++LDFLAGS = -L$(ndkMissing_dir)/lib
++
++MODULES = $(SRCS:.c=.o)
++MODULES := $(MODULES:.cpp=.o)
++CFLAGS = $(user_CFLAGS)
++CFLAGS += -fPIC -fexceptions -fvisibility=hidden
++# OpenJPEG
++CFLAGS += -DOPJ_STATIC
++# LibRaw
++CFLAGS += -DNO_LCMS
++# LibJXR
++CFLAGS += -DDISABLE_PERF_MEASUREMENT -D__ANSI__
++CFLAGS += $(INCLUDE)
++CXXFLAGS = $(user_CXXFLAGS)
++CXXFLAGS += -fPIC -fexceptions -fvisibility=hidden -Wno-ctor-dtor-privacy
++# LibJXR
++CXXFLAGS += -D__ANSI__
++CXXFLAGS += $(INCLUDE)
++
++TARGET = freeimage
++STATICLIB = lib$(TARGET).a
++SHAREDLIB = lib$(TARGET)-$(VER_MAJOR).$(VER_MINOR).so
++LIBNAME = lib$(TARGET).so
++VERLIBNAME = $(LIBNAME)
++HEADER = Source/FreeImage.h
++
++
++
++default: all
++
++all: foo dist
++
++foo:
++ echo "my CFLAGS = " $(CFLAGS)
++
++dist: FreeImage
++ mkdir -p Dist
++ cp *.a Dist/
++ cp *.so Dist/
++ cp Source/FreeImage.h Dist/
++
++dos2unix:
++ @$(DOS2UNIX) $(SRCS) $(INCLS)
++
++FreeImage: $(STATICLIB) $(SHAREDLIB)
++
++.c.o:
++ $(CC) $(CFLAGS) -c $< -o $@
++
++.cpp.o:
++ $(CXX) $(CXXFLAGS) -c $< -o $@
++
++$(STATICLIB): $(MODULES)
++ $(AR) r $@ $(MODULES)
++
++$(SHAREDLIB): $(MODULES)
++ $(CC) -s -shared -Wl,-soname,$(VERLIBNAME) $(LDFLAGS) -o $@ $(MODULES) $(LIBRARIES)
++
++install:
++ install -d $(INCDIR) $(INSTALLDIR)
++ install -m 644 $(HEADER) $(INCDIR)
++ install -m 644 $(STATICLIB) $(INSTALLDIR)
++ install -m 755 $(SHAREDLIB) $(INSTALLDIR)
++ ln -sf $(SHAREDLIB) $(INSTALLDIR)/$(VERLIBNAME)
++
++clean:
++ rm -f core Dist/*.* u2dtmp* $(MODULES) $(STATICLIB) $(SHAREDLIB) $(LIBNAME)
++
+diff -rupN FreeImage_3_17_0_orig/Source/LibJXR/common/include/wmspecstring.h FreeImage_3_17_0_new/Source/LibJXR/common/include/wmspecstring.h
+--- FreeImage_3_17_0_orig/Source/LibJXR/common/include/wmspecstring.h 2015-03-02 01:50:58.000000000 +0200
++++ FreeImage_3_17_0_new/Source/LibJXR/common/include/wmspecstring.h 2015-08-22 14:16:36.084525640 +0300
+@@ -286,7 +286,9 @@ extern "C" {
+
+ #if defined(_WINDOWS_)
+ /* Windows Internal */
++#if defined _WIN32
+ #define __volatile __$volatile
++#endif
+ #define __nonvolatile __$nonvolatile
+ #define __deref_volatile __deref __volatile
+ #define __deref_nonvolatile __deref __nonvolatile
+diff -rupN FreeImage_3_17_0_orig/Source/LibRawLite/internal/libraw_x3f.cpp FreeImage_3_17_0_new/Source/LibRawLite/internal/libraw_x3f.cpp
+--- FreeImage_3_17_0_orig/Source/LibRawLite/internal/libraw_x3f.cpp 2014-08-31 23:45:02.000000000 +0300
++++ FreeImage_3_17_0_new/Source/LibRawLite/internal/libraw_x3f.cpp 2015-08-22 14:16:36.092525482 +0300
+@@ -625,7 +625,7 @@ static x3f_huffman_t *new_huffman(x3f_hu
+ I->output.file = NULL;
+
+ if (infile == NULL) {
+- I->error = "No infile";
++ I->error = const_cast("No infile");
+ return x3f;
+ }
+
diff --git a/android/ndk-missing_1_0_0/CMakeLists.txt b/android/ndk-missing_1_0_0/CMakeLists.txt
new file mode 100644
index 000000000..35a1f6639
--- /dev/null
+++ b/android/ndk-missing_1_0_0/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required (VERSION 3.0)
+cmake_policy (VERSION 3.0)
+project (NDK-Missing VERSION 1.0.0 LANGUAGES C CXX)
+set (TARGET_ABI_VER "${PROJECT_VERSION_MAJOR}")
+set (TARGET_NAME "ndk-missing_${TARGET_ABI_VER}")
+
+set (CMAKE_C_VISIBILITY_PRESET "hidden")
+
+if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu99 -Wall -Wextra")
+endif ()
+
+add_library ("${TARGET_NAME}" SHARED main.cpp)
+set_target_properties(${TARGET_NAME} PROPERTIES DEFINE_SYMBOL "NDK_MISSING__EXPORTS")
+
+install (FILES ${HEADERS} DESTINATION "include")
+install (TARGETS "${TARGET_NAME}" RUNTIME DESTINATION bin LIBRARY DESTINATION lib)
diff --git a/android/ndk-missing_1_0_0/main.cpp b/android/ndk-missing_1_0_0/main.cpp
new file mode 100644
index 000000000..46b0765cd
--- /dev/null
+++ b/android/ndk-missing_1_0_0/main.cpp
@@ -0,0 +1,22 @@
+#include
+
+extern "C"
+{
+
+void swab(const void* bfrom, void* bto, ssize_t n) __attribute__((visibility("default")));
+
+void swab(const void* bfrom, void* bto, ssize_t n)
+{
+ const char* from = (const char*)bfrom;
+ char* to = (char*)bto;
+ n &= ~((ssize_t)1);
+ while (n > 1)
+ {
+ const char b0 = from[--n];
+ const char b1 = from[--n];
+ to[n] = b0;
+ to[n+1] = b1;
+ }
+}
+
+} // extern "C"
diff --git a/android/prepare_ndk b/android/prepare_ndk
new file mode 100644
index 000000000..4c2507246
--- /dev/null
+++ b/android/prepare_ndk
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+myScriptsDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+. "$myScriptsDir/common"
+
+maybeSudo cp "$myScriptsDir/android-ndk-r10e_RELEASE.TXT" \
+ "$androidNdkDir/RELEASE.TXT"
+
+if [ ! -d "$androidStandaloneToolchainDir" ]; then
+
+ dirRequiresSudo "$androidStandaloneToolchainDir" toolchainDirMaybeSudo
+ myBash "$toolchainDirMaybeSudo" \
+ "$androidNdkDir/build/tools/make-standalone-toolchain.sh" \
+ --platform="android-$androidNdkApiLevel" \
+ --system="$mySystemName" \
+ --arch="$androidArch" \
+ --ndk-dir="$androidNdkDir" \
+ --abis="$androidAbi" \
+ --toolchain="$androidToolchain" \
+ --install-dir="$androidStandaloneToolchainDir"
+
+ myPatchDir "$toolchainDirMaybeSudo" "$androidStandaloneToolchainDir" \
+ "$myScriptsDir/standalone_toolchain.patch"
+
+ pushd "$androidStandaloneToolchainDir/include/c++/$androidToolchainVer/bits"
+ mySymLink "$toolchainDirMaybeSudo" \
+ "../$androidToolchainName/$androidToolchainAbi/bits/"* .
+ popd
+
+ ${toolchainDirMaybeSudo}cp \
+ "$androidNdkDir/sources/cpufeatures/cpu-features.h" \
+ "$androidStandaloneToolchainDir/sysroot/usr/include"
+
+ pushd "$androidStandaloneToolchainDir/arm-linux-androideabi/lib"
+ for file in libgnuobjc_shared.so libgnustl_shared.so libobjc.a libstdc++.a \
+ libsupc++.a; do
+ mySymLink "$toolchainDirMaybeSudo" "$androidToolchainAbi/$file" .
+ done
+ popd
+fi
+
+if [ ! -f "$androidToolchainCmakeFile" ]; then
+ myPatchFile "" "$myScriptsDir" "$androidToolchainCmakeFile" \
+ "$myScriptsDir/android.toolchain.cmake__orig" \
+ "$myScriptsDir/android.toolchain.cmake.patch"
+fi
diff --git a/android/run_sample-framework_with_logcat b/android/run_sample-framework_with_logcat
new file mode 100755
index 000000000..8fad47f94
--- /dev/null
+++ b/android/run_sample-framework_with_logcat
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+myScriptsDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+. "$myScriptsDir/sample-framework_common"
+cd "$androidSampleFrameworkDir"
+adb logcat -c
+adb shell am start -a android.intent.action.MAIN -n sample_framework.cegui/.MainActivity
+adb logcat CEGUIBase:V MainActivity:V DEBUG:I *:F
diff --git a/android/sample-framework_common b/android/sample-framework_common
new file mode 100644
index 000000000..b554e2059
--- /dev/null
+++ b/android/sample-framework_common
@@ -0,0 +1,3 @@
+. "$myScriptsDir/common"
+export JAVA_HOME="$javaHomeDir"
+export PATH="$androidNdkDir:$androidSdkDir/tools:$androidSdkDir/platform-tools:$javaHomeDir/bin${PATH+:}$PATH"
diff --git a/android/standalone_toolchain.patch b/android/standalone_toolchain.patch
new file mode 100644
index 000000000..c95ceb29e
--- /dev/null
+++ b/android/standalone_toolchain.patch
@@ -0,0 +1,50 @@
+diff -rupN orig/sysroot/usr/include/crystax/freebsd/include/mangled-string.h new/sysroot/usr/include/crystax/freebsd/include/mangled-string.h
+--- orig/sysroot/usr/include/crystax/freebsd/include/mangled-string.h 2015-08-25 21:46:30.670286841 +0300
++++ new/sysroot/usr/include/crystax/freebsd/include/mangled-string.h 2015-08-25 21:49:25.074987710 +0300
+@@ -123,6 +123,8 @@ char *strtok_r(char *, const char *, cha
+ size_t strxfrm(char * __restrict, const char * __restrict, size_t);
+ #if __BSD_VISIBLE
+
++#if 0
++
+ #ifndef _SWAB_DECLARED
+ #define _SWAB_DECLARED
+
+@@ -134,6 +136,8 @@ typedef __ssize_t ssize_t;
+ void swab(const void * __restrict, void * __restrict, ssize_t);
+ #endif /* _SWAB_DECLARED */
+
++#endif
++
+ #endif /* __BSD_VISIBLE */
+
+ #if __POSIX_VISIBLE >= 200809 || defined(_XLOCALE_H_)
+diff -rupN orig/sysroot/usr/include/crystax/freebsd.h new/sysroot/usr/include/crystax/freebsd.h
+--- orig/sysroot/usr/include/crystax/freebsd.h 2015-08-25 21:46:30.670286841 +0300
++++ new/sysroot/usr/include/crystax/freebsd.h 2015-08-25 21:49:25.074987710 +0300
+@@ -135,11 +135,11 @@ int __crystax_isthreaded();
+ #endif
+
+ #ifndef MIN
+-#define MIN(a,b) (((a)<(b))?(a):(b))
++//#define MIN(a,b) (((a)<(b))?(a):(b))
+ #endif
+
+ #ifndef MAX
+-#define MAX(a,b) (((a)>(b))?(a):(b))
++//#define MAX(a,b) (((a)>(b))?(a):(b))
+ #endif
+
+ #ifndef powerof2
+diff -rupN orig/sysroot/usr/include/crystax/google/unistd.h new/sysroot/usr/include/crystax/google/unistd.h
+--- orig/sysroot/usr/include/crystax/google/unistd.h 2015-08-25 21:46:30.670286841 +0300
++++ new/sysroot/usr/include/crystax/google/unistd.h 2015-08-25 21:49:25.074987710 +0300
+@@ -197,6 +197,8 @@ extern int tcsetpgrp(int fd, pid_t _pi
+ } while (_rc == -1 && errno == EINTR); \
+ _rc; })
+
++extern void swab(const void* bfrom, void* bto, ssize_t n);
++
+ #if defined(__BIONIC_FORTIFY)
+ extern ssize_t __read_chk(int, void*, size_t, size_t);
+ __errordecl(__read_dest_size_error, "read called with size bigger than destination");
diff --git a/android/tinyxml-CMakeLists.txt b/android/tinyxml-CMakeLists.txt
new file mode 100644
index 000000000..76275c9f8
--- /dev/null
+++ b/android/tinyxml-CMakeLists.txt
@@ -0,0 +1,31 @@
+cmake_minimum_required (VERSION 3.0)
+cmake_policy (VERSION 3.0)
+project (Tinyxml VERSION 2.6.2 LANGUAGES C CXX)
+set (TARGET_NAME tinyxml)
+
+if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++03")
+endif ()
+
+if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing -Wall -Wextra")
+elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+ if (NOT CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
+ set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} /W4")
+ endif()
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Dinline=__inline")
+endif ()
+
+set (SOURCES tinystr.cpp
+ tinyxml.cpp
+ tinyxmlerror.cpp
+ tinyxmlparser.cpp)
+set (HEADERS tinystr.h
+ tinyxml.h)
+
+add_library ("${TARGET_NAME}" SHARED ${SOURCES})
+set_target_properties("${TARGET_NAME}" PROPERTIES DEFINE_SYMBOL "TINYXML_EXPORTS")
+
+install (FILES ${HEADERS} DESTINATION "include")
+install (TARGETS "${TARGET_NAME}" RUNTIME DESTINATION bin LIBRARY DESTINATION lib)
+
diff --git a/application_templates/CMakeLists.txt b/application_templates/CMakeLists.txt
new file mode 100644
index 000000000..e07e943a1
--- /dev/null
+++ b/application_templates/CMakeLists.txt
@@ -0,0 +1,28 @@
+cegui_dependent_option(CEGUI_BUILD_APPLICATION_TEMPLATE_SDL2 "Specifies whether to build the application template for SDL2" "SDL2_FOUND;CEGUI_BUILD_RENDERER_OPENGL")
+cegui_dependent_option(CEGUI_BUILD_APPLICATION_TEMPLATE_GLFW3 "Specifies whether to build the application template for GLFW3" "GLFW3_FOUND;CEGUI_BUILD_RENDERER_OPENGL")
+
+if(CEGUI_BUILD_RENDERER_OPENGL)
+ if(${CEGUI_BUILD_APPLICATION_TEMPLATE_SDL2})
+ add_executable(CEGUITemplate_SDL2 SDL2.cpp)
+
+ cegui_target_link_libraries(CEGUITemplate_SDL2 ${CEGUI_BASE_LIBNAME})
+ cegui_target_link_libraries(CEGUITemplate_SDL2 ${CEGUI_OPENGL_RENDERER_LIBNAME})
+ cegui_add_dependency(CEGUITemplate_SDL2 SDL2 PRIVATE TRUE)
+ cegui_add_dependency(CEGUITemplate_SDL2 GLEW PRIVATE TRUE)
+ if( MINGW )
+ cegui_target_link_libraries( CEGUITemplate_SDL2 imm32 version winmm )
+ endif()
+ endif()
+
+ if(${CEGUI_BUILD_APPLICATION_TEMPLATE_GLFW3})
+ add_executable(CEGUITemplate_GLFW3 glfw3.cpp)
+ if (WIN32)
+ set_property (TARGET CEGUITemplate_GLFW3 PROPERTY WIN32_EXECUTABLE TRUE)
+ endif ()
+
+ cegui_target_link_libraries(CEGUITemplate_GLFW3 ${CEGUI_BASE_LIBNAME})
+ cegui_target_link_libraries(CEGUITemplate_GLFW3 ${CEGUI_OPENGL_RENDERER_LIBNAME})
+ cegui_add_dependency(CEGUITemplate_GLFW3 GLFW3 PRIVATE TRUE)
+
+ endif()
+endif()
diff --git a/application_templates/Ogre.cpp b/application_templates/Ogre.cpp
new file mode 100644
index 000000000..5ee466d63
--- /dev/null
+++ b/application_templates/Ogre.cpp
@@ -0,0 +1,336 @@
+/***********************************************************************
+created: Feb 27 2016
+author: Petskull
+*************************************************************************/
+
+/***************************************************************************
+* Copyright (C) 2004 - 2015 Paul D Turner & The CEGUI Development Team
+*
+* 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 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.
+***************************************************************************/
+
+/**************************************************************************
+* The following libs (and corresponding headers) are needed to compile and to link:
+* OgreMain
+* OIS
+* CEGUIBase-0
+* CEGUIOgreRenderer-0
+***************************************************************************/
+
+#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
+#define WIN32_LEAN_AND_MEAN
+#include "windows.h"
+#endif
+
+// Ogre3D 1.10 cloned on 160226 https://bitbucket.org/sinbad/ogre
+#include
+#include
+
+// CEGUI 0.8.4 cloned on 160226 from https://bitbucket.org/cegui/cegui
+#include
+#include
+
+typedef struct{ /* For moving data between App and AppListener */
+ Ogre::Root* ogre_root;
+ Ogre::RenderWindow *ogre_win;
+ OIS::ParamList *ois_pl;
+ CEGUI::OgreRenderer *cegui_renderer;
+} AppPak;
+
+/* This AppListener class will house all callback from Ogre's rendering and window events, as well as OIS's Keyboard and Mouse events. */
+class AppListener : public Ogre::FrameListener, public Ogre::WindowEventListener, public OIS::KeyListener, public OIS::MouseListener{
+public:
+ AppListener(AppPak *new_app_pak) :keep_running(true){
+ app_pak = new_app_pak;
+
+ ois_input_man = OIS::InputManager::createInputSystem(*app_pak->ois_pl);
+ ois_kb = static_cast(ois_input_man->createInputObject(OIS::OISKeyboard, true));
+ ois_mouse = static_cast(ois_input_man->createInputObject(OIS::OISMouse, true));
+ ois_kb->setEventCallback(this);
+ ois_mouse->setEventCallback(this);
+
+ windowResized(app_pak->ogre_win);
+
+ MAX_BUTTON_NUM = 0;
+ }
+ ~AppListener(){
+ OIS::InputManager::destroyInputSystem(ois_input_man);
+ }
+
+ // --- Ogre::FrameListener Callbacks ---------------------------//
+ bool frameRenderingQueued(const Ogre::FrameEvent& evt){
+ Ogre::WindowEventUtilities::messagePump();
+
+ // For some reason, injectTimePulse(delta_time) currently must be done both
+ // on the GUIContext and also on CEGUI::System itself everytime.
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectTimePulse((float)evt.timeSinceLastFrame);
+ CEGUI::System::getSingleton().injectTimePulse((float)evt.timeSinceLastFrame);
+
+ // If our OIS::Keyboard or our OIS::Mouse has been destroyed (say, by closing the window), end the rendering
+ if (ois_kb && ois_mouse){
+ ois_kb->capture();
+ ois_mouse->capture();
+ } else {
+ return false;
+ }
+
+ //CEGUI::System::getSingleton().renderAllGUIContexts(); // By bootstrapping Ogre directly, we don't have to call this. Ogre does it automatically.
+
+ return keep_running; // Return false ends Ogre's rendering
+ }
+
+ // --- OIS::KeyListener and OIS::MouseListener Callbacks -------//
+ bool keyPressed(const OIS::KeyEvent &arg){
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectKeyDown((CEGUI::Key::Scan)arg.key);
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectChar((CEGUI::Key::Scan)arg.text);
+
+ if (arg.key == OIS::KC_ESCAPE){ keep_running = false; }
+ return true;
+ }
+ bool keyReleased(const OIS::KeyEvent &arg){
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectKeyUp((CEGUI::Key::Scan)arg.key);
+ return true;
+ }
+ bool mouseMoved(const OIS::MouseEvent &arg){
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseMove((float)arg.state.X.rel, (float)arg.state.Y.rel);
+ //CEGUI::System::getSingleton().getDefaultGUIContext().injectMousePosition(200.f, 200.f); // Another way to control the mouse cursor
+ return true;
+ }
+ bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id){
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonDown(convertButton(id));
+ return true;
+ }
+ bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id){
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonUp(convertButton(id));
+ return true;
+ }
+
+ // --- Ogre::WindowEventListener Callbacks ---------------------//
+ void windowResized(Ogre::RenderWindow* rw){
+ unsigned int width, height, depth;
+ int left, top;
+ app_pak->ogre_win->getMetrics(width, height, depth, left, top);
+
+ const OIS::MouseState &ms = ois_mouse->getMouseState();
+ ms.width = width;
+ ms.height = height;
+
+ CEGUI::System::getSingleton().notifyDisplaySizeChanged(CEGUI::Sizef((float)width, (float)height));
+ }
+ void windowClosed(Ogre::RenderWindow* rw){
+ if (rw == app_pak->ogre_win){
+ if (ois_input_man){
+ ois_input_man->destroyInputObject(ois_mouse);
+ ois_input_man->destroyInputObject(ois_kb);
+ ois_mouse = NULL;
+ ois_kb = NULL;
+
+ OIS::InputManager::destroyInputSystem(ois_input_man);
+ ois_input_man = 0;
+ }
+ }
+ }
+
+ // Convert OIS MouseButton event to CEGUI MouseButton event
+ CEGUI::MouseButton convertButton(OIS::MouseButtonID buttonID) {
+ switch (buttonID) {
+ case OIS::MB_Left:
+ return CEGUI::LeftButton;
+ case OIS::MB_Right:
+ return CEGUI::RightButton;
+ case OIS::MB_Middle:
+ return CEGUI::MiddleButton;
+ default:
+ return CEGUI::LeftButton;
+ }
+ }
+
+private:
+ AppPak *app_pak;
+ bool keep_running;
+
+ OIS::InputManager *ois_input_man;
+ OIS::Mouse *ois_mouse;
+ OIS::Keyboard *ois_kb;
+
+ unsigned int MAX_BUTTON_NUM;
+};
+
+class App{
+public:
+ void go(){ /* Entry Point Called by main() */
+ Setup();
+ CreateGUIContext();
+ CreateGUIRootWindow();
+ app_pak.ogre_root->startRendering();
+ DestroyGUIRootWindow();
+ Shutdown();
+ }
+private:
+ void Setup(){ /* Here we set up the basic libs of Ogre, OIS, and CEGUI */
+ // --- Init Ogre --- //
+ app_pak.ogre_root = new Ogre::Root("", "", "Ogre.log");
+ Ogre::ResourceGroupManager::getSingleton().addResourceLocation("./media", "FileSystem", "General");
+ Ogre::ResourceGroupManager::getSingleton().addResourceLocation("./media/CEGUI/imagesets/", "FileSystem", "imagesets");
+ Ogre::ResourceGroupManager::getSingleton().addResourceLocation("./media/CEGUI/schemes/", "FileSystem", "schemes");
+ Ogre::ResourceGroupManager::getSingleton().addResourceLocation("./media/CEGUI/fonts/", "FileSystem", "fonts");
+ Ogre::ResourceGroupManager::getSingleton().addResourceLocation("./media/CEGUI/looknfeel/", "FileSystem", "looknfeel");
+ Ogre::ResourceGroupManager::getSingleton().addResourceLocation("./media/CEGUI/layouts/", "FileSystem", "layouts");
+ Ogre::ResourceGroupManager::getSingleton().addResourceLocation("./media/CEGUI/lua_scripts/", "FileSystem", "lua_scripts");
+
+#ifdef _DEBUG
+ app_pak.ogre_root->loadPlugin(Ogre::String("RenderSystem_GL_d"));
+ app_pak.ogre_root->loadPlugin(Ogre::String("Plugin_OctreeSceneManager_d"));
+#else
+ app_pak.ogre_root->loadPlugin("RenderSystem_GL");
+ app_pak.ogre_root->loadPlugin("Plugin_OctreeSceneManager");
+#endif;
+
+ Ogre::RenderSystem* rs = app_pak.ogre_root->getRenderSystemByName("OpenGL Rendering Subsystem");
+ if (!(rs->getName() == "OpenGL Rendering Subsystem")){ return; }
+ rs->setConfigOption("Full Screen", "No");
+ rs->setConfigOption("VSync", "No");
+ rs->setConfigOption("Video Mode", "1024 x 768 @ 32-bit");
+ app_pak.ogre_root->setRenderSystem(rs);
+
+ app_pak.ogre_win = app_pak.ogre_root->initialise(true, "Clean CEGUI Window");
+
+ Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5);
+ Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
+
+ //---------[ CEGUI works fine without these, but the black background does not redraw. ]---------//
+ // --- Ogre Scene Manager --- //
+ Ogre::SceneManager *scene_man = app_pak.ogre_root->createSceneManager("OctreeSceneManager", "DefaultSceneManager");
+
+ // --- Camera --- //
+ Ogre::Camera *main_cam = scene_man->createCamera("MainCam");
+ main_cam->setPosition(Ogre::Vector3(40, 20, 80));
+ main_cam->lookAt(Ogre::Vector3(0, 0, 0));
+ main_cam->setNearClipDistance(5);
+
+ // --- Viewport --- //
+ Ogre::Viewport* vp = app_pak.ogre_win->addViewport(main_cam);
+ vp->setBackgroundColour(Ogre::ColourValue(17.f / 255.f, 17.f / 255.f, 17.f / 255.f));
+ main_cam->setAspectRatio(Ogre::Real(vp->getActualWidth()) / Ogre::Real(vp->getActualHeight()));
+ //----------------------------------------------[|]----------------------------------------------//
+
+ // --- Init OIS --- //
+ Ogre::LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");
+ size_t windowHnd = 0;
+ std::ostringstream windowHndStr;
+ app_pak.ogre_win->getCustomAttribute("WINDOW", &windowHnd);
+ windowHndStr << windowHnd;
+ app_pak.ois_pl = new OIS::ParamList();
+ app_pak.ois_pl->insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
+
+ // --- Init CEGUI --- //
+ Ogre::LogManager::getSingletonPtr()->logMessage("*** Initializing CEGUI ***");
+ app_pak.cegui_renderer = &CEGUI::OgreRenderer::bootstrapSystem();
+ CEGUI::System::getSingleton().notifyDisplaySizeChanged(CEGUI::Sizef(1024.f, 768.f));
+ CEGUI::Logger::getSingleton().setLoggingLevel(CEGUI::Informative);
+
+ // setup CEGUI default resource groups
+ CEGUI::ImageManager::setImagesetDefaultResourceGroup("imagesets");
+ CEGUI::Scheme::setDefaultResourceGroup("schemes");
+ CEGUI::Font::setDefaultResourceGroup("fonts");
+ CEGUI::WidgetLookManager::setDefaultResourceGroup("looknfeel");
+ CEGUI::WindowManager::setDefaultResourceGroup("layouts");
+ CEGUI::ScriptModule::setDefaultResourceGroup("lua_scripts");
+
+ // --- Init Ogre/OIS Listeners --- //
+ app_listener = new AppListener(&app_pak);
+ app_pak.ogre_root->addFrameListener(app_listener);
+ Ogre::WindowEventUtilities::addWindowEventListener(app_pak.ogre_win, app_listener);
+
+ }
+ void Shutdown(){
+ // --- Shutdown Ogre, OIS, and CEGUI --- //
+ app_pak.ogre_root->getAutoCreatedWindow()->removeAllViewports();
+ Ogre::WindowEventUtilities::removeWindowEventListener(app_pak.ogre_win, app_listener);
+ app_listener->windowClosed(app_pak.ogre_win);
+ app_pak.ogre_root->removeFrameListener( app_listener );
+ delete app_listener;
+
+ delete app_pak.ogre_root;
+ delete app_pak.ois_pl;
+ }
+ void CreateGUIContext(){
+ // --- Create resources we need --- //
+ CEGUI::SchemeManager::getSingleton().createFromFile("VanillaSkin.scheme");
+ CEGUI::SchemeManager::getSingleton().createFromFile("AlfiskoSkin.scheme");
+ CEGUI::FontManager::getSingleton().createFromFile("DejaVuSans-12.font");
+
+ // --- Create our GUIContext and set its defaults --- //
+ CEGUI::System::getSingleton().createGUIContext(app_pak.cegui_renderer->getDefaultRenderTarget());
+ CEGUI::System::getSingleton().getDefaultGUIContext().setDefaultFont("DejaVuSans-12");
+ CEGUI::System::getSingleton().getDefaultGUIContext().getMouseCursor().setDefaultImage("Vanilla-Images/MouseArrow");
+ //CEGUI::System::getSingleton().getDefaultGUIContext().getMouseCursor().show(); // Only important to bring cursor back from hide()
+ }
+ void CreateGUIRootWindow(){
+ ui_root_win = CEGUI::WindowManager::getSingleton().loadLayoutFromFile("application_templates.layout");
+ CEGUI::System::getSingleton().getDefaultGUIContext().setRootWindow(ui_root_win);
+ }
+ void DestroyGUIRootWindow(){
+ CEGUI::WindowManager::getSingleton().destroyWindow(ui_root_win);
+ }
+
+ AppPak app_pak;
+ AppListener *app_listener;
+
+ CEGUI::Window *ui_root_win;
+};
+
+//-------------------------------------------------------------------[ Init ]---//
+std::wstring s2ws(const std::string& s){
+ int len;
+ int slength = (int)s.length() + 1;
+ len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
+ wchar_t* buf = new wchar_t[len];
+ MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
+ std::wstring r(buf);
+ delete[] buf;
+ return r;
+}
+
+#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
+INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT){
+#else
+int main(int argc, char *argv[]){
+#endif
+ App my_app;
+
+ try {
+ my_app.go();
+ }
+ catch (Ogre::Exception& e){
+#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
+ std::wstring stemp1 = s2ws("Stoopid Ogre exception has occurred!");
+ std::wstring stemp2 = s2ws(e.getFullDescription().c_str());
+
+ LPCWSTR title = stemp1.c_str();
+ LPCWSTR error_desc = stemp2.c_str();
+ MessageBox(NULL, error_desc, title, MB_OK | MB_ICONERROR | MB_TASKMODAL);
+#else
+ std::cerr << "Stoopid Ogre exception has occurred: " << e.getFullDescription().c_str() << std::endl;
+#endif
+ }
+
+ return 0;
+}
\ No newline at end of file
diff --git a/application_templates/SDL2.cpp b/application_templates/SDL2.cpp
new file mode 100644
index 000000000..85c793c8e
--- /dev/null
+++ b/application_templates/SDL2.cpp
@@ -0,0 +1,337 @@
+/***********************************************************************
+created: Sep 11 2014
+author: Luca Ebach
+*************************************************************************/
+/***************************************************************************
+* Copyright (C) 2004 - 2015 Paul D Turner & The CEGUI Development Team
+*
+* 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 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.
+***************************************************************************/
+
+/**************************************************************************
+* The following libs (and corresponding headers) are needed to compile and to link:
+* CEGUIBase
+* CEGUIOpenGLRenderer
+* CEGUICoreWindowRendererSet
+* default CEGUI xml parser (and dependencies)
+* SDL2main (windows only)
+* SDL2
+* OpengGL
+* glm headers (as part of CEGUIBase)
+***************************************************************************/
+
+#include
+
+#include
+#include
+
+#include
+#include
+
+#include "sdl_scancode_to_dinput_mappings.h"
+
+static SDL_Window* window;
+static SDL_GLContext context;
+
+CEGUI::Key::Scan toCEGUIKey(SDL_Scancode key)
+{
+ return static_cast(scanCodeToKeyNum[static_cast(key)]);
+}
+
+void injectUTF8Text(const char* utf8str)
+{
+ static SDL_iconv_t cd = SDL_iconv_t(-1);
+
+ if (cd == SDL_iconv_t(-1))
+ {
+ // note: just "UTF-32" doesn't work as toFormat, because then you get BOMs, which we don't want.
+ const char* toFormat = "UTF-32LE"; // TODO: what does CEGUI expect on big endian machines?
+ cd = SDL_iconv_open(toFormat, "UTF-8");
+ if (cd == SDL_iconv_t(-1))
+ {
+ std::cerr << "Couldn't initialize SDL_iconv for UTF-8 to UTF-32!" << std::endl;
+ return;
+ }
+ }
+
+ // utf8str has at most SDL_TEXTINPUTEVENT_TEXT_SIZE (32) chars,
+ // so we won't have have more utf32 chars than that
+ Uint32 utf32buf[SDL_TEXTINPUTEVENT_TEXT_SIZE] = {0};
+
+ // we'll convert utf8str to a utf32 string, saved in utf32buf.
+ // the utf32 chars will be injected into cegui
+
+ size_t len = strlen(utf8str);
+
+ size_t inbytesleft = len;
+ size_t outbytesleft = 4 * SDL_TEXTINPUTEVENT_TEXT_SIZE; // *4 because utf-32 needs 4x as much space as utf-8
+ char* outbuf = (char*)utf32buf;
+ size_t n = SDL_iconv(cd, &utf8str, &inbytesleft, &outbuf, &outbytesleft);
+
+ if (n == size_t(-1)) // some error occured during iconv
+ {
+ std::cerr << "Converting UTF-8 string " << utf8str << " from SDL_TEXTINPUT to UTF-32 failed!" << std::endl;
+ }
+
+ for (int i = 0; i < SDL_TEXTINPUTEVENT_TEXT_SIZE; ++i)
+ {
+ if (utf32buf[i] == 0)
+ break; // end of string
+
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectChar(utf32buf[i]);
+ }
+
+ // reset cd so it can be used again
+ SDL_iconv(cd, NULL, &inbytesleft, NULL, &outbytesleft);
+}
+
+void initSDL()
+{
+ // init everything from SDL
+ if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
+ {
+ std::cerr << "SDL could not be initialized!" << std::endl
+ << "Error message: " << SDL_GetError() << std::endl;
+ exit(1);
+ }
+
+ // create opengl window with size of 800x600px
+ window = SDL_CreateWindow("CEGUI + SDL2 window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
+ 800, 600, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
+ if (!window)
+ {
+ std::cerr << "Could not create SDL window: " << SDL_GetError() << std::endl;
+ SDL_Quit();
+ exit(1);
+ }
+
+ // disable native mouse cursor
+ SDL_ShowCursor(0);
+
+ // setup opengl rendering context
+ context = SDL_GL_CreateContext(window);
+}
+
+void initCEGUI()
+{
+ using namespace CEGUI;
+
+ // create renderer and enable extra states
+ OpenGLRenderer& cegui_renderer = OpenGLRenderer::create(Sizef(800.f, 600.f));
+ cegui_renderer.enableExtraStateSettings(true);
+
+ // create CEGUI system object
+ System::create(cegui_renderer);
+
+ // setup resource directories
+ DefaultResourceProvider* rp = static_cast(System::getSingleton().getResourceProvider());
+ rp->setResourceGroupDirectory("schemes", "datafiles/schemes/");
+ rp->setResourceGroupDirectory("imagesets", "datafiles/imagesets/");
+ rp->setResourceGroupDirectory("fonts", "datafiles/fonts/");
+ rp->setResourceGroupDirectory("layouts", "datafiles/layouts/");
+ rp->setResourceGroupDirectory("looknfeels", "datafiles/looknfeel/");
+ rp->setResourceGroupDirectory("lua_scripts", "datafiles/lua_scripts/");
+ rp->setResourceGroupDirectory("schemas", "datafiles/xml_schemas/");
+
+ // set default resource groups
+ ImageManager::setImagesetDefaultResourceGroup("imagesets");
+ Font::setDefaultResourceGroup("fonts");
+ Scheme::setDefaultResourceGroup("schemes");
+ WidgetLookManager::setDefaultResourceGroup("looknfeels");
+ WindowManager::setDefaultResourceGroup("layouts");
+ ScriptModule::setDefaultResourceGroup("lua_scripts");
+
+ XMLParser* parser = System::getSingleton().getXMLParser();
+ if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))
+ parser->setProperty("SchemaDefaultResourceGroup", "schemas");
+
+ // load TaharezLook scheme and DejaVuSans-10 font
+ SchemeManager::getSingleton().createFromFile("TaharezLook.scheme", "schemes");
+ FontManager::getSingleton().createFromFile("DejaVuSans-10.font");
+
+ // set default font and cursor image and tooltip type
+ System::getSingleton().getDefaultGUIContext().setDefaultFont("DejaVuSans-10");
+ System::getSingleton().getDefaultGUIContext().getMouseCursor().setDefaultImage("TaharezLook/MouseArrow");
+ System::getSingleton().getDefaultGUIContext().setDefaultTooltipType("TaharezLook/Tooltip");
+}
+
+void initWindows()
+{
+ using namespace CEGUI;
+
+ /////////////////////////////////////////////////////////////
+ // Add your gui initialisation code in here.
+ // You can use the following code as an inspiration for
+ // creating your own windows.
+ // But you should preferably use layout loading because you won't
+ // have to recompile everytime you change the layout.
+ /////////////////////////////////////////////////////////////
+
+ // load layout
+ Window* root = WindowManager::getSingleton().loadLayoutFromFile("application_templates.layout");
+ System::getSingleton().getDefaultGUIContext().setRootWindow(root);
+}
+
+// convert SDL mouse button to CEGUI mouse button
+CEGUI::MouseButton SDLtoCEGUIMouseButton(const Uint8& button)
+{
+ using namespace CEGUI;
+
+ switch (button)
+ {
+ case SDL_BUTTON_LEFT:
+ return LeftButton;
+
+ case SDL_BUTTON_MIDDLE:
+ return MiddleButton;
+
+ case SDL_BUTTON_RIGHT:
+ return RightButton;
+
+ case SDL_BUTTON_X1:
+ return X1Button;
+
+ case SDL_BUTTON_X2:
+ return X2Button;
+
+ default:
+ return NoButton;
+ }
+}
+
+int main(int /*argc*/, char* /*argv*/[])
+{
+ using namespace CEGUI;
+
+ // init SDL
+ initSDL();
+
+ // init cegui
+ initCEGUI();
+
+ // notify system of the window size
+ System::getSingleton().notifyDisplaySizeChanged(Sizef(800.f, 600.f));
+
+ // initialise windows and setup layout
+ initWindows();
+
+ // set gl clear color
+ glClearColor(0, 0, 0, 255);
+
+ bool quit = false;
+ SDL_Event event;
+ float time = SDL_GetTicks() / 1000.f;
+
+ OpenGLRenderer* renderer = static_cast(System::getSingleton().getRenderer());
+
+ // repeat until a quit is requested
+ while (!quit && !SDL_QuitRequested())
+ {
+ // query and process events
+ while (SDL_PollEvent(&event))
+ {
+ switch (event.type)
+ {
+ case SDL_QUIT:
+ quit = true;
+ break;
+
+ case SDL_MOUSEMOTION:
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMousePosition(static_cast(event.motion.x),
+ static_cast(event.motion.y));
+ break;
+
+ case SDL_MOUSEBUTTONDOWN:
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonDown(SDLtoCEGUIMouseButton(event.button.button));
+ break;
+
+ case SDL_MOUSEBUTTONUP:
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonUp(SDLtoCEGUIMouseButton(event.button.button));
+ break;
+
+ case SDL_MOUSEWHEEL:
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseWheelChange(static_cast(event.wheel.y));
+ break;
+
+ case SDL_KEYDOWN:
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectKeyDown(toCEGUIKey(event.key.keysym.scancode));
+ break;
+
+ case SDL_KEYUP:
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectKeyUp(toCEGUIKey(event.key.keysym.scancode));
+ break;
+
+ case SDL_TEXTINPUT:
+ injectUTF8Text(event.text.text);
+ break;
+
+ case SDL_WINDOWEVENT:
+ if (event.window.event == SDL_WINDOWEVENT_RESIZED)
+ {
+ System::getSingleton().notifyDisplaySizeChanged(Sizef(static_cast(event.window.data1),
+ static_cast(event.window.data2)));
+ glViewport(0, 0, event.window.data1, event.window.data2);
+ }
+ else if (event.window.event == SDL_WINDOWEVENT_LEAVE)
+ {
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseLeaves();
+ }
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ // inject time pulses
+ const float newtime = SDL_GetTicks() / 1000.f;
+ const float time_elapsed = newtime - time;
+ System::getSingleton().injectTimePulse(time_elapsed);
+ System::getSingleton().getDefaultGUIContext().injectTimePulse(time_elapsed);
+ time = newtime;
+
+ // render gui
+ renderer->beginRendering();
+ System::getSingleton().renderAllGUIContexts();
+ renderer->endRendering();
+
+ // swap buffers
+ SDL_GL_SwapWindow(window);
+ }
+
+ // destroy system and renderer
+ System::destroy();
+ OpenGLRenderer::destroy(*renderer);
+ renderer = 0;
+
+ // delete SDL GL context
+ SDL_GL_DeleteContext(context);
+
+ // destroy SDL window
+ SDL_DestroyWindow(window);
+
+ // cleanup SDL
+ SDL_Quit();
+
+ return 0;
+}
diff --git a/application_templates/glfw3.cpp b/application_templates/glfw3.cpp
new file mode 100644
index 000000000..39c1c37e9
--- /dev/null
+++ b/application_templates/glfw3.cpp
@@ -0,0 +1,366 @@
+/***********************************************************************
+created: Sep 15 2014
+author: Luca Ebach
+*************************************************************************/
+/***************************************************************************
+* Copyright (C) 2004 - 2015 Paul D Turner & The CEGUI Development Team
+*
+* 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 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.
+***************************************************************************/
+
+/**************************************************************************
+* The following libs (and corresponding headers) are needed to compile and to link:
+* CEGUIBase
+* CEGUIOpenGLRenderer
+* CEGUICoreWindowRendererSet
+* default CEGUI xml parser (and dependencies)
+* GLFW3
+* OpengGL
+* glm headers (as part of CEGUIBase)
+***************************************************************************/
+
+#include
+
+#include
+#include
+
+#include
+
+static GLFWwindow* window;
+
+CEGUI::MouseButton toCEGUIButton(int button)
+{
+ switch (button)
+ {
+ case GLFW_MOUSE_BUTTON_LEFT:
+ return CEGUI::LeftButton;
+
+ case GLFW_MOUSE_BUTTON_MIDDLE:
+ return CEGUI::MiddleButton;
+
+ case GLFW_MOUSE_BUTTON_RIGHT:
+ return CEGUI::RightButton;
+
+ default:
+ return CEGUI::MouseButtonCount;
+ }
+}
+
+CEGUI::Key::Scan toCEGUIKey(int glfwKey)
+{
+ switch (glfwKey)
+ {
+ case GLFW_KEY_ESCAPE: return CEGUI::Key::Escape;
+ case GLFW_KEY_F1: return CEGUI::Key::F1;
+ case GLFW_KEY_F2: return CEGUI::Key::F2;
+ case GLFW_KEY_F3: return CEGUI::Key::F3;
+ case GLFW_KEY_F4: return CEGUI::Key::F4;
+ case GLFW_KEY_F5: return CEGUI::Key::F5;
+ case GLFW_KEY_F6: return CEGUI::Key::F6;
+ case GLFW_KEY_F7: return CEGUI::Key::F7;
+ case GLFW_KEY_F8: return CEGUI::Key::F8;
+ case GLFW_KEY_F9: return CEGUI::Key::F9;
+ case GLFW_KEY_F10: return CEGUI::Key::F10;
+ case GLFW_KEY_F11: return CEGUI::Key::F11;
+ case GLFW_KEY_F12: return CEGUI::Key::F12;
+ case GLFW_KEY_F13: return CEGUI::Key::F13;
+ case GLFW_KEY_F14: return CEGUI::Key::F14;
+ case GLFW_KEY_F15: return CEGUI::Key::F15;
+ case GLFW_KEY_UP: return CEGUI::Key::ArrowUp;
+ case GLFW_KEY_DOWN: return CEGUI::Key::ArrowDown;
+ case GLFW_KEY_LEFT: return CEGUI::Key::ArrowLeft;
+ case GLFW_KEY_RIGHT: return CEGUI::Key::ArrowRight;
+ case GLFW_KEY_LEFT_SHIFT: return CEGUI::Key::LeftShift;
+ case GLFW_KEY_RIGHT_SHIFT: return CEGUI::Key::RightShift;
+ case GLFW_KEY_LEFT_CONTROL: return CEGUI::Key::LeftControl;
+ case GLFW_KEY_RIGHT_CONTROL: return CEGUI::Key::RightControl;
+ case GLFW_KEY_LEFT_ALT: return CEGUI::Key::LeftAlt;
+ case GLFW_KEY_RIGHT_ALT: return CEGUI::Key::RightAlt;
+ case GLFW_KEY_TAB: return CEGUI::Key::Tab;
+ case GLFW_KEY_ENTER: return CEGUI::Key::Return;
+ case GLFW_KEY_BACKSPACE: return CEGUI::Key::Backspace;
+ case GLFW_KEY_INSERT: return CEGUI::Key::Insert;
+ case GLFW_KEY_DELETE: return CEGUI::Key::Delete;
+ case GLFW_KEY_PAGE_UP: return CEGUI::Key::PageUp;
+ case GLFW_KEY_PAGE_DOWN: return CEGUI::Key::PageDown;
+ case GLFW_KEY_HOME: return CEGUI::Key::Home;
+ case GLFW_KEY_END: return CEGUI::Key::End;
+ case GLFW_KEY_KP_ENTER: return CEGUI::Key::NumpadEnter;
+ case GLFW_KEY_SPACE: return CEGUI::Key::Space;
+ case 'A': return CEGUI::Key::A;
+ case 'B': return CEGUI::Key::B;
+ case 'C': return CEGUI::Key::C;
+ case 'D': return CEGUI::Key::D;
+ case 'E': return CEGUI::Key::E;
+ case 'F': return CEGUI::Key::F;
+ case 'G': return CEGUI::Key::G;
+ case 'H': return CEGUI::Key::H;
+ case 'I': return CEGUI::Key::I;
+ case 'J': return CEGUI::Key::J;
+ case 'K': return CEGUI::Key::K;
+ case 'L': return CEGUI::Key::L;
+ case 'M': return CEGUI::Key::M;
+ case 'N': return CEGUI::Key::N;
+ case 'O': return CEGUI::Key::O;
+ case 'P': return CEGUI::Key::P;
+ case 'Q': return CEGUI::Key::Q;
+ case 'R': return CEGUI::Key::R;
+ case 'S': return CEGUI::Key::S;
+ case 'T': return CEGUI::Key::T;
+ case 'U': return CEGUI::Key::U;
+ case 'V': return CEGUI::Key::V;
+ case 'W': return CEGUI::Key::W;
+ case 'X': return CEGUI::Key::X;
+ case 'Y': return CEGUI::Key::Y;
+ case 'Z': return CEGUI::Key::Z;
+ default: return CEGUI::Key::Unknown;
+ }
+}
+
+void charCallback(GLFWwindow*, unsigned int char_pressed)
+{
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectChar(char_pressed);
+}
+
+void cursorPosCallback(GLFWwindow*, double x, double y)
+{
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMousePosition(x, y);
+}
+
+void keyCallback(GLFWwindow*, int key, int /*scan*/, int action, int /*mod*/)
+{
+ CEGUI::Key::Scan cegui_key = toCEGUIKey(key);
+ if (action == GLFW_PRESS)
+ {
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectKeyDown(cegui_key);
+ }
+ else
+ {
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectKeyUp(cegui_key);
+ }
+}
+
+void mouseButtonCallback(GLFWwindow*, int button, int state, int /*mod*/)
+{
+ if (state == GLFW_PRESS)
+ {
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonDown(toCEGUIButton(button));
+ }
+ else
+ {
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseButtonUp(toCEGUIButton(button));
+ }
+}
+
+void mouseWheelCallback(GLFWwindow*, double /*x*/, double y)
+{
+ if (y < 0.f)
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseWheelChange(-1.f);
+ else
+ CEGUI::System::getSingleton().getDefaultGUIContext().injectMouseWheelChange(+1.f);
+}
+
+void windowResizedCallback(GLFWwindow*, int width, int height)
+{
+ CEGUI::System::getSingleton().notifyDisplaySizeChanged(
+ CEGUI::Sizef(static_cast(width), static_cast(height)));
+ glViewport(0, 0, width, height);
+}
+
+void errorCallback(int /*error*/, const char* message)
+{
+ CEGUI::Logger::getSingleton().logEvent(message, CEGUI::Errors);
+}
+
+void setupCallbacks()
+{
+ // input callbacks
+ glfwSetCharCallback(window, charCallback);
+ glfwSetCursorPosCallback(window, cursorPosCallback);
+ glfwSetKeyCallback(window, keyCallback);
+ glfwSetMouseButtonCallback(window, mouseButtonCallback);
+ glfwSetScrollCallback(window, mouseWheelCallback);
+
+ // window callback
+ glfwSetWindowSizeCallback(window, windowResizedCallback);
+
+ // error callback
+ glfwSetErrorCallback(errorCallback);
+}
+
+void initGLFW()
+{
+ // init everything from glfw
+ if (glfwInit() != GL_TRUE)
+ {
+ std::cerr << "glfw could not be initialized!" << std::endl;
+ exit(1);
+ }
+
+ // create glfw window with size of 800x600px
+ window = glfwCreateWindow(800, 600, "CEGUI + glfw3 window", NULL, NULL);
+ if (!window)
+ {
+ std::cerr << "Could not create glfw window!" << std::endl;
+ glfwTerminate();
+ exit(1);
+ }
+
+ // makes this window's gl context the current one
+ glfwMakeContextCurrent(window);
+
+ // hide native mouse cursor when it is over the window
+ glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
+
+ // disable VSYNC
+ glfwSwapInterval(0);
+
+ // clear error messages
+ glGetError();
+}
+
+void initCEGUI()
+{
+ using namespace CEGUI;
+
+ // create renderer and enable extra states
+ OpenGLRenderer& cegui_renderer = OpenGLRenderer::create(Sizef(800.f, 600.f));
+ cegui_renderer.enableExtraStateSettings(true);
+
+ // create CEGUI system object
+ CEGUI::System::create(cegui_renderer);
+
+ // setup resource directories
+ DefaultResourceProvider* rp = static_cast(System::getSingleton().getResourceProvider());
+ rp->setResourceGroupDirectory("schemes", "datafiles/schemes/");
+ rp->setResourceGroupDirectory("imagesets", "datafiles/imagesets/");
+ rp->setResourceGroupDirectory("fonts", "datafiles/fonts/");
+ rp->setResourceGroupDirectory("layouts", "datafiles/layouts/");
+ rp->setResourceGroupDirectory("looknfeels", "datafiles/looknfeel/");
+ rp->setResourceGroupDirectory("lua_scripts", "datafiles/lua_scripts/");
+ rp->setResourceGroupDirectory("schemas", "datafiles/xml_schemas/");
+
+ // set default resource groups
+ ImageManager::setImagesetDefaultResourceGroup("imagesets");
+ Font::setDefaultResourceGroup("fonts");
+ Scheme::setDefaultResourceGroup("schemes");
+ WidgetLookManager::setDefaultResourceGroup("looknfeels");
+ WindowManager::setDefaultResourceGroup("layouts");
+ ScriptModule::setDefaultResourceGroup("lua_scripts");
+
+ XMLParser* parser = System::getSingleton().getXMLParser();
+ if (parser->isPropertyPresent("SchemaDefaultResourceGroup"))
+ parser->setProperty("SchemaDefaultResourceGroup", "schemas");
+
+ // load TaharezLook scheme and DejaVuSans-10 font
+ SchemeManager::getSingleton().createFromFile("TaharezLook.scheme", "schemes");
+ FontManager::getSingleton().createFromFile("DejaVuSans-10.font");
+
+ // set default font and cursor image and tooltip type
+ System::getSingleton().getDefaultGUIContext().setDefaultFont("DejaVuSans-10");
+ System::getSingleton().getDefaultGUIContext().getMouseCursor().setDefaultImage("TaharezLook/MouseArrow");
+ System::getSingleton().getDefaultGUIContext().setDefaultTooltipType("TaharezLook/Tooltip");
+}
+
+void initWindows()
+{
+ using namespace CEGUI;
+
+ /////////////////////////////////////////////////////////////
+ // Add your gui initialisation code in here.
+ // You should preferably use layout loading because you won't
+ // have to recompile everytime you change the layout. But you
+ // can also use static window creation code here, of course.
+ /////////////////////////////////////////////////////////////
+
+ // load layout
+ Window* root = WindowManager::getSingleton().loadLayoutFromFile("application_templates.layout");
+ System::getSingleton().getDefaultGUIContext().setRootWindow(root);
+}
+
+#ifdef _MSC_VER
+int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
+#else
+int main()
+#endif
+{
+ using namespace CEGUI;
+
+ // init glfw
+ initGLFW();
+
+ // init cegui
+ initCEGUI();
+
+ // setup glfw callbacks
+ setupCallbacks();
+
+ // notify system of the window size
+ System::getSingleton().notifyDisplaySizeChanged(Sizef(800.f, 600.f));
+ glViewport(0, 0, 800, 600);
+
+ // initialise windows and setup layout
+ initWindows();
+
+ // set gl clear color
+ glClearColor(0, 0, 0, 255);
+
+ float time = glfwGetTime();
+
+ OpenGLRenderer* renderer = static_cast(System::getSingleton().getRenderer());
+
+ // repeat until a quit is requested
+ while (glfwWindowShouldClose(window) == GL_FALSE)
+ {
+ // clear screen
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ // inject time pulses
+ const float newtime = glfwGetTime();
+ const float time_elapsed = newtime - time;
+ System::getSingleton().injectTimePulse(time_elapsed);
+ System::getSingleton().getDefaultGUIContext().injectTimePulse(time_elapsed);
+ time = newtime;
+
+ // render gui
+ renderer->beginRendering();
+ System::getSingleton().renderAllGUIContexts();
+ renderer->endRendering();
+
+ // swap buffers
+ glfwSwapBuffers(window);
+
+ // poll events
+ glfwPollEvents();
+ }
+
+ // destroy system and renderer
+ System::destroy();
+ OpenGLRenderer::destroy(*renderer);
+ renderer = 0;
+
+ // destroy glfw window
+ glfwDestroyWindow(window);
+
+ // cleanup glfw
+ glfwTerminate();
+
+ return 0;
+}
diff --git a/application_templates/sdl_scancode_to_dinput_mappings.h b/application_templates/sdl_scancode_to_dinput_mappings.h
new file mode 100644
index 000000000..d8d2d24fc
--- /dev/null
+++ b/application_templates/sdl_scancode_to_dinput_mappings.h
@@ -0,0 +1,361 @@
+/*
+ * Maps SDL2 scancodes to directinput keynums/scancodes.
+ * Useful if you're porting a game that uses dinput scancodes internally
+ * (for key bindings etc) or any other lib (like CEGUI) that uses them.
+ *
+ * (C) 2015 Daniel Gibson, do whatever you want with this.
+ *
+ * No warranty is offered or implied; use this code at your own risk.
+ *
+ * Released to the Public Domain, do whatever you want with this: use it,
+ * modify it, copy it into your own code, ...
+ * No need to mention me or this "license" in your code or docs, even though
+ * it would be appreciated, of course.
+ */
+
+
+#ifndef _SDL2_SCANCODE_TO_DINPUT_MAPPINGS_H_
+#define _SDL2_SCANCODE_TO_DINPUT_MAPPINGS_H_
+
+ // TODO: map the following keys, if possible:
+ // #define DIK_UNDERLINE 0x93 /* (NEC PC98) */
+ // #define DIK_KANJI 0x94 /* (Japanese keyboard) */
+ // #define DIK_AX 0x96 /* (Japan AX) */
+ // #define DIK_UNLABELED 0x97 /* (J3100) */
+ //
+ // #define DIK_WAKE 0xE3 /* System Wake */
+ //
+ // (#define DIK_ABNT_C2 0x7E /* Numpad . on Brazilian keyboard */ - system should map this to KP_COMMA or something,
+ // according to USB doc, so probably it doesn't need mapping here)
+
+// maps SDL2 scancodes to directinput keynums/scancodes - dinput_key = scanCodeToKeyNum[(int)your_sdl2_scancode];
+static int scanCodeToKeyNum[SDL_NUM_SCANCODES] = {
+ 0x0, // SDL_SCANCODE_UNKNOWN = 0, => 0 should also work for dinput codes as "not assigned/unknown"
+ 0x0, // // 1 (unused)
+ 0x0, // // 2 (unused)
+ 0x0, // // 3 (unused)
+ 0x1E, // SDL_SCANCODE_A = 4, - DIK_A
+ 0x30, // SDL_SCANCODE_B = 5, - DIK_B
+ 0x2E, // SDL_SCANCODE_C = 6, - DIK_C
+ 0x20, // SDL_SCANCODE_D = 7, - DIK_D
+ 0x12, // SDL_SCANCODE_E = 8, - DIK_E
+ 0x21, // SDL_SCANCODE_F = 9, - DIK_F
+ 0x22, // SDL_SCANCODE_G = 10, - DIK_G
+ 0x23, // SDL_SCANCODE_H = 11, - DIK_H
+ 0x17, // SDL_SCANCODE_I = 12, - DIK_I
+ 0x24, // SDL_SCANCODE_J = 13, - DIK_J
+ 0x25, // SDL_SCANCODE_K = 14, - DIK_K
+ 0x26, // SDL_SCANCODE_L = 15, - DIK_L
+ 0x32, // SDL_SCANCODE_M = 16, - DIK_M
+ 0x31, // SDL_SCANCODE_N = 17, - DIK_N
+ 0x18, // SDL_SCANCODE_O = 18, - DIK_O
+ 0x19, // SDL_SCANCODE_P = 19, - DIK_P
+ 0x10, // SDL_SCANCODE_Q = 20, - DIK_Q
+ 0x13, // SDL_SCANCODE_R = 21, - DIK_R
+ 0x1F, // SDL_SCANCODE_S = 22, - DIK_S
+ 0x14, // SDL_SCANCODE_T = 23, - DIK_T
+ 0x16, // SDL_SCANCODE_U = 24, - DIK_U
+ 0x2F, // SDL_SCANCODE_V = 25, - DIK_V
+ 0x11, // SDL_SCANCODE_W = 26, - DIK_W
+ 0x2D, // SDL_SCANCODE_X = 27, - DIK_X
+ 0x15, // SDL_SCANCODE_Y = 28, - DIK_Y
+ 0x2C, // SDL_SCANCODE_Z = 29, - DIK_Z
+
+ 0x02, // SDL_SCANCODE_1 = 30, - DIK_1
+ 0x03, // SDL_SCANCODE_2 = 31, - DIK_2
+ 0x04, // SDL_SCANCODE_3 = 32, - DIK_3
+ 0x05, // SDL_SCANCODE_4 = 33, - DIK_4
+ 0x06, // SDL_SCANCODE_5 = 34, - DIK_5
+ 0x07, // SDL_SCANCODE_6 = 35, - DIK_6
+ 0x08, // SDL_SCANCODE_7 = 36, - DIK_7
+ 0x09, // SDL_SCANCODE_8 = 37, - DIK_8
+ 0x0A, // SDL_SCANCODE_9 = 38, - DIK_9
+ 0x0B, // SDL_SCANCODE_0 = 39, - DIK_0
+
+ 0x1C, // SDL_SCANCODE_RETURN = 40, - DIK_RETURN
+ 0x01, // SDL_SCANCODE_ESCAPE = 41, - DIK_ESCAPE
+ 0x0E, // SDL_SCANCODE_BACKSPACE = 42, - DIK_BACK
+ 0x0F, // SDL_SCANCODE_TAB = 43, - DIK_TAB
+ 0x39, // SDL_SCANCODE_SPACE = 44, - DIK_SPACE
+
+ 0x0C, // SDL_SCANCODE_MINUS = 45, - DIK_MINUS
+ 0x0D, // SDL_SCANCODE_EQUALS = 46, - DIK_EQUALS
+ 0x1A, // SDL_SCANCODE_LEFTBRACKET = 47, - DIK_LBRACKET
+ 0x1B, // SDL_SCANCODE_RIGHTBRACKET = 48, - DIK_RBRACKET
+ 0x2B, // SDL_SCANCODE_BACKSLASH = 49, // next to enter, US: [\|] DE: [#'] UK: [#~] - DIK_BACKSLASH
+ 0x2B, // SDL_SCANCODE_NONUSHASH = 50, // same key as before actually on some layouts, systems should map this to SDL_SCANCODE_BACKSLASH - DIK_BACKSLASH
+ 0x27, // SDL_SCANCODE_SEMICOLON = 51, - DIK_SEMICOLON
+ 0x28, // SDL_SCANCODE_APOSTROPHE = 52, - DIK_APOSTROPHE
+ 0x29, // SDL_SCANCODE_GRAVE = 53, // "quake/doom3 console key" - DIK_GRAVE
+ 0x33, // SDL_SCANCODE_COMMA = 54, - DIK_COMMA
+ 0x34, // SDL_SCANCODE_PERIOD = 55, - DIK_PERIOD
+ 0x35, // SDL_SCANCODE_SLASH = 56, - DIK_SLASH
+
+ 0x3A, // SDL_SCANCODE_CAPSLOCK = 57, - DIK_CAPITAL
+
+ 0x3B, // SDL_SCANCODE_F1 = 58, - DIK_F1
+ 0x3C, // SDL_SCANCODE_F2 = 59, - DIK_F2
+ 0x3D, // SDL_SCANCODE_F3 = 60, - DIK_F3
+ 0x3E, // SDL_SCANCODE_F4 = 61, - DIK_F4
+ 0x3F, // SDL_SCANCODE_F5 = 62, - DIK_F5
+ 0x40, // SDL_SCANCODE_F6 = 63, - DIK_F6
+ 0x41, // SDL_SCANCODE_F7 = 64, - DIK_F7
+ 0x42, // SDL_SCANCODE_F8 = 65, - DIK_F8
+ 0x43, // SDL_SCANCODE_F9 = 66, - DIK_F9
+ 0x44, // SDL_SCANCODE_F10 = 67, - DIK_F10
+ 0x57, // SDL_SCANCODE_F11 = 68, - DIK_F11
+ 0x58, // SDL_SCANCODE_F12 = 69, - DIK_F12
+
+ 0xB7, // SDL_SCANCODE_PRINTSCREEN = 70, // - DIK_SYSRQ; SDL_SCANCODE_SYSREQ also maps to this!
+
+ 0x46, // SDL_SCANCODE_SCROLLLOCK = 71, - DIK_SCROLL
+ 0xC5, // SDL_SCANCODE_PAUSE = 72, - DIK_PAUSE
+ 0xD2, // SDL_SCANCODE_INSERT = 73, // insert on PC, help on some Mac keyboards (but does send code 73, not 117) - DIK_INSERT
+ 0xC7, // SDL_SCANCODE_HOME = 74, - DIK_HOME
+ 0xC9, // SDL_SCANCODE_PAGEUP = 75, - DIK_PRIOR
+ 0xD3, // SDL_SCANCODE_DELETE = 76, - DIK_DELETE
+ 0xCF, // SDL_SCANCODE_END = 77, - DIK_END
+ 0xD1, // SDL_SCANCODE_PAGEDOWN = 78, - DIK_NEXT
+ 0xCD, // SDL_SCANCODE_RIGHT = 79, - DIK_RIGHT
+ 0xCB, // SDL_SCANCODE_LEFT = 80, - DIK_LEFT
+ 0xD0, // SDL_SCANCODE_DOWN = 81, - DIK_DOWN
+ 0xC8, // SDL_SCANCODE_UP = 82, - DIK_UP
+
+ 0x45, // SDL_SCANCODE_NUMLOCKCLEAR = 83, // num lock on PC, clear on Mac keyboards - DIK_NUMLOCK
+
+ 0xB5, // SDL_SCANCODE_KP_DIVIDE = 84, - DIK_DIVIDE
+ 0x37, // SDL_SCANCODE_KP_MULTIPLY = 85, - DIK_MULTIPLY
+ 0x4A, // SDL_SCANCODE_KP_MINUS = 86, - DIK_SUBTRACT
+ 0x4E, // SDL_SCANCODE_KP_PLUS = 87, - DIK_ADD
+ 0x9C, // SDL_SCANCODE_KP_ENTER = 88, - DIK_NUMPADENTER
+ 0x4F, // SDL_SCANCODE_KP_1 = 89, - DIK_NUMPAD1
+ 0x50, // SDL_SCANCODE_KP_2 = 90, - DIK_NUMPAD2
+ 0x51, // SDL_SCANCODE_KP_3 = 91, - DIK_NUMPAD3
+ 0x4B, // SDL_SCANCODE_KP_4 = 92, - DIK_NUMPAD4
+ 0x4C, // SDL_SCANCODE_KP_5 = 93, - DIK_NUMPAD5
+ 0x4D, // SDL_SCANCODE_KP_6 = 94, - DIK_NUMPAD6
+ 0x47, // SDL_SCANCODE_KP_7 = 95, - DIK_NUMPAD7
+ 0x48, // SDL_SCANCODE_KP_8 = 96, - DIK_NUMPAD8
+ 0x49, // SDL_SCANCODE_KP_9 = 97, - DIK_NUMPAD9
+ 0x52, // SDL_SCANCODE_KP_0 = 98, - DIK_NUMPAD0
+ 0x53, // SDL_SCANCODE_KP_PERIOD = 99, - DIK_DECIMAL
+
+ 0x56, // SDL_SCANCODE_NONUSBACKSLASH = 100, // [<>|] on german keyboard, next to left shift - DIK_OEM_102
+ 0xDD, // SDL_SCANCODE_APPLICATION = 101, // windows contextual menu, compose - DIK_APPS
+ 0xDE, // SDL_SCANCODE_POWER = 102, // should be a status flag, but some mac keyboards have a power key - DIK_POWER
+
+ 0x8D, // SDL_SCANCODE_KP_EQUALS = 103, - DIK_NUMPADEQUALS
+ 0x64, // SDL_SCANCODE_F13 = 104, - DIK_F13
+ 0x65, // SDL_SCANCODE_F14 = 105, - DIK_F14
+ 0x66, // SDL_SCANCODE_F15 = 106, - DIK_F15
+ 0x67, // SDL_SCANCODE_F16 = 107, // TODO: F16 and up don't have DIK_ constants! is this right?
+ 0x68, // SDL_SCANCODE_F17 = 108, // (at least 0x67-0x6F have no DIK_constants at all)
+ 0x69, // SDL_SCANCODE_F18 = 109,
+ 0x6A, // SDL_SCANCODE_F19 = 110,
+ 0x6B, // SDL_SCANCODE_F20 = 111,
+ 0x6C, // SDL_SCANCODE_F21 = 112,
+ 0x6D, // SDL_SCANCODE_F22 = 113,
+ 0x6E, // SDL_SCANCODE_F23 = 114,
+ 0x6F, // SDL_SCANCODE_F24 = 115,
+
+ 0x0, // SDL_SCANCODE_EXECUTE = 116,
+ 0x0, // SDL_SCANCODE_HELP = 117,
+ 0x0, // SDL_SCANCODE_MENU = 118,
+ 0x0, // SDL_SCANCODE_SELECT = 119,
+
+ 0x95, // SDL_SCANCODE_STOP = 120, - DIK_STOP
+
+ 0x0, // SDL_SCANCODE_AGAIN = 121, // redo
+ 0x0, // SDL_SCANCODE_UNDO = 122,
+ 0x0, // SDL_SCANCODE_CUT = 123,
+ 0x0, // SDL_SCANCODE_COPY = 124,
+ 0x0, // SDL_SCANCODE_PASTE = 125,
+ 0x0, // SDL_SCANCODE_FIND = 126,
+ 0x0, // SDL_SCANCODE_MUTE = 127,
+
+ 0xB0, // SDL_SCANCODE_VOLUMEUP = 128, - DIK_VOLUMEUP
+ 0xAE, // SDL_SCANCODE_VOLUMEDOWN = 129, - DIK_VOLUMEDOWN
+
+ // /* not sure whether there's a reason to enable these */
+ 0x0, // /* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */
+ 0x0, // /* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */
+ 0x0, // /* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */
+
+ 0xB3, // SDL_SCANCODE_KP_COMMA = 133, - DIK_NUMPADCOMMA
+
+ 0x0, // SDL_SCANCODE_KP_EQUALSAS400 = 134,
+
+ 0x73, // SDL_SCANCODE_INTERNATIONAL1 = 135, // this is really brazilian / and ? - DIK_ABNT_C1
+ 0x0, // SDL_SCANCODE_INTERNATIONAL2 = 136, // TODO: Hut1_12v2.pdf page 60, footnote 16
+ 0x7D, // SDL_SCANCODE_INTERNATIONAL3 = 137, - DIK_YEN
+ 0x79, // SDL_SCANCODE_INTERNATIONAL4 = 138, // Japan: XFER/"convert kana -> kanji", right of space - DIK_CONVERT
+ 0x7B, // SDL_SCANCODE_INTERNATIONAL5 = 139, // Japan: NFER/"don't convert kana -> kanji", left of space - DIK_NOCONVERT
+ 0x0, // SDL_SCANCODE_INTERNATIONAL6 = 140, // TODO: Hut1_12v2.pdf page 60, footnote 20
+ 0x0, // SDL_SCANCODE_INTERNATIONAL7 = 141, // Toggle Double-Byte/Single-Byte mode.
+ 0x0, // SDL_SCANCODE_INTERNATIONAL8 = 142, // Undefined, available for other Front End Language Processors
+ 0x0, // SDL_SCANCODE_INTERNATIONAL9 = 143, // Undefined, available for other Front End Language Processors
+ 0x0, // SDL_SCANCODE_LANG1 = 144, // Hangul/English toggle (Korea)
+ 0x0, // SDL_SCANCODE_LANG2 = 145, // Hanja conversion (Korea)
+ 0x70, // SDL_SCANCODE_LANG3 = 146, // Katakana (Japan) - DIK_KANA
+ 0x0, // SDL_SCANCODE_LANG4 = 147, // Hiragana (Japan)
+ 0x0, // SDL_SCANCODE_LANG5 = 148, // Zenkaku/Hankaku (Japan)
+ 0x0, // SDL_SCANCODE_LANG6 = 149, // reserved
+ 0x0, // SDL_SCANCODE_LANG7 = 150, // reserved
+ 0x0, // SDL_SCANCODE_LANG8 = 151, // reserved
+ 0x0, // SDL_SCANCODE_LANG9 = 152, // reserved
+
+ 0x0, // SDL_SCANCODE_ALTERASE = 153, // Erase-Eaze
+
+ 0xB7, // SDL_SCANCODE_SYSREQ = 154, - DIK_SYSRQ; SDL_SCANCODE_PRINTSCREEN also maps to this!
+
+ 0x0, // SDL_SCANCODE_CANCEL = 155,
+ 0x0, // SDL_SCANCODE_CLEAR = 156,
+ 0x0, // SDL_SCANCODE_PRIOR = 157,
+ 0x0, // SDL_SCANCODE_RETURN2 = 158,
+ 0x0, // SDL_SCANCODE_SEPARATOR = 159,
+ 0x0, // SDL_SCANCODE_OUT = 160,
+ 0x0, // SDL_SCANCODE_OPER = 161,
+ 0x0, // SDL_SCANCODE_CLEARAGAIN = 162,
+ 0x0, // SDL_SCANCODE_CRSEL = 163,
+ 0x0, // SDL_SCANCODE_EXSEL = 164,
+
+ 0x0, // 165 (unused)
+ 0x0, // 166 (unused)
+ 0x0, // 167 (unused)
+ 0x0, // 168 (unused)
+ 0x0, // 169 (unused)
+ 0x0, // 170 (unused)
+ 0x0, // 171 (unused)
+ 0x0, // 172 (unused)
+ 0x0, // 173 (unused)
+ 0x0, // 174 (unused)
+ 0x0, // 175 (unused)
+
+ 0x0, // SDL_SCANCODE_KP_00 = 176,
+ 0x0, // SDL_SCANCODE_KP_000 = 177,
+ 0x0, // SDL_SCANCODE_THOUSANDSSEPARATOR = 178,
+ 0x0, // SDL_SCANCODE_DECIMALSEPARATOR = 179,
+ 0x0, // SDL_SCANCODE_CURRENCYUNIT = 180,
+ 0x0, // SDL_SCANCODE_CURRENCYSUBUNIT = 181,
+ 0x0, // SDL_SCANCODE_KP_LEFTPAREN = 182,
+ 0x0, // SDL_SCANCODE_KP_RIGHTPAREN = 183,
+ 0x0, // SDL_SCANCODE_KP_LEFTBRACE = 184,
+ 0x0, // SDL_SCANCODE_KP_RIGHTBRACE = 185,
+ 0x0, // SDL_SCANCODE_KP_TAB = 186,
+ 0x0, // SDL_SCANCODE_KP_BACKSPACE = 187,
+ 0x0, // SDL_SCANCODE_KP_A = 188,
+ 0x0, // SDL_SCANCODE_KP_B = 189,
+ 0x0, // SDL_SCANCODE_KP_C = 190,
+ 0x0, // SDL_SCANCODE_KP_D = 191,
+ 0x0, // SDL_SCANCODE_KP_E = 192,
+ 0x0, // SDL_SCANCODE_KP_F = 193,
+ 0x0, // SDL_SCANCODE_KP_XOR = 194,
+ 0x0, // SDL_SCANCODE_KP_POWER = 195,
+ 0x0, // SDL_SCANCODE_KP_PERCENT = 196,
+ 0x0, // SDL_SCANCODE_KP_LESS = 197,
+ 0x0, // SDL_SCANCODE_KP_GREATER = 198,
+ 0x0, // SDL_SCANCODE_KP_AMPERSAND = 199,
+ 0x0, // SDL_SCANCODE_KP_DBLAMPERSAND = 200,
+ 0x0, // SDL_SCANCODE_KP_VERTICALBAR = 201,
+ 0x0, // SDL_SCANCODE_KP_DBLVERTICALBAR = 202,
+
+ 0x92, // SDL_SCANCODE_KP_COLON = 203, - DIK_COLON
+
+ 0x0, // SDL_SCANCODE_KP_HASH = 204,
+ 0x0, // SDL_SCANCODE_KP_SPACE = 205,
+
+ 0x91, // SDL_SCANCODE_KP_AT = 206, - DIK_AT
+
+ 0x0, // SDL_SCANCODE_KP_EXCLAM = 207,
+ 0x0, // SDL_SCANCODE_KP_MEMSTORE = 208,
+ 0x0, // SDL_SCANCODE_KP_MEMRECALL = 209,
+ 0x0, // SDL_SCANCODE_KP_MEMCLEAR = 210,
+ 0x0, // SDL_SCANCODE_KP_MEMADD = 211,
+ 0x0, // SDL_SCANCODE_KP_MEMSUBTRACT = 212,
+ 0x0, // SDL_SCANCODE_KP_MEMMULTIPLY = 213,
+ 0x0, // SDL_SCANCODE_KP_MEMDIVIDE = 214,
+ 0x0, // SDL_SCANCODE_KP_PLUSMINUS = 215,
+ 0x0, // SDL_SCANCODE_KP_CLEAR = 216,
+ 0x0, // SDL_SCANCODE_KP_CLEARENTRY = 217,
+ 0x0, // SDL_SCANCODE_KP_BINARY = 218,
+ 0x0, // SDL_SCANCODE_KP_OCTAL = 219,
+ 0x0, // SDL_SCANCODE_KP_DECIMAL = 220,
+ 0x0, // SDL_SCANCODE_KP_HEXADECIMAL = 221,
+
+ 0x0, // 222 (unused)
+ 0x0, // 223 (unused)
+
+ 0x1D, // SDL_SCANCODE_LCTRL = 224, - DIK_LCONTROL
+ 0x2A, // SDL_SCANCODE_LSHIFT = 225, - DIK_LSHIFT
+ 0x38, // SDL_SCANCODE_LALT = 226, // left Alt, option - DIK_LMENU
+ 0xDB, // SDL_SCANCODE_LGUI = 227, // left windows, command (apple), meta - DIK_LWIN
+ 0x9D, // SDL_SCANCODE_RCTRL = 228, - DIK_RCONTROL
+ 0x36, // SDL_SCANCODE_RSHIFT = 229, - DIK_RSHIFT
+ 0xB8, // SDL_SCANCODE_RALT = 230, // right Alt/AltGr, option - DIK_RMENU, also used for SDL_SCANCODE_MODE!
+ 0xDC, // SDL_SCANCODE_RGUI = 231, // left windows, command (apple), meta - DIK_RWIN
+
+ // 232 - 256 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, // 232 - 240 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 241-250 unused
+ 0, 0, 0, 0, 0, 0, // 251-256 unused
+
+ 0xB8, // SDL_SCANCODE_MODE = 257, // this seems to be the AltGr Key? - DIK_RMENU (right alt)
+
+ // These values are mapped from usage page 0x0C (USB consumer page).
+ 0x99, // SDL_SCANCODE_AUDIONEXT = 258, - DIK_NEXTTRACK
+ 0x90, // SDL_SCANCODE_AUDIOPREV = 259, - DIK_PREVTRACK, which is DIK_CIRCUMFLEX on japanese keyboards
+ 0xA4, // SDL_SCANCODE_AUDIOSTOP = 260, - DIK_MEDIASTOP
+ 0xA2, // SDL_SCANCODE_AUDIOPLAY = 261, - DIK_PLAYPAUSE
+ 0xA0, // SDL_SCANCODE_AUDIOMUTE = 262, - DIK_MUTE
+ 0xED, // SDL_SCANCODE_MEDIASELECT = 263, - DIK_MEDIASELECT
+
+ 0x0, // SDL_SCANCODE_WWW = 264,
+
+ 0xEC, // SDL_SCANCODE_MAIL = 265, - DIK_MAIL
+ 0xA1, // SDL_SCANCODE_CALCULATOR = 266, - DIK_CALCULATOR
+ 0xEB, // SDL_SCANCODE_COMPUTER = 267, - DIK_MYCOMPUTER
+ 0xE5, // SDL_SCANCODE_AC_SEARCH = 268, - DIK_WEBSEARCH
+ 0xB2, // SDL_SCANCODE_AC_HOME = 269, - DIK_WEBHOME
+ 0xEA, // SDL_SCANCODE_AC_BACK = 270, - DIK_WEBBACK
+ 0xE9, // SDL_SCANCODE_AC_FORWARD = 271, - DIK_WEBFORWARD
+ 0xE8, // SDL_SCANCODE_AC_STOP = 272, - DIK_WEBSTOP
+ 0xE7, // SDL_SCANCODE_AC_REFRESH = 273, - DIK_WEBREFRESH
+ 0xE6, // SDL_SCANCODE_AC_BOOKMARKS = 274, - DIK_WEBFAVORITES
+
+ // These are values that Christian Walther added (for mac keyboard?).
+ 0x0, // SDL_SCANCODE_BRIGHTNESSDOWN = 275,
+ 0x0, // SDL_SCANCODE_BRIGHTNESSUP = 276,
+ 0x0, // SDL_SCANCODE_DISPLAYSWITCH = 277, // display mirroring/dual display switch, video mode switch
+ 0x0, // SDL_SCANCODE_KBDILLUMTOGGLE = 278,
+ 0x0, // SDL_SCANCODE_KBDILLUMDOWN = 279,
+ 0x0, // SDL_SCANCODE_KBDILLUMUP = 280,
+ 0x0, // SDL_SCANCODE_EJECT = 281,
+
+ 0xDF, // SDL_SCANCODE_SLEEP = 282, - DIK_SLEEP
+
+ 0x0, // SDL_SCANCODE_APP1 = 283,
+ 0x0, // SDL_SCANCODE_APP2 = 284,
+ // end of Walther-keys
+
+ // the rest up to 511 are currently not named in SDL
+
+ 0, 0, 0, 0, 0, 0, // 285-290 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 291-300 unused
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 301-320 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 321-340 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 341-360 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 361-380 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 381-400 unused
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 401-420 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 421-440 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 441-460 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 461-480 unused
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 481-500 unused
+
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 501-511 unused
+};
+
+
+#endif /* _SDL2_SCANCODE_TO_DINPUT_MAPPINGS_H_ */
diff --git a/cegui/include/CEGUI/Base.h b/cegui/include/CEGUI/Base.h
index 43dfaf44c..daa24b564 100644
--- a/cegui/include/CEGUI/Base.h
+++ b/cegui/include/CEGUI/Base.h
@@ -131,12 +131,15 @@
# define CEGUI_FUNCTION_NAME CEGUI::String(__FUNCSIG__)
#elif defined(__GNUC__)
# define CEGUI_FUNCTION_NAME CEGUI::String(__PRETTY_FUNCTION__)
-#elif __STDC_VERSION__ >= 199901L
+#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
# define CEGUI_FUNCTION_NAME CEGUI::String(__func__)
#else
# define CEGUI_FUNCTION_NAME CEGUI::String("[Function name unavailable]")
#endif
+//! Prevent an "unused parameter/variable" warning.
+#define CEGUI_UNUSED(var) (static_cast(var))
+
/*************************************************************************
Documentation for the CEGUI namespace itself
*************************************************************************/
@@ -158,10 +161,10 @@ typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned char uchar;
-typedef long long int64;
-typedef int int32;
-typedef short int16;
-typedef char int8;
+typedef long long int64;
+typedef int int32;
+typedef short int16;
+typedef signed char int8;
typedef unsigned long long uint64;
typedef unsigned int uint32;
diff --git a/cegui/include/CEGUI/BasicRenderedStringParser.h b/cegui/include/CEGUI/BasicRenderedStringParser.h
index 1dbe4a4e0..c39354a97 100644
--- a/cegui/include/CEGUI/BasicRenderedStringParser.h
+++ b/cegui/include/CEGUI/BasicRenderedStringParser.h
@@ -96,6 +96,7 @@ class CEGUIEXPORT BasicRenderedStringParser : public RenderedStringParser
\param initial_colours
Reference to a ColourRect describing the initial colours to be used.
*/
+ //! \deprecated This constructor is deprecated and will be removed in the next major version */
BasicRenderedStringParser(const String& initial_font,
const ColourRect& initial_colours);
//! Destructor.
@@ -108,6 +109,7 @@ class CEGUIEXPORT BasicRenderedStringParser : public RenderedStringParser
\param font_name
String object holding the name of the font.
*/
+ //! \deprecated This function is deprecated and will be removed in the next major version */
void setInitialFontName(const String& font_name);
/*!
@@ -117,24 +119,27 @@ class CEGUIEXPORT BasicRenderedStringParser : public RenderedStringParser
\param colours
ColourRect object holding the colours.
*/
+ //! \deprecated This function is deprecated and will be removed in the next major version */
void setInitialColours(const ColourRect& colours);
/*!
\brief
Return the name of the initial font used in each parse.
*/
+ //! \deprecated This function is deprecated and will be removed in the next major version */
const String& getInitialFontName() const;
/*!
\brief
Return a ColourRect describing the initial colours used in each parse.
*/
+ //! \deprecated This function is deprecated and will be removed in the next major version */
const ColourRect& getInitialColours() const;
// implement required interface from RenderedStringParser
RenderedString parse(const String& input_string,
- const Font* initial_font,
- const ColourRect* initial_colours);
+ const Font* active_font,
+ const ColourRect* active_colours);
protected:
//! append the text string \a text to the RenderedString \a rs.
@@ -165,9 +170,9 @@ class CEGUIEXPORT BasicRenderedStringParser : public RenderedStringParser
void handleImageWidth(RenderedString& rs, const String& value);
void handleImageHeight(RenderedString& rs, const String& value);
- //! initial font name
+ //! \deprecated This variable is deprecated and will removed in the next major version */
String d_initialFontName;
- //! initial colours
+ //! \deprecated This variable is deprecated and will removed in the next major version */
ColourRect d_initialColours;
//! active padding values.
Rectf d_padding;
diff --git a/cegui/include/CEGUI/Config.h.in b/cegui/include/CEGUI/Config.h.in
index 11b2533cc..e2f683896 100644
--- a/cegui/include/CEGUI/Config.h.in
+++ b/cegui/include/CEGUI/Config.h.in
@@ -175,6 +175,12 @@ setting CMake options and regenerating, rather than editing directly.
// Uncomment this to use an external fribidi library.
#cmakedefine CEGUI_USE_FRIBIDI
+// Controls whether to use GLEW as an OpenGL loading library.
+#cmakedefine CEGUI_USE_GLEW
+
+// Controls whether to use Epoxy as an OpenGL loading library.
+#cmakedefine CEGUI_USE_EPOXY
+
//////////////////////////////////////////////////////////////////////////
// The following controls whether the MinizipResourceProvider will be
// built into the CEGUIBase library. You can uncomment the following line
@@ -189,7 +195,7 @@ setting CMake options and regenerating, rather than editing directly.
// this can be changed at runtime via the CEGUI_MODULE_DIR environment var.
#if defined(_WIN32) || defined(__WIN32__)
# define CEGUI_MODULE_DIR "${CMAKE_BINARY_DIR}/bin/"
-#else
+#elif !defined(__ANDROID__)
# define CEGUI_MODULE_DIR "${CMAKE_INSTALL_PREFIX}/${CEGUI_MODULE_INSTALL_DIR}/"
#endif
diff --git a/cegui/include/CEGUI/EventSet.h b/cegui/include/CEGUI/EventSet.h
index abdde3f9c..f20ea54af 100644
--- a/cegui/include/CEGUI/EventSet.h
+++ b/cegui/include/CEGUI/EventSet.h
@@ -37,7 +37,7 @@
#if defined (_MSC_VER)
# pragma warning(push)
-# pragma warning(disable : 4251)
+# pragma warning(disable : 4251 4521 4522)
#endif
// Start of CEGUI namespace section
@@ -427,11 +427,10 @@ class CEGUIEXPORT EventSet
ScriptModule* getScriptModule() const;
// Do not allow copying, assignment, or any other usage than simple creation.
- EventSet(EventSet&) {}
- EventSet& operator=(EventSet&)
- {
- return *this;
- }
+ EventSet(EventSet&) {} //! \deprecated
+ EventSet(const EventSet&) {}
+ EventSet& operator=(EventSet&) { return *this; } //! \deprecated
+ EventSet& operator=(const EventSet&) { return *this; }
typedef std::map EventMap;
diff --git a/cegui/include/CEGUI/Exceptions.h b/cegui/include/CEGUI/Exceptions.h
index 9cf464904..d26832339 100644
--- a/cegui/include/CEGUI/Exceptions.h
+++ b/cegui/include/CEGUI/Exceptions.h
@@ -33,6 +33,12 @@
#include "CEGUI/String.h"
#include
+#if defined(_MSC_VER)
+# pragma warning(push)
+# pragma warning(disable : 4275)
+#endif
+
+
// Start of CEGUI namespace section
namespace CEGUI
{
@@ -464,7 +470,7 @@ class CEGUIEXPORT RendererException : public Exception
VS2003.
*/
#define RendererException(message) \
- RendererException(message, __FILE__, __LINE__, CEGUI_FUNCTION_NAME)
+ ::CEGUI::RendererException(message, __FILE__, __LINE__, CEGUI_FUNCTION_NAME)
//----------------------------------------------------------------------------//
@@ -770,5 +776,8 @@ class CEGUIEXPORT ScriptException : public Exception
} // End of CEGUI namespace section
+#if defined(_MSC_VER)
+# pragma warning(pop)
+#endif
#endif // end of guard _CEGUIExceptions_h_
diff --git a/cegui/include/CEGUI/FreeFunctionSlot.h b/cegui/include/CEGUI/FreeFunctionSlot.h
index 90adf04bc..ff6a0775a 100644
--- a/cegui/include/CEGUI/FreeFunctionSlot.h
+++ b/cegui/include/CEGUI/FreeFunctionSlot.h
@@ -3,7 +3,7 @@
author: Paul D Turner
*************************************************************************/
/***************************************************************************
- * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
+ * Copyright (C) 2004 - 2014 Paul D Turner & The CEGUI Development Team
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
@@ -32,6 +32,7 @@
// Start of CEGUI namespace section
namespace CEGUI
{
+
/*!
\brief
Slot functor class that calls back via a free function pointer.
@@ -55,6 +56,90 @@ class FreeFunctionSlot : public SlotFunctorBase
SlotFunction* d_function;
};
+/*!
+\brief
+ Slot functor class that calls back via a free function pointer.
+ This variant doesn't require a handler that returns bool.
+
+\note
+ This functor always returns true to CEGUI, which means the event was
+ handled.
+*/
+class FreeFunctionSlotVoid : public SlotFunctorBase
+{
+public:
+ //! Slot function type.
+ typedef void (SlotFunction)(const EventArgs&);
+
+ FreeFunctionSlotVoid(SlotFunction* func) :
+ d_function(func)
+ {}
+
+ virtual bool operator()(const EventArgs& args)
+ {
+ d_function(args);
+
+ return true;
+ }
+
+private:
+ SlotFunction* d_function;
+};
+
+/*!
+\brief
+ Slot functor class that calls back via a free function pointer.
+ This variant ignores passed EventArgs.
+*/
+class FreeFunctionSlotNoArgs : public SlotFunctorBase
+{
+public:
+ //! Slot function type.
+ typedef bool (SlotFunction)();
+
+ FreeFunctionSlotNoArgs(SlotFunction* func) :
+ d_function(func)
+ {}
+
+ virtual bool operator()(const EventArgs& /*args*/)
+ {
+ return d_function();
+ }
+
+private:
+ SlotFunction* d_function;
+};
+
+/*!
+\brief
+ Slot functor class that calls back via a free function pointer.
+ This variant ignores passed EventArgs and the handler
+ doesn't have to return a bool.
+
+\note
+ This functor always returns true to CEGUI, which means the event was
+ handled.
+*/
+class FreeFunctionSlotVoidNoArgs : public SlotFunctorBase
+{
+public:
+ //! Slot function type.
+ typedef void (SlotFunction)();
+
+ FreeFunctionSlotVoidNoArgs(SlotFunction* func) :
+ d_function(func)
+ {}
+
+ virtual bool operator()(const EventArgs&)
+ {
+ d_function();
+
+ return true;
+ }
+
+private:
+ SlotFunction* d_function;
+};
} // End of CEGUI namespace section
diff --git a/cegui/include/CEGUI/FunctorCopySlot.h b/cegui/include/CEGUI/FunctorCopySlot.h
index 42b82793e..a80b551ab 100644
--- a/cegui/include/CEGUI/FunctorCopySlot.h
+++ b/cegui/include/CEGUI/FunctorCopySlot.h
@@ -1,9 +1,10 @@
/************************************************************************
created: Tue Feb 28 2006
- author: Paul D Turner
+ authors: Paul D Turner
+ Martin Preisler
*************************************************************************/
/***************************************************************************
- * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
+ * Copyright (C) 2004 - 2014 Paul D Turner & The CEGUI Development Team
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
@@ -32,6 +33,223 @@
// Start of CEGUI namespace section
namespace CEGUI
{
+
+namespace FunctorCopySlot_detail
+{
+ typedef char Yes;
+ typedef int No;
+
+ template
+ struct HasBoolEventArgsConstOp
+ {
+ template struct SFINAE {};
+ template static Yes Test(SFINAE*);
+ template static No Test(...);
+ static const bool Value = sizeof(Test(0)) == sizeof(Yes);
+ };
+
+ template
+ struct HasBoolEventArgsOp
+ {
+ template struct SFINAE {};
+ template static Yes Test(SFINAE*);
+ template static No Test(...);
+ static const bool Value = sizeof(Test(0)) == sizeof(Yes);
+ };
+
+ template
+ struct HasVoidEventArgsConstOp
+ {
+ template struct SFINAE {};
+ template static Yes Test(SFINAE*);
+ template static No Test(...);
+ static const bool Value = sizeof(Test(0)) == sizeof(Yes);
+ };
+
+ template
+ struct HasVoidEventArgsOp
+ {
+ template struct SFINAE {};
+ template static Yes Test(SFINAE*);
+ template static No Test(...);
+ static const bool Value = sizeof(Test(0)) == sizeof(Yes);
+ };
+
+ template
+ struct HasBoolNoArgsConstOp
+ {
+ template struct SFINAE {};
+ template static Yes Test(SFINAE*);
+ template static No Test(...);
+ static const bool Value = sizeof(Test(0)) == sizeof(Yes);
+ };
+
+ template
+ struct HasBoolNoArgsOp
+ {
+ template struct SFINAE {};
+ template static Yes Test(SFINAE*);
+ template static No Test(...);
+ static const bool Value = sizeof(Test(0)) == sizeof(Yes);
+ };
+
+ template
+ struct HasVoidNoArgsConstOp
+ {
+ template struct SFINAE {};
+ template static Yes Test(SFINAE*);
+ template static No Test(...);
+ static const bool Value = sizeof(Test(0)) == sizeof(Yes);
+ };
+
+ // The following 3 templates use the same idea as boost::disable_if
+ template
+ struct DisableIfC
+ {
+ typedef T Type;
+ };
+
+ template
+ struct DisableIfC
+ {};
+
+ template
+ struct DisableIf : public DisableIfC
+ {};
+
+
+ // The following is just overload trickery to accommodate 8 allowed
+ // operator() signatures:
+ //
+ // 1) bool (const EventArgs&) const = BoolEventArgsConstOp
+ // 2) bool (const EventArgs&) = BoolEventArgsOp
+ // 3) void (const EventArgs&) const = VoidEventArgsConstOp
+ // 4) void (const EventArgs&) = VoidEventArgsOp
+ // 5) bool () const = BoolNoArgsConstOp
+ // 6) bool () = BoolNoArgsOp
+ // 7) void () const = VoidNoArgsConstOp
+ // 8) void () = VoidNoArgsOp
+ //
+ // The calls are priorised as outlined above, if call 1) is possible, no
+ // other variants are tried, ...
+
+ template
+ inline bool call(const T& functor, bool(T::*member_fn)(const EventArgs&) const, const EventArgs& args,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0
+ )
+ {
+ return CEGUI_CALL_MEMBER_FN(functor, member_fn)(args);
+ }
+
+ template
+ inline bool call(T& functor, bool(T::*member_fn)(const EventArgs&), const EventArgs& args,
+ typename DisableIf >::Type* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0
+ )
+ {
+ return CEGUI_CALL_MEMBER_FN(functor, member_fn)(args);
+ }
+
+ template
+ inline bool call(const T& functor, void(T::*member_fn)(const EventArgs&) const, const EventArgs& args,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0
+ )
+ {
+ CEGUI_CALL_MEMBER_FN(functor, member_fn)(args);
+ return true;
+ }
+
+ template
+ inline bool call(T& functor, void(T::*member_fn)(const EventArgs&), const EventArgs& args,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0
+ )
+ {
+ CEGUI_CALL_MEMBER_FN(functor, member_fn)(args);
+ return true;
+ }
+
+ template
+ inline bool call(const T& functor, bool(T::*member_fn)() const, const EventArgs& /*args*/,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ void* = 0,
+ void* = 0,
+ void* = 0
+ )
+ {
+ return CEGUI_CALL_MEMBER_FN(functor, member_fn)();
+ }
+
+ template
+ inline bool call(T& functor, bool(T::*member_fn)(), const EventArgs& /*args*/,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ void* = 0,
+ void* = 0
+ )
+ {
+ return CEGUI_CALL_MEMBER_FN(functor, member_fn)();
+ }
+
+ template
+ inline bool call(const T& functor, void(T::*member_fn)() const, const EventArgs& /*args*/,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ void* = 0
+ )
+ {
+ CEGUI_CALL_MEMBER_FN(functor, member_fn)();
+ return true;
+ }
+
+ template
+ inline bool call(T& functor, void(T::*member_fn)(), const EventArgs& /*args*/,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0,
+ typename DisableIf >::Type* = 0
+ )
+ {
+ CEGUI_CALL_MEMBER_FN(functor, member_fn)();
+ return true;
+ }
+}
+
/*!
\brief
Slot template class that creates a functor that calls back via a copy of a
@@ -41,19 +259,19 @@ template
class FunctorCopySlot : public SlotFunctorBase
{
public:
- FunctorCopySlot(const T& functor) :
+ FunctorCopySlot(const T& functor):
d_functor(functor)
{}
virtual bool operator()(const EventArgs& args)
{
- return d_functor(args);
+ return FunctorCopySlot_detail::call(d_functor, &T::operator(), args);
}
private:
T d_functor;
};
-} // End of CEGUI namespace section
+}
#endif // end of guard _CEGUIFunctorCopySlot_h_
diff --git a/cegui/include/CEGUI/ImageCodecModules/SDL2/ImageCodec.h b/cegui/include/CEGUI/ImageCodecModules/SDL2/ImageCodec.h
new file mode 100644
index 000000000..07085b1be
--- /dev/null
+++ b/cegui/include/CEGUI/ImageCodecModules/SDL2/ImageCodec.h
@@ -0,0 +1,64 @@
+/***********************************************************************
+ created: 04/07/2014
+ author: Luca Ebach
+ with code by John Norman
+
+ purpose: This codec provides SDL2 based image loading
+*************************************************************************/
+/***************************************************************************
+ * Copyright (C) 2004 - 2015 Paul D Turner & The CEGUI Development Team
+ *
+ * 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 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.
+ ***************************************************************************/
+
+#ifndef _SDL2_IMAGE_CODEC_H_
+#define _SDL2_IMAGE_CODEC_H_
+
+#if (defined( __WIN32__ ) || defined( _WIN32 )) && !defined(CEGUI_STATIC)
+# ifdef CEGUISDL2IMAGECODEC_EXPORTS
+# define CEGUISDL2IMAGECODEC_API __declspec(dllexport)
+# else
+# define CEGUISDL2IMAGECODEC_API __declspec(dllimport)
+# endif
+#else
+# define CEGUISDL2IMAGECODEC_API
+#endif
+
+#include
+#include
+
+#include
+
+namespace CEGUI
+{
+
+class CEGUISDL2IMAGECODEC_API SDL2ImageCodec : public ImageCodec
+{
+public:
+ SDL2ImageCodec();
+ ~SDL2ImageCodec();
+
+ Texture* load(const RawDataContainer& data, Texture* result);
+};
+
+} // End namespace
+
+#endif /* IMAGECODEC_H */
+
diff --git a/cegui/include/CEGUI/ImageCodecModules/SDL2/ImageCodecModule.h b/cegui/include/CEGUI/ImageCodecModules/SDL2/ImageCodecModule.h
new file mode 100644
index 000000000..fde97f5ed
--- /dev/null
+++ b/cegui/include/CEGUI/ImageCodecModules/SDL2/ImageCodecModule.h
@@ -0,0 +1,53 @@
+/***********************************************************************
+ created: 04/07/2014
+ author: Luca Ebach
+ with code by John Norman
+
+ purpose: This codec provides SDL2 based image loading
+*************************************************************************/
+/***************************************************************************
+ * Copyright (C) 2004 - 2015 Paul D Turner & The CEGUI Development Team
+ *
+ * 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 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.
+ ***************************************************************************/
+
+#ifndef _SDL2_IMAGE_CODEC_MODULE_H_
+#define _SDL2_IMAGE_CODEC_MODULE_H_
+
+#include
+
+
+/*!
+ \brief
+ exported function that creates the ImageCodec based object and
+ returns a pointer to that object.
+*/
+extern "C" CEGUISDL2IMAGECODEC_API CEGUI::ImageCodec* createImageCodec(void);
+
+/*!
+ \brief
+ exported function that deletes an ImageCodec based object previously
+ created by this module.
+*/
+extern "C" CEGUISDL2IMAGECODEC_API void destroyImageCodec(CEGUI::ImageCodec* imageCodec);
+
+
+#endif /* _SDL2_IMAGE_CODEC_MODULE_H_ */
+
diff --git a/cegui/include/CEGUI/MemberFunctionSlot.h b/cegui/include/CEGUI/MemberFunctionSlot.h
index 6ab481922..5e72ff163 100644
--- a/cegui/include/CEGUI/MemberFunctionSlot.h
+++ b/cegui/include/CEGUI/MemberFunctionSlot.h
@@ -3,7 +3,7 @@
author: Paul D Turner
*************************************************************************/
/***************************************************************************
- * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
+ * Copyright (C) 2004 - 2014 Paul D Turner & The CEGUI Development Team
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
@@ -59,6 +59,100 @@ class MemberFunctionSlot : public SlotFunctorBase
T* d_object;
};
-} // End of CEGUI namespace section
+/*!
+\brief
+ Slot template class that creates a functor that calls back via a class
+ member function. This variant doesn't require a handler that returns bool.
+
+\note
+ This functor always returns true to CEGUI, which means the event was
+ handled.
+*/
+template
+class MemberFunctionSlotVoid : public SlotFunctorBase
+{
+public:
+ //! Member function slot type.
+ typedef void(T::*MemberFunctionType)(const EventArgs&);
+
+ MemberFunctionSlotVoid(MemberFunctionType func, T* obj) :
+ d_function(func),
+ d_object(obj)
+ {}
+
+ virtual bool operator()(const EventArgs& args)
+ {
+ (d_object->*d_function)(args);
+
+ return true;
+ }
+
+private:
+ MemberFunctionType d_function;
+ T* d_object;
+};
+
+/*!
+\brief
+ Slot template class that creates a functor that calls back via a class
+ member function. This variant ignores passed EventArgs.
+*/
+template
+class MemberFunctionSlotNoArgs : public SlotFunctorBase
+{
+public:
+ //! Member function slot type.
+ typedef bool(T::*MemberFunctionType)();
+
+ MemberFunctionSlotNoArgs(MemberFunctionType func, T* obj) :
+ d_function(func),
+ d_object(obj)
+ {}
+
+ virtual bool operator()(const EventArgs& /*args*/)
+ {
+ return (d_object->*d_function)();
+ }
+
+private:
+ MemberFunctionType d_function;
+ T* d_object;
+};
+
+/*!
+\brief
+ Slot template class that creates a functor that calls back via a class
+ member function. This variant ignores passed EventArgs and the handler
+ doesn't have to return a bool.
+
+\note
+ This functor always returns true to CEGUI, which means the event was
+ handled.
+*/
+template
+class MemberFunctionSlotVoidNoArgs : public SlotFunctorBase
+{
+public:
+ //! Member function slot type.
+ typedef void(T::*MemberFunctionType)();
+
+ MemberFunctionSlotVoidNoArgs(MemberFunctionType func, T* obj) :
+ d_function(func),
+ d_object(obj)
+ {}
+
+ virtual bool operator()(const EventArgs& /*args*/)
+ {
+ (d_object->*d_function)();
+
+ return true;
+ }
+
+private:
+ MemberFunctionType d_function;
+ T* d_object;
+};
+
+}
#endif // end of guard _CEGUIMemberFunctionSlot_h_
diff --git a/cegui/include/CEGUI/PropertyHelper.h b/cegui/include/CEGUI/PropertyHelper.h
index 74a33970f..0b0408b28 100644
--- a/cegui/include/CEGUI/PropertyHelper.h
+++ b/cegui/include/CEGUI/PropertyHelper.h
@@ -49,9 +49,23 @@
#endif
#ifdef _MSC_VER
-#define snprintf _snprintf
+ #define snprintf _snprintf
#endif
+#ifdef __MINGW32__
+
+ #if __USE_MINGW_ANSI_STDIO != 1
+ #warning __USE_MINGW_ANSI_STDIO must be set to 1 for sscanf and snprintf to work with 64bit integers
+ #endif
+
+ #pragma GCC diagnostic push
+
+ /* Due to a bug in MinGW-w64, a false warning is sometimes issued when using
+ "%llu" format with the "printf"/"scanf" family of functions. */
+ #pragma GCC diagnostic ignored "-Wformat"
+ #pragma GCC diagnostic ignored "-Wformat-extra-args"
+
+#endif
namespace CEGUI
{
@@ -979,8 +993,12 @@ class CEGUIEXPORT PropertyHelper
}
+#ifdef __MINGW32__
+ #pragma GCC diagnostic pop
+#endif
+
#if defined(_MSC_VER)
-# pragma warning(pop)
+ #pragma warning(pop)
#endif
-#endif
\ No newline at end of file
+#endif
diff --git a/cegui/include/CEGUI/RendererModules/Direct3D10/GeometryBuffer.h b/cegui/include/CEGUI/RendererModules/Direct3D10/GeometryBuffer.h
index d4a3f08ac..3b07c7fc4 100644
--- a/cegui/include/CEGUI/RendererModules/Direct3D10/GeometryBuffer.h
+++ b/cegui/include/CEGUI/RendererModules/Direct3D10/GeometryBuffer.h
@@ -32,7 +32,13 @@
#include "../../Rect.h"
#include "../../Quaternion.h"
-#include
+// Unfortunately, MinGW-w64 doesn't have
+#ifdef __MINGW32__
+ #include
+ #include
+#else
+ #include
+#endif
#if defined(_MSC_VER)
# pragma warning(push)
diff --git a/cegui/include/CEGUI/RendererModules/Direct3D10/RenderTarget.h b/cegui/include/CEGUI/RendererModules/Direct3D10/RenderTarget.h
index 985e31a9a..a8d4fd01f 100644
--- a/cegui/include/CEGUI/RendererModules/Direct3D10/RenderTarget.h
+++ b/cegui/include/CEGUI/RendererModules/Direct3D10/RenderTarget.h
@@ -30,7 +30,14 @@
#include "../../RenderTarget.h"
#include "CEGUI/RendererModules/Direct3D10/Renderer.h"
#include "../../Rect.h"
-#include
+
+// Unfortunately, MinGW-w64 doesn't have
+#ifdef __MINGW32__
+ #include