From 4c09151dae619fe3f24e7f1406ed838693696b16 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Sun, 6 Nov 2016 03:10:43 +0100 Subject: [PATCH] basic Android support --- cmake/FindAllegro5.cmake | 2 +- cmake/FindAllegro5ACodec.cmake | 2 +- cmake/FindAllegro5Audio.cmake | 2 +- cmake/FindAllegro5Color.cmake | 2 +- cmake/FindAllegro5Font.cmake | 2 +- cmake/FindAllegro5Image.cmake | 2 +- cmake/FindAllegro5Main.cmake | 2 +- cmake/FindAllegro5Primitives.cmake | 2 +- cmake/FindAllegro5TTF.cmake | 2 +- cmake/android.toolchain | 155 +++++++++++++++++++++++++++++ cmake/libsuperderpy.cmake | 6 +- src/CMakeLists.txt | 2 - src/libsuperderpy.c | 39 +++++++- src/libsuperderpy.h | 5 + 14 files changed, 210 insertions(+), 15 deletions(-) create mode 100644 cmake/android.toolchain diff --git a/cmake/FindAllegro5.cmake b/cmake/FindAllegro5.cmake index 7afc317..85be126 100644 --- a/cmake/FindAllegro5.cmake +++ b/cmake/FindAllegro5.cmake @@ -7,7 +7,7 @@ FIND_PATH(ALLEGRO5_INCLUDE_DIR allegro5/allegro.h) -SET(ALLEGRO5_NAMES ${ALLEGRO5_NAMES} allegro allegro_static liballegro liballegro_static Allegro-5.2) +SET(ALLEGRO5_NAMES ${ALLEGRO5_NAMES} allegro allegro_static liballegro liballegro_static Allegro-5.2 allegro-debug) FIND_LIBRARY(ALLEGRO5_LIBRARY NAMES ${ALLEGRO5_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_FOUND to TRUE if diff --git a/cmake/FindAllegro5ACodec.cmake b/cmake/FindAllegro5ACodec.cmake index 5bf913d..8a69d9b 100644 --- a/cmake/FindAllegro5ACodec.cmake +++ b/cmake/FindAllegro5ACodec.cmake @@ -7,7 +7,7 @@ FIND_PATH(ALLEGRO5_ACODEC_INCLUDE_DIR allegro5/allegro_acodec.h) -SET(ALLEGRO5_ACODEC_NAMES ${ALLEGRO5_ACODEC_NAMES} allegro_acodec allegro_acodec_static liballegro_acodec liballegro_acodec_static AllegroAcodec-5.2) +SET(ALLEGRO5_ACODEC_NAMES ${ALLEGRO5_ACODEC_NAMES} allegro_acodec allegro_acodec_static liballegro_acodec liballegro_acodec_static AllegroAcodec-5.2 allegro_acodec-debug) FIND_LIBRARY(ALLEGRO5_ACODEC_LIBRARY NAMES ${ALLEGRO5_ACODEC_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_ACODEC_FOUND to TRUE if diff --git a/cmake/FindAllegro5Audio.cmake b/cmake/FindAllegro5Audio.cmake index 62f936c..316589d 100644 --- a/cmake/FindAllegro5Audio.cmake +++ b/cmake/FindAllegro5Audio.cmake @@ -7,7 +7,7 @@ FIND_PATH(ALLEGRO5_AUDIO_INCLUDE_DIR allegro5/allegro_audio.h) -SET(ALLEGRO5_AUDIO_NAMES ${ALLEGRO5_AUDIO_NAMES} allegro_audio allegro_audio_static liballegro_audio liballegro_audio_static AllegroAudio-5.2) +SET(ALLEGRO5_AUDIO_NAMES ${ALLEGRO5_AUDIO_NAMES} allegro_audio allegro_audio_static liballegro_audio liballegro_audio_static AllegroAudio-5.2 allegro_audio-debug) FIND_LIBRARY(ALLEGRO5_AUDIO_LIBRARY NAMES ${ALLEGRO5_AUDIO_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_AUDIO_FOUND to TRUE if diff --git a/cmake/FindAllegro5Color.cmake b/cmake/FindAllegro5Color.cmake index 7f29fa2..2321190 100644 --- a/cmake/FindAllegro5Color.cmake +++ b/cmake/FindAllegro5Color.cmake @@ -7,7 +7,7 @@ FIND_PATH(ALLEGRO5_COLOR_INCLUDE_DIR allegro5/allegro_color.h) -SET(ALLEGRO5_COLOR_NAMES ${ALLEGRO5_COLOR_NAMES} allegro_color allegro_color_static liballegro_color liballegro_color_static AllegroColor-5.2) +SET(ALLEGRO5_COLOR_NAMES ${ALLEGRO5_COLOR_NAMES} allegro_color allegro_color_static liballegro_color liballegro_color_static AllegroColor-5.2 allegro_color-debug) FIND_LIBRARY(ALLEGRO5_COLOR_LIBRARY NAMES ${ALLEGRO5_COLOR_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_COLOR_FOUND to TRUE if diff --git a/cmake/FindAllegro5Font.cmake b/cmake/FindAllegro5Font.cmake index c9b79a8..860c155 100644 --- a/cmake/FindAllegro5Font.cmake +++ b/cmake/FindAllegro5Font.cmake @@ -7,7 +7,7 @@ FIND_PATH(ALLEGRO5_FONT_INCLUDE_DIR allegro5/allegro_font.h) -SET(ALLEGRO5_FONT_NAMES ${ALLEGRO5_FONT_NAMES} allegro_font allegro_font_static liballegro_font liballegro_font_static AllegroFont-5.2) +SET(ALLEGRO5_FONT_NAMES ${ALLEGRO5_FONT_NAMES} allegro_font allegro_font_static liballegro_font liballegro_font_static AllegroFont-5.2 allegro_font-debug) FIND_LIBRARY(ALLEGRO5_FONT_LIBRARY NAMES ${ALLEGRO5_FONT_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_FONT_FOUND to TRUE if diff --git a/cmake/FindAllegro5Image.cmake b/cmake/FindAllegro5Image.cmake index 25bb3ac..20d89fc 100644 --- a/cmake/FindAllegro5Image.cmake +++ b/cmake/FindAllegro5Image.cmake @@ -7,7 +7,7 @@ FIND_PATH(ALLEGRO5_IMAGE_INCLUDE_DIR allegro5/allegro_image.h) -SET(ALLEGRO5_IMAGE_NAMES ${ALLEGRO5_IMAGE_NAMES} allegro_image allegro_image_static liballegro_image liballegro_image_static AllegroImage-5.2) +SET(ALLEGRO5_IMAGE_NAMES ${ALLEGRO5_IMAGE_NAMES} allegro_image allegro_image_static liballegro_image liballegro_image_static AllegroImage-5.2 allegro_image-debug) FIND_LIBRARY(ALLEGRO5_IMAGE_LIBRARY NAMES ${ALLEGRO5_IMAGE_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_IMAGE_FOUND to TRUE if diff --git a/cmake/FindAllegro5Main.cmake b/cmake/FindAllegro5Main.cmake index ef9a981..d5a06a6 100644 --- a/cmake/FindAllegro5Main.cmake +++ b/cmake/FindAllegro5Main.cmake @@ -4,7 +4,7 @@ # ALLEGRO5_MAIN_LIBRARIES - Link these to use allegro5 # -SET(ALLEGRO5_MAIN_NAMES ${ALLEGRO5_MAIN_NAMES} allegro_main allegro_main_static liballegro_main liballegro_main_static) +SET(ALLEGRO5_MAIN_NAMES ${ALLEGRO5_MAIN_NAMES} allegro_main allegro_main_static liballegro_main liballegro_main_static allegro_main-debug) FIND_LIBRARY(ALLEGRO5_MAIN_LIBRARY NAMES ${ALLEGRO5_MAIN_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_MAIN_FOUND to TRUE if diff --git a/cmake/FindAllegro5Primitives.cmake b/cmake/FindAllegro5Primitives.cmake index 8d2313c..a893633 100644 --- a/cmake/FindAllegro5Primitives.cmake +++ b/cmake/FindAllegro5Primitives.cmake @@ -7,7 +7,7 @@ FIND_PATH(ALLEGRO5_PRIMITIVES_INCLUDE_DIR allegro5/allegro_primitives.h) -SET(ALLEGRO5_PRIMITIVES_NAMES ${ALLEGRO5_PRIMITIVES_NAMES} allegro_primitives allegro_primitives_static liballegro_primitives liballegro_primitives_static AllegroPrimitives-5.2) +SET(ALLEGRO5_PRIMITIVES_NAMES ${ALLEGRO5_PRIMITIVES_NAMES} allegro_primitives allegro_primitives_static liballegro_primitives liballegro_primitives_static AllegroPrimitives-5.2 allegro_primitives-debug) FIND_LIBRARY(ALLEGRO5_PRIMITIVES_LIBRARY NAMES ${ALLEGRO5_PRIMITIVES_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_PRIMITIVES_FOUND to TRUE if diff --git a/cmake/FindAllegro5TTF.cmake b/cmake/FindAllegro5TTF.cmake index 51de9ac..3ae23a2 100644 --- a/cmake/FindAllegro5TTF.cmake +++ b/cmake/FindAllegro5TTF.cmake @@ -7,7 +7,7 @@ FIND_PATH(ALLEGRO5_TTF_INCLUDE_DIR allegro5/allegro_ttf.h) -SET(ALLEGRO5_TTF_NAMES ${ALLEGRO5_TTF_NAMES} allegro_ttf allegro_ttf_static liballegro_ttf liballegro_ttf_static AllegroTTF-5.2) +SET(ALLEGRO5_TTF_NAMES ${ALLEGRO5_TTF_NAMES} allegro_ttf allegro_ttf_static liballegro_ttf liballegro_ttf_static AllegroTTF-5.2 allegro_ttf-debug) FIND_LIBRARY(ALLEGRO5_TTF_LIBRARY NAMES ${ALLEGRO5_TTF_NAMES} ) # handle the QUIETLY and REQUIRED arguments and set ALLEGRO5_TTF_FOUND to TRUE if diff --git a/cmake/android.toolchain b/cmake/android.toolchain new file mode 100644 index 0000000..294e3d1 --- /dev/null +++ b/cmake/android.toolchain @@ -0,0 +1,155 @@ + +SET(CMAKE_SYSTEM_NAME Linux) +SET(CMAKE_SYSTEM_VERSION 1) + +#set path for android toolchain -- look + +set(ANDROID_NDK_TOOLCHAIN_ROOT "$ENV{ANDROID_NDK_TOOLCHAIN_ROOT}" CACHE PATH "Path to the Android NDK Standalone Toolchain" ) + +message( STATUS "Selected Android toolchain: ${ANDROID_NDK_TOOLCHAIN_ROOT}" ) +if(NOT EXISTS ${ANDROID_NDK_TOOLCHAIN_ROOT}) + set(ANDROID_NDK_TOOLCHAIN_ROOT "/opt/android-toolchain" CACHE PATH "Path to the Android NDK Standalone Toolchain" ) + message( STATUS "Using default path for toolchain ${ANDROID_NDK_TOOLCHAIN_ROOT}") + message( STATUS "If you prefer to use a different location, please set the ANDROID_NDK_TOOLCHAIN_ROOT cmake variable.") +endif() + +#set(ANDROID_NDK_TOOLCHAIN_ROOT ${ANDROID_NDK_TOOLCHAIN_ROOT} CACHE PATH +# "root of the android ndk standalone toolchain" FORCE) + +if(NOT EXISTS ${ANDROID_NDK_TOOLCHAIN_ROOT}) + message(FATAL_ERROR + "${ANDROID_NDK_TOOLCHAIN_ROOT} does not exist! + You should either set an environment variable: + export ANDROID_NDK_TOOLCHAIN_ROOT=~/my-toolchain + or put the toolchain in the default path: + sudo ln -s ~/android-toolchain /opt/android-toolchain + ") +endif() + +find_program(CMAKE_MAKE_PROGRAM make) + +#setup build targets, mutually exclusive +set(PossibleArmTargets + "x86;x86_64;armeabi;armeabi-v7a;armeabi-v7a with NEON") +set(ARM_TARGETS "armeabi-v7a" CACHE STRING + "the arm targets for android, recommend armeabi-v7a + for floating point support and NEON.") + +if(ARM_TARGETS STREQUAL "x86") + set(ANDROID_ARCH "i686-linux-android") +elseif(ARM_TARGETS STREQUAL "x86_64") + set(ANDROID_ARCH "x86_64-linux-android") +else() + set(ANDROID_ARCH "arm-linux-androideabi") +endif() + +if(WIN32) + set(CMAKE_EXECUTABLE_SUFFIX ".exe") +endif() + +# specify the cross compiler +SET(CMAKE_C_COMPILER + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-gcc${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "gcc" FORCE) +SET(CMAKE_CXX_COMPILER + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-g++${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "gcc" FORCE) +#there may be a way to make cmake deduce these TODO deduce the rest of the tools +set(CMAKE_AR + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-ar${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "archive" FORCE) +set(CMAKE_LINKER + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-ld${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "linker" FORCE) +set(CMAKE_NM + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-nm${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "nm" FORCE) +set(CMAKE_OBJCOPY + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-objcopy${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "objcopy" FORCE) +set(CMAKE_OBJDUMP + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-objdump${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "objdump" FORCE) +set(CMAKE_STRIP + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-strip${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "strip" FORCE) +set(CMAKE_RANLIB + ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin/${ANDROID_ARCH}-ranlib${CMAKE_EXECUTABLE_SUFFIX} CACHE PATH "ranlib" FORCE) + +set_property(CACHE ARM_TARGETS PROPERTY STRINGS ${PossibleArmTargets} ) + +set(LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH + "root for library output, set this to change where + android libs are installed to") + +#set these flags for client use +if(ARM_TARGETS STREQUAL "armeabi") + set(ARMEABI true) + set(LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH_ROOT}/libs/armeabi + CACHE PATH "path for android libs" FORCE) + set(CMAKE_INSTALL_PREFIX ${ANDROID_NDK_TOOLCHAIN_ROOT}/user/armeabi + CACHE STRING "path for installing" FORCE) + set(NEON false) +elseif(ARM_TARGETS STREQUAL "x86") + set( LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH_ROOT}/libs/x86 + CACHE PATH "path for android libs" FORCE) + set( CMAKE_INSTALL_PREFIX ${ANDROID_NDK_TOOLCHAIN_ROOT}/user/x86 + CACHE STRING "path for installing" FORCE) +elseif(ARM_TARGETS STREQUAL "x86_64") + set( LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH_ROOT}/libs/x86_64 + CACHE PATH "path for android libs" FORCE) + set( CMAKE_INSTALL_PREFIX ${ANDROID_NDK_TOOLCHAIN_ROOT}/user/x86_64 + CACHE STRING "path for installing" FORCE) +else() + if(ARM_TARGETS STREQUAL "armeabi-v7a with NEON") + set(NEON true) + endif() + set(ARMEABI_V7A true) + set( LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH_ROOT}/libs/armeabi-v7a + CACHE PATH "path for android libs" FORCE) + set( CMAKE_INSTALL_PREFIX ${ANDROID_NDK_TOOLCHAIN_ROOT}/user/armeabi-v7a + CACHE STRING "path for installing" FORCE) +endif() + +# where is the target environment +SET(CMAKE_FIND_ROOT_PATH ${ANDROID_NDK_TOOLCHAIN_ROOT}/bin ${ANDROID_NDK_TOOLCHAIN_ROOT}/arm-linux-androideabi ${ANDROID_NDK_TOOLCHAIN_ROOT}/sysroot ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_PREFIX}/share) + +SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) +# only search for libraries and includes in the ndk toolchain +SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + +if(ARM_TARGETS STREQUAL "x86") + SET(CMAKE_CXX_FLAGS "-DGL_GLEXT_PROTOTYPES -fPIC -DANDROID -Wno-psabi") + SET(CMAKE_C_FLAGS "-DGL_GLEXT_PROTOTYPES -fPIC -DANDROID -Wno-psabi") +elseif(ARM_TARGETS STREQUAL "x86_64") + SET(CMAKE_CXX_FLAGS "-DGL_GLEXT_PROTOTYPES -fPIC -DANDROID -Wno-psabi") + SET(CMAKE_C_FLAGS "-DGL_GLEXT_PROTOTYPES -fPIC -DANDROID -Wno-psabi") +else() + #Setup arm specific stuff + #It is recommended to use the -mthumb compiler flag to force the generation + #of 16-bit Thumb-1 instructions (the default being 32-bit ARM ones). + SET(CMAKE_CXX_FLAGS "-DGL_GLEXT_PROTOTYPES -fPIC -DANDROID -mthumb -Wno-psabi") + SET(CMAKE_C_FLAGS "-DGL_GLEXT_PROTOTYPES -fPIC -DANDROID -mthumb -Wno-psabi") + + #these are required flags for android armv7-a + if(WANT_ANDROID_LEGACY) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv6") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv6") + SET(ALLEGRO_CFG_ANDROID_LEGACY 1) + else(WANT_ANDROID_LEGACY) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -mfloat-abi=softfp") + if(NEON) + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mfpu=neon") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mfpu=neon") + endif() + endif(WANT_ANDROID_LEGACY) + + #-Wl,-L${LIBCPP_LINK_DIR},-lstdc++,-lsupc++ + #-L${LIBCPP_LINK_DIR} -lstdc++ -lsupc++ + #Also, this is *required* to use the following linker flags that routes around + #a CPU bug in some Cortex-A8 implementations: + + SET(CMAKE_SHARED_LINKER_FLAGS "-Wl,--fix-cortex-a8 -L${CMAKE_INSTALL_PREFIX}/lib" CACHE STRING "linker flags" FORCE) + SET(CMAKE_MODULE_LINKER_FLAGS "-Wl,--fix-cortex-a8 -L${CMAKE_INSTALL_PREFIX}/lib" CACHE STRING "linker flags" FORCE) +endif() + +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags") +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags") + +#set these global flags for cmake client scripts to change behavior +set(ANDROID True) +set(BUILD_ANDROID True) diff --git a/cmake/libsuperderpy.cmake b/cmake/libsuperderpy.cmake index 33cd597..8c8dc73 100644 --- a/cmake/libsuperderpy.cmake +++ b/cmake/libsuperderpy.cmake @@ -49,6 +49,8 @@ if(APPLE) find_package(Allegro5Main) endif(APPLE) +include_directories(${ALLEGRO5_INCLUDE_DIR} ${ALLEGRO5_FONT_INCLUDE_DIR} ${ALLEGRO5_TTF_INCLUDE_DIR} ${ALLEGRO5_PRIMITIVES_INCLUDE_DIR} ${ALLEGRO5_AUDIO_INCLUDE_DIR} ${ALLEGRO5_ACODEC_INCLUDE_DIR} ${ALLEGRO5_IMAGE_INCLUDE_DIR}) + MACRO(register_gamestate name) add_library("libsuperderpy-${LIBSUPERDERPY_GAMENAME}-${name}" SHARED "${name}") @@ -67,9 +69,9 @@ ENDMACRO() MACRO(libsuperderpy_copy EXECUTABLE) - if (NOT APPLE) + if (NOT APPLE AND NOT ANDROID) add_custom_command(TARGET "${EXECUTABLE}" PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "../libsuperderpy/src/libsuperderpy${CMAKE_SHARED_LIBRARY_SUFFIX}" $) - endif (NOT APPLE) + endif (NOT APPLE AND NOT ANDROID) ENDMACRO() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b572cbc..195a801 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,8 +12,6 @@ add_library("libsuperderpy" SHARED ${SRC_LIST}) SET_TARGET_PROPERTIES("libsuperderpy" PROPERTIES PREFIX "") -include_directories(${ALLEGRO5_INCLUDE_DIR} ${ALLEGRO5_FONT_INCLUDE_DIR} ${ALLEGRO5_TTF_INCLUDE_DIR} ${ALLEGRO5_PRIMITIVES_INCLUDE_DIR} ${ALLEGRO5_AUDIO_INCLUDE_DIR} ${ALLEGRO5_ACODEC_INCLUDE_DIR} ${ALLEGRO5_IMAGE_INCLUDE_DIR}) - target_link_libraries("libsuperderpy" ${ALLEGRO5_LIBRARIES} ${ALLEGRO5_FONT_LIBRARIES} ${ALLEGRO5_TTF_LIBRARIES} ${ALLEGRO5_PRIMITIVES_LIBRARIES} ${ALLEGRO5_AUDIO_LIBRARIES} ${ALLEGRO5_ACODEC_LIBRARIES} ${ALLEGRO5_IMAGE_LIBRARIES} m dl) install(TARGETS "libsuperderpy" DESTINATION ${LIB_INSTALL_DIR}) diff --git a/src/libsuperderpy.c b/src/libsuperderpy.c index 6531cea..8b5f8b0 100644 --- a/src/libsuperderpy.c +++ b/src/libsuperderpy.c @@ -22,6 +22,10 @@ * * Also, ponies. */ +#ifdef LIBSUPERDERPY_MOUSE_EMULATION +#define ALLEGRO_UNSTABLE +#endif + #include #include #include @@ -120,6 +124,12 @@ SYMBOL_EXPORT struct Game* libsuperderpy_init(int argc, char** argv, const char* return NULL; } + al_install_touch_input(); + +#ifdef LIBSUPERDERPY_MOUSE_EMULATION + al_set_mouse_emulation_mode(ALLEGRO_MOUSE_EMULATION_TRANSPARENT); +#endif + al_set_new_display_flags(ALLEGRO_PROGRAMMABLE_PIPELINE | (game->config.fullscreen ? ALLEGRO_FULLSCREEN_WINDOW : ALLEGRO_WINDOWED) | ALLEGRO_RESIZABLE | ALLEGRO_OPENGL ); al_set_new_display_option(ALLEGRO_VSYNC, 2-atoi(GetConfigOptionDefault(game, "SuperDerpy", "vsync", "1")), ALLEGRO_SUGGEST); al_set_new_display_option(ALLEGRO_OPENGL, atoi(GetConfigOptionDefault(game, "SuperDerpy", "opengl", "1")), ALLEGRO_SUGGEST); @@ -134,6 +144,11 @@ SYMBOL_EXPORT struct Game* libsuperderpy_init(int argc, char** argv, const char* return NULL; } +#ifdef ALLEGRO_ANDROID + al_android_set_apk_file_interface(); + al_android_set_apk_fs_interface(); +#endif + SetupViewport(game, viewport); PrintConsole(game, "Viewport %dx%d", game->viewport.width, game->viewport.height); @@ -192,6 +207,10 @@ SYMBOL_EXPORT int libsuperderpy_run(struct Game *game) { al_register_event_source(game->_priv.event_queue, al_get_display_event_source(game->display)); al_register_event_source(game->_priv.event_queue, al_get_mouse_event_source()); al_register_event_source(game->_priv.event_queue, al_get_keyboard_event_source()); + al_register_event_source(game->_priv.event_queue, al_get_touch_input_event_source()); +#ifdef LIBSUPERDERPY_MOUSE_EMULATION + al_register_event_source(game->_priv.event_queue, al_get_touch_input_mouse_emulation_event_source()); +#endif al_register_event_source(game->_priv.event_queue, &(game->event_source)); al_clear_to_color(al_map_rgb(0,0,0)); @@ -232,12 +251,13 @@ SYMBOL_EXPORT int libsuperderpy_run(struct Game *game) { game->_priv.loading.data = (*game->_priv.loading.Load)(game); bool redraw = false; + game->_priv.draw = true; while(1) { // TODO: split mainloop to functions to make it readable ALLEGRO_EVENT ev; - if ((redraw && al_is_event_queue_empty(game->_priv.event_queue)) || (game->_priv.gamestate_scheduled)) { + if ((game->_priv.draw && redraw && al_is_event_queue_empty(game->_priv.event_queue)) || (game->_priv.gamestate_scheduled)) { game->_priv.gamestate_scheduled = false; struct Gamestate *tmp = game->_priv.gamestates; @@ -377,9 +397,24 @@ SYMBOL_EXPORT int libsuperderpy_run(struct Game *game) { else if(ev.type == ALLEGRO_EVENT_DISPLAY_FOUND) { SetupViewport(game, game->viewport_config); } + else if(ev.type == ALLEGRO_EVENT_DISPLAY_HALT_DRAWING) { + al_stop_timer(game->_priv.timer); + game->_priv.draw = false; + al_detach_voice(game->audio.v); + al_acknowledge_drawing_halt(game->display); + } + else if(ev.type == ALLEGRO_EVENT_DISPLAY_RESUME_DRAWING) { + al_acknowledge_drawing_resume(game->display); + al_attach_mixer_to_voice(game->audio.mixer, game->audio.v); + game->_priv.draw = true; + al_resume_timer(game->_priv.timer); + SetupViewport(game, game->viewport_config); + } else if(ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE) { al_acknowledge_resize(game->display); - SetupViewport(game, game->viewport_config); + if (game->_priv.draw) { + SetupViewport(game, game->viewport_config); + } } #ifdef ALLEGRO_MACOSX else if ((ev.type == ALLEGRO_EVENT_KEY_DOWN) && (ev.keyboard.keycode == 104)) { //TODO: report to upstream diff --git a/src/libsuperderpy.h b/src/libsuperderpy.h index e52d778..cf6b443 100644 --- a/src/libsuperderpy.h +++ b/src/libsuperderpy.h @@ -30,6 +30,9 @@ #include #include #include +#ifdef ALLEGRO_ANDROID +#include +#endif #include #include "gamestate.h" #include "config.h" @@ -118,6 +121,8 @@ struct Game { struct libsuperderpy_list *garbage; + bool draw; + #ifdef ALLEGRO_MACOSX char cwd[MAXPATHLEN]; #endif