diff --git a/CMakeLists.txt b/CMakeLists.txt index 290b7d6c3..0f9d6697c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,7 +209,7 @@ if(ANDROID) message(STATUS "FREERDP_ANDROID_EXTERNAL_SSL_PATH not set! - Needs to be set if openssl is not found in the android NDK (which usually isn't)") endif() set(CMAKE_FIND_ROOT_PATH ${CMAKE_FIND_ROOT_PATH} ${FREERDP_ANDROID_EXTERNAL_SSL_PATH}) - set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/client/Android/libs/${ANDROID_ABI}) + set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/client/Android/FreeRDPCore/libs/${ANDROID_ABI}) endif() set(CMAKE_THREAD_PREFER_PTHREAD TRUE) diff --git a/client/Android/AndroidManifest.xml.cmake b/client/Android/AndroidManifest.xml.cmake deleted file mode 100644 index 0fd9e9c1b..000000000 --- a/client/Android/AndroidManifest.xml.cmake +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/Android/CMakeLists.txt b/client/Android/CMakeLists.txt index bf543ed2e..9557f7e63 100644 --- a/client/Android/CMakeLists.txt +++ b/client/Android/CMakeLists.txt @@ -1,7 +1,6 @@ # FreeRDP: A Remote Desktop Protocol Implementation # Android Client # -# Copyright 2012 Marc-Andre Moreau # Copyright 2013 Bernhard Miklautz # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,23 +15,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -set(ANDROID_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) -set(ANDROID_PACKAGE_NAME "aFreeRDP") - -CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml.cmake ${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml @ONLY) - -if (ANDROID_SDK) - CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/local.properties.cmake ${CMAKE_CURRENT_SOURCE_DIR}/local.properties @ONLY) -endif() - -add_subdirectory(jni) - - if(ANDROID_BUILD_JAVA) if (NOT ANDROID_SDK) message(FATAL_ERROR "ANDROID_SDK not set but required for building the java gui (ANDROID_BUILD_JAVA)") endif() - # And isn't shiped with the android ndk/sdk so # we need to find it on the local machine SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER, BOTH) @@ -43,22 +29,12 @@ if(ANDROID_BUILD_JAVA) message(FATAL_ERROR "ant not found but required to build android java") endif() - if(ANDROID_BUILD_JAVA_DEBUG) + if(ANDROID_BUILD_JAVA_DEBUG) set(ANDROID_BUILD_TYPE "debug") - set(APK "${ANDROID_SOURCE_DIR}/bin/${ANDROID_PACKAGE_NAME}-release-unsigned.apk") else() set(ANDROID_BUILD_TYPE "release") - set(APK "${ANDROID_SOURCE_DIR}/bin/${ANDROID_PACKAGE_NAME}-debug.apk") endif() +endif(ANDROID_BUILD_JAVA) - # command to create the android package - add_custom_command( - OUTPUT "${APK}" - COMMAND ${ANT_COMMAND} ${ANDROID_BUILD_TYPE} - WORKING_DIRECTORY "${ANDROID_SOURCE_DIR}" - MAIN_DEPENDENCY AndroidManifest.xml - DEPENDS freerdp-android local.properties - ) - add_custom_target(android-package ALL SOURCES "${APK}") - SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "gen;bin") -endif() +add_subdirectory(FreeRDPCore) +add_subdirectory(aFreeRDP) diff --git a/client/Android/FreeRDPCore/.classpath b/client/Android/FreeRDPCore/.classpath new file mode 100644 index 000000000..a4763d1ee --- /dev/null +++ b/client/Android/FreeRDPCore/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/Android/FreeRDPCore/.project b/client/Android/FreeRDPCore/.project new file mode 100644 index 000000000..85408c31b --- /dev/null +++ b/client/Android/FreeRDPCore/.project @@ -0,0 +1,33 @@ + + + FreeRDPCore + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/client/Android/FreeRDPCore/AndroidManifest.xml.cmake b/client/Android/FreeRDPCore/AndroidManifest.xml.cmake new file mode 100644 index 000000000..03344d43f --- /dev/null +++ b/client/Android/FreeRDPCore/AndroidManifest.xml.cmake @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/Android/FreeRDPCore/CMakeLists.txt b/client/Android/FreeRDPCore/CMakeLists.txt new file mode 100644 index 000000000..005e90d45 --- /dev/null +++ b/client/Android/FreeRDPCore/CMakeLists.txt @@ -0,0 +1,44 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# Android Client +# +# Copyright 2012 Marc-Andre Moreau +# Copyright 2013 Bernhard Miklautz +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(ANDROID_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(ANDROID_PACKAGE_NAME "aFreeRDPCore") + +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml.cmake ${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml @ONLY) + +if (ANDROID_SDK) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/local.properties.cmake ${CMAKE_CURRENT_SOURCE_DIR}/local.properties @ONLY) +endif() + +add_subdirectory(jni) + + +if(ANDROID_BUILD_JAVA) + set(ANDROIDLIB "${ANDROID_SOURCE_DIR}/bin/classes.jar") + + # command to create the android package + add_custom_command( + OUTPUT "${ANDROIDLIB}" + COMMAND ${ANT_COMMAND} ${ANDROID_BUILD_TYPE} + WORKING_DIRECTORY "${ANDROID_SOURCE_DIR}" + MAIN_DEPENDENCY AndroidManifest.xml + DEPENDS freerdp-android local.properties + ) + add_custom_target(android-lib ALL SOURCES "${ANDROIDLIB}") + SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "gen;bin") +endif() diff --git a/client/Android/FreeRDPCore/ant.properties b/client/Android/FreeRDPCore/ant.properties new file mode 100644 index 000000000..73031c7a7 --- /dev/null +++ b/client/Android/FreeRDPCore/ant.properties @@ -0,0 +1,16 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked into Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. diff --git a/client/Android/FreeRDPCore/build.xml b/client/Android/FreeRDPCore/build.xml new file mode 100644 index 000000000..f07d7de42 --- /dev/null +++ b/client/Android/FreeRDPCore/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/Android/jni/CMakeLists.txt b/client/Android/FreeRDPCore/jni/CMakeLists.txt similarity index 100% rename from client/Android/jni/CMakeLists.txt rename to client/Android/FreeRDPCore/jni/CMakeLists.txt diff --git a/client/Android/jni/android_debug.h b/client/Android/FreeRDPCore/jni/android_debug.h similarity index 100% rename from client/Android/jni/android_debug.h rename to client/Android/FreeRDPCore/jni/android_debug.h diff --git a/client/Android/jni/android_event.c b/client/Android/FreeRDPCore/jni/android_event.c similarity index 100% rename from client/Android/jni/android_event.c rename to client/Android/FreeRDPCore/jni/android_event.c diff --git a/client/Android/jni/android_event.h b/client/Android/FreeRDPCore/jni/android_event.h similarity index 100% rename from client/Android/jni/android_event.h rename to client/Android/FreeRDPCore/jni/android_event.h diff --git a/client/Android/jni/android_freerdp.c b/client/Android/FreeRDPCore/jni/android_freerdp.c similarity index 99% rename from client/Android/jni/android_freerdp.c rename to client/Android/FreeRDPCore/jni/android_freerdp.c index 6a31ebc0e..7f84dea75 100644 --- a/client/Android/jni/android_freerdp.c +++ b/client/Android/FreeRDPCore/jni/android_freerdp.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -536,7 +537,10 @@ JNIEXPORT void JNICALL jni_freerdp_set_data_directory(JNIEnv *env, jclass cls, j const jbyte *directory = (*env)->GetStringUTFChars(env, jdirectory, NULL); free(settings->HomePath); + free(settings->ConfigPath); settings->HomePath = strdup(directory); + settings->ConfigPath = NULL; + freerdp_detect_paths(settings); (*env)->ReleaseStringUTFChars(env, jdirectory, directory); } @@ -655,7 +659,6 @@ JNIEXPORT void JNICALL jni_freerdp_set_performance_flags( settings->FastPathOutput = TRUE; settings->ColorDepth = 32; settings->LargePointerFlag = TRUE; - settings->PerformanceFlags = PERF_FLAG_NONE; settings->FrameMarkerCommandEnabled = TRUE; } @@ -680,6 +683,7 @@ JNIEXPORT void JNICALL jni_freerdp_set_performance_flags( /* Create performance flags from settings */ + settings->PerformanceFlags = PERF_FLAG_NONE; if (settings->AllowFontSmoothing) settings->PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING; diff --git a/client/Android/jni/android_freerdp.h b/client/Android/FreeRDPCore/jni/android_freerdp.h similarity index 100% rename from client/Android/jni/android_freerdp.h rename to client/Android/FreeRDPCore/jni/android_freerdp.h diff --git a/client/Android/jni/android_jni_callback.c b/client/Android/FreeRDPCore/jni/android_jni_callback.c similarity index 100% rename from client/Android/jni/android_jni_callback.c rename to client/Android/FreeRDPCore/jni/android_jni_callback.c diff --git a/client/Android/jni/android_jni_callback.h b/client/Android/FreeRDPCore/jni/android_jni_callback.h similarity index 100% rename from client/Android/jni/android_jni_callback.h rename to client/Android/FreeRDPCore/jni/android_jni_callback.h diff --git a/client/Android/jni/generated/android_freerdp_jni.c b/client/Android/FreeRDPCore/jni/generated/android_freerdp_jni.c similarity index 59% rename from client/Android/jni/generated/android_freerdp_jni.c rename to client/Android/FreeRDPCore/jni/generated/android_freerdp_jni.c index 8d64e094c..308c146cb 100644 --- a/client/Android/jni/generated/android_freerdp_jni.c +++ b/client/Android/FreeRDPCore/jni/generated/android_freerdp_jni.c @@ -20,32 +20,32 @@ #include "android_freerdp.h" #include "android_freerdp_jni.h" -JNIEXPORT jint JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1new(JNIEnv *env, jclass cls) +JNIEXPORT jint JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1new(JNIEnv *env, jclass cls) { return jni_freerdp_new(env, cls); } -JNIEXPORT void JNICALL JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1free(JNIEnv *env, jclass cls, jint instance) +JNIEXPORT void JNICALL JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1free(JNIEnv *env, jclass cls, jint instance) { jni_freerdp_free(env, cls, instance); } -JNIEXPORT jboolean JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1connect(JNIEnv *env, jclass cls, jint instance) +JNIEXPORT jboolean JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1connect(JNIEnv *env, jclass cls, jint instance) { return jni_freerdp_connect(env, cls, instance); } -JNIEXPORT jboolean JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1disconnect(JNIEnv *env, jclass cls, jint instance) +JNIEXPORT jboolean JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1disconnect(JNIEnv *env, jclass cls, jint instance) { return jni_freerdp_disconnect(env, cls, instance); } -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1cancel_1connection(JNIEnv *env, jclass cls, jint instance) +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1cancel_1connection(JNIEnv *env, jclass cls, jint instance) { jni_freerdp_cancel_connection(env, cls, instance); } -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1set_1connection_1info(JNIEnv *env, jclass cls, jint instance, +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1connection_1info(JNIEnv *env, jclass cls, jint instance, jstring jhostname, jstring jusername, jstring jpassword, jstring jdomain, jint width, jint height, jint color_depth, jint port, jboolean console, jint security, jstring certname) { @@ -53,48 +53,48 @@ JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1se width, height, color_depth, port, console, security, certname); } -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1set_1advanced_1settings(JNIEnv *env, jclass cls, jint instance, jstring remote_program, jstring work_dir) +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1advanced_1settings(JNIEnv *env, jclass cls, jint instance, jstring remote_program, jstring work_dir) { jni_freerdp_set_advanced_settings(env, cls, instance, remote_program, work_dir); } -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1set_1data_1directory(JNIEnv *env, jclass cls, jint instance, jstring directory) +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1data_1directory(JNIEnv *env, jclass cls, jint instance, jstring directory) { jni_freerdp_set_data_directory(env, cls, instance, directory); } -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1set_1performance_1flags( +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1performance_1flags( JNIEnv *env, jclass cls, jint instance, jboolean remotefx, jboolean disableWallpaper, jboolean disableFullWindowDrag, jboolean disableMenuAnimations, jboolean disableTheming, jboolean enableFontSmoothing, jboolean enableDesktopComposition) { jni_freerdp_set_performance_flags(env, cls, instance, remotefx, disableWallpaper, disableFullWindowDrag, disableMenuAnimations, disableTheming, enableFontSmoothing, enableDesktopComposition); } -JNIEXPORT jboolean JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1update_1graphics( +JNIEXPORT jboolean JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1update_1graphics( JNIEnv *env, jclass cls, jint instance, jobject bitmap, jint x, jint y, jint width, jint height) { return jni_freerdp_update_graphics(env, cls, instance, bitmap, x, y, width, height); } -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1send_1cursor_1event( +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1send_1cursor_1event( JNIEnv *env, jclass cls, jint instance, jint x, jint y, jint flags) { jni_freerdp_send_cursor_event(env, cls, instance, x, y, flags); } -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1send_1key_1event( +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1send_1key_1event( JNIEnv *env, jclass cls, jint instance, jint keycode, jboolean down) { jni_freerdp_send_key_event(env, cls, instance, keycode, down); } -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1send_1unicodekey_1event +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1send_1unicodekey_1event (JNIEnv *env, jclass cls, jint instance, jint keycode) { jni_freerdp_send_unicodekey_event(env, cls, instance, keycode); } -JNIEXPORT jstring JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1get_1version(JNIEnv *env, jclass cls) +JNIEXPORT jstring JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1get_1version(JNIEnv *env, jclass cls) { return jni_freerdp_get_version(env, cls); } diff --git a/client/Android/jni/generated/android_freerdp_jni.h b/client/Android/FreeRDPCore/jni/generated/android_freerdp_jni.h similarity index 85% rename from client/Android/jni/generated/android_freerdp_jni.h rename to client/Android/FreeRDPCore/jni/generated/android_freerdp_jni.h index a10d17cc6..fab4c7290 100644 --- a/client/Android/jni/generated/android_freerdp_jni.h +++ b/client/Android/FreeRDPCore/jni/generated/android_freerdp_jni.h @@ -20,9 +20,9 @@ #ifndef __ANDROID_FREERDP_JNI_H #define __ANDROID_FREERDP_JNI_H -#include "com_freerdp_afreerdp_services_LibFreeRDP.h" +#include "com_freerdp_freerdpcore_services_LibFreeRDP.h" -#define JAVA_LIBFREERDP_CLASS "com/freerdp/afreerdp/services/LibFreeRDP" +#define JAVA_LIBFREERDP_CLASS "com/freerdp/freerdpcore/services/LibFreeRDP" #endif /* __ANDROID_FREERDP_JNI_H */ diff --git a/client/Android/FreeRDPCore/jni/generated/com_freerdp_freerdpcore_services_LibFreeRDP.h b/client/Android/FreeRDPCore/jni/generated/com_freerdp_freerdpcore_services_LibFreeRDP.h new file mode 100644 index 000000000..17c62cd99 --- /dev/null +++ b/client/Android/FreeRDPCore/jni/generated/com_freerdp_freerdpcore_services_LibFreeRDP.h @@ -0,0 +1,125 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_freerdp_freerdpcore_services_LibFreeRDP */ + +#ifndef _Included_com_freerdp_freerdpcore_services_LibFreeRDP +#define _Included_com_freerdp_freerdpcore_services_LibFreeRDP +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_new + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1new + (JNIEnv *, jclass); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_free + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1free + (JNIEnv *, jclass, jint); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_connect + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1connect + (JNIEnv *, jclass, jint); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_disconnect + * Signature: (I)Z + */ +JNIEXPORT jboolean JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1disconnect + (JNIEnv *, jclass, jint); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_cancel_connection + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1cancel_1connection + (JNIEnv *, jclass, jint); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_set_connection_info + * Signature: (ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIZILjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1connection_1info + (JNIEnv *, jclass, jint, jstring, jstring, jstring, jstring, jint, jint, jint, jint, jboolean, jint, jstring); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_set_performance_flags + * Signature: (IZZZZZZZ)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1performance_1flags + (JNIEnv *, jclass, jint, jboolean, jboolean, jboolean, jboolean, jboolean, jboolean, jboolean); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_set_advanced_settings + * Signature: (ILjava/lang/String;Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1advanced_1settings + (JNIEnv *, jclass, jint, jstring, jstring); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_set_data_directory + * Signature: (ILjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1set_1data_1directory + (JNIEnv *, jclass, jint, jstring); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_update_graphics + * Signature: (ILandroid/graphics/Bitmap;IIII)Z + */ +JNIEXPORT jboolean JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1update_1graphics + (JNIEnv *, jclass, jint, jobject, jint, jint, jint, jint); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_send_cursor_event + * Signature: (IIII)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1send_1cursor_1event + (JNIEnv *, jclass, jint, jint, jint, jint); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_send_key_event + * Signature: (IIZ)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1send_1key_1event + (JNIEnv *, jclass, jint, jint, jboolean); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_send_unicodekey_event + * Signature: (II)V + */ +JNIEXPORT void JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1send_1unicodekey_1event + (JNIEnv *, jclass, jint, jint); + +/* + * Class: com_freerdp_freerdpcore_services_LibFreeRDP + * Method: freerdp_get_version + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_com_freerdp_freerdpcore_services_LibFreeRDP_freerdp_1get_1version + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/client/Android/local.properties.cmake b/client/Android/FreeRDPCore/local.properties.cmake similarity index 100% rename from client/Android/local.properties.cmake rename to client/Android/FreeRDPCore/local.properties.cmake diff --git a/client/Android/FreeRDPCore/project.properties b/client/Android/FreeRDPCore/project.properties new file mode 100644 index 000000000..db721fd89 --- /dev/null +++ b/client/Android/FreeRDPCore/project.properties @@ -0,0 +1,15 @@ +# 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-8 +android.library=true diff --git a/client/Android/res/drawable-hdpi/icon_button_add.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_button_add.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_button_add.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_button_add.png diff --git a/client/Android/res/drawable-hdpi/icon_edittext_clear.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_edittext_clear.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_edittext_clear.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_edittext_clear.png diff --git a/client/Android/res/drawable-hdpi/icon_edittext_search.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_edittext_search.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_edittext_search.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_edittext_search.png diff --git a/client/Android/res/drawable-hdpi/icon_launcher_freerdp.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_launcher_freerdp.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_launcher_freerdp.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_launcher_freerdp.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_about.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_about.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_about.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_about.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_add.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_add.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_add.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_add.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_close.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_close.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_close.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_close.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_disconnect.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_disconnect.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_disconnect.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_disconnect.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_ext_keyboard.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_ext_keyboard.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_ext_keyboard.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_ext_keyboard.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_help.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_help.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_help.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_help.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_preferences.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_preferences.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_preferences.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_preferences.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_settings.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_settings.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_settings.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_settings.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_sys_keyboard.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_sys_keyboard.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_sys_keyboard.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_sys_keyboard.png diff --git a/client/Android/res/drawable-hdpi/icon_menu_touch_pointer.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_touch_pointer.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_menu_touch_pointer.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_menu_touch_pointer.png diff --git a/client/Android/res/drawable-hdpi/icon_star_off.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_star_off.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_star_off.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_star_off.png diff --git a/client/Android/res/drawable-hdpi/icon_star_on.png b/client/Android/FreeRDPCore/res/drawable-hdpi/icon_star_on.png similarity index 100% rename from client/Android/res/drawable-hdpi/icon_star_on.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/icon_star_on.png diff --git a/client/Android/res/drawable-hdpi/search_plate.9.png b/client/Android/FreeRDPCore/res/drawable-hdpi/search_plate.9.png similarity index 100% rename from client/Android/res/drawable-hdpi/search_plate.9.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/search_plate.9.png diff --git a/client/Android/res/drawable-hdpi/sym_keyboard_delete.png b/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_delete.png similarity index 100% rename from client/Android/res/drawable-hdpi/sym_keyboard_delete.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_delete.png diff --git a/client/Android/res/drawable-hdpi/sym_keyboard_feedback_delete.png b/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_delete.png similarity index 100% rename from client/Android/res/drawable-hdpi/sym_keyboard_feedback_delete.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_delete.png diff --git a/client/Android/res/drawable-hdpi/sym_keyboard_feedback_return.png b/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_return.png similarity index 100% rename from client/Android/res/drawable-hdpi/sym_keyboard_feedback_return.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_feedback_return.png diff --git a/client/Android/res/drawable-hdpi/sym_keyboard_return.png b/client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_return.png similarity index 100% rename from client/Android/res/drawable-hdpi/sym_keyboard_return.png rename to client/Android/FreeRDPCore/res/drawable-hdpi/sym_keyboard_return.png diff --git a/client/Android/res/drawable-ldpi/icon_button_add.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_button_add.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_button_add.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_button_add.png diff --git a/client/Android/res/drawable-ldpi/icon_edittext_search.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_edittext_search.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_edittext_search.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_edittext_search.png diff --git a/client/Android/res/drawable-ldpi/icon_launcher_freerdp.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_launcher_freerdp.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_launcher_freerdp.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_launcher_freerdp.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_about.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_about.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_about.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_about.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_add.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_add.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_add.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_add.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_disconnect.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_disconnect.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_disconnect.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_disconnect.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_exit.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_exit.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_exit.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_exit.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_ext_keyboard.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_ext_keyboard.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_ext_keyboard.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_ext_keyboard.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_help.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_help.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_help.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_help.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_preferences.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_preferences.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_preferences.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_preferences.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_settings.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_settings.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_settings.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_settings.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_sys_keyboard.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_sys_keyboard.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_sys_keyboard.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_sys_keyboard.png diff --git a/client/Android/res/drawable-ldpi/icon_menu_touch_pointer.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_touch_pointer.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_menu_touch_pointer.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_menu_touch_pointer.png diff --git a/client/Android/res/drawable-ldpi/icon_star_off.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_star_off.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_star_off.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_star_off.png diff --git a/client/Android/res/drawable-ldpi/icon_star_on.png b/client/Android/FreeRDPCore/res/drawable-ldpi/icon_star_on.png similarity index 100% rename from client/Android/res/drawable-ldpi/icon_star_on.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/icon_star_on.png diff --git a/client/Android/res/drawable-ldpi/search_plate.9.png b/client/Android/FreeRDPCore/res/drawable-ldpi/search_plate.9.png similarity index 100% rename from client/Android/res/drawable-ldpi/search_plate.9.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/search_plate.9.png diff --git a/client/Android/res/drawable-ldpi/sym_keyboard_delete.png b/client/Android/FreeRDPCore/res/drawable-ldpi/sym_keyboard_delete.png similarity index 100% rename from client/Android/res/drawable-ldpi/sym_keyboard_delete.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/sym_keyboard_delete.png diff --git a/client/Android/res/drawable-ldpi/sym_keyboard_feedback_delete.png b/client/Android/FreeRDPCore/res/drawable-ldpi/sym_keyboard_feedback_delete.png similarity index 100% rename from client/Android/res/drawable-ldpi/sym_keyboard_feedback_delete.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/sym_keyboard_feedback_delete.png diff --git a/client/Android/res/drawable-ldpi/sym_keyboard_feedback_return.png b/client/Android/FreeRDPCore/res/drawable-ldpi/sym_keyboard_feedback_return.png similarity index 100% rename from client/Android/res/drawable-ldpi/sym_keyboard_feedback_return.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/sym_keyboard_feedback_return.png diff --git a/client/Android/res/drawable-ldpi/sym_keyboard_return.png b/client/Android/FreeRDPCore/res/drawable-ldpi/sym_keyboard_return.png similarity index 100% rename from client/Android/res/drawable-ldpi/sym_keyboard_return.png rename to client/Android/FreeRDPCore/res/drawable-ldpi/sym_keyboard_return.png diff --git a/client/Android/res/drawable-mdpi/icon_button_add.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_button_add.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_button_add.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_button_add.png diff --git a/client/Android/res/drawable-mdpi/icon_edittext_clear.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_edittext_clear.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_edittext_clear.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_edittext_clear.png diff --git a/client/Android/res/drawable-mdpi/icon_edittext_search.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_edittext_search.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_edittext_search.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_edittext_search.png diff --git a/client/Android/res/drawable-mdpi/icon_launcher_freerdp.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_launcher_freerdp.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_launcher_freerdp.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_launcher_freerdp.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_about.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_about.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_about.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_about.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_add.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_add.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_add.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_add.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_disconnect.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_disconnect.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_disconnect.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_disconnect.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_exit.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_exit.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_exit.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_exit.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_ext_keyboard.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_ext_keyboard.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_ext_keyboard.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_ext_keyboard.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_help.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_help.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_help.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_help.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_preferences.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_preferences.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_preferences.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_preferences.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_settings.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_settings.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_settings.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_settings.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_sys_keyboard.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_sys_keyboard.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_sys_keyboard.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_sys_keyboard.png diff --git a/client/Android/res/drawable-mdpi/icon_menu_touch_pointer.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_touch_pointer.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_menu_touch_pointer.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_menu_touch_pointer.png diff --git a/client/Android/res/drawable-mdpi/icon_star_off.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_off.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_star_off.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_off.png diff --git a/client/Android/res/drawable-mdpi/icon_star_on.png b/client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_on.png similarity index 100% rename from client/Android/res/drawable-mdpi/icon_star_on.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/icon_star_on.png diff --git a/client/Android/res/drawable-mdpi/search_plate.9.png b/client/Android/FreeRDPCore/res/drawable-mdpi/search_plate.9.png similarity index 100% rename from client/Android/res/drawable-mdpi/search_plate.9.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/search_plate.9.png diff --git a/client/Android/res/drawable-mdpi/sym_keyboard_delete.png b/client/Android/FreeRDPCore/res/drawable-mdpi/sym_keyboard_delete.png similarity index 100% rename from client/Android/res/drawable-mdpi/sym_keyboard_delete.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/sym_keyboard_delete.png diff --git a/client/Android/res/drawable-mdpi/sym_keyboard_feedback_delete.png b/client/Android/FreeRDPCore/res/drawable-mdpi/sym_keyboard_feedback_delete.png similarity index 100% rename from client/Android/res/drawable-mdpi/sym_keyboard_feedback_delete.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/sym_keyboard_feedback_delete.png diff --git a/client/Android/res/drawable-mdpi/sym_keyboard_feedback_return.png b/client/Android/FreeRDPCore/res/drawable-mdpi/sym_keyboard_feedback_return.png similarity index 100% rename from client/Android/res/drawable-mdpi/sym_keyboard_feedback_return.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/sym_keyboard_feedback_return.png diff --git a/client/Android/res/drawable-mdpi/sym_keyboard_return.png b/client/Android/FreeRDPCore/res/drawable-mdpi/sym_keyboard_return.png similarity index 100% rename from client/Android/res/drawable-mdpi/sym_keyboard_return.png rename to client/Android/FreeRDPCore/res/drawable-mdpi/sym_keyboard_return.png diff --git a/client/Android/res/drawable/button_background.xml b/client/Android/FreeRDPCore/res/drawable/button_background.xml similarity index 100% rename from client/Android/res/drawable/button_background.xml rename to client/Android/FreeRDPCore/res/drawable/button_background.xml diff --git a/client/Android/res/drawable/icon_button_cancel.png b/client/Android/FreeRDPCore/res/drawable/icon_button_cancel.png similarity index 100% rename from client/Android/res/drawable/icon_button_cancel.png rename to client/Android/FreeRDPCore/res/drawable/icon_button_cancel.png diff --git a/client/Android/res/drawable/icon_launcher_freerdp.png b/client/Android/FreeRDPCore/res/drawable/icon_launcher_freerdp.png similarity index 100% rename from client/Android/res/drawable/icon_launcher_freerdp.png rename to client/Android/FreeRDPCore/res/drawable/icon_launcher_freerdp.png diff --git a/client/Android/res/drawable/separator_background.xml b/client/Android/FreeRDPCore/res/drawable/separator_background.xml similarity index 100% rename from client/Android/res/drawable/separator_background.xml rename to client/Android/FreeRDPCore/res/drawable/separator_background.xml diff --git a/client/Android/res/drawable/sym_keyboard_arrows.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_arrows.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows.png diff --git a/client/Android/res/drawable/sym_keyboard_arrows_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows_black.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_arrows_black.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_arrows_black.png diff --git a/client/Android/res/drawable/sym_keyboard_down_arrow.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_down_arrow.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow.png diff --git a/client/Android/res/drawable/sym_keyboard_down_arrow_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow_black.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_down_arrow_black.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_down_arrow_black.png diff --git a/client/Android/res/drawable/sym_keyboard_left_arrow.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_left_arrow.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow.png diff --git a/client/Android/res/drawable/sym_keyboard_left_arrow_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow_black.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_left_arrow_black.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_left_arrow_black.png diff --git a/client/Android/res/drawable/sym_keyboard_menu.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_menu.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu.png diff --git a/client/Android/res/drawable/sym_keyboard_menu_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu_black.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_menu_black.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_menu_black.png diff --git a/client/Android/res/drawable/sym_keyboard_right_arrow.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_right_arrow.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow.png diff --git a/client/Android/res/drawable/sym_keyboard_right_arrow_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow_black.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_right_arrow_black.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_right_arrow_black.png diff --git a/client/Android/res/drawable/sym_keyboard_up_arrow.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_up_arrow.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow.png diff --git a/client/Android/res/drawable/sym_keyboard_up_arrow_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow_black.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_up_arrow_black.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_up_arrow_black.png diff --git a/client/Android/res/drawable/sym_keyboard_winkey.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_winkey.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey.png diff --git a/client/Android/res/drawable/sym_keyboard_winkey_black.png b/client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey_black.png similarity index 100% rename from client/Android/res/drawable/sym_keyboard_winkey_black.png rename to client/Android/FreeRDPCore/res/drawable/sym_keyboard_winkey_black.png diff --git a/client/Android/res/drawable/touch_pointer_active.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_active.png similarity index 100% rename from client/Android/res/drawable/touch_pointer_active.png rename to client/Android/FreeRDPCore/res/drawable/touch_pointer_active.png diff --git a/client/Android/res/drawable/touch_pointer_default.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_default.png similarity index 100% rename from client/Android/res/drawable/touch_pointer_default.png rename to client/Android/FreeRDPCore/res/drawable/touch_pointer_default.png diff --git a/client/Android/res/drawable/touch_pointer_extkeyboard.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_extkeyboard.png similarity index 100% rename from client/Android/res/drawable/touch_pointer_extkeyboard.png rename to client/Android/FreeRDPCore/res/drawable/touch_pointer_extkeyboard.png diff --git a/client/Android/res/drawable/touch_pointer_keyboard.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_keyboard.png similarity index 100% rename from client/Android/res/drawable/touch_pointer_keyboard.png rename to client/Android/FreeRDPCore/res/drawable/touch_pointer_keyboard.png diff --git a/client/Android/res/drawable/touch_pointer_lclick.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_lclick.png similarity index 100% rename from client/Android/res/drawable/touch_pointer_lclick.png rename to client/Android/FreeRDPCore/res/drawable/touch_pointer_lclick.png diff --git a/client/Android/res/drawable/touch_pointer_rclick.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_rclick.png similarity index 100% rename from client/Android/res/drawable/touch_pointer_rclick.png rename to client/Android/FreeRDPCore/res/drawable/touch_pointer_rclick.png diff --git a/client/Android/res/drawable/touch_pointer_reset.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_reset.png similarity index 100% rename from client/Android/res/drawable/touch_pointer_reset.png rename to client/Android/FreeRDPCore/res/drawable/touch_pointer_reset.png diff --git a/client/Android/res/drawable/touch_pointer_scroll.png b/client/Android/FreeRDPCore/res/drawable/touch_pointer_scroll.png similarity index 100% rename from client/Android/res/drawable/touch_pointer_scroll.png rename to client/Android/FreeRDPCore/res/drawable/touch_pointer_scroll.png diff --git a/client/Android/res/layout/bookmark_list_item.xml b/client/Android/FreeRDPCore/res/layout/bookmark_list_item.xml similarity index 100% rename from client/Android/res/layout/bookmark_list_item.xml rename to client/Android/FreeRDPCore/res/layout/bookmark_list_item.xml diff --git a/client/Android/res/layout/button_preference.xml b/client/Android/FreeRDPCore/res/layout/button_preference.xml similarity index 100% rename from client/Android/res/layout/button_preference.xml rename to client/Android/FreeRDPCore/res/layout/button_preference.xml diff --git a/client/Android/res/layout/credentials.xml b/client/Android/FreeRDPCore/res/layout/credentials.xml similarity index 100% rename from client/Android/res/layout/credentials.xml rename to client/Android/FreeRDPCore/res/layout/credentials.xml diff --git a/client/Android/res/layout/dont_show_again_dialog.xml b/client/Android/FreeRDPCore/res/layout/dont_show_again_dialog.xml similarity index 100% rename from client/Android/res/layout/dont_show_again_dialog.xml rename to client/Android/FreeRDPCore/res/layout/dont_show_again_dialog.xml diff --git a/client/Android/res/layout/home.xml b/client/Android/FreeRDPCore/res/layout/home.xml similarity index 100% rename from client/Android/res/layout/home.xml rename to client/Android/FreeRDPCore/res/layout/home.xml diff --git a/client/Android/res/layout/list_header.xml b/client/Android/FreeRDPCore/res/layout/list_header.xml similarity index 100% rename from client/Android/res/layout/list_header.xml rename to client/Android/FreeRDPCore/res/layout/list_header.xml diff --git a/client/Android/res/layout/session.xml b/client/Android/FreeRDPCore/res/layout/session.xml similarity index 91% rename from client/Android/res/layout/session.xml rename to client/Android/FreeRDPCore/res/layout/session.xml index aa4db7296..925e73d95 100644 --- a/client/Android/res/layout/session.xml +++ b/client/Android/FreeRDPCore/res/layout/session.xml @@ -24,7 +24,7 @@ android:visibility="gone" /> - - - + - + /> diff --git a/client/Android/res/menu/session_menu.xml b/client/Android/FreeRDPCore/res/menu/session_menu.xml similarity index 100% rename from client/Android/res/menu/session_menu.xml rename to client/Android/FreeRDPCore/res/menu/session_menu.xml diff --git a/client/Android/res/values-land/dimens.xml b/client/Android/FreeRDPCore/res/values-land/dimens.xml similarity index 100% rename from client/Android/res/values-land/dimens.xml rename to client/Android/FreeRDPCore/res/values-land/dimens.xml diff --git a/client/Android/res/values/attrs.xml b/client/Android/FreeRDPCore/res/values/attrs.xml similarity index 100% rename from client/Android/res/values/attrs.xml rename to client/Android/FreeRDPCore/res/values/attrs.xml diff --git a/client/Android/res/values/dimens.xml b/client/Android/FreeRDPCore/res/values/dimens.xml similarity index 100% rename from client/Android/res/values/dimens.xml rename to client/Android/FreeRDPCore/res/values/dimens.xml diff --git a/client/Android/res/values/integers.xml b/client/Android/FreeRDPCore/res/values/integers.xml similarity index 100% rename from client/Android/res/values/integers.xml rename to client/Android/FreeRDPCore/res/values/integers.xml diff --git a/client/Android/res/values/strings.xml b/client/Android/FreeRDPCore/res/values/strings.xml similarity index 97% rename from client/Android/res/values/strings.xml rename to client/Android/FreeRDPCore/res/values/strings.xml index 780a7aa3e..810127219 100644 --- a/client/Android/res/values/strings.xml +++ b/client/Android/FreeRDPCore/res/values/strings.xml @@ -1,7 +1,5 @@ - aFreeRDP - Yes No @@ -29,6 +27,8 @@ Manual Connections Active Sessions + + Connect to Computer Login No Servers @@ -38,10 +38,6 @@ Wrong Password Invalid Username Add Connection - - aFreeRDP - Connect to Computer - Remote Computers Host Label diff --git a/client/Android/res/values/theme.xml b/client/Android/FreeRDPCore/res/values/theme.xml similarity index 100% rename from client/Android/res/values/theme.xml rename to client/Android/FreeRDPCore/res/values/theme.xml diff --git a/client/Android/res/xml/advanced_settings.xml b/client/Android/FreeRDPCore/res/xml/advanced_settings.xml similarity index 62% rename from client/Android/res/xml/advanced_settings.xml rename to client/Android/FreeRDPCore/res/xml/advanced_settings.xml index 657a0dd7c..9158acf16 100644 --- a/client/Android/res/xml/advanced_settings.xml +++ b/client/Android/FreeRDPCore/res/xml/advanced_settings.xml @@ -15,20 +15,20 @@ - + - + - + diff --git a/client/Android/res/xml/application_settings.xml b/client/Android/FreeRDPCore/res/xml/application_settings.xml similarity index 81% rename from client/Android/res/xml/application_settings.xml rename to client/Android/FreeRDPCore/res/xml/application_settings.xml index 314b2acb9..9d7cc0a67 100644 --- a/client/Android/res/xml/application_settings.xml +++ b/client/Android/FreeRDPCore/res/xml/application_settings.xml @@ -9,7 +9,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ --> - + @@ -21,7 +21,7 @@ - + diff --git a/client/Android/FreeRDPCore/res/xml/bookmark_settings.xml b/client/Android/FreeRDPCore/res/xml/bookmark_settings.xml new file mode 100644 index 000000000..c49d4272a --- /dev/null +++ b/client/Android/FreeRDPCore/res/xml/bookmark_settings.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/Android/res/xml/credentials_settings.xml b/client/Android/FreeRDPCore/res/xml/credentials_settings.xml similarity index 100% rename from client/Android/res/xml/credentials_settings.xml rename to client/Android/FreeRDPCore/res/xml/credentials_settings.xml diff --git a/client/Android/res/xml/cursor_keyboard.xml b/client/Android/FreeRDPCore/res/xml/cursor_keyboard.xml similarity index 100% rename from client/Android/res/xml/cursor_keyboard.xml rename to client/Android/FreeRDPCore/res/xml/cursor_keyboard.xml diff --git a/client/Android/res/xml/modifiers_keyboard.xml b/client/Android/FreeRDPCore/res/xml/modifiers_keyboard.xml similarity index 100% rename from client/Android/res/xml/modifiers_keyboard.xml rename to client/Android/FreeRDPCore/res/xml/modifiers_keyboard.xml diff --git a/client/Android/res/xml/numpad_keyboard.xml b/client/Android/FreeRDPCore/res/xml/numpad_keyboard.xml similarity index 100% rename from client/Android/res/xml/numpad_keyboard.xml rename to client/Android/FreeRDPCore/res/xml/numpad_keyboard.xml diff --git a/client/Android/res/xml/performance_flags.xml b/client/Android/FreeRDPCore/res/xml/performance_flags.xml similarity index 100% rename from client/Android/res/xml/performance_flags.xml rename to client/Android/FreeRDPCore/res/xml/performance_flags.xml diff --git a/client/Android/res/xml/performance_flags_3g.xml b/client/Android/FreeRDPCore/res/xml/performance_flags_3g.xml similarity index 100% rename from client/Android/res/xml/performance_flags_3g.xml rename to client/Android/FreeRDPCore/res/xml/performance_flags_3g.xml diff --git a/client/Android/res/xml/screen_settings_3g.xml b/client/Android/FreeRDPCore/res/xml/screen_settings.xml similarity index 51% rename from client/Android/res/xml/screen_settings_3g.xml rename to client/Android/FreeRDPCore/res/xml/screen_settings.xml index de750855c..265c1c9e9 100644 --- a/client/Android/res/xml/screen_settings_3g.xml +++ b/client/Android/FreeRDPCore/res/xml/screen_settings.xml @@ -1,7 +1,7 @@ - + - - - - + + + + diff --git a/client/Android/FreeRDPCore/res/xml/screen_settings_3g.xml b/client/Android/FreeRDPCore/res/xml/screen_settings_3g.xml new file mode 100644 index 000000000..0eb0a7925 --- /dev/null +++ b/client/Android/FreeRDPCore/res/xml/screen_settings_3g.xml @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/client/Android/res/xml/specialkeys_keyboard.xml b/client/Android/FreeRDPCore/res/xml/specialkeys_keyboard.xml similarity index 100% rename from client/Android/res/xml/specialkeys_keyboard.xml rename to client/Android/FreeRDPCore/res/xml/specialkeys_keyboard.xml diff --git a/client/Android/src/com/freerdp/afreerdp/application/GlobalApp.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/GlobalApp.java similarity index 93% rename from client/Android/src/com/freerdp/afreerdp/application/GlobalApp.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/GlobalApp.java index 4fd849c21..c37f8df5a 100644 --- a/client/Android/src/com/freerdp/afreerdp/application/GlobalApp.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/GlobalApp.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.application; +package com.freerdp.freerdpcore.application; import android.app.Application; import android.content.Intent; @@ -16,13 +16,13 @@ import android.util.Log; import java.util.*; -import com.freerdp.afreerdp.application.SessionState; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.services.BookmarkDB; -import com.freerdp.afreerdp.services.HistoryDB; -import com.freerdp.afreerdp.services.LibFreeRDP; -import com.freerdp.afreerdp.services.ManualBookmarkGateway; -import com.freerdp.afreerdp.services.QuickConnectHistoryGateway; +import com.freerdp.freerdpcore.application.SessionState; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.services.BookmarkDB; +import com.freerdp.freerdpcore.services.HistoryDB; +import com.freerdp.freerdpcore.services.LibFreeRDP; +import com.freerdp.freerdpcore.services.ManualBookmarkGateway; +import com.freerdp.freerdpcore.services.QuickConnectHistoryGateway; public class GlobalApp extends Application implements LibFreeRDP.EventListener { diff --git a/client/Android/src/com/freerdp/afreerdp/application/GlobalSettings.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/GlobalSettings.java similarity index 98% rename from client/Android/src/com/freerdp/afreerdp/application/GlobalSettings.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/GlobalSettings.java index 48ef10fbb..5b876dd94 100644 --- a/client/Android/src/com/freerdp/afreerdp/application/GlobalSettings.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/GlobalSettings.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.application; +package com.freerdp.freerdpcore.application; import android.content.Context; import android.content.SharedPreferences; diff --git a/client/Android/src/com/freerdp/afreerdp/application/NetworkStateReceiver.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/NetworkStateReceiver.java similarity index 97% rename from client/Android/src/com/freerdp/afreerdp/application/NetworkStateReceiver.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/NetworkStateReceiver.java index 24a7ff990..86f9f075e 100644 --- a/client/Android/src/com/freerdp/afreerdp/application/NetworkStateReceiver.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/NetworkStateReceiver.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.application; +package com.freerdp.freerdpcore.application; import android.content.BroadcastReceiver; import android.content.Context; diff --git a/client/Android/src/com/freerdp/afreerdp/application/ScreenReceiver.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/ScreenReceiver.java similarity index 95% rename from client/Android/src/com/freerdp/afreerdp/application/ScreenReceiver.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/ScreenReceiver.java index d2d74286e..25c392c7e 100644 --- a/client/Android/src/com/freerdp/afreerdp/application/ScreenReceiver.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/ScreenReceiver.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.application; +package com.freerdp.freerdpcore.application; import android.content.BroadcastReceiver; import android.content.Context; diff --git a/client/Android/src/com/freerdp/afreerdp/application/SessionState.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/SessionState.java similarity index 93% rename from client/Android/src/com/freerdp/afreerdp/application/SessionState.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/SessionState.java index 18d19f232..fe213fb4f 100644 --- a/client/Android/src/com/freerdp/afreerdp/application/SessionState.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/application/SessionState.java @@ -7,15 +7,15 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.application; +package com.freerdp.freerdpcore.application; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Parcel; import android.os.Parcelable; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.services.LibFreeRDP; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.services.LibFreeRDP; public class SessionState implements Parcelable { diff --git a/client/Android/src/com/freerdp/afreerdp/domain/BookmarkBase.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/BookmarkBase.java similarity index 99% rename from client/Android/src/com/freerdp/afreerdp/domain/BookmarkBase.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/BookmarkBase.java index dc73872e1..12828ffd4 100644 --- a/client/Android/src/com/freerdp/afreerdp/domain/BookmarkBase.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/BookmarkBase.java @@ -7,9 +7,9 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.domain; +package com.freerdp.freerdpcore.domain; -import com.freerdp.afreerdp.application.GlobalApp; +import com.freerdp.freerdpcore.application.GlobalApp; import android.content.SharedPreferences; import android.os.Parcel; diff --git a/client/Android/src/com/freerdp/afreerdp/domain/ConnectionReference.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/ConnectionReference.java similarity index 97% rename from client/Android/src/com/freerdp/afreerdp/domain/ConnectionReference.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/ConnectionReference.java index 7975f795e..270139c51 100644 --- a/client/Android/src/com/freerdp/afreerdp/domain/ConnectionReference.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/ConnectionReference.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.domain; +package com.freerdp.freerdpcore.domain; public class ConnectionReference { diff --git a/client/Android/src/com/freerdp/afreerdp/domain/ManualBookmark.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/ManualBookmark.java similarity index 98% rename from client/Android/src/com/freerdp/afreerdp/domain/ManualBookmark.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/ManualBookmark.java index 4d749c5a1..81d9b717c 100644 --- a/client/Android/src/com/freerdp/afreerdp/domain/ManualBookmark.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/ManualBookmark.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.domain; +package com.freerdp.freerdpcore.domain; import android.content.SharedPreferences; import android.os.Parcel; diff --git a/client/Android/src/com/freerdp/afreerdp/domain/PlaceholderBookmark.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/PlaceholderBookmark.java similarity index 97% rename from client/Android/src/com/freerdp/afreerdp/domain/PlaceholderBookmark.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/PlaceholderBookmark.java index 54b08d431..b6712ec02 100644 --- a/client/Android/src/com/freerdp/afreerdp/domain/PlaceholderBookmark.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/PlaceholderBookmark.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.domain; +package com.freerdp.freerdpcore.domain; import android.content.SharedPreferences; import android.os.Parcel; diff --git a/client/Android/src/com/freerdp/afreerdp/domain/QuickConnectBookmark.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/QuickConnectBookmark.java similarity index 97% rename from client/Android/src/com/freerdp/afreerdp/domain/QuickConnectBookmark.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/QuickConnectBookmark.java index 1f6780c26..396853989 100644 --- a/client/Android/src/com/freerdp/afreerdp/domain/QuickConnectBookmark.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/domain/QuickConnectBookmark.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.domain; +package com.freerdp.freerdpcore.domain; import android.content.SharedPreferences; import android.os.Parcel; diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/AboutActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/AboutActivity.java similarity index 95% rename from client/Android/src/com/freerdp/afreerdp/presentation/AboutActivity.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/AboutActivity.java index f5a525b37..dc030c977 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/AboutActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/AboutActivity.java @@ -7,14 +7,14 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.IllegalFormatException; -import com.freerdp.afreerdp.services.LibFreeRDP; +import com.freerdp.freerdpcore.services.LibFreeRDP; import android.app.Activity; import android.content.pm.PackageManager.NameNotFoundException; diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/ApplicationSettingsActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ApplicationSettingsActivity.java similarity index 97% rename from client/Android/src/com/freerdp/afreerdp/presentation/ApplicationSettingsActivity.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ApplicationSettingsActivity.java index 6dd387de3..3b99ee240 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/ApplicationSettingsActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ApplicationSettingsActivity.java @@ -7,11 +7,11 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; import java.io.File; -import com.freerdp.afreerdp.R; +import com.freerdp.freerdpcore.R; import android.app.AlertDialog; import android.content.DialogInterface; diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/BookmarkActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/BookmarkActivity.java similarity index 93% rename from client/Android/src/com/freerdp/afreerdp/presentation/BookmarkActivity.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/BookmarkActivity.java index 40ebeddfa..078852f3b 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/BookmarkActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/BookmarkActivity.java @@ -7,21 +7,23 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; -import com.freerdp.afreerdp.R; -import com.freerdp.afreerdp.application.GlobalApp; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.domain.ConnectionReference; -import com.freerdp.afreerdp.domain.ManualBookmark; -import com.freerdp.afreerdp.services.BookmarkBaseGateway; +import com.freerdp.freerdpcore.R; +import com.freerdp.freerdpcore.application.GlobalApp; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.ConnectionReference; +import com.freerdp.freerdpcore.domain.ManualBookmark; +import com.freerdp.freerdpcore.services.BookmarkBaseGateway; import android.app.AlertDialog; +import android.content.ComponentName; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; import android.preference.ListPreference; +import android.preference.Preference; import android.preference.PreferenceActivity; public class BookmarkActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener @@ -137,8 +139,35 @@ public class BookmarkActivity extends PreferenceActivity implements OnSharedPref // register for preferences changed notification getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + + // set the correct component names in our preferencescreen settings + setIntentComponentNames(); } + private void setIntentComponentNames() + { + // we set the component name for our sub-activity calls here because we don't know the package + // name of the main app in our library project. + ComponentName compName = new ComponentName(getPackageName(), BookmarkActivity.class.getName()); + String[] prefKeys = { + "bookmark.credentials", + "bookmark.screen", + "bookmark.performance", + "bookmark.advanced", + "bookmark.screen_3g", + "bookmark.performance_3g" + }; + + for (int i = 0; i < prefKeys.length; ++i) + { + Preference pref = findPreference(prefKeys[i]); + if (pref != null) + pref.getIntent().setComponent(compName); + } + + + } + @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { settings_changed = true; diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/HelpActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HelpActivity.java similarity index 95% rename from client/Android/src/com/freerdp/afreerdp/presentation/HelpActivity.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HelpActivity.java index 07f6cc9d4..2b526faee 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/HelpActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HelpActivity.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; import android.app.Activity; import android.content.res.Configuration; diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/HomeActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HomeActivity.java similarity index 80% rename from client/Android/src/com/freerdp/afreerdp/presentation/HomeActivity.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HomeActivity.java index 62fff1d98..8abd471c9 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/HomeActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/HomeActivity.java @@ -7,19 +7,19 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; import java.util.ArrayList; -import com.freerdp.afreerdp.R; -import com.freerdp.afreerdp.application.GlobalApp; -import com.freerdp.afreerdp.application.GlobalSettings; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.domain.ConnectionReference; -import com.freerdp.afreerdp.domain.PlaceholderBookmark; -import com.freerdp.afreerdp.domain.QuickConnectBookmark; -import com.freerdp.afreerdp.utils.BookmarkArrayAdapter; -import com.freerdp.afreerdp.utils.SeparatedListAdapter; +import com.freerdp.freerdpcore.R; +import com.freerdp.freerdpcore.application.GlobalApp; +import com.freerdp.freerdpcore.application.GlobalSettings; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.ConnectionReference; +import com.freerdp.freerdpcore.domain.PlaceholderBookmark; +import com.freerdp.freerdpcore.domain.QuickConnectBookmark; +import com.freerdp.freerdpcore.utils.BookmarkArrayAdapter; +import com.freerdp.freerdpcore.utils.SeparatedListAdapter; import android.app.Activity; import android.app.AlertDialog; @@ -185,52 +185,49 @@ public class HomeActivity extends Activity // get connection reference AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo)aItem.getMenuInfo(); String refStr = menuInfo.targetView.getTag().toString(); - - switch(aItem.getItemId()) { - - case R.id.bookmark_connect: + + // refer to http://tools.android.com/tips/non-constant-fields why we can't use switch/case here .. + int itemId = aItem.getItemId(); + if (itemId == R.id.bookmark_connect) + { + Bundle bundle = new Bundle(); + bundle.putString(SessionActivity.PARAM_CONNECTION_REFERENCE, refStr); + Intent sessionIntent = new Intent(this, SessionActivity.class); + sessionIntent.putExtras(bundle); + + startActivity(sessionIntent); + return true; + } + else if (itemId == R.id.bookmark_edit) + { + Bundle bundle = new Bundle(); + bundle.putString(BookmarkActivity.PARAM_CONNECTION_REFERENCE, refStr); + + Intent bookmarkIntent = new Intent(this.getApplicationContext(), BookmarkActivity.class); + bookmarkIntent.putExtras(bundle); + startActivity(bookmarkIntent); + return true; + } + else if (itemId == R.id.bookmark_delete) + { + if(ConnectionReference.isManualBookmarkReference(refStr)) { - Bundle bundle = new Bundle(); - bundle.putString(SessionActivity.PARAM_CONNECTION_REFERENCE, refStr); - Intent sessionIntent = new Intent(this, SessionActivity.class); - sessionIntent.putExtras(bundle); - - startActivity(sessionIntent); - return true; + long id = ConnectionReference.getManualBookmarkId(refStr); + GlobalApp.getManualBookmarkGateway().delete(id); + manualBookmarkAdapter.remove(id); + separatedListAdapter.notifyDataSetChanged(); + } + else + { + assert false; } - case R.id.bookmark_edit: - { - Bundle bundle = new Bundle(); - bundle.putString(BookmarkActivity.PARAM_CONNECTION_REFERENCE, refStr); - - Intent bookmarkIntent = new Intent(this.getApplicationContext(), BookmarkActivity.class); - bookmarkIntent.putExtras(bundle); - startActivity(bookmarkIntent); - return true; - } - - case R.id.bookmark_delete: - { - if(ConnectionReference.isManualBookmarkReference(refStr)) - { - long id = ConnectionReference.getManualBookmarkId(refStr); - GlobalApp.getManualBookmarkGateway().delete(id); - manualBookmarkAdapter.remove(id); - separatedListAdapter.notifyDataSetChanged(); - } - else - { - assert false; - } - - showWelcomeScreenOrBookmarkList(); - - // clear super bar text - superBarEditText.setText(""); - return true; - } - } + showWelcomeScreenOrBookmarkList(); + + // clear super bar text + superBarEditText.setText(""); + return true; + } return false; } @@ -333,41 +330,31 @@ public class HomeActivity extends Activity @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - - case R.id.newBookmark: - { - Intent bookmarkIntent = new Intent(this, BookmarkActivity.class); - startActivity(bookmarkIntent); - break; - } - - case R.id.appSettings: - { - Intent settingsIntent = new Intent(this, ApplicationSettingsActivity.class); - startActivity(settingsIntent); - break; - } - - case R.id.help: - { - Intent helpIntent = new Intent(this, HelpActivity.class); - startActivity(helpIntent); - break; - } - - case R.id.exit: - { - finish(); - break; - } - - case R.id.about: - { - Intent aboutIntent = new Intent(this, AboutActivity.class); - startActivity(aboutIntent); - break; - } + // refer to http://tools.android.com/tips/non-constant-fields why we can't use switch/case here .. + int itemId = item.getItemId(); + if (itemId == R.id.newBookmark) + { + Intent bookmarkIntent = new Intent(this, BookmarkActivity.class); + startActivity(bookmarkIntent); + } + else if (itemId == R.id.appSettings) + { + Intent settingsIntent = new Intent(this, ApplicationSettingsActivity.class); + startActivity(settingsIntent); + } + else if (itemId == R.id.help) + { + Intent helpIntent = new Intent(this, HelpActivity.class); + startActivity(helpIntent); + } + else if (itemId == R.id.exit) + { + finish(); + } + else if (itemId == R.id.about) + { + Intent aboutIntent = new Intent(this, AboutActivity.class); + startActivity(aboutIntent); } return true; diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/ScrollView2D.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ScrollView2D.java similarity index 99% rename from client/Android/src/com/freerdp/afreerdp/presentation/ScrollView2D.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ScrollView2D.java index 9150e5ccc..332306abb 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/ScrollView2D.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ScrollView2D.java @@ -19,7 +19,7 @@ * http://GORGES.us */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; import java.util.List; diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/SessionActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/SessionActivity.java similarity index 95% rename from client/Android/src/com/freerdp/afreerdp/presentation/SessionActivity.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/SessionActivity.java index eef2c3d65..5a637930c 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/SessionActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/SessionActivity.java @@ -7,21 +7,21 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; import java.util.Iterator; import java.util.List; -import com.freerdp.afreerdp.R; -import com.freerdp.afreerdp.application.GlobalApp; -import com.freerdp.afreerdp.application.GlobalSettings; -import com.freerdp.afreerdp.application.SessionState; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.domain.ConnectionReference; -import com.freerdp.afreerdp.domain.ManualBookmark; -import com.freerdp.afreerdp.services.LibFreeRDP; -import com.freerdp.afreerdp.utils.KeyboardMapper; -import com.freerdp.afreerdp.utils.Mouse; +import com.freerdp.freerdpcore.R; +import com.freerdp.freerdpcore.application.GlobalApp; +import com.freerdp.freerdpcore.application.GlobalSettings; +import com.freerdp.freerdpcore.application.SessionState; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.ConnectionReference; +import com.freerdp.freerdpcore.domain.ManualBookmark; +import com.freerdp.freerdpcore.services.LibFreeRDP; +import com.freerdp.freerdpcore.utils.KeyboardMapper; +import com.freerdp.freerdpcore.utils.Mouse; import android.app.Activity; import android.app.Dialog; @@ -754,43 +754,36 @@ public class SessionActivity extends Activity @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) - { - case R.id.session_touch_pointer: - { - // toggle touch pointer - if(touchPointerView.getVisibility() == View.VISIBLE) - { - touchPointerView.setVisibility(View.INVISIBLE); - sessionView.setTouchPointerPadding(0, 0); - } - else - { - touchPointerView.setVisibility(View.VISIBLE); - sessionView.setTouchPointerPadding(touchPointerView.getPointerWidth(), touchPointerView.getPointerHeight()); - } - break; - } + // refer to http://tools.android.com/tips/non-constant-fields why we can't use switch/case here .. + int itemId = item.getItemId(); - case R.id.session_sys_keyboard: + if (itemId == R.id.session_touch_pointer) + { + // toggle touch pointer + if(touchPointerView.getVisibility() == View.VISIBLE) { - showKeyboard(!sysKeyboardVisible, false); - break; + touchPointerView.setVisibility(View.INVISIBLE); + sessionView.setTouchPointerPadding(0, 0); } - - case R.id.session_ext_keyboard: + else { - showKeyboard(false, !extKeyboardVisible); - break; - } - - case R.id.session_disconnect: - { - showKeyboard(false, false); - LibFreeRDP.disconnect(session.getInstance()); - break; + touchPointerView.setVisibility(View.VISIBLE); + sessionView.setTouchPointerPadding(touchPointerView.getPointerWidth(), touchPointerView.getPointerHeight()); } } + else if (itemId == R.id.session_sys_keyboard) + { + showKeyboard(!sysKeyboardVisible, false); + } + else if (itemId == R.id.session_ext_keyboard) + { + showKeyboard(false, !extKeyboardVisible); + } + else if (itemId == R.id.session_disconnect) + { + showKeyboard(false, false); + LibFreeRDP.disconnect(session.getInstance()); + } return true; } diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/SessionView.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/SessionView.java similarity index 97% rename from client/Android/src/com/freerdp/afreerdp/presentation/SessionView.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/SessionView.java index f1234567f..0074e2eb9 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/SessionView.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/SessionView.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; import android.util.AttributeSet; import android.util.Log; @@ -21,9 +21,9 @@ import android.graphics.drawable.BitmapDrawable; import java.util.*; -import com.freerdp.afreerdp.application.SessionState; -import com.freerdp.afreerdp.utils.DoubleGestureDetector; -import com.freerdp.afreerdp.utils.GestureDetector; +import com.freerdp.freerdpcore.application.SessionState; +import com.freerdp.freerdpcore.utils.DoubleGestureDetector; +import com.freerdp.freerdpcore.utils.GestureDetector; public class SessionView extends View diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/ShortcutsActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ShortcutsActivity.java similarity index 94% rename from client/Android/src/com/freerdp/afreerdp/presentation/ShortcutsActivity.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ShortcutsActivity.java index 947cb05e2..3281774c5 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/ShortcutsActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/ShortcutsActivity.java @@ -7,15 +7,15 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; import java.util.ArrayList; -import com.freerdp.afreerdp.R; -import com.freerdp.afreerdp.application.GlobalApp; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.services.SessionRequestHandlerActivity; -import com.freerdp.afreerdp.utils.BookmarkArrayAdapter; +import com.freerdp.freerdpcore.R; +import com.freerdp.freerdpcore.application.GlobalApp; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.services.SessionRequestHandlerActivity; +import com.freerdp.freerdpcore.utils.BookmarkArrayAdapter; import android.app.AlertDialog; import android.app.ListActivity; diff --git a/client/Android/src/com/freerdp/afreerdp/presentation/TouchPointerView.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/TouchPointerView.java similarity index 98% rename from client/Android/src/com/freerdp/afreerdp/presentation/TouchPointerView.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/TouchPointerView.java index 7850f9fdf..f58b840bd 100644 --- a/client/Android/src/com/freerdp/afreerdp/presentation/TouchPointerView.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/presentation/TouchPointerView.java @@ -7,10 +7,10 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.presentation; +package com.freerdp.freerdpcore.presentation; -import com.freerdp.afreerdp.R; -import com.freerdp.afreerdp.utils.GestureDetector; +import com.freerdp.freerdpcore.R; +import com.freerdp.freerdpcore.utils.GestureDetector; import android.content.Context; import android.graphics.Matrix; diff --git a/client/Android/src/com/freerdp/afreerdp/services/BookmarkBaseGateway.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/BookmarkBaseGateway.java similarity index 99% rename from client/Android/src/com/freerdp/afreerdp/services/BookmarkBaseGateway.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/BookmarkBaseGateway.java index 97aefdde7..6abac51d2 100644 --- a/client/Android/src/com/freerdp/afreerdp/services/BookmarkBaseGateway.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/BookmarkBaseGateway.java @@ -7,12 +7,12 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.services; +package com.freerdp.freerdpcore.services; import java.util.ArrayList; -import com.freerdp.afreerdp.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.BookmarkBase; import android.content.ContentValues; import android.database.Cursor; diff --git a/client/Android/src/com/freerdp/afreerdp/services/BookmarkDB.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/BookmarkDB.java similarity index 92% rename from client/Android/src/com/freerdp/afreerdp/services/BookmarkDB.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/BookmarkDB.java index 02f74440b..5d10d7048 100644 --- a/client/Android/src/com/freerdp/afreerdp/services/BookmarkDB.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/BookmarkDB.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.services; +package com.freerdp.freerdpcore.services; import android.content.Context; import android.provider.BaseColumns; @@ -82,8 +82,7 @@ public class BookmarkDB extends SQLiteOpenHelper db.execSQL(sqlManualBookmarks); - // REMOVE - FOR DEBUGGING ONLY! -/* + // Insert a test entry String sqlInsertDefaultScreenEntry = "INSERT INTO tbl_screen_settings (" + "colors, " @@ -91,8 +90,8 @@ public class BookmarkDB extends SQLiteOpenHelper + "width, " + "height) " + "VALUES ( " - + "16, -1, 0, 0);"; - db.execSQL(sqlInsertDefaultScreenEntry); + + "32, 1, 1024, 768);"; + db.execSQL(sqlInsertDefaultScreenEntry); db.execSQL(sqlInsertDefaultScreenEntry); String sqlInsertDefaultPerfFlags = @@ -105,7 +104,7 @@ public class BookmarkDB extends SQLiteOpenHelper + "perf_font_smoothing, " + "perf_desktop_composition) " + "VALUES ( " - + "0, 0, 0, 0, 0, 0, 0);"; + + "1, 0, 0, 0, 0, 0, 0);"; db.execSQL(sqlInsertDefaultPerfFlags); db.execSQL(sqlInsertDefaultPerfFlags); @@ -126,14 +125,14 @@ public class BookmarkDB extends SQLiteOpenHelper + "work_dir, " + "console_mode) " + "VALUES ( " - + "'test', " - + "'192.168.50.125', " - + "'demo1', " - + "'qw', " + + "'Test Server', " + + "'testservice.afreerdp.com', " + + "'', " + + "'', " + "'', " + "3389, " + "1, 1, 2, 2, 0, '', '', 0);"; - db.execSQL(sqlInsertDefaultSessionEntry); */ + db.execSQL(sqlInsertDefaultSessionEntry); } @Override diff --git a/client/Android/src/com/freerdp/afreerdp/services/FreeRDPSuggestionProvider.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/FreeRDPSuggestionProvider.java similarity index 92% rename from client/Android/src/com/freerdp/afreerdp/services/FreeRDPSuggestionProvider.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/FreeRDPSuggestionProvider.java index 1fd06a7cf..ee242d5d4 100644 --- a/client/Android/src/com/freerdp/afreerdp/services/FreeRDPSuggestionProvider.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/FreeRDPSuggestionProvider.java @@ -7,15 +7,15 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.services; +package com.freerdp.freerdpcore.services; import java.util.ArrayList; -import com.freerdp.afreerdp.R; -import com.freerdp.afreerdp.application.GlobalApp; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.domain.ConnectionReference; -import com.freerdp.afreerdp.domain.ManualBookmark; +import com.freerdp.freerdpcore.R; +import com.freerdp.freerdpcore.application.GlobalApp; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.ConnectionReference; +import com.freerdp.freerdpcore.domain.ManualBookmark; import android.app.SearchManager; import android.content.ContentProvider; diff --git a/client/Android/src/com/freerdp/afreerdp/services/HistoryDB.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/HistoryDB.java similarity index 96% rename from client/Android/src/com/freerdp/afreerdp/services/HistoryDB.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/HistoryDB.java index 900336f60..f12be6bb0 100644 --- a/client/Android/src/com/freerdp/afreerdp/services/HistoryDB.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/HistoryDB.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.services; +package com.freerdp.freerdpcore.services; import android.content.Context; import android.database.sqlite.SQLiteDatabase; diff --git a/client/Android/src/com/freerdp/afreerdp/services/LibFreeRDP.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/LibFreeRDP.java similarity index 96% rename from client/Android/src/com/freerdp/afreerdp/services/LibFreeRDP.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/LibFreeRDP.java index 8de2cc435..672dcd934 100644 --- a/client/Android/src/com/freerdp/afreerdp/services/LibFreeRDP.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/LibFreeRDP.java @@ -7,13 +7,13 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.services; +package com.freerdp.freerdpcore.services; -import com.freerdp.afreerdp.application.GlobalApp; -import com.freerdp.afreerdp.application.SessionState; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.domain.ManualBookmark; +import com.freerdp.freerdpcore.application.GlobalApp; +import com.freerdp.freerdpcore.application.SessionState; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.ManualBookmark; import android.graphics.Bitmap; diff --git a/client/Android/src/com/freerdp/afreerdp/services/ManualBookmarkGateway.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/ManualBookmarkGateway.java similarity index 93% rename from client/Android/src/com/freerdp/afreerdp/services/ManualBookmarkGateway.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/ManualBookmarkGateway.java index a95f8e40d..6b07850ac 100644 --- a/client/Android/src/com/freerdp/afreerdp/services/ManualBookmarkGateway.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/ManualBookmarkGateway.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.services; +package com.freerdp.freerdpcore.services; import java.util.ArrayList; @@ -15,8 +15,8 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteOpenHelper; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.domain.ManualBookmark; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.ManualBookmark; public class ManualBookmarkGateway extends BookmarkBaseGateway { diff --git a/client/Android/src/com/freerdp/afreerdp/services/QuickConnectHistoryGateway.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/QuickConnectHistoryGateway.java similarity index 95% rename from client/Android/src/com/freerdp/afreerdp/services/QuickConnectHistoryGateway.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/QuickConnectHistoryGateway.java index beb6a596f..df3cfb478 100644 --- a/client/Android/src/com/freerdp/afreerdp/services/QuickConnectHistoryGateway.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/QuickConnectHistoryGateway.java @@ -7,12 +7,12 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.services; +package com.freerdp.freerdpcore.services; import java.util.ArrayList; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.domain.QuickConnectBookmark; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.QuickConnectBookmark; import android.database.Cursor; import android.database.SQLException; diff --git a/client/Android/src/com/freerdp/afreerdp/services/SessionRequestHandlerActivity.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/SessionRequestHandlerActivity.java similarity index 90% rename from client/Android/src/com/freerdp/afreerdp/services/SessionRequestHandlerActivity.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/SessionRequestHandlerActivity.java index ac41df7c1..57a61bddc 100644 --- a/client/Android/src/com/freerdp/afreerdp/services/SessionRequestHandlerActivity.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/services/SessionRequestHandlerActivity.java @@ -7,11 +7,11 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.services; +package com.freerdp.freerdpcore.services; -import com.freerdp.afreerdp.domain.ConnectionReference; -import com.freerdp.afreerdp.presentation.BookmarkActivity; -import com.freerdp.afreerdp.presentation.SessionActivity; +import com.freerdp.freerdpcore.domain.ConnectionReference; +import com.freerdp.freerdpcore.presentation.BookmarkActivity; +import com.freerdp.freerdpcore.presentation.SessionActivity; import android.app.Activity; import android.app.SearchManager; diff --git a/client/Android/src/com/freerdp/afreerdp/utils/BookmarkArrayAdapter.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/BookmarkArrayAdapter.java similarity index 91% rename from client/Android/src/com/freerdp/afreerdp/utils/BookmarkArrayAdapter.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/BookmarkArrayAdapter.java index 50d2cf66b..cdd4721a6 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/BookmarkArrayAdapter.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/BookmarkArrayAdapter.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; import java.util.List; @@ -22,12 +22,12 @@ import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; -import com.freerdp.afreerdp.R; -import com.freerdp.afreerdp.domain.BookmarkBase; -import com.freerdp.afreerdp.domain.ConnectionReference; -import com.freerdp.afreerdp.domain.ManualBookmark; -import com.freerdp.afreerdp.domain.PlaceholderBookmark; -import com.freerdp.afreerdp.presentation.BookmarkActivity; +import com.freerdp.freerdpcore.R; +import com.freerdp.freerdpcore.domain.BookmarkBase; +import com.freerdp.freerdpcore.domain.ConnectionReference; +import com.freerdp.freerdpcore.domain.ManualBookmark; +import com.freerdp.freerdpcore.domain.PlaceholderBookmark; +import com.freerdp.freerdpcore.presentation.BookmarkActivity; public class BookmarkArrayAdapter extends ArrayAdapter { diff --git a/client/Android/src/com/freerdp/afreerdp/utils/ButtonPreference.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/ButtonPreference.java similarity index 96% rename from client/Android/src/com/freerdp/afreerdp/utils/ButtonPreference.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/ButtonPreference.java index fb9cbe261..3f119fa15 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/ButtonPreference.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/ButtonPreference.java @@ -7,9 +7,9 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; -import com.freerdp.afreerdp.R; +import com.freerdp.freerdpcore.R; import android.content.Context; import android.preference.Preference; diff --git a/client/Android/src/com/freerdp/afreerdp/utils/DoubleGestureDetector.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/DoubleGestureDetector.java similarity index 99% rename from client/Android/src/com/freerdp/afreerdp/utils/DoubleGestureDetector.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/DoubleGestureDetector.java index e837a6a2e..1146c4c92 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/DoubleGestureDetector.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/DoubleGestureDetector.java @@ -7,14 +7,14 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; import android.content.Context; import android.os.Handler; import android.view.MotionEvent; import android.view.ScaleGestureDetector; -import com.freerdp.afreerdp.utils.GestureDetector.OnGestureListener; +import com.freerdp.freerdpcore.utils.GestureDetector.OnGestureListener; public class DoubleGestureDetector { /** diff --git a/client/Android/src/com/freerdp/afreerdp/utils/GestureDetector.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/GestureDetector.java similarity index 99% rename from client/Android/src/com/freerdp/afreerdp/utils/GestureDetector.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/GestureDetector.java index e656bab77..c8773b930 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/GestureDetector.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/GestureDetector.java @@ -16,7 +16,7 @@ * Modified for aFreeRDP by Martin Fleisz (mfleisz@thinstuff.at) */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; import android.content.Context; import android.os.Build; diff --git a/client/Android/src/com/freerdp/afreerdp/utils/IntEditTextPreference.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/IntEditTextPreference.java similarity index 97% rename from client/Android/src/com/freerdp/afreerdp/utils/IntEditTextPreference.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/IntEditTextPreference.java index 4ce494467..1142bc4ae 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/IntEditTextPreference.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/IntEditTextPreference.java @@ -7,9 +7,9 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; -import com.freerdp.afreerdp.R; +import com.freerdp.freerdpcore.R; import android.content.Context; import android.content.res.TypedArray; diff --git a/client/Android/src/com/freerdp/afreerdp/utils/IntListPreference.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/IntListPreference.java similarity index 95% rename from client/Android/src/com/freerdp/afreerdp/utils/IntListPreference.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/IntListPreference.java index 718a69ae7..49b718a29 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/IntListPreference.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/IntListPreference.java @@ -7,7 +7,7 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; import android.content.Context; import android.preference.ListPreference; diff --git a/client/Android/src/com/freerdp/afreerdp/utils/KeyboardMapper.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/KeyboardMapper.java similarity index 99% rename from client/Android/src/com/freerdp/afreerdp/utils/KeyboardMapper.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/KeyboardMapper.java index ae72de873..e9bbb2cd6 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/KeyboardMapper.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/KeyboardMapper.java @@ -8,9 +8,9 @@ */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; -import com.freerdp.afreerdp.R; +import com.freerdp.freerdpcore.R; import android.content.Context; import android.view.KeyEvent; diff --git a/client/Android/src/com/freerdp/afreerdp/utils/Mouse.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/Mouse.java similarity index 93% rename from client/Android/src/com/freerdp/afreerdp/utils/Mouse.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/Mouse.java index 202c4d5de..38743be93 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/Mouse.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/Mouse.java @@ -7,9 +7,9 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; -import com.freerdp.afreerdp.application.GlobalSettings; +import com.freerdp.freerdpcore.application.GlobalSettings; public class Mouse { diff --git a/client/Android/src/com/freerdp/afreerdp/utils/SeparatedListAdapter.java b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/SeparatedListAdapter.java similarity index 98% rename from client/Android/src/com/freerdp/afreerdp/utils/SeparatedListAdapter.java rename to client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/SeparatedListAdapter.java index 9ee8894c1..1528b78b4 100644 --- a/client/Android/src/com/freerdp/afreerdp/utils/SeparatedListAdapter.java +++ b/client/Android/FreeRDPCore/src/com/freerdp/freerdpcore/utils/SeparatedListAdapter.java @@ -8,12 +8,12 @@ If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package com.freerdp.afreerdp.utils; +package com.freerdp.freerdpcore.utils; import java.util.LinkedHashMap; import java.util.Map; -import com.freerdp.afreerdp.R; +import com.freerdp.freerdpcore.R; import android.content.Context; import android.view.View; diff --git a/client/Android/aFreeRDP/.classpath b/client/Android/aFreeRDP/.classpath new file mode 100644 index 000000000..a4763d1ee --- /dev/null +++ b/client/Android/aFreeRDP/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/Android/aFreeRDP/.project b/client/Android/aFreeRDP/.project new file mode 100644 index 000000000..335291e03 --- /dev/null +++ b/client/Android/aFreeRDP/.project @@ -0,0 +1,33 @@ + + + aFreeRDP + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/client/Android/aFreeRDP/AndroidManifest.xml.cmake b/client/Android/aFreeRDP/AndroidManifest.xml.cmake new file mode 100644 index 000000000..e0d01c824 --- /dev/null +++ b/client/Android/aFreeRDP/AndroidManifest.xml.cmake @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/Android/aFreeRDP/CMakeLists.txt b/client/Android/aFreeRDP/CMakeLists.txt new file mode 100644 index 000000000..9dd3b6179 --- /dev/null +++ b/client/Android/aFreeRDP/CMakeLists.txt @@ -0,0 +1,45 @@ +# FreeRDP: A Remote Desktop Protocol Implementation +# Android Client +# +# Copyright 2012 Marc-Andre Moreau +# Copyright 2013 Bernhard Miklautz +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(ANDROID_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) +set(ANDROID_PACKAGE_NAME "aFreeRDP") + +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml.cmake ${CMAKE_CURRENT_SOURCE_DIR}/AndroidManifest.xml @ONLY) + +if (ANDROID_SDK) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/local.properties.cmake ${CMAKE_CURRENT_SOURCE_DIR}/local.properties @ONLY) +endif() + +if(ANDROID_BUILD_JAVA) + if(ANDROID_BUILD_JAVA_DEBUG) + set(APK "${ANDROID_SOURCE_DIR}/bin/${ANDROID_PACKAGE_NAME}-release-unsigned.apk") + else() + set(APK "${ANDROID_SOURCE_DIR}/bin/${ANDROID_PACKAGE_NAME}-debug.apk") + endif() + + # command to create the android package + add_custom_command( + OUTPUT "${APK}" + COMMAND ${ANT_COMMAND} ${ANDROID_BUILD_TYPE} + WORKING_DIRECTORY "${ANDROID_SOURCE_DIR}" + MAIN_DEPENDENCY AndroidManifest.xml + DEPENDS freerdp-android local.properties android-lib + ) + add_custom_target(android-package ALL SOURCES "${APK}") + SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "gen;bin") +endif() diff --git a/client/Android/assets/about_page/FreeRDP_Logo.png b/client/Android/aFreeRDP/assets/about_page/FreeRDP_Logo.png similarity index 100% rename from client/Android/assets/about_page/FreeRDP_Logo.png rename to client/Android/aFreeRDP/assets/about_page/FreeRDP_Logo.png diff --git a/client/Android/assets/about_page/about.html b/client/Android/aFreeRDP/assets/about_page/about.html similarity index 100% rename from client/Android/assets/about_page/about.html rename to client/Android/aFreeRDP/assets/about_page/about.html diff --git a/client/Android/assets/about_page/about_phone.html b/client/Android/aFreeRDP/assets/about_page/about_phone.html similarity index 100% rename from client/Android/assets/about_page/about_phone.html rename to client/Android/aFreeRDP/assets/about_page/about_phone.html diff --git a/client/Android/assets/about_page/back.jpg b/client/Android/aFreeRDP/assets/about_page/back.jpg similarity index 100% rename from client/Android/assets/about_page/back.jpg rename to client/Android/aFreeRDP/assets/about_page/back.jpg diff --git a/client/Android/assets/about_page/background_transparent.png b/client/Android/aFreeRDP/assets/about_page/background_transparent.png similarity index 100% rename from client/Android/assets/about_page/background_transparent.png rename to client/Android/aFreeRDP/assets/about_page/background_transparent.png diff --git a/client/Android/assets/help_page/back.jpg b/client/Android/aFreeRDP/assets/help_page/back.jpg similarity index 100% rename from client/Android/assets/help_page/back.jpg rename to client/Android/aFreeRDP/assets/help_page/back.jpg diff --git a/client/Android/assets/help_page/gestures.html b/client/Android/aFreeRDP/assets/help_page/gestures.html similarity index 100% rename from client/Android/assets/help_page/gestures.html rename to client/Android/aFreeRDP/assets/help_page/gestures.html diff --git a/client/Android/assets/help_page/gestures.png b/client/Android/aFreeRDP/assets/help_page/gestures.png similarity index 100% rename from client/Android/assets/help_page/gestures.png rename to client/Android/aFreeRDP/assets/help_page/gestures.png diff --git a/client/Android/assets/help_page/gestures_phone.html b/client/Android/aFreeRDP/assets/help_page/gestures_phone.html similarity index 100% rename from client/Android/assets/help_page/gestures_phone.html rename to client/Android/aFreeRDP/assets/help_page/gestures_phone.html diff --git a/client/Android/assets/help_page/gestures_phone.png b/client/Android/aFreeRDP/assets/help_page/gestures_phone.png similarity index 100% rename from client/Android/assets/help_page/gestures_phone.png rename to client/Android/aFreeRDP/assets/help_page/gestures_phone.png diff --git a/client/Android/assets/help_page/nav_gestures.png b/client/Android/aFreeRDP/assets/help_page/nav_gestures.png similarity index 100% rename from client/Android/assets/help_page/nav_gestures.png rename to client/Android/aFreeRDP/assets/help_page/nav_gestures.png diff --git a/client/Android/assets/help_page/nav_toolbar.png b/client/Android/aFreeRDP/assets/help_page/nav_toolbar.png similarity index 100% rename from client/Android/assets/help_page/nav_toolbar.png rename to client/Android/aFreeRDP/assets/help_page/nav_toolbar.png diff --git a/client/Android/assets/help_page/nav_touch_pointer.png b/client/Android/aFreeRDP/assets/help_page/nav_touch_pointer.png similarity index 100% rename from client/Android/assets/help_page/nav_touch_pointer.png rename to client/Android/aFreeRDP/assets/help_page/nav_touch_pointer.png diff --git a/client/Android/assets/help_page/toolbar.html b/client/Android/aFreeRDP/assets/help_page/toolbar.html similarity index 100% rename from client/Android/assets/help_page/toolbar.html rename to client/Android/aFreeRDP/assets/help_page/toolbar.html diff --git a/client/Android/assets/help_page/toolbar.png b/client/Android/aFreeRDP/assets/help_page/toolbar.png similarity index 100% rename from client/Android/assets/help_page/toolbar.png rename to client/Android/aFreeRDP/assets/help_page/toolbar.png diff --git a/client/Android/assets/help_page/toolbar_phone.html b/client/Android/aFreeRDP/assets/help_page/toolbar_phone.html similarity index 100% rename from client/Android/assets/help_page/toolbar_phone.html rename to client/Android/aFreeRDP/assets/help_page/toolbar_phone.html diff --git a/client/Android/assets/help_page/toolbar_phone.png b/client/Android/aFreeRDP/assets/help_page/toolbar_phone.png similarity index 100% rename from client/Android/assets/help_page/toolbar_phone.png rename to client/Android/aFreeRDP/assets/help_page/toolbar_phone.png diff --git a/client/Android/assets/help_page/touch_pointer.html b/client/Android/aFreeRDP/assets/help_page/touch_pointer.html similarity index 100% rename from client/Android/assets/help_page/touch_pointer.html rename to client/Android/aFreeRDP/assets/help_page/touch_pointer.html diff --git a/client/Android/assets/help_page/touch_pointer.png b/client/Android/aFreeRDP/assets/help_page/touch_pointer.png similarity index 100% rename from client/Android/assets/help_page/touch_pointer.png rename to client/Android/aFreeRDP/assets/help_page/touch_pointer.png diff --git a/client/Android/assets/help_page/touch_pointer_phone.html b/client/Android/aFreeRDP/assets/help_page/touch_pointer_phone.html similarity index 100% rename from client/Android/assets/help_page/touch_pointer_phone.html rename to client/Android/aFreeRDP/assets/help_page/touch_pointer_phone.html diff --git a/client/Android/assets/help_page/touch_pointer_phone.png b/client/Android/aFreeRDP/assets/help_page/touch_pointer_phone.png similarity index 100% rename from client/Android/assets/help_page/touch_pointer_phone.png rename to client/Android/aFreeRDP/assets/help_page/touch_pointer_phone.png diff --git a/client/Android/assets/welcome_page/1.png b/client/Android/aFreeRDP/assets/welcome_page/1.png similarity index 100% rename from client/Android/assets/welcome_page/1.png rename to client/Android/aFreeRDP/assets/welcome_page/1.png diff --git a/client/Android/assets/welcome_page/2.png b/client/Android/aFreeRDP/assets/welcome_page/2.png similarity index 100% rename from client/Android/assets/welcome_page/2.png rename to client/Android/aFreeRDP/assets/welcome_page/2.png diff --git a/client/Android/assets/welcome_page/back.jpg b/client/Android/aFreeRDP/assets/welcome_page/back.jpg similarity index 100% rename from client/Android/assets/welcome_page/back.jpg rename to client/Android/aFreeRDP/assets/welcome_page/back.jpg diff --git a/client/Android/assets/welcome_page/new_connection.png b/client/Android/aFreeRDP/assets/welcome_page/new_connection.png similarity index 100% rename from client/Android/assets/welcome_page/new_connection.png rename to client/Android/aFreeRDP/assets/welcome_page/new_connection.png diff --git a/client/Android/assets/welcome_page/welcome.html b/client/Android/aFreeRDP/assets/welcome_page/welcome.html similarity index 100% rename from client/Android/assets/welcome_page/welcome.html rename to client/Android/aFreeRDP/assets/welcome_page/welcome.html diff --git a/client/Android/assets/welcome_page/welcome_phone.html b/client/Android/aFreeRDP/assets/welcome_page/welcome_phone.html similarity index 100% rename from client/Android/assets/welcome_page/welcome_phone.html rename to client/Android/aFreeRDP/assets/welcome_page/welcome_phone.html diff --git a/client/Android/build.xml b/client/Android/aFreeRDP/build.xml similarity index 100% rename from client/Android/build.xml rename to client/Android/aFreeRDP/build.xml diff --git a/client/Android/aFreeRDP/local.properties.cmake b/client/Android/aFreeRDP/local.properties.cmake new file mode 100644 index 000000000..159126370 --- /dev/null +++ b/client/Android/aFreeRDP/local.properties.cmake @@ -0,0 +1,2 @@ +# This file is automatically generated by cmake. +sdk.dir=@ANDROID_SDK@ diff --git a/client/Android/project.properties b/client/Android/aFreeRDP/project.properties similarity index 83% rename from client/Android/project.properties rename to client/Android/aFreeRDP/project.properties index ea89160e0..857d31de6 100644 --- a/client/Android/project.properties +++ b/client/Android/aFreeRDP/project.properties @@ -9,3 +9,5 @@ # Project target. target=android-8 +android.library.reference.1=../FreeRDPCore +manifestmerger.enabled=true diff --git a/client/Android/aFreeRDP/res/drawable-hdpi/icon_launcher_freerdp.png b/client/Android/aFreeRDP/res/drawable-hdpi/icon_launcher_freerdp.png new file mode 100644 index 000000000..45ed86123 Binary files /dev/null and b/client/Android/aFreeRDP/res/drawable-hdpi/icon_launcher_freerdp.png differ diff --git a/client/Android/aFreeRDP/res/drawable-ldpi/icon_launcher_freerdp.png b/client/Android/aFreeRDP/res/drawable-ldpi/icon_launcher_freerdp.png new file mode 100644 index 000000000..b57651bed Binary files /dev/null and b/client/Android/aFreeRDP/res/drawable-ldpi/icon_launcher_freerdp.png differ diff --git a/client/Android/aFreeRDP/res/drawable-mdpi/icon_launcher_freerdp.png b/client/Android/aFreeRDP/res/drawable-mdpi/icon_launcher_freerdp.png new file mode 100644 index 000000000..55335c869 Binary files /dev/null and b/client/Android/aFreeRDP/res/drawable-mdpi/icon_launcher_freerdp.png differ diff --git a/client/Android/aFreeRDP/res/drawable/button_background.xml b/client/Android/aFreeRDP/res/drawable/button_background.xml new file mode 100644 index 000000000..9fdf3096d --- /dev/null +++ b/client/Android/aFreeRDP/res/drawable/button_background.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/Android/aFreeRDP/res/drawable/icon_launcher_freerdp.png b/client/Android/aFreeRDP/res/drawable/icon_launcher_freerdp.png new file mode 100644 index 000000000..ad325d46e Binary files /dev/null and b/client/Android/aFreeRDP/res/drawable/icon_launcher_freerdp.png differ diff --git a/client/Android/aFreeRDP/res/drawable/separator_background.xml b/client/Android/aFreeRDP/res/drawable/separator_background.xml new file mode 100644 index 000000000..61c7b8925 --- /dev/null +++ b/client/Android/aFreeRDP/res/drawable/separator_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/client/Android/aFreeRDP/res/values/strings.xml b/client/Android/aFreeRDP/res/values/strings.xml new file mode 100644 index 000000000..f0aa7c6af --- /dev/null +++ b/client/Android/aFreeRDP/res/values/strings.xml @@ -0,0 +1,7 @@ + + + aFreeRDP + + aFreeRDP + Remote Computers + diff --git a/client/Android/res/xml/searchable.xml b/client/Android/aFreeRDP/res/xml/searchable.xml similarity index 100% rename from client/Android/res/xml/searchable.xml rename to client/Android/aFreeRDP/res/xml/searchable.xml diff --git a/client/Android/aFreeRDP/src/com/freerdp/afreerdp/application/GlobalApp.java b/client/Android/aFreeRDP/src/com/freerdp/afreerdp/application/GlobalApp.java new file mode 100644 index 000000000..c0b36f020 --- /dev/null +++ b/client/Android/aFreeRDP/src/com/freerdp/afreerdp/application/GlobalApp.java @@ -0,0 +1,6 @@ +package com.freerdp.afreerdp.application; + + +public class GlobalApp extends com.freerdp.freerdpcore.application.GlobalApp { + +} diff --git a/client/Android/jni/generated/com_freerdp_afreerdp_services_LibFreeRDP.h b/client/Android/jni/generated/com_freerdp_afreerdp_services_LibFreeRDP.h deleted file mode 100644 index cfe8d65f5..000000000 --- a/client/Android/jni/generated/com_freerdp_afreerdp_services_LibFreeRDP.h +++ /dev/null @@ -1,125 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_freerdp_afreerdp_services_LibFreeRDP */ - -#ifndef _Included_com_freerdp_afreerdp_services_LibFreeRDP -#define _Included_com_freerdp_afreerdp_services_LibFreeRDP -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_new - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1new - (JNIEnv *, jclass); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_free - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1free - (JNIEnv *, jclass, jint); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_connect - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1connect - (JNIEnv *, jclass, jint); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_disconnect - * Signature: (I)Z - */ -JNIEXPORT jboolean JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1disconnect - (JNIEnv *, jclass, jint); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_cancel_connection - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1cancel_1connection - (JNIEnv *, jclass, jint); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_set_connection_info - * Signature: (ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIZILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1set_1connection_1info - (JNIEnv *, jclass, jint, jstring, jstring, jstring, jstring, jint, jint, jint, jint, jboolean, jint, jstring); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_set_performance_flags - * Signature: (IZZZZZZZ)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1set_1performance_1flags - (JNIEnv *, jclass, jint, jboolean, jboolean, jboolean, jboolean, jboolean, jboolean, jboolean); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_set_advanced_settings - * Signature: (ILjava/lang/String;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1set_1advanced_1settings - (JNIEnv *, jclass, jint, jstring, jstring); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_set_data_directory - * Signature: (ILjava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1set_1data_1directory - (JNIEnv *, jclass, jint, jstring); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_update_graphics - * Signature: (ILandroid/graphics/Bitmap;IIII)Z - */ -JNIEXPORT jboolean JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1update_1graphics - (JNIEnv *, jclass, jint, jobject, jint, jint, jint, jint); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_send_cursor_event - * Signature: (IIII)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1send_1cursor_1event - (JNIEnv *, jclass, jint, jint, jint, jint); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_send_key_event - * Signature: (IIZ)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1send_1key_1event - (JNIEnv *, jclass, jint, jint, jboolean); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_send_unicodekey_event - * Signature: (II)V - */ -JNIEXPORT void JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1send_1unicodekey_1event - (JNIEnv *, jclass, jint, jint); - -/* - * Class: com_freerdp_afreerdp_services_LibFreeRDP - * Method: freerdp_get_version - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_freerdp_afreerdp_services_LibFreeRDP_freerdp_1get_1version - (JNIEnv *, jclass); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/client/Android/res/xml/bookmark_settings.xml b/client/Android/res/xml/bookmark_settings.xml deleted file mode 100644 index 86df480ad..000000000 --- a/client/Android/res/xml/bookmark_settings.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/Android/res/xml/screen_settings.xml b/client/Android/res/xml/screen_settings.xml deleted file mode 100644 index 589a35a8d..000000000 --- a/client/Android/res/xml/screen_settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 68aefcbb9..25b639caf 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -47,9 +47,7 @@ if(APPLE) endif() if(ANDROID) - if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Android") - message(STATUS "Adding Android client") - add_subdirectory(Android) - endif() + message(STATUS "Adding Android client") + add_subdirectory(Android) endif() diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 3b21e21ce..8233204fb 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -291,7 +291,7 @@ int freerdp_client_add_device_channel(rdpSettings* settings, int count, char** p printer->Type = RDPDR_DTYP_PRINT; printer->Name = _strdup(params[1]); - if (params[2]) + if (count > 2) printer->DriverName = _strdup(params[2]); freerdp_device_collection_add(settings, (RDPDR_DEVICE*) printer); diff --git a/client/iOS/Controllers/BookmarkListController.m b/client/iOS/Controllers/BookmarkListController.m index 27a508134..301bd5f5d 100644 --- a/client/iOS/Controllers/BookmarkListController.m +++ b/client/iOS/Controllers/BookmarkListController.m @@ -13,6 +13,7 @@ #import "RDPSessionViewController.h" #import "Toast+UIView.h" #import "Reachability.h" +#import "GlobalDefaults.h" #define SECTION_SESSIONS 0 #define SECTION_BOOKMARKS 1 @@ -803,7 +804,10 @@ _manual_bookmarks = [self arrayFromDataStoreURL:[self manualBookmarksDataStoreURL]]; if(_manual_bookmarks == nil) + { _manual_bookmarks = [[NSMutableArray alloc] init]; + [_manual_bookmarks addObject:[[[GlobalDefaults sharedGlobalDefaults] newTestServerBookmark] autorelease]]; + } } - (void)readConnectionHistoryFromDataStore diff --git a/client/iOS/Defaults.plist b/client/iOS/Defaults.plist index 88e2113b1..a60e3be19 100644 --- a/client/iOS/Defaults.plist +++ b/client/iOS/Defaults.plist @@ -9,11 +9,11 @@ port 3389 screen_resolution_type - 0 + 1 width - 1024 + 0 height - 768 + 0 colors 16 perf_font_smoothing diff --git a/client/iOS/Models/GlobalDefaults.h b/client/iOS/Models/GlobalDefaults.h index ecbee2c38..d522991bd 100644 --- a/client/iOS/Models/GlobalDefaults.h +++ b/client/iOS/Models/GlobalDefaults.h @@ -24,5 +24,6 @@ - (ConnectionParams*)newParams; - (ComputerBookmark*)newBookmark; +- (ComputerBookmark*)newTestServerBookmark; @end diff --git a/client/iOS/Models/GlobalDefaults.m b/client/iOS/Models/GlobalDefaults.m index 1a0619a22..2b2ab293f 100644 --- a/client/iOS/Models/GlobalDefaults.m +++ b/client/iOS/Models/GlobalDefaults.m @@ -68,4 +68,17 @@ return param_copy; } +- (ComputerBookmark*)newTestServerBookmark +{ + ComputerBookmark* bm = [self newBookmark]; + [bm setLabel:@"Test Server"]; + [[bm params] setValue:@"testservice.ifreerdp.com" forKey:@"hostname"]; + [[bm params] setInt:0 forKey:@"screen_resolution_type"]; + [[bm params] setInt:1024 forKey:@"width"]; + [[bm params] setInt:768 forKey:@"height"]; + [[bm params] setInt:32 forKey:@"colors"]; + [[bm params] setBool:YES forKey:@"perf_remotefx"]; + return bm; +} + @end diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake index 0f63c742c..c922d2f78 100644 --- a/cmake/ConfigOptions.cmake +++ b/cmake/ConfigOptions.cmake @@ -17,10 +17,18 @@ else() option(WITH_SSE2 "Enable SSE2 optimization." OFF) endif() -if((TARGET_ARCH MATCHES "ARM") AND (NOT DEFINED WITH_NEON)) - option(WITH_NEON "Enable NEON optimization." ON) -else() - option(WITH_NEON "Enable NEON optimization." OFF) +if(TARGET_ARCH MATCHES "ARM") + if (NOT DEFINED WITH_NEON) + option(WITH_NEON "Enable NEON optimization." ON) + else() + option(WITH_NEON "Enable NEON optimization." OFF) + endif() + if (NOT DEFINED ARM_FP_ABI) + set(ARM_FP_ABI "softfp" CACHE STRING "Floating point ABI to use on arm") + else() + set(ARM_FP_ABI ${ARM_FP_API} CACHE STRING "Floating point ABI to use on arm") + endif() + mark_as_advanced(ARM_FP_ABI) endif() option(WITH_JPEG "Use JPEG decoding." OFF) diff --git a/keymaps/macosx b/keymaps/macosx index 8363f81cc..4f55dd72e 100644 --- a/keymaps/macosx +++ b/keymaps/macosx @@ -57,6 +57,8 @@ keyboard "macosx" VK_OEM_PERIOD <55> VK_OEM_2 <52> VK_SPACE <57> + VK_LWIN <63> + VK_RWIN <71> VK_LCONTROL <67> VK_LMENU <66> VK_LSHIFT <64> diff --git a/libfreerdp/codec/CMakeLists.txt b/libfreerdp/codec/CMakeLists.txt index 6c9615125..f69801897 100644 --- a/libfreerdp/codec/CMakeLists.txt +++ b/libfreerdp/codec/CMakeLists.txt @@ -72,12 +72,12 @@ if(WITH_NEON) if(ANDROID) set(ANDROID_CPU_FEATURES_PATH "${ANDROID_NDK}/sources/android/cpufeatures") include_directories(${ANDROID_CPU_FEATURES_PATH}) - set(${MODULE_PREFIX}_NEON_SRCS ${${MODULE_PREFIX}_NEON_SRCS} + set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} ${ANDROID_CPU_FEATURES_PATH}/cpu-features.c ${ANDROID_CPU_FEATURES_PATH}/cpu-features.h) endif() set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} ${${MODULE_PREFIX}_NEON_SRCS}) - set_source_files_properties(${${MODULE_PREFIX}_NEON_SRCS} PROPERTIES COMPILE_FLAGS "-mfpu=neon -mfloat-abi=softfp -Wno-unused-variable") + set_source_files_properties(${${MODULE_PREFIX}_NEON_SRCS} PROPERTIES COMPILE_FLAGS "-mfpu=neon -mfloat-abi=${ARM_FP_ABI} -Wno-unused-variable") endif() if(WITH_JPEG) diff --git a/libfreerdp/codec/nsc.c b/libfreerdp/codec/nsc.c index d20e015c3..c405997d0 100644 --- a/libfreerdp/codec/nsc.c +++ b/libfreerdp/codec/nsc.c @@ -271,8 +271,8 @@ NSC_CONTEXT* nsc_context_new(void) NSC_CONTEXT* nsc_context; UINT8 i; - nsc_context = (NSC_CONTEXT*) malloc(sizeof(NSC_CONTEXT)); - nsc_context->priv = (NSC_CONTEXT_PRIV*) malloc(sizeof(NSC_CONTEXT_PRIV)); + nsc_context = (NSC_CONTEXT*) calloc(1, sizeof(NSC_CONTEXT)); + nsc_context->priv = (NSC_CONTEXT_PRIV*) calloc(1, sizeof(NSC_CONTEXT_PRIV)); for (i=0; i < 5; ++i) { nsc_context->priv->plane_buf[i] = NULL; diff --git a/libfreerdp/codec/rfx.c b/libfreerdp/codec/rfx.c index e29a095ca..3f30cbd22 100644 --- a/libfreerdp/codec/rfx.c +++ b/libfreerdp/codec/rfx.c @@ -37,6 +37,7 @@ #include #include +#include #include "rfx_constants.h" #include "rfx_types.h" @@ -45,13 +46,8 @@ #include "rfx_quantization.h" #include "rfx_dwt.h" -#ifdef WITH_SSE2 #include "rfx_sse2.h" -#endif - -#ifdef WITH_NEON #include "rfx_neon.h" -#endif #ifndef RFX_INIT_SIMD #define RFX_INIT_SIMD(_rfx_context) do { } while (0) @@ -209,6 +205,11 @@ RFX_CONTEXT* rfx_context_new(void) if (context->priv->UseThreads) { + /* Call primitives_get here in order to avoid race conditions when using primitives_get */ + /* from multiple threads. This call will initialize all function pointers correctly */ + /* before any decoding threads are started */ + primitives_get(); + context->priv->ThreadPool = CreateThreadpool(NULL); InitializeThreadpoolEnvironment(&context->priv->ThreadPoolEnv); SetThreadpoolCallbackPool(&context->priv->ThreadPoolEnv, context->priv->ThreadPool); @@ -232,6 +233,8 @@ RFX_CONTEXT* rfx_context_new(void) context->dwt_2d_decode = rfx_dwt_2d_decode; context->dwt_2d_encode = rfx_dwt_2d_encode; + RFX_INIT_SIMD(context); + return context; } diff --git a/libfreerdp/codec/rfx_neon.c b/libfreerdp/codec/rfx_neon.c index 7331ea18b..40683b91b 100644 --- a/libfreerdp/codec/rfx_neon.c +++ b/libfreerdp/codec/rfx_neon.c @@ -40,9 +40,7 @@ static __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__)) rfx_quantization_decode_block_NEON(INT16 * buffer, const int buffer_size, const UINT32 factor) { - if (factor <= 6) - return; - int16x8_t quantFactors = vdupq_n_s16(factor - 6); + int16x8_t quantFactors = vdupq_n_s16(factor); int16x8_t* buf = (int16x8_t*)buffer; int16x8_t* buf_end = (int16x8_t*)(buffer + buffer_size); @@ -59,16 +57,18 @@ rfx_quantization_decode_block_NEON(INT16 * buffer, const int buffer_size, const void rfx_quantization_decode_NEON(INT16 * buffer, const UINT32 * quantization_values) { - rfx_quantization_decode_block_NEON(buffer, 1024, quantization_values[8]); /* HL1 */ - rfx_quantization_decode_block_NEON(buffer + 1024, 1024, quantization_values[7]); /* LH1 */ - rfx_quantization_decode_block_NEON(buffer + 2048, 1024, quantization_values[9]); /* HH1 */ - rfx_quantization_decode_block_NEON(buffer + 3072, 256, quantization_values[5]); /* HL2 */ - rfx_quantization_decode_block_NEON(buffer + 3328, 256, quantization_values[4]); /* LH2 */ - rfx_quantization_decode_block_NEON(buffer + 3584, 256, quantization_values[6]); /* HH2 */ - rfx_quantization_decode_block_NEON(buffer + 3840, 64, quantization_values[2]); /* HL3 */ - rfx_quantization_decode_block_NEON(buffer + 3904, 64, quantization_values[1]); /* LH3 */ - rfx_quantization_decode_block_NEON(buffer + 3968, 64, quantization_values[3]); /* HH3 */ - rfx_quantization_decode_block_NEON(buffer + 4032, 64, quantization_values[0]); /* LL3 */ + rfx_quantization_decode_block_NEON(buffer, 4096, 5); + + rfx_quantization_decode_block_NEON(buffer, 1024, quantization_values[8] - 6); /* HL1 */ + rfx_quantization_decode_block_NEON(buffer + 1024, 1024, quantization_values[7] - 6); /* LH1 */ + rfx_quantization_decode_block_NEON(buffer + 2048, 1024, quantization_values[9] - 6); /* HH1 */ + rfx_quantization_decode_block_NEON(buffer + 3072, 256, quantization_values[5] - 6); /* HL2 */ + rfx_quantization_decode_block_NEON(buffer + 3328, 256, quantization_values[4] - 6); /* LH2 */ + rfx_quantization_decode_block_NEON(buffer + 3584, 256, quantization_values[6] - 6); /* HH2 */ + rfx_quantization_decode_block_NEON(buffer + 3840, 64, quantization_values[2] - 6); /* HL3 */ + rfx_quantization_decode_block_NEON(buffer + 3904, 64, quantization_values[1] - 6); /* LH3 */ + rfx_quantization_decode_block_NEON(buffer + 3968, 64, quantization_values[3] - 6); /* HH3 */ + rfx_quantization_decode_block_NEON(buffer + 4032, 64, quantization_values[0] - 6); /* LL3 */ } @@ -278,8 +278,11 @@ int isNeonSupported() } return FALSE; -#else +#elif defined(__APPLE) + /* assume NEON support on iOS devices */ return TRUE; +#else + return FALSE; #endif } diff --git a/libfreerdp/codec/rfx_neon.h b/libfreerdp/codec/rfx_neon.h index 4ec15b281..4a4edddf4 100644 --- a/libfreerdp/codec/rfx_neon.h +++ b/libfreerdp/codec/rfx_neon.h @@ -22,8 +22,6 @@ #include -#if defined(__ARM_NEON__) - void rfx_init_neon(RFX_CONTEXT * context); #ifndef RFX_INIT_SIMD @@ -32,7 +30,5 @@ void rfx_init_neon(RFX_CONTEXT * context); #endif #endif -#endif // __ARM_NEON__ - #endif /* __RFX_NEON_H */ diff --git a/libfreerdp/codec/rfx_sse2.h b/libfreerdp/codec/rfx_sse2.h index 2fc14fd47..f1ff20e6d 100644 --- a/libfreerdp/codec/rfx_sse2.h +++ b/libfreerdp/codec/rfx_sse2.h @@ -24,8 +24,10 @@ void rfx_init_sse2(RFX_CONTEXT* context); -#ifndef RFX_INIT_SIMD -#define RFX_INIT_SIMD(_rfx_context) rfx_init_sse2(_rfx_context) +#ifdef WITH_SSE2 + #ifndef RFX_INIT_SIMD + #define RFX_INIT_SIMD(_rfx_context) rfx_init_sse2(_rfx_context) + #endif #endif #endif /* __RFX_SSE2_H */ diff --git a/libfreerdp/core/nla.c b/libfreerdp/core/nla.c index 5bf341fc0..441bf9680 100644 --- a/libfreerdp/core/nla.c +++ b/libfreerdp/core/nla.c @@ -1104,28 +1104,28 @@ void credssp_send(rdpCredssp* credssp) /* [1] negoTokens (NegoData) */ if (nego_tokens_length > 0) { - length = der_get_content_length(nego_tokens_length); - length -= der_write_contextual_tag(s, 1, length, TRUE); /* NegoData */ - length -= der_write_sequence_tag(s, length); /* SEQUENCE OF NegoDataItem */ - length -= der_write_sequence_tag(s, length); /* NegoDataItem */ - length -= der_write_contextual_tag(s, 0, length, TRUE); /* [0] negoToken */ - der_write_octet_string(s, (BYTE*) credssp->negoToken.pvBuffer, length); /* OCTET STRING */ + length = nego_tokens_length; + length -= der_write_contextual_tag(s, 1, der_get_content_length(length), TRUE); /* NegoData */ + length -= der_write_sequence_tag(s, der_get_content_length(length)); /* SEQUENCE OF NegoDataItem */ + length -= der_write_sequence_tag(s, der_get_content_length(length)); /* NegoDataItem */ + length -= der_write_contextual_tag(s, 0, der_get_content_length(length), TRUE); /* [0] negoToken */ + der_write_octet_string(s, (BYTE*) credssp->negoToken.pvBuffer, credssp->negoToken.cbBuffer); /* OCTET STRING */ } /* [2] authInfo (OCTET STRING) */ if (auth_info_length > 0) { - length = ber_get_content_length(auth_info_length); - length -= ber_write_contextual_tag(s, 2, length, TRUE); + length = auth_info_length; + length -= ber_write_contextual_tag(s, 2, ber_get_content_length(length), TRUE); ber_write_octet_string(s, credssp->authInfo.pvBuffer, credssp->authInfo.cbBuffer); } /* [3] pubKeyAuth (OCTET STRING) */ if (pub_key_auth_length > 0) { - length = ber_get_content_length(pub_key_auth_length); - length -= ber_write_contextual_tag(s, 3, length, TRUE); - ber_write_octet_string(s, credssp->pubKeyAuth.pvBuffer, length); + length = pub_key_auth_length; + length -= ber_write_contextual_tag(s, 3, ber_get_content_length(length), TRUE); + ber_write_octet_string(s, credssp->pubKeyAuth.pvBuffer, credssp->pubKeyAuth.cbBuffer); } transport_write(credssp->transport, s); diff --git a/libfreerdp/crypto/ber.c b/libfreerdp/crypto/ber.c index 344d5570d..963471dce 100644 --- a/libfreerdp/crypto/ber.c +++ b/libfreerdp/crypto/ber.c @@ -76,7 +76,7 @@ int ber_write_length(STREAM* s, int length) int _ber_skip_length(int length) { - if (length > 0x7F) + if (length > 0x80) return 3; else return 1; @@ -84,7 +84,7 @@ int _ber_skip_length(int length) int ber_get_content_length(int length) { - if (length - 1 > 0x7F) + if (length > 0x81) return length - 4; else return length - 2; diff --git a/libfreerdp/crypto/der.c b/libfreerdp/crypto/der.c index ef77b2a7f..888a00036 100644 --- a/libfreerdp/crypto/der.c +++ b/libfreerdp/crypto/der.c @@ -25,9 +25,9 @@ int _der_skip_length(int length) { - if (length > 0x7F && length <= 0xFF) + if (length > 0x81 && length <= 0x102) return 2; - else if (length > 0xFF) + else if (length > 0x102) return 3; else return 1; @@ -56,9 +56,9 @@ int der_write_length(STREAM* s, int length) int der_get_content_length(int length) { - if (length > 0x7F && length <= 0xFF) + if (length > 0x81 && length <= 0x102) return length - 3; - else if (length > 0xFF) + else if (length > 0x102) return length - 4; else return length - 2; diff --git a/libfreerdp/locale/keyboard_x11.c b/libfreerdp/locale/keyboard_x11.c index a4030946e..2f938ae4d 100644 --- a/libfreerdp/locale/keyboard_x11.c +++ b/libfreerdp/locale/keyboard_x11.c @@ -277,7 +277,7 @@ const UINT32 KEYCODE_TO_VKCODE_MACOSX[256] = 0, /* 60 */ VK_ESCAPE, /* 61 */ 0, /* 62 */ - 0, /* 63 */ + VK_LWIN, /* 63 */ VK_LSHIFT, /* 64 */ VK_CAPITAL, /* 65 */ VK_LMENU, /* 66 */ @@ -285,7 +285,7 @@ const UINT32 KEYCODE_TO_VKCODE_MACOSX[256] = VK_RSHIFT, /* 68 */ VK_RMENU, /* 69 */ 0, /* 70 */ - 0, /* 71 */ + VK_RWIN, /* 71 */ 0, /* 72 */ VK_DECIMAL, /* 73 */ 0, /* 74 */ diff --git a/libfreerdp/primitives/CMakeLists.txt b/libfreerdp/primitives/CMakeLists.txt index 4cbae2717..e8d1a7bfb 100644 --- a/libfreerdp/primitives/CMakeLists.txt +++ b/libfreerdp/primitives/CMakeLists.txt @@ -28,6 +28,15 @@ set(${MODULE_PREFIX}_SRCS primitives.c prim_internal.h) +set(${MODULE_PREFIX}_OPT_SRCS + prim_add_opt.c + prim_andor_opt.c + prim_alphaComp_opt.c + prim_colors_opt.c + prim_set_opt.c + prim_shift_opt.c + prim_sign_opt.c) + add_definitions(-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}) ### IPP Variable debugging @@ -49,7 +58,7 @@ if(WITH_SSE2) endif() elseif(WITH_NEON) if(CMAKE_COMPILER_IS_GNUCC) - set(OPTIMIZATION "${OPTIMIZATION} -mfpu=neon -mfloat-abi=softfp") + set(OPTIMIZATION "${OPTIMIZATION} -mfpu=neon -mfloat-abi=${ARM_FP_ABI}") endif() # TODO: Add MSVC equivalent endif() @@ -63,7 +72,9 @@ if(ANDROID) ${ANDROID_CPU_FEATURES_PATH}/cpu-features.h) endif() -set_property(SOURCE ${${MODULE_PREFIX}_SRCS} PROPERTY COMPILE_FLAGS ${OPTIMIZATION}) +set_property(SOURCE ${${MODULE_PREFIX}_OPT_SRCS} PROPERTY COMPILE_FLAGS ${OPTIMIZATION}) + +set(${MODULE_PREFIX}_SRCS ${${MODULE_PREFIX}_SRCS} ${${MODULE_PREFIX}_OPT_SRCS}) add_complex_library(MODULE ${MODULE_NAME} TYPE "OBJECT" MONOLITHIC ${MONOLITHIC_BUILD} diff --git a/libfreerdp/primitives/prim_add.c b/libfreerdp/primitives/prim_add.c index 17e504201..258bcc6ea 100644 --- a/libfreerdp/primitives/prim_add.c +++ b/libfreerdp/primitives/prim_add.c @@ -18,27 +18,16 @@ #include "config.h" #endif -#include - #include #include -#ifdef WITH_SSE2 -#include -#include -#endif /* WITH_SSE2 */ - -#ifdef WITH_IPP -#include -#endif /* WITH_IPP */ - #include "prim_internal.h" -#include "prim_templates.h" +#include "prim_add.h" /* ---------------------------------------------------------------------------- * 16-bit signed add with saturation (under and over). */ -PRIM_STATIC pstatus_t general_add_16s( +pstatus_t general_add_16s( const INT16 *pSrc1, const INT16 *pSrc2, INT16 *pDst, @@ -55,29 +44,14 @@ PRIM_STATIC pstatus_t general_add_16s( return PRIMITIVES_SUCCESS; } -#ifdef WITH_SSE2 -# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) -/* ------------------------------------------------------------------------- */ -SSE3_SSD_ROUTINE(sse3_add_16s, INT16, general_add_16s, - _mm_adds_epi16, general_add_16s(sptr1++, sptr2++, dptr++, 1)) -# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ -#endif - /* ------------------------------------------------------------------------- */ void primitives_init_add( const primitives_hints_t *hints, primitives_t *prims) { prims->add_16s = general_add_16s; -#ifdef WITH_IPP - prims->add_16s = (__add_16s_t) ippsAdd_16s; -#elif defined(WITH_SSE2) - if ((hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) - && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) /* for LDDQU */ - { - prims->add_16s = sse3_add_16s; - } -#endif + + primitives_init_add_opt(hints, prims); } /* ------------------------------------------------------------------------- */ diff --git a/libfreerdp/primitives/prim_add.h b/libfreerdp/primitives/prim_add.h new file mode 100644 index 000000000..4ad460279 --- /dev/null +++ b/libfreerdp/primitives/prim_add.h @@ -0,0 +1,30 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Add operations. + * vi:ts=4 sw=4 + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. Algorithms used by + * this code may be covered by patents by HP, Microsoft, or other parties. + * + */ + +#ifdef __GNUC__ +# pragma once +#endif + +#ifndef __PRIM_ADD_H_INCLUDED__ +#define __PRIM_ADD_H_INCLUDED__ + +pstatus_t general_add_16s(const INT16 *pSrc1, const INT16 *pSrc2, INT16 *pDst, INT32 len); + +void primitives_init_add_opt(const primitives_hints_t *hints, primitives_t *prims); + +#endif /* !__PRIM_ADD_H_INCLUDED__ */ + diff --git a/libfreerdp/primitives/prim_add_opt.c b/libfreerdp/primitives/prim_add_opt.c new file mode 100644 index 000000000..2de0b8fc6 --- /dev/null +++ b/libfreerdp/primitives/prim_add_opt.c @@ -0,0 +1,62 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Optimized add operations. + * vi:ts=4 sw=4: + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef WITH_SSE2 +#include +#include +#endif /* WITH_SSE2 */ + +#ifdef WITH_IPP +#include +#endif /* WITH_IPP */ + +#include "prim_internal.h" +#include "prim_templates.h" +#include "prim_add.h" + + +#ifdef WITH_SSE2 +# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) +/* ------------------------------------------------------------------------- */ +SSE3_SSD_ROUTINE(sse3_add_16s, INT16, general_add_16s, + _mm_adds_epi16, general_add_16s(sptr1++, sptr2++, dptr++, 1)) +# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ +#endif + +/* ------------------------------------------------------------------------- */ +void primitives_init_add_opt( + const primitives_hints_t *hints, + primitives_t *prims) +{ +#ifdef WITH_IPP + prims->add_16s = (__add_16s_t) ippsAdd_16s; +#elif defined(WITH_SSE2) + if ((hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) + && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) /* for LDDQU */ + { + prims->add_16s = sse3_add_16s; + } +#endif +} + + diff --git a/libfreerdp/primitives/prim_alphaComp.c b/libfreerdp/primitives/prim_alphaComp.c index 7f1a19093..24f916770 100644 --- a/libfreerdp/primitives/prim_alphaComp.c +++ b/libfreerdp/primitives/prim_alphaComp.c @@ -24,21 +24,11 @@ #include "config.h" #endif -#include - #include #include #include "prim_internal.h" - -#ifdef WITH_SSE2 -#include -#include -#endif /* WITH_SSE2 */ - -#ifdef WITH_IPP -#include -#endif /* WITH_IPP */ +#include "prim_alphaComp.h" #define ALPHA(_k_) (((_k_) & 0xFF000000U) >> 24) #define RED(_k_) (((_k_) & 0x00FF0000U) >> 16) @@ -46,7 +36,7 @@ #define BLU(_k_) (((_k_) & 0x000000FFU)) /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_alphaComp_argb( +pstatus_t general_alphaComp_argb( const BYTE *pSrc1, INT32 src1Step, const BYTE *pSrc2, INT32 src2Step, BYTE *pDst, INT32 dstStep, @@ -111,188 +101,12 @@ PRIM_STATIC pstatus_t general_alphaComp_argb( return PRIMITIVES_SUCCESS; } -/* ------------------------------------------------------------------------- */ -#ifdef WITH_SSE2 -#if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) - -PRIM_STATIC pstatus_t sse2_alphaComp_argb( - const BYTE *pSrc1, INT32 src1Step, - const BYTE *pSrc2, INT32 src2Step, - BYTE *pDst, INT32 dstStep, - INT32 width, INT32 height) -{ - const UINT32 *sptr1 = (const UINT32 *) pSrc1; - const UINT32 *sptr2 = (const UINT32 *) pSrc2; - UINT32 *dptr; - int linebytes, src1Jump, src2Jump, dstJump, y; - __m128i xmm0, xmm1; - - if ((width <= 0) || (height <= 0)) return PRIMITIVES_SUCCESS; - - if (width < 4) /* pointless if too small */ - { - return general_alphaComp_argb(pSrc1, src1Step, pSrc2, src2Step, - pDst, dstStep, width, height); - } - dptr = (UINT32 *) pDst; - linebytes = width * sizeof(UINT32); - src1Jump = (src1Step - linebytes) / sizeof(UINT32); - src2Jump = (src2Step - linebytes) / sizeof(UINT32); - dstJump = (dstStep - linebytes) / sizeof(UINT32); - - xmm0 = _mm_set1_epi32(0); - xmm1 = _mm_set1_epi16(1); - - for (y=0; y> 2; - pixels -= count << 2; - while (count--) - { - __m128i xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - /* BdGdRdAdBcGcRcAcBbGbRbAbBaGaRaAa */ - xmm2 = LOAD_SI128(sptr1); sptr1 += 4; - /* BhGhRhAhBgGgRgAgBfGfRfAfBeGeReAe */ - xmm3 = LOAD_SI128(sptr2); sptr2 += 4; - /* 00Bb00Gb00Rb00Ab00Ba00Ga00Ra00Aa */ - xmm4 = _mm_unpackhi_epi8(xmm2, xmm0); - /* 00Bf00Gf00Bf00Af00Be00Ge00Re00Ae */ - xmm5 = _mm_unpackhi_epi8(xmm3, xmm0); - /* subtract */ - xmm6 = _mm_subs_epi16(xmm4, xmm5); - /* 00Bb00Gb00Rb00Ab00Aa00Aa00Aa00Aa */ - xmm4 = _mm_shufflelo_epi16(xmm4, 0xff); - /* 00Ab00Ab00Ab00Ab00Aa00Aa00Aa00Aa */ - xmm4 = _mm_shufflehi_epi16(xmm4, 0xff); - /* Add one to alphas */ - xmm4 = _mm_adds_epi16(xmm4, xmm1); - /* Multiply and take low word */ - xmm4 = _mm_mullo_epi16(xmm4, xmm6); - /* Shift 8 right */ - xmm4 = _mm_srai_epi16(xmm4, 8); - /* Add xmm5 */ - xmm4 = _mm_adds_epi16(xmm4, xmm5); - /* 00Bj00Gj00Rj00Aj00Bi00Gi00Ri00Ai */ - - /* 00Bd00Gd00Rd00Ad00Bc00Gc00Rc00Ac */ - xmm5 = _mm_unpacklo_epi8(xmm2, xmm0); - /* 00Bh00Gh00Rh00Ah00Bg00Gg00Rg00Ag */ - xmm6 = _mm_unpacklo_epi8(xmm3, xmm0); - /* subtract */ - xmm7 = _mm_subs_epi16(xmm5, xmm6); - /* 00Bd00Gd00Rd00Ad00Ac00Ac00Ac00Ac */ - xmm5 = _mm_shufflelo_epi16(xmm5, 0xff); - /* 00Ad00Ad00Ad00Ad00Ac00Ac00Ac00Ac */ - xmm5 = _mm_shufflehi_epi16(xmm5, 0xff); - /* Add one to alphas */ - xmm5 = _mm_adds_epi16(xmm5, xmm1); - /* Multiply and take low word */ - xmm5 = _mm_mullo_epi16(xmm5, xmm7); - /* Shift 8 right */ - xmm5 = _mm_srai_epi16(xmm5, 8); - /* Add xmm6 */ - xmm5 = _mm_adds_epi16(xmm5, xmm6); - /* 00Bl00Gl00Rl00Al00Bk00Gk00Rk0ABk */ - - /* Must mask off remainders or pack gets confused */ - xmm3 = _mm_set1_epi16(0x00ffU); - xmm4 = _mm_and_si128(xmm4, xmm3); - xmm5 = _mm_and_si128(xmm5, xmm3); - - /* BlGlRlAlBkGkRkAkBjGjRjAjBiGiRiAi */ - xmm5 = _mm_packus_epi16(xmm5, xmm4); - _mm_store_si128((__m128i *) dptr, xmm5); dptr += 4; - } - - /* Finish off the remainder. */ - if (pixels) - { - general_alphaComp_argb((const BYTE *) sptr1, src1Step, - (const BYTE *) sptr2, src2Step, - (BYTE *) dptr, dstStep, pixels, 1); - sptr1 += pixels; - sptr2 += pixels; - dptr += pixels; - } - - /* Jump to next row. */ - sptr1 += src1Jump; - sptr2 += src2Jump; - dptr += dstJump; - } - - return PRIMITIVES_SUCCESS; -} -#endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ -#endif - -#ifdef WITH_IPP -/* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t ipp_alphaComp_argb( - const BYTE *pSrc1, INT32 src1Step, - const BYTE *pSrc2, INT32 src2Step, - BYTE *pDst, INT32 dstStep, - INT32 width, INT32 height) -{ - IppiSize sz; - sz.width = width; - sz.height = height; - return ippiAlphaComp_8u_AC4R(pSrc1, src1Step, pSrc2, src2Step, - pDst, dstStep, sz, ippAlphaOver); -} -#endif - /* ------------------------------------------------------------------------- */ void primitives_init_alphaComp(const primitives_hints_t* hints, primitives_t* prims) { prims->alphaComp_argb = general_alphaComp_argb; -#ifdef WITH_IPP - prims->alphaComp_argb = ipp_alphaComp_argb; -#elif defined(WITH_SSE2) - if ((hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) - && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) /* for LDDQU */ - { - prims->alphaComp_argb = sse2_alphaComp_argb; - } -#endif + + primitives_init_alphaComp_opt(hints, prims); } /* ------------------------------------------------------------------------- */ @@ -300,3 +114,4 @@ void primitives_deinit_alphaComp(primitives_t *prims) { /* Nothing to do. */ } + diff --git a/libfreerdp/primitives/prim_alphaComp.h b/libfreerdp/primitives/prim_alphaComp.h new file mode 100644 index 000000000..50591162d --- /dev/null +++ b/libfreerdp/primitives/prim_alphaComp.h @@ -0,0 +1,30 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Alpha blending routines. + * vi:ts=4 sw=4 + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. Algorithms used by + * this code may be covered by patents by HP, Microsoft, or other parties. + * + */ + +#ifdef __GNUC__ +# pragma once +#endif + +#ifndef __PRIM_ALPHACOMP_H_INCLUDED__ +#define __PRIM_ALPHACOMP_H_INCLUDED__ + +pstatus_t general_alphaComp_argb(const BYTE *pSrc1, INT32 src1Step, const BYTE *pSrc2, INT32 src2Step, BYTE *pDst, INT32 dstStep, INT32 width, INT32 height); + +void primitives_init_alphaComp_opt(const primitives_hints_t* hints, primitives_t* prims); + +#endif /* !__PRIM_ALPHACOMP_H_INCLUDED__ */ + diff --git a/libfreerdp/primitives/prim_alphaComp_opt.c b/libfreerdp/primitives/prim_alphaComp_opt.c new file mode 100644 index 000000000..5550fcbc1 --- /dev/null +++ b/libfreerdp/primitives/prim_alphaComp_opt.c @@ -0,0 +1,225 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Optimized alpha blending routines. + * vi:ts=4 sw=4: + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + * + * Note: this code assumes the second operand is fully opaque, + * e.g. + * newval = alpha1*val1 + (1-alpha1)*val2 + * rather than + * newval = alpha1*val1 + (1-alpha1)*alpha2*val2 + * The IPP gives other options. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef WITH_SSE2 +#include +#include +#endif /* WITH_SSE2 */ + +#ifdef WITH_IPP +#include +#endif /* WITH_IPP */ + +#include "prim_internal.h" +#include "prim_alphaComp.h" + + +/* ------------------------------------------------------------------------- */ +#ifdef WITH_SSE2 +#if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) + +pstatus_t sse2_alphaComp_argb( + const BYTE *pSrc1, INT32 src1Step, + const BYTE *pSrc2, INT32 src2Step, + BYTE *pDst, INT32 dstStep, + INT32 width, INT32 height) +{ + const UINT32 *sptr1 = (const UINT32 *) pSrc1; + const UINT32 *sptr2 = (const UINT32 *) pSrc2; + UINT32 *dptr; + int linebytes, src1Jump, src2Jump, dstJump, y; + __m128i xmm0, xmm1; + + if ((width <= 0) || (height <= 0)) return PRIMITIVES_SUCCESS; + + if (width < 4) /* pointless if too small */ + { + return general_alphaComp_argb(pSrc1, src1Step, pSrc2, src2Step, + pDst, dstStep, width, height); + } + dptr = (UINT32 *) pDst; + linebytes = width * sizeof(UINT32); + src1Jump = (src1Step - linebytes) / sizeof(UINT32); + src2Jump = (src2Step - linebytes) / sizeof(UINT32); + dstJump = (dstStep - linebytes) / sizeof(UINT32); + + xmm0 = _mm_set1_epi32(0); + xmm1 = _mm_set1_epi16(1); + + for (y=0; y> 2; + pixels -= count << 2; + while (count--) + { + __m128i xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; + /* BdGdRdAdBcGcRcAcBbGbRbAbBaGaRaAa */ + xmm2 = LOAD_SI128(sptr1); sptr1 += 4; + /* BhGhRhAhBgGgRgAgBfGfRfAfBeGeReAe */ + xmm3 = LOAD_SI128(sptr2); sptr2 += 4; + /* 00Bb00Gb00Rb00Ab00Ba00Ga00Ra00Aa */ + xmm4 = _mm_unpackhi_epi8(xmm2, xmm0); + /* 00Bf00Gf00Bf00Af00Be00Ge00Re00Ae */ + xmm5 = _mm_unpackhi_epi8(xmm3, xmm0); + /* subtract */ + xmm6 = _mm_subs_epi16(xmm4, xmm5); + /* 00Bb00Gb00Rb00Ab00Aa00Aa00Aa00Aa */ + xmm4 = _mm_shufflelo_epi16(xmm4, 0xff); + /* 00Ab00Ab00Ab00Ab00Aa00Aa00Aa00Aa */ + xmm4 = _mm_shufflehi_epi16(xmm4, 0xff); + /* Add one to alphas */ + xmm4 = _mm_adds_epi16(xmm4, xmm1); + /* Multiply and take low word */ + xmm4 = _mm_mullo_epi16(xmm4, xmm6); + /* Shift 8 right */ + xmm4 = _mm_srai_epi16(xmm4, 8); + /* Add xmm5 */ + xmm4 = _mm_adds_epi16(xmm4, xmm5); + /* 00Bj00Gj00Rj00Aj00Bi00Gi00Ri00Ai */ + + /* 00Bd00Gd00Rd00Ad00Bc00Gc00Rc00Ac */ + xmm5 = _mm_unpacklo_epi8(xmm2, xmm0); + /* 00Bh00Gh00Rh00Ah00Bg00Gg00Rg00Ag */ + xmm6 = _mm_unpacklo_epi8(xmm3, xmm0); + /* subtract */ + xmm7 = _mm_subs_epi16(xmm5, xmm6); + /* 00Bd00Gd00Rd00Ad00Ac00Ac00Ac00Ac */ + xmm5 = _mm_shufflelo_epi16(xmm5, 0xff); + /* 00Ad00Ad00Ad00Ad00Ac00Ac00Ac00Ac */ + xmm5 = _mm_shufflehi_epi16(xmm5, 0xff); + /* Add one to alphas */ + xmm5 = _mm_adds_epi16(xmm5, xmm1); + /* Multiply and take low word */ + xmm5 = _mm_mullo_epi16(xmm5, xmm7); + /* Shift 8 right */ + xmm5 = _mm_srai_epi16(xmm5, 8); + /* Add xmm6 */ + xmm5 = _mm_adds_epi16(xmm5, xmm6); + /* 00Bl00Gl00Rl00Al00Bk00Gk00Rk0ABk */ + + /* Must mask off remainders or pack gets confused */ + xmm3 = _mm_set1_epi16(0x00ffU); + xmm4 = _mm_and_si128(xmm4, xmm3); + xmm5 = _mm_and_si128(xmm5, xmm3); + + /* BlGlRlAlBkGkRkAkBjGjRjAjBiGiRiAi */ + xmm5 = _mm_packus_epi16(xmm5, xmm4); + _mm_store_si128((__m128i *) dptr, xmm5); dptr += 4; + } + + /* Finish off the remainder. */ + if (pixels) + { + general_alphaComp_argb((const BYTE *) sptr1, src1Step, + (const BYTE *) sptr2, src2Step, + (BYTE *) dptr, dstStep, pixels, 1); + sptr1 += pixels; + sptr2 += pixels; + dptr += pixels; + } + + /* Jump to next row. */ + sptr1 += src1Jump; + sptr2 += src2Jump; + dptr += dstJump; + } + + return PRIMITIVES_SUCCESS; +} +#endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ +#endif + +#ifdef WITH_IPP +/* ------------------------------------------------------------------------- */ +pstatus_t ipp_alphaComp_argb( + const BYTE *pSrc1, INT32 src1Step, + const BYTE *pSrc2, INT32 src2Step, + BYTE *pDst, INT32 dstStep, + INT32 width, INT32 height) +{ + IppiSize sz; + sz.width = width; + sz.height = height; + return ippiAlphaComp_8u_AC4R(pSrc1, src1Step, pSrc2, src2Step, + pDst, dstStep, sz, ippAlphaOver); +} +#endif + +/* ------------------------------------------------------------------------- */ +void primitives_init_alphaComp_opt(const primitives_hints_t* hints, primitives_t* prims) +{ +#ifdef WITH_IPP + prims->alphaComp_argb = ipp_alphaComp_argb; +#elif defined(WITH_SSE2) + if ((hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) + && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) /* for LDDQU */ + { + prims->alphaComp_argb = sse2_alphaComp_argb; + } +#endif +} + diff --git a/libfreerdp/primitives/prim_andor.c b/libfreerdp/primitives/prim_andor.c index 358d6c823..0b8092ff2 100644 --- a/libfreerdp/primitives/prim_andor.c +++ b/libfreerdp/primitives/prim_andor.c @@ -17,27 +17,16 @@ #include "config.h" #endif -#include - #include #include -#ifdef WITH_SSE2 -#include -#include -#endif /* WITH_SSE2 */ - -#ifdef WITH_IPP -#include -#endif /* WITH_IPP */ - #include "prim_internal.h" -#include "prim_templates.h" +#include "prim_andor.h" /* ---------------------------------------------------------------------------- * 32-bit AND with a constant. */ -PRIM_STATIC pstatus_t general_andC_32u( +pstatus_t general_andC_32u( const UINT32 *pSrc, UINT32 val, UINT32 *pDst, @@ -55,7 +44,7 @@ PRIM_STATIC pstatus_t general_andC_32u( /* ---------------------------------------------------------------------------- * 32-bit OR with a constant. */ -PRIM_STATIC pstatus_t general_orC_32u( +pstatus_t general_orC_32u( const UINT32 *pSrc, UINT32 val, UINT32 *pDst, @@ -70,16 +59,6 @@ PRIM_STATIC pstatus_t general_orC_32u( return PRIMITIVES_SUCCESS; } -#ifdef WITH_SSE2 -# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) -/* ------------------------------------------------------------------------- */ -SSE3_SCD_PRE_ROUTINE(sse3_andC_32u, UINT32, general_andC_32u, - _mm_and_si128, *dptr++ = *sptr++ & val) -SSE3_SCD_PRE_ROUTINE(sse3_orC_32u, UINT32, general_orC_32u, - _mm_or_si128, *dptr++ = *sptr++ | val) -# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ -#endif - /* ------------------------------------------------------------------------- */ void primitives_init_andor( const primitives_hints_t *hints, @@ -89,17 +68,7 @@ void primitives_init_andor( prims->andC_32u = general_andC_32u; prims->orC_32u = general_orC_32u; -#if defined(WITH_IPP) - prims->andC_32u = (__andC_32u_t) ippsAndC_32u; - prims->orC_32u = (__orC_32u_t) ippsOrC_32u; -#elif defined(WITH_SSE2) - if ((hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) - && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) - { - prims->andC_32u = sse3_andC_32u; - prims->orC_32u = sse3_orC_32u; - } -#endif + primitives_init_andor_opt(hints, prims); } /* ------------------------------------------------------------------------- */ @@ -108,3 +77,4 @@ void primitives_deinit_andor( { /* Nothing to do. */ } + diff --git a/libfreerdp/primitives/prim_andor.h b/libfreerdp/primitives/prim_andor.h new file mode 100644 index 000000000..6a2e7ac46 --- /dev/null +++ b/libfreerdp/primitives/prim_andor.h @@ -0,0 +1,31 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Logical operations. + * vi:ts=4 sw=4 + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. Algorithms used by + * this code may be covered by patents by HP, Microsoft, or other parties. + * + */ + +#ifdef __GNUC__ +# pragma once +#endif + +#ifndef __PRIM_ANDOR_H_INCLUDED__ +#define __PRIM_ANDOR_H_INCLUDED__ + +pstatus_t general_andC_32u(const UINT32 *pSrc, UINT32 val, UINT32 *pDst, INT32 len); +pstatus_t general_orC_32u(const UINT32 *pSrc, UINT32 val, UINT32 *pDst, INT32 len); + +void primitives_init_andor_opt(const primitives_hints_t *hints, primitives_t *prims); + +#endif /* !__PRIM_ANDOR_H_INCLUDED__ */ + diff --git a/libfreerdp/primitives/prim_andor_opt.c b/libfreerdp/primitives/prim_andor_opt.c new file mode 100644 index 000000000..1a7ebd2a0 --- /dev/null +++ b/libfreerdp/primitives/prim_andor_opt.c @@ -0,0 +1,61 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Optimized Logical operations. + * vi:ts=4 sw=4: + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef WITH_SSE2 +#include +#include +#endif /* WITH_SSE2 */ + +#ifdef WITH_IPP +#include +#endif /* WITH_IPP */ + +#include "prim_internal.h" +#include "prim_templates.h" +#include "prim_andor.h" + +#ifdef WITH_SSE2 +# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) +/* ------------------------------------------------------------------------- */ +SSE3_SCD_PRE_ROUTINE(sse3_andC_32u, UINT32, general_andC_32u, + _mm_and_si128, *dptr++ = *sptr++ & val) +SSE3_SCD_PRE_ROUTINE(sse3_orC_32u, UINT32, general_orC_32u, + _mm_or_si128, *dptr++ = *sptr++ | val) +# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ +#endif + +/* ------------------------------------------------------------------------- */ +void primitives_init_andor_opt(const primitives_hints_t *hints, primitives_t *prims) +{ +#if defined(WITH_IPP) + prims->andC_32u = (__andC_32u_t) ippsAndC_32u; + prims->orC_32u = (__orC_32u_t) ippsOrC_32u; +#elif defined(WITH_SSE2) + if ((hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) + && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) + { + prims->andC_32u = sse3_andC_32u; + prims->orC_32u = sse3_orC_32u; + } +#endif +} + diff --git a/libfreerdp/primitives/prim_colors.c b/libfreerdp/primitives/prim_colors.c index e6e7a18bf..179e569b7 100644 --- a/libfreerdp/primitives/prim_colors.c +++ b/libfreerdp/primitives/prim_colors.c @@ -21,16 +21,11 @@ #include "config.h" #endif -#include #include #include -#ifdef WITH_SSE2 -#include -#elif defined(WITH_NEON) -#include -#endif /* WITH_SSE2 else WITH_NEON */ + #include "prim_internal.h" -#include "prim_templates.h" +#include "prim_colors.h" #ifndef MINMAX #define MINMAX(_v_, _l_, _h_) \ @@ -38,7 +33,7 @@ #endif /* !MINMAX */ /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_yCbCrToRGB_16s16s_P3P3( +pstatus_t general_yCbCrToRGB_16s16s_P3P3( const INT16 *pSrc[3], INT32 srcStep, INT16 *pDst[3], INT32 dstStep, const prim_size_t *roi) /* region of interest */ @@ -119,7 +114,7 @@ PRIM_STATIC pstatus_t general_yCbCrToRGB_16s16s_P3P3( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_RGBToYCbCr_16s16s_P3P3( +pstatus_t general_RGBToYCbCr_16s16s_P3P3( const INT16 *pSrc[3], INT32 srcStep, INT16 *pDst[3], INT32 dstStep, const prim_size_t *roi) /* region of interest */ @@ -187,7 +182,7 @@ PRIM_STATIC pstatus_t general_RGBToYCbCr_16s16s_P3P3( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_RGBToRGB_16s8u_P3AC4R( +pstatus_t general_RGBToRGB_16s8u_P3AC4R( const INT16 *pSrc[3], /* 16-bit R,G, and B arrays */ int srcStep, /* bytes between rows in source data */ BYTE *pDst, /* 32-bit interleaved ARGB (ABGR?) data */ @@ -219,500 +214,6 @@ PRIM_STATIC pstatus_t general_RGBToRGB_16s8u_P3AC4R( return PRIMITIVES_SUCCESS; } - -#ifdef WITH_SSE2 - -#ifdef __GNUC__ -# define GNU_INLINE \ - __attribute__((__gnu_inline__, __always_inline__, __artificial__)) -#else -# define GNU_INLINE -#endif - -#define CACHE_LINE_BYTES 64 - -#define _mm_between_epi16(_val, _min, _max) \ - do { _val = _mm_min_epi16(_max, _mm_max_epi16(_val, _min)); } while (0) - -#ifdef DO_PREFETCH -/*---------------------------------------------------------------------------*/ -static inline void GNU_INLINE _mm_prefetch_buffer( - char * buffer, - int num_bytes) -{ - __m128i * buf = (__m128i*) buffer; - unsigned int i; - for (i = 0; i < (num_bytes / sizeof(__m128i)); - i+=(CACHE_LINE_BYTES / sizeof(__m128i))) - { - _mm_prefetch((char*)(&buf[i]), _MM_HINT_NTA); - } -} -#endif /* DO_PREFETCH */ - -/*---------------------------------------------------------------------------*/ -PRIM_STATIC pstatus_t sse2_yCbCrToRGB_16s16s_P3P3( - const INT16 *pSrc[3], - int srcStep, - INT16 *pDst[3], - int dstStep, - const prim_size_t *roi) /* region of interest */ -{ - __m128i zero, max, r_cr, g_cb, g_cr, b_cb, c4096; - __m128i *y_buf, *cb_buf, *cr_buf, *r_buf, *g_buf, *b_buf; - int srcbump, dstbump, yp, imax; - - if (((ULONG_PTR) (pSrc[0]) & 0x0f) - || ((ULONG_PTR) (pSrc[1]) & 0x0f) - || ((ULONG_PTR) (pSrc[2]) & 0x0f) - || ((ULONG_PTR) (pDst[0]) & 0x0f) - || ((ULONG_PTR) (pDst[1]) & 0x0f) - || ((ULONG_PTR) (pDst[2]) & 0x0f) - || (roi->width & 0x07) - || (srcStep & 127) - || (dstStep & 127)) - { - /* We can't maintain 16-byte alignment. */ - return general_yCbCrToRGB_16s16s_P3P3(pSrc, srcStep, - pDst, dstStep, roi); - } - - zero = _mm_setzero_si128(); - max = _mm_set1_epi16(255); - - y_buf = (__m128i*) (pSrc[0]); - cb_buf = (__m128i*) (pSrc[1]); - cr_buf = (__m128i*) (pSrc[2]); - r_buf = (__m128i*) (pDst[0]); - g_buf = (__m128i*) (pDst[1]); - b_buf = (__m128i*) (pDst[2]); - - r_cr = _mm_set1_epi16(22986); /* 1.403 << 14 */ - g_cb = _mm_set1_epi16(-5636); /* -0.344 << 14 */ - g_cr = _mm_set1_epi16(-11698); /* -0.714 << 14 */ - b_cb = _mm_set1_epi16(28999); /* 1.770 << 14 */ - c4096 = _mm_set1_epi16(4096); - srcbump = srcStep / sizeof(__m128i); - dstbump = dstStep / sizeof(__m128i); - -#ifdef DO_PREFETCH - /* Prefetch Y's, Cb's, and Cr's. */ - for (yp=0; ypheight; yp++) - { - int i; - for (i=0; iwidth * sizeof(INT16) / sizeof(__m128i); - i += (CACHE_LINE_BYTES / sizeof(__m128i))) - { - _mm_prefetch((char*)(&y_buf[i]), _MM_HINT_NTA); - _mm_prefetch((char*)(&cb_buf[i]), _MM_HINT_NTA); - _mm_prefetch((char*)(&cr_buf[i]), _MM_HINT_NTA); - } - y_buf += srcbump; - cb_buf += srcbump; - cr_buf += srcbump; - } - y_buf = (__m128i*) (pSrc[0]); - cb_buf = (__m128i*) (pSrc[1]); - cr_buf = (__m128i*) (pSrc[2]); -#endif /* DO_PREFETCH */ - - imax = roi->width * sizeof(INT16) / sizeof(__m128i); - for (yp=0; ypheight; ++yp) - { - int i; - for (i=0; i>5) + 128 + (cr*1.403)>>5 // our base formula - * r = (y>>5) + 128 + (HIWORD(cr*(1.403<<14)<<2))>>5 // see above - * r = (y+4096)>>5 + (HIWORD(cr*22986)<<2)>>5 // simplification - * r = ((y+4096)>>2 + HIWORD(cr*22986)) >> 3 - */ - - /* y = (y_r_buf[i] + 4096) >> 2 */ - __m128i y, cb, cr, r, g, b; - y = _mm_load_si128(y_buf + i); - y = _mm_add_epi16(y, c4096); - y = _mm_srai_epi16(y, 2); - /* cb = cb_g_buf[i]; */ - cb = _mm_load_si128(cb_buf + i); - /* cr = cr_b_buf[i]; */ - cr = _mm_load_si128(cr_buf + i); - - /* (y + HIWORD(cr*22986)) >> 3 */ - r = _mm_add_epi16(y, _mm_mulhi_epi16(cr, r_cr)); - r = _mm_srai_epi16(r, 3); - - /* r_buf[i] = MINMAX(r, 0, 255); */ - _mm_between_epi16(r, zero, max); - _mm_store_si128(r_buf + i, r); - - /* (y + HIWORD(cb*-5636) + HIWORD(cr*-11698)) >> 3 */ - g = _mm_add_epi16(y, _mm_mulhi_epi16(cb, g_cb)); - g = _mm_add_epi16(g, _mm_mulhi_epi16(cr, g_cr)); - g = _mm_srai_epi16(g, 3); - - /* g_buf[i] = MINMAX(g, 0, 255); */ - _mm_between_epi16(g, zero, max); - _mm_store_si128(g_buf + i, g); - - /* (y + HIWORD(cb*28999)) >> 3 */ - b = _mm_add_epi16(y, _mm_mulhi_epi16(cb, b_cb)); - b = _mm_srai_epi16(b, 3); - /* b_buf[i] = MINMAX(b, 0, 255); */ - _mm_between_epi16(b, zero, max); - _mm_store_si128(b_buf + i, b); - } - y_buf += srcbump; - cb_buf += srcbump; - cr_buf += srcbump; - r_buf += dstbump; - g_buf += dstbump; - b_buf += dstbump; - } - - return PRIMITIVES_SUCCESS; -} - -/*---------------------------------------------------------------------------*/ -/* The encodec YCbCr coeffectients are represented as 11.5 fixed-point - * numbers. See the general code above. - */ -PRIM_STATIC pstatus_t sse2_RGBToYCbCr_16s16s_P3P3( - const INT16 *pSrc[3], - int srcStep, - INT16 *pDst[3], - int dstStep, - const prim_size_t *roi) /* region of interest */ -{ - __m128i min, max, y_r, y_g, y_b, cb_r, cb_g, cb_b, cr_r, cr_g, cr_b; - __m128i *r_buf, *g_buf, *b_buf, *y_buf, *cb_buf, *cr_buf; - int srcbump, dstbump, yp, imax; - - if (((ULONG_PTR) (pSrc[0]) & 0x0f) - || ((ULONG_PTR) (pSrc[1]) & 0x0f) - || ((ULONG_PTR) (pSrc[2]) & 0x0f) - || ((ULONG_PTR) (pDst[0]) & 0x0f) - || ((ULONG_PTR) (pDst[1]) & 0x0f) - || ((ULONG_PTR) (pDst[2]) & 0x0f) - || (roi->width & 0x07) - || (srcStep & 127) - || (dstStep & 127)) - { - /* We can't maintain 16-byte alignment. */ - return general_RGBToYCbCr_16s16s_P3P3(pSrc, srcStep, - pDst, dstStep, roi); - } - - min = _mm_set1_epi16(-128 << 5); - max = _mm_set1_epi16(127 << 5); - - r_buf = (__m128i*) (pSrc[0]); - g_buf = (__m128i*) (pSrc[1]); - b_buf = (__m128i*) (pSrc[2]); - y_buf = (__m128i*) (pDst[0]); - cb_buf = (__m128i*) (pDst[1]); - cr_buf = (__m128i*) (pDst[2]); - - y_r = _mm_set1_epi16(9798); /* 0.299000 << 15 */ - y_g = _mm_set1_epi16(19235); /* 0.587000 << 15 */ - y_b = _mm_set1_epi16(3735); /* 0.114000 << 15 */ - cb_r = _mm_set1_epi16(-5535); /* -0.168935 << 15 */ - cb_g = _mm_set1_epi16(-10868); /* -0.331665 << 15 */ - cb_b = _mm_set1_epi16(16403); /* 0.500590 << 15 */ - cr_r = _mm_set1_epi16(16377); /* 0.499813 << 15 */ - cr_g = _mm_set1_epi16(-13714); /* -0.418531 << 15 */ - cr_b = _mm_set1_epi16(-2663); /* -0.081282 << 15 */ - - srcbump = srcStep / sizeof(__m128i); - dstbump = dstStep / sizeof(__m128i); - -#ifdef DO_PREFETCH - /* Prefetch RGB's. */ - for (yp=0; ypheight; yp++) - { - int i; - for (i=0; iwidth * sizeof(INT16) / sizeof(__m128i); - i += (CACHE_LINE_BYTES / sizeof(__m128i))) - { - _mm_prefetch((char*)(&r_buf[i]), _MM_HINT_NTA); - _mm_prefetch((char*)(&g_buf[i]), _MM_HINT_NTA); - _mm_prefetch((char*)(&b_buf[i]), _MM_HINT_NTA); - } - r_buf += srcbump; - g_buf += srcbump; - b_buf += srcbump; - } - r_buf = (__m128i*) (pSrc[0]); - g_buf = (__m128i*) (pSrc[1]); - b_buf = (__m128i*) (pSrc[2]); -#endif /* DO_PREFETCH */ - - imax = roi->width * sizeof(INT16) / sizeof(__m128i); - for (yp=0; ypheight; ++yp) - { - int i; - for (i=0; iwidth & 0x0f) - || (srcStep & 0x0f) - || (dstStep & 0x0f)) - { - return general_RGBToRGB_16s8u_P3AC4R(pSrc, srcStep, pDst, dstStep, roi); - } - - out = (BYTE *) pDst; - srcbump = (srcStep - (roi->width * sizeof(UINT16))) / sizeof(UINT16); - dstbump = (dstStep - (roi->width * sizeof(UINT32))); - - for (y=0; yheight; ++y) - { - int width = roi->width; - do { - __m128i R0, R1, R2, R3, R4; - /* The comments below pretend these are 8-byte registers - * rather than 16-byte, for readability. - */ - R0 = LOAD128(b); b += 8; /* R0 = 00B300B200B100B0 */ - R1 = LOAD128(b); b += 8; /* R1 = 00B700B600B500B4 */ - PACKUSWB(R0,R1); /* R0 = B7B6B5B4B3B2B1B0 */ - R1 = LOAD128(g); g += 8; /* R1 = 00G300G200G100G0 */ - R2 = LOAD128(g); g += 8; /* R2 = 00G700G600G500G4 */ - PACKUSWB(R1,R2); /* R1 = G7G6G5G4G3G2G1G0 */ - R2 = R1; /* R2 = G7G6G5G4G3G2G1G0 */ - PUNPCKLBW(R2,R0); /* R2 = G3B3G2B2G1B1G0B0 */ - PUNPCKHBW(R1,R0); /* R1 = G7B7G6B7G5B5G4B4 */ - R0 = LOAD128(r); r += 8; /* R0 = 00R300R200R100R0 */ - R3 = LOAD128(r); r += 8; /* R3 = 00R700R600R500R4 */ - PACKUSWB(R0,R3); /* R0 = R7R6R5R4R3R2R1R0 */ - R3 = XMM_ALL_ONES; /* R3 = FFFFFFFFFFFFFFFF */ - R4 = R3; /* R4 = FFFFFFFFFFFFFFFF */ - PUNPCKLBW(R4,R0); /* R4 = FFR3FFR2FFR1FFR0 */ - PUNPCKHBW(R3,R0); /* R3 = FFR7FFR6FFR5FFR4 */ - R0 = R4; /* R0 = R4 */ - PUNPCKLWD(R0,R2); /* R0 = FFR1G1B1FFR0G0B0 */ - PUNPCKHWD(R4,R2); /* R4 = FFR3G3B3FFR2G2B2 */ - R2 = R3; /* R2 = R3 */ - PUNPCKLWD(R2,R1); /* R2 = FFR5G5B5FFR4G4B4 */ - PUNPCKHWD(R3,R1); /* R3 = FFR7G7B7FFR6G6B6 */ - STORE128(out, R0); out += 16; /* FFR1G1B1FFR0G0B0 */ - STORE128(out, R4); out += 16; /* FFR3G3B3FFR2G2B2 */ - STORE128(out, R2); out += 16; /* FFR5G5B5FFR4G4B4 */ - STORE128(out, R3); out += 16; /* FFR7G7B7FFR6G6B6 */ - } while (width -= 16); - /* Jump to next row. */ - r += srcbump; - g += srcbump; - b += srcbump; - out += dstbump; - } - return PRIMITIVES_SUCCESS; -} -#endif /* WITH_SSE2 */ - -/*---------------------------------------------------------------------------*/ -#ifdef WITH_NEON -PRIM_STATIC pstatus_t neon_yCbCrToRGB_16s16s_P3P3( - const INT16 *pSrc[3], - int srcStep, - INT16 *pDst[3], - int dstStep, - const prim_size_t *roi) /* region of interest */ -{ - /* TODO: If necessary, check alignments and call the general version. */ - - int16x8_t zero = vdupq_n_s16(0); - int16x8_t max = vdupq_n_s16(255); - int16x8_t y_add = vdupq_n_s16(128); - - int16x8_t* y_buf = (int16x8_t*) pSrc[0]; - int16x8_t* cb_buf = (int16x8_t*) pSrc[1]; - int16x8_t* cr_buf = (int16x8_t*) pSrc[2]; - int16x8_t* r_buf = (int16x8_t*) pDst[0]; - int16x8_t* g_buf = (int16x8_t*) pDst[1]; - int16x8_t* b_buf = (int16x8_t*) pDst[2]; - - int srcbump = srcStep / sizeof(int16x8_t); - int dstbump = dstStep / sizeof(int16x8_t); - int yp; - - int imax = roi->width * sizeof(INT16) / sizeof(int16x8_t); - for (yp=0; ypheight; ++yp) - { - int i; - for (i=0; i> 2) + (cr >> 3) + (cr >> 5)), - * 0, 255); - */ - int16x8_t r = vaddq_s16(y, cr); - r = vaddq_s16(r, vshrq_n_s16(cr, 2)); - r = vaddq_s16(r, vshrq_n_s16(cr, 3)); - r = vaddq_s16(r, vshrq_n_s16(cr, 5)); - r = vminq_s16(vmaxq_s16(r, zero), max); - vst1q_s16((INT16*) (r_buf+i), r); - - /* cb = cb_g_buf[i]; */ - int16x8_t cb = vld1q_s16((INT16*) (cb_buf+i)); - - /* g = between(y - (cb >> 2) - (cb >> 4) - (cb >> 5) - (cr >> 1) - * - (cr >> 3) - (cr >> 4) - (cr >> 5), 0, 255); - */ - int16x8_t g = vsubq_s16(y, vshrq_n_s16(cb, 2)); - g = vsubq_s16(g, vshrq_n_s16(cb, 4)); - g = vsubq_s16(g, vshrq_n_s16(cb, 5)); - g = vsubq_s16(g, vshrq_n_s16(cr, 1)); - g = vsubq_s16(g, vshrq_n_s16(cr, 3)); - g = vsubq_s16(g, vshrq_n_s16(cr, 4)); - g = vsubq_s16(g, vshrq_n_s16(cr, 5)); - g = vminq_s16(vmaxq_s16(g, zero), max); - vst1q_s16((INT16*) (g_buf+i), g); - - /* b = between((y + cb + (cb >> 1) + (cb >> 2) + (cb >> 6)), - * 0, 255); - */ - int16x8_t b = vaddq_s16(y, cb); - b = vaddq_s16(b, vshrq_n_s16(cb, 1)); - b = vaddq_s16(b, vshrq_n_s16(cb, 2)); - b = vaddq_s16(b, vshrq_n_s16(cb, 6)); - b = vminq_s16(vmaxq_s16(b, zero), max); - vst1q_s16((INT16*) (b_buf+i), b); - } - y_buf += srcbump; - cb_buf += srcbump; - cr_buf += srcbump; - r_buf += dstbump; - g_buf += dstbump; - b_buf += dstbump; - } - return PRIMITIVES_SUCCESS; -} -#endif /* WITH_NEON */ - - -/* I don't see a direct IPP version of this, since the input is INT16 - * YCbCr. It may be possible via Deinterleave and then YCbCrToRGB_. - * But that would likely be slower. - */ - /* ------------------------------------------------------------------------- */ void primitives_init_colors(const primitives_hints_t* hints, primitives_t* prims) { @@ -720,19 +221,7 @@ void primitives_init_colors(const primitives_hints_t* hints, primitives_t* prims prims->yCbCrToRGB_16s16s_P3P3 = general_yCbCrToRGB_16s16s_P3P3; prims->RGBToYCbCr_16s16s_P3P3 = general_RGBToYCbCr_16s16s_P3P3; -#if defined(WITH_SSE2) - if (hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) - { - prims->RGBToRGB_16s8u_P3AC4R = sse2_RGBToRGB_16s8u_P3AC4R; - prims->yCbCrToRGB_16s16s_P3P3 = sse2_yCbCrToRGB_16s16s_P3P3; - prims->RGBToYCbCr_16s16s_P3P3 = sse2_RGBToYCbCr_16s16s_P3P3; - } -#elif defined(WITH_NEON) - if (hints->arm_flags & PRIM_ARM_NEON_AVAILABLE) - { - prims->yCbCrToRGB_16s16s_P3P3 = neon_yCbCrToRGB_16s16s_P3P3; - } -#endif /* WITH_SSE2 */ + primitives_init_colors_opt(hints, prims); } /* ------------------------------------------------------------------------- */ @@ -740,3 +229,4 @@ void primitives_deinit_colors(primitives_t* prims) { /* Nothing to do. */ } + diff --git a/libfreerdp/primitives/prim_colors.h b/libfreerdp/primitives/prim_colors.h new file mode 100644 index 000000000..70f478547 --- /dev/null +++ b/libfreerdp/primitives/prim_colors.h @@ -0,0 +1,32 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Color conversion operations. + * vi:ts=4 sw=4 + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. Algorithms used by + * this code may be covered by patents by HP, Microsoft, or other parties. + * + */ + +#ifdef __GNUC__ +# pragma once +#endif + +#ifndef __PRIM_COLORS_H_INCLUDED__ +#define __PRIM_COLORS_H_INCLUDED__ + +pstatus_t general_yCbCrToRGB_16s16s_P3P3(const INT16 *pSrc[3], INT32 srcStep, INT16 *pDst[3], INT32 dstStep, const prim_size_t *roi); +pstatus_t general_RGBToYCbCr_16s16s_P3P3(const INT16 *pSrc[3], INT32 srcStep, INT16 *pDst[3], INT32 dstStep, const prim_size_t *roi); +pstatus_t general_RGBToRGB_16s8u_P3AC4R(const INT16 *pSrc[3], int srcStep, BYTE *pDst, int dstStep, const prim_size_t *roi); + +void primitives_init_colors_opt(const primitives_hints_t* hints, primitives_t* prims); + +#endif /* !__PRIM_COLORS_H_INCLUDED__ */ + diff --git a/libfreerdp/primitives/prim_colors_opt.c b/libfreerdp/primitives/prim_colors_opt.c new file mode 100644 index 000000000..cfc87414e --- /dev/null +++ b/libfreerdp/primitives/prim_colors_opt.c @@ -0,0 +1,561 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Optimized Color conversion operations. + * vi:ts=4 sw=4: + * + * Copyright 2011 Stephen Erisman + * Copyright 2011 Norbert Federa + * Copyright 2011 Martin Fleisz + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef WITH_SSE2 +#include +#elif defined(WITH_NEON) +#include +#endif /* WITH_SSE2 else WITH_NEON */ + +#include "prim_internal.h" +#include "prim_templates.h" +#include "prim_colors.h" + +#ifdef WITH_SSE2 + +#ifdef __GNUC__ +# define GNU_INLINE \ + __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +#else +# define GNU_INLINE +#endif + +#define CACHE_LINE_BYTES 64 + +#define _mm_between_epi16(_val, _min, _max) \ + do { _val = _mm_min_epi16(_max, _mm_max_epi16(_val, _min)); } while (0) + +#ifdef DO_PREFETCH +/*---------------------------------------------------------------------------*/ +static inline void GNU_INLINE _mm_prefetch_buffer( + char * buffer, + int num_bytes) +{ + __m128i * buf = (__m128i*) buffer; + unsigned int i; + for (i = 0; i < (num_bytes / sizeof(__m128i)); + i+=(CACHE_LINE_BYTES / sizeof(__m128i))) + { + _mm_prefetch((char*)(&buf[i]), _MM_HINT_NTA); + } +} +#endif /* DO_PREFETCH */ + +/*---------------------------------------------------------------------------*/ +pstatus_t sse2_yCbCrToRGB_16s16s_P3P3( + const INT16 *pSrc[3], + int srcStep, + INT16 *pDst[3], + int dstStep, + const prim_size_t *roi) /* region of interest */ +{ + __m128i zero, max, r_cr, g_cb, g_cr, b_cb, c4096; + __m128i *y_buf, *cb_buf, *cr_buf, *r_buf, *g_buf, *b_buf; + int srcbump, dstbump, yp, imax; + + if (((ULONG_PTR) (pSrc[0]) & 0x0f) + || ((ULONG_PTR) (pSrc[1]) & 0x0f) + || ((ULONG_PTR) (pSrc[2]) & 0x0f) + || ((ULONG_PTR) (pDst[0]) & 0x0f) + || ((ULONG_PTR) (pDst[1]) & 0x0f) + || ((ULONG_PTR) (pDst[2]) & 0x0f) + || (roi->width & 0x07) + || (srcStep & 127) + || (dstStep & 127)) + { + /* We can't maintain 16-byte alignment. */ + return general_yCbCrToRGB_16s16s_P3P3(pSrc, srcStep, + pDst, dstStep, roi); + } + + zero = _mm_setzero_si128(); + max = _mm_set1_epi16(255); + + y_buf = (__m128i*) (pSrc[0]); + cb_buf = (__m128i*) (pSrc[1]); + cr_buf = (__m128i*) (pSrc[2]); + r_buf = (__m128i*) (pDst[0]); + g_buf = (__m128i*) (pDst[1]); + b_buf = (__m128i*) (pDst[2]); + + r_cr = _mm_set1_epi16(22986); /* 1.403 << 14 */ + g_cb = _mm_set1_epi16(-5636); /* -0.344 << 14 */ + g_cr = _mm_set1_epi16(-11698); /* -0.714 << 14 */ + b_cb = _mm_set1_epi16(28999); /* 1.770 << 14 */ + c4096 = _mm_set1_epi16(4096); + srcbump = srcStep / sizeof(__m128i); + dstbump = dstStep / sizeof(__m128i); + +#ifdef DO_PREFETCH + /* Prefetch Y's, Cb's, and Cr's. */ + for (yp=0; ypheight; yp++) + { + int i; + for (i=0; iwidth * sizeof(INT16) / sizeof(__m128i); + i += (CACHE_LINE_BYTES / sizeof(__m128i))) + { + _mm_prefetch((char*)(&y_buf[i]), _MM_HINT_NTA); + _mm_prefetch((char*)(&cb_buf[i]), _MM_HINT_NTA); + _mm_prefetch((char*)(&cr_buf[i]), _MM_HINT_NTA); + } + y_buf += srcbump; + cb_buf += srcbump; + cr_buf += srcbump; + } + y_buf = (__m128i*) (pSrc[0]); + cb_buf = (__m128i*) (pSrc[1]); + cr_buf = (__m128i*) (pSrc[2]); +#endif /* DO_PREFETCH */ + + imax = roi->width * sizeof(INT16) / sizeof(__m128i); + for (yp=0; ypheight; ++yp) + { + int i; + for (i=0; i>5) + 128 + (cr*1.403)>>5 // our base formula + * r = (y>>5) + 128 + (HIWORD(cr*(1.403<<14)<<2))>>5 // see above + * r = (y+4096)>>5 + (HIWORD(cr*22986)<<2)>>5 // simplification + * r = ((y+4096)>>2 + HIWORD(cr*22986)) >> 3 + */ + + /* y = (y_r_buf[i] + 4096) >> 2 */ + __m128i y, cb, cr, r, g, b; + y = _mm_load_si128(y_buf + i); + y = _mm_add_epi16(y, c4096); + y = _mm_srai_epi16(y, 2); + /* cb = cb_g_buf[i]; */ + cb = _mm_load_si128(cb_buf + i); + /* cr = cr_b_buf[i]; */ + cr = _mm_load_si128(cr_buf + i); + + /* (y + HIWORD(cr*22986)) >> 3 */ + r = _mm_add_epi16(y, _mm_mulhi_epi16(cr, r_cr)); + r = _mm_srai_epi16(r, 3); + + /* r_buf[i] = MINMAX(r, 0, 255); */ + _mm_between_epi16(r, zero, max); + _mm_store_si128(r_buf + i, r); + + /* (y + HIWORD(cb*-5636) + HIWORD(cr*-11698)) >> 3 */ + g = _mm_add_epi16(y, _mm_mulhi_epi16(cb, g_cb)); + g = _mm_add_epi16(g, _mm_mulhi_epi16(cr, g_cr)); + g = _mm_srai_epi16(g, 3); + + /* g_buf[i] = MINMAX(g, 0, 255); */ + _mm_between_epi16(g, zero, max); + _mm_store_si128(g_buf + i, g); + + /* (y + HIWORD(cb*28999)) >> 3 */ + b = _mm_add_epi16(y, _mm_mulhi_epi16(cb, b_cb)); + b = _mm_srai_epi16(b, 3); + /* b_buf[i] = MINMAX(b, 0, 255); */ + _mm_between_epi16(b, zero, max); + _mm_store_si128(b_buf + i, b); + } + y_buf += srcbump; + cb_buf += srcbump; + cr_buf += srcbump; + r_buf += dstbump; + g_buf += dstbump; + b_buf += dstbump; + } + + return PRIMITIVES_SUCCESS; +} + +/*---------------------------------------------------------------------------*/ +/* The encodec YCbCr coeffectients are represented as 11.5 fixed-point + * numbers. See the general code above. + */ +pstatus_t sse2_RGBToYCbCr_16s16s_P3P3( + const INT16 *pSrc[3], + int srcStep, + INT16 *pDst[3], + int dstStep, + const prim_size_t *roi) /* region of interest */ +{ + __m128i min, max, y_r, y_g, y_b, cb_r, cb_g, cb_b, cr_r, cr_g, cr_b; + __m128i *r_buf, *g_buf, *b_buf, *y_buf, *cb_buf, *cr_buf; + int srcbump, dstbump, yp, imax; + + if (((ULONG_PTR) (pSrc[0]) & 0x0f) + || ((ULONG_PTR) (pSrc[1]) & 0x0f) + || ((ULONG_PTR) (pSrc[2]) & 0x0f) + || ((ULONG_PTR) (pDst[0]) & 0x0f) + || ((ULONG_PTR) (pDst[1]) & 0x0f) + || ((ULONG_PTR) (pDst[2]) & 0x0f) + || (roi->width & 0x07) + || (srcStep & 127) + || (dstStep & 127)) + { + /* We can't maintain 16-byte alignment. */ + return general_RGBToYCbCr_16s16s_P3P3(pSrc, srcStep, + pDst, dstStep, roi); + } + + min = _mm_set1_epi16(-128 << 5); + max = _mm_set1_epi16(127 << 5); + + r_buf = (__m128i*) (pSrc[0]); + g_buf = (__m128i*) (pSrc[1]); + b_buf = (__m128i*) (pSrc[2]); + y_buf = (__m128i*) (pDst[0]); + cb_buf = (__m128i*) (pDst[1]); + cr_buf = (__m128i*) (pDst[2]); + + y_r = _mm_set1_epi16(9798); /* 0.299000 << 15 */ + y_g = _mm_set1_epi16(19235); /* 0.587000 << 15 */ + y_b = _mm_set1_epi16(3735); /* 0.114000 << 15 */ + cb_r = _mm_set1_epi16(-5535); /* -0.168935 << 15 */ + cb_g = _mm_set1_epi16(-10868); /* -0.331665 << 15 */ + cb_b = _mm_set1_epi16(16403); /* 0.500590 << 15 */ + cr_r = _mm_set1_epi16(16377); /* 0.499813 << 15 */ + cr_g = _mm_set1_epi16(-13714); /* -0.418531 << 15 */ + cr_b = _mm_set1_epi16(-2663); /* -0.081282 << 15 */ + + srcbump = srcStep / sizeof(__m128i); + dstbump = dstStep / sizeof(__m128i); + +#ifdef DO_PREFETCH + /* Prefetch RGB's. */ + for (yp=0; ypheight; yp++) + { + int i; + for (i=0; iwidth * sizeof(INT16) / sizeof(__m128i); + i += (CACHE_LINE_BYTES / sizeof(__m128i))) + { + _mm_prefetch((char*)(&r_buf[i]), _MM_HINT_NTA); + _mm_prefetch((char*)(&g_buf[i]), _MM_HINT_NTA); + _mm_prefetch((char*)(&b_buf[i]), _MM_HINT_NTA); + } + r_buf += srcbump; + g_buf += srcbump; + b_buf += srcbump; + } + r_buf = (__m128i*) (pSrc[0]); + g_buf = (__m128i*) (pSrc[1]); + b_buf = (__m128i*) (pSrc[2]); +#endif /* DO_PREFETCH */ + + imax = roi->width * sizeof(INT16) / sizeof(__m128i); + for (yp=0; ypheight; ++yp) + { + int i; + for (i=0; iwidth & 0x0f) + || (srcStep & 0x0f) + || (dstStep & 0x0f)) + { + return general_RGBToRGB_16s8u_P3AC4R(pSrc, srcStep, pDst, dstStep, roi); + } + + out = (BYTE *) pDst; + srcbump = (srcStep - (roi->width * sizeof(UINT16))) / sizeof(UINT16); + dstbump = (dstStep - (roi->width * sizeof(UINT32))); + + for (y=0; yheight; ++y) + { + int width = roi->width; + do { + __m128i R0, R1, R2, R3, R4; + /* The comments below pretend these are 8-byte registers + * rather than 16-byte, for readability. + */ + R0 = LOAD128(b); b += 8; /* R0 = 00B300B200B100B0 */ + R1 = LOAD128(b); b += 8; /* R1 = 00B700B600B500B4 */ + PACKUSWB(R0,R1); /* R0 = B7B6B5B4B3B2B1B0 */ + R1 = LOAD128(g); g += 8; /* R1 = 00G300G200G100G0 */ + R2 = LOAD128(g); g += 8; /* R2 = 00G700G600G500G4 */ + PACKUSWB(R1,R2); /* R1 = G7G6G5G4G3G2G1G0 */ + R2 = R1; /* R2 = G7G6G5G4G3G2G1G0 */ + PUNPCKLBW(R2,R0); /* R2 = G3B3G2B2G1B1G0B0 */ + PUNPCKHBW(R1,R0); /* R1 = G7B7G6B7G5B5G4B4 */ + R0 = LOAD128(r); r += 8; /* R0 = 00R300R200R100R0 */ + R3 = LOAD128(r); r += 8; /* R3 = 00R700R600R500R4 */ + PACKUSWB(R0,R3); /* R0 = R7R6R5R4R3R2R1R0 */ + R3 = XMM_ALL_ONES; /* R3 = FFFFFFFFFFFFFFFF */ + R4 = R3; /* R4 = FFFFFFFFFFFFFFFF */ + PUNPCKLBW(R4,R0); /* R4 = FFR3FFR2FFR1FFR0 */ + PUNPCKHBW(R3,R0); /* R3 = FFR7FFR6FFR5FFR4 */ + R0 = R4; /* R0 = R4 */ + PUNPCKLWD(R0,R2); /* R0 = FFR1G1B1FFR0G0B0 */ + PUNPCKHWD(R4,R2); /* R4 = FFR3G3B3FFR2G2B2 */ + R2 = R3; /* R2 = R3 */ + PUNPCKLWD(R2,R1); /* R2 = FFR5G5B5FFR4G4B4 */ + PUNPCKHWD(R3,R1); /* R3 = FFR7G7B7FFR6G6B6 */ + STORE128(out, R0); out += 16; /* FFR1G1B1FFR0G0B0 */ + STORE128(out, R4); out += 16; /* FFR3G3B3FFR2G2B2 */ + STORE128(out, R2); out += 16; /* FFR5G5B5FFR4G4B4 */ + STORE128(out, R3); out += 16; /* FFR7G7B7FFR6G6B6 */ + } while (width -= 16); + /* Jump to next row. */ + r += srcbump; + g += srcbump; + b += srcbump; + out += dstbump; + } + return PRIMITIVES_SUCCESS; +} +#endif /* WITH_SSE2 */ + +/*---------------------------------------------------------------------------*/ +#ifdef WITH_NEON +pstatus_t neon_yCbCrToRGB_16s16s_P3P3( + const INT16 *pSrc[3], + int srcStep, + INT16 *pDst[3], + int dstStep, + const prim_size_t *roi) /* region of interest */ +{ + /* TODO: If necessary, check alignments and call the general version. */ + + int16x8_t zero = vdupq_n_s16(0); + int16x8_t max = vdupq_n_s16(255); + + int16x8_t r_cr = vdupq_n_s16(22986); // 1.403 << 14 + int16x8_t g_cb = vdupq_n_s16(-5636); // -0.344 << 14 + int16x8_t g_cr = vdupq_n_s16(-11698); // -0.714 << 14 + int16x8_t b_cb = vdupq_n_s16(28999); // 1.770 << 14 + int16x8_t c4096 = vdupq_n_s16(4096); + + int16x8_t* y_buf = (int16x8_t*) pSrc[0]; + int16x8_t* cb_buf = (int16x8_t*) pSrc[1]; + int16x8_t* cr_buf = (int16x8_t*) pSrc[2]; + int16x8_t* r_buf = (int16x8_t*) pDst[0]; + int16x8_t* g_buf = (int16x8_t*) pDst[1]; + int16x8_t* b_buf = (int16x8_t*) pDst[2]; + + int srcbump = srcStep / sizeof(int16x8_t); + int dstbump = dstStep / sizeof(int16x8_t); + int yp; + + int imax = roi->width * sizeof(INT16) / sizeof(int16x8_t); + for (yp=0; ypheight; ++yp) + { + int i; + for (i=0; i>5) + 128 + (cr*1.403)>>5 // our base formula + r = (y>>5) + 128 + (HIWORD(cr*(1.403<<14)<<2))>>5 // see above + r = (y+4096)>>5 + (HIWORD(cr*22986)<<2)>>5 // simplification + r = ((y+4096)>>2 + HIWORD(cr*22986)) >> 3 + */ + + /* y = (y_buf[i] + 4096) >> 2 */ + int16x8_t y = vld1q_s16((INT16*) &y_buf[i]); + y = vaddq_s16(y, c4096); + y = vshrq_n_s16(y, 2); + /* cb = cb_buf[i]; */ + int16x8_t cb = vld1q_s16((INT16*)&cb_buf[i]); + /* cr = cr_buf[i]; */ + int16x8_t cr = vld1q_s16((INT16*) &cr_buf[i]); + + /* (y + HIWORD(cr*22986)) >> 3 */ + int16x8_t r = vaddq_s16(y, vshrq_n_s16(vqdmulhq_s16(cr, r_cr), 1)); + r = vshrq_n_s16(r, 3); + /* r_buf[i] = MINMAX(r, 0, 255); */ + r = vminq_s16(vmaxq_s16(r, zero), max); + vst1q_s16((INT16*)&r_buf[i], r); + + /* (y + HIWORD(cb*-5636) + HIWORD(cr*-11698)) >> 3 */ + int16x8_t g = vaddq_s16(y, vshrq_n_s16(vqdmulhq_s16(cb, g_cb), 1)); + g = vaddq_s16(g, vshrq_n_s16(vqdmulhq_s16(cr, g_cr), 1)); + g = vshrq_n_s16(g, 3); + /* g_buf[i] = MINMAX(g, 0, 255); */ + g = vminq_s16(vmaxq_s16(g, zero), max); + vst1q_s16((INT16*)&g_buf[i], g); + + /* (y + HIWORD(cb*28999)) >> 3 */ + int16x8_t b = vaddq_s16(y, vshrq_n_s16(vqdmulhq_s16(cb, b_cb), 1)); + b = vshrq_n_s16(b, 3); + /* b_buf[i] = MINMAX(b, 0, 255); */ + b = vminq_s16(vmaxq_s16(b, zero), max); + vst1q_s16((INT16*)&b_buf[i], b); + } + + y_buf += srcbump; + cb_buf += srcbump; + cr_buf += srcbump; + r_buf += dstbump; + g_buf += dstbump; + b_buf += dstbump; + } + return PRIMITIVES_SUCCESS; +} +#endif /* WITH_NEON */ + + +/* I don't see a direct IPP version of this, since the input is INT16 + * YCbCr. It may be possible via Deinterleave and then YCbCrToRGB_. + * But that would likely be slower. + */ + +/* ------------------------------------------------------------------------- */ +void primitives_init_colors_opt(const primitives_hints_t* hints, primitives_t* prims) +{ +#if defined(WITH_SSE2) + if (hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) + { + prims->RGBToRGB_16s8u_P3AC4R = sse2_RGBToRGB_16s8u_P3AC4R; + prims->yCbCrToRGB_16s16s_P3P3 = sse2_yCbCrToRGB_16s16s_P3P3; + prims->RGBToYCbCr_16s16s_P3P3 = sse2_RGBToYCbCr_16s16s_P3P3; + } +#elif defined(WITH_NEON) + if (hints->arm_flags & PRIM_ARM_NEON_AVAILABLE) + { + prims->yCbCrToRGB_16s16s_P3P3 = neon_yCbCrToRGB_16s16s_P3P3; + } +#endif /* WITH_SSE2 */ +} + diff --git a/libfreerdp/primitives/prim_copy.c b/libfreerdp/primitives/prim_copy.c index 71303b1a6..4198f2d8f 100644 --- a/libfreerdp/primitives/prim_copy.c +++ b/libfreerdp/primitives/prim_copy.c @@ -72,7 +72,7 @@ static BOOL memory_regions_overlap_2d( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_copy_8u( +pstatus_t general_copy_8u( const BYTE *pSrc, BYTE *pDst, INT32 len) @@ -94,7 +94,7 @@ PRIM_STATIC pstatus_t general_copy_8u( * The addresses are assumed to have been already offset to the upper-left * corners of the source and destination region of interest. */ -PRIM_STATIC pstatus_t general_copy_8u_AC4r( +pstatus_t general_copy_8u_AC4r( const BYTE *pSrc, INT32 srcStep, BYTE *pDst, INT32 dstStep, INT32 width, INT32 height) diff --git a/libfreerdp/primitives/prim_internal.h b/libfreerdp/primitives/prim_internal.h index 21df8cae0..001ab8562 100644 --- a/libfreerdp/primitives/prim_internal.h +++ b/libfreerdp/primitives/prim_internal.h @@ -27,15 +27,6 @@ #include -/* Normally the internal entrypoints should be static, but a benchmark - * program may want to access them directly and turn this off. - */ -#ifndef PRIM_STATIC -# define PRIM_STATIC static -#else -# undef PRIM_STATIC -# define PRIM_STATIC -#endif /* !PRIM_STATIC */ /* Use lddqu for unaligned; load for 16-byte aligned. */ #define LOAD_SI128(_ptr_) \ diff --git a/libfreerdp/primitives/prim_set.c b/libfreerdp/primitives/prim_set.c index 5b40ce00c..9176c8722 100644 --- a/libfreerdp/primitives/prim_set.c +++ b/libfreerdp/primitives/prim_set.c @@ -19,18 +19,15 @@ #endif #include + #include #include -#ifdef WITH_SSE2 -# include -#endif /* WITH_SSE2 */ -#ifdef WITH_IPP -# include -#endif /* WITH_IPP */ + #include "prim_internal.h" +#include "prim_set.h" /* ========================================================================= */ -PRIM_STATIC pstatus_t general_set_8u( +pstatus_t general_set_8u( BYTE val, BYTE *pDst, INT32 len) @@ -40,7 +37,7 @@ PRIM_STATIC pstatus_t general_set_8u( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_zero( +pstatus_t general_zero( void *pDst, size_t len) { @@ -48,75 +45,8 @@ PRIM_STATIC pstatus_t general_zero( return PRIMITIVES_SUCCESS; } -/* ------------------------------------------------------------------------- */ -#ifdef WITH_SSE2 -# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) -PRIM_STATIC pstatus_t sse2_set_8u( - BYTE val, - BYTE *pDst, - INT32 len) -{ - BYTE byte, *dptr; - __m128i xmm0; - size_t count; - - if (len < 16) return general_set_8u(val, pDst, len); - - byte = val; - dptr = (BYTE *) pDst; - - /* Seek 16-byte alignment. */ - while ((ULONG_PTR) dptr & 0x0f) - { - *dptr++ = byte; - if (--len == 0) return PRIMITIVES_SUCCESS; - } - - xmm0 = _mm_set1_epi8(byte); - - /* Cover 256-byte chunks via SSE register stores. */ - count = len >> 8; - len -= count << 8; - /* Do 256-byte chunks using one XMM register. */ - while (count--) - { - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - } - - /* Cover 16-byte chunks via SSE register stores. */ - count = len >> 4; - len -= count << 4; - /* Do 16-byte chunks using one XMM register. */ - while (count--) - { - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; - } - - /* Do leftover bytes. */ - while (len--) *dptr++ = byte; - - return PRIMITIVES_SUCCESS; -} -# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ -#endif /* WITH_SSE2 */ - /* ========================================================================= */ -PRIM_STATIC pstatus_t general_set_32s( +pstatus_t general_set_32s( INT32 val, INT32 *pDst, INT32 len) @@ -148,7 +78,7 @@ PRIM_STATIC pstatus_t general_set_32s( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_set_32u( +pstatus_t general_set_32u( UINT32 val, UINT32 *pDst, INT32 len) @@ -179,104 +109,6 @@ PRIM_STATIC pstatus_t general_set_32u( return PRIMITIVES_SUCCESS; } -/* ------------------------------------------------------------------------- */ -#ifdef WITH_SSE2 -# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) -PRIM_STATIC pstatus_t sse2_set_32u( - UINT32 val, - UINT32 *pDst, - INT32 len) -{ - UINT32 *dptr = (UINT32 *) pDst; - __m128i xmm0; - size_t count; - - /* If really short, just do it here. */ - if (len < 32) - { - while (len--) *dptr++ = val; - return PRIMITIVES_SUCCESS; - } - - /* Assure we can reach 16-byte alignment. */ - if (((ULONG_PTR) dptr & 0x03) != 0) - { - return general_set_32u(val, pDst, len); - } - - /* Seek 16-byte alignment. */ - while ((ULONG_PTR) dptr & 0x0f) - { - *dptr++ = val; - if (--len == 0) return PRIMITIVES_SUCCESS; - } - - xmm0 = _mm_set1_epi32(val); - - /* Cover 256-byte chunks via SSE register stores. */ - count = len >> 6; - len -= count << 6; - /* Do 256-byte chunks using one XMM register. */ - while (count--) - { - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - } - - /* Cover 16-byte chunks via SSE register stores. */ - count = len >> 2; - len -= count << 2; - /* Do 16-byte chunks using one XMM register. */ - while (count--) - { - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; - } - - /* Do leftover bytes. */ - while (len--) *dptr++ = val; - - return PRIMITIVES_SUCCESS; -} - -/* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t sse2_set_32s( - INT32 val, - INT32 *pDst, - INT32 len) -{ - UINT32 uval = *((UINT32 *) &val); - return sse2_set_32u(uval, (UINT32 *) pDst, len); -} -# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ -#endif /* WITH_SSE2 */ - -#ifdef WITH_IPP -/* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t ipp_wrapper_set_32u( - UINT32 val, - UINT32 *pDst, - INT32 len) -{ - /* A little type conversion, then use the signed version. */ - INT32 sval = *((INT32 *) &val); - return ippsSet_32s(sval, (INT32 *) pDst, len); -} -#endif - /* ------------------------------------------------------------------------- */ void primitives_init_set( const primitives_hints_t *hints, @@ -288,20 +120,7 @@ void primitives_init_set( prims->set_32u = general_set_32u; prims->zero = general_zero; - /* Pick tuned versions if possible. */ -#ifdef WITH_IPP - prims->set_8u = (__set_8u_t) ippsSet_8u; - prims->set_32s = (__set_32s_t) ippsSet_32s; - prims->set_32u = (__set_32u_t) ipp_wrapper_set_32u; - prims->zero = (__zero_t) ippsZero_8u; -#elif defined(WITH_SSE2) - if (hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) - { - prims->set_8u = sse2_set_8u; - prims->set_32s = sse2_set_32s; - prims->set_32u = sse2_set_32u; - } -#endif + primitives_init_set_opt(hints, prims); } /* ------------------------------------------------------------------------- */ @@ -310,3 +129,4 @@ void primitives_deinit_set( { /* Nothing to do. */ } + diff --git a/libfreerdp/primitives/prim_set.h b/libfreerdp/primitives/prim_set.h new file mode 100644 index 000000000..e4504dc2c --- /dev/null +++ b/libfreerdp/primitives/prim_set.h @@ -0,0 +1,34 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Routines to set a chunk of memory to a constant. + * vi:ts=4 sw=4 + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. Algorithms used by + * this code may be covered by patents by HP, Microsoft, or other parties. + * + */ + +#ifdef __GNUC__ +# pragma once +#endif + +#ifndef __PRIM_SET_H_INCLUDED__ +#define __PRIM_SET_H_INCLUDED__ + +pstatus_t general_set_8u(BYTE val, BYTE *pDst, INT32 len); +pstatus_t general_zero(void *pDst, size_t len); +pstatus_t general_set_32s(INT32 val, INT32 *pDst, INT32 len); +pstatus_t general_set_32u(UINT32 val, UINT32 *pDst, INT32 len); + + +void primitives_init_set_opt(const primitives_hints_t *hints, primitives_t *prims); + +#endif /* !__PRIM_SET_H_INCLUDED__ */ + diff --git a/libfreerdp/primitives/prim_set_opt.c b/libfreerdp/primitives/prim_set_opt.c new file mode 100644 index 000000000..0523434ff --- /dev/null +++ b/libfreerdp/primitives/prim_set_opt.c @@ -0,0 +1,218 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Optimized routines to set a chunk of memory to a constant. + * vi:ts=4 sw=4: + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#ifdef WITH_SSE2 +# include +#endif /* WITH_SSE2 */ +#ifdef WITH_IPP +# include +#endif /* WITH_IPP */ + +#include "prim_internal.h" +#include "prim_set.h" + +/* ========================================================================= */ +#ifdef WITH_SSE2 +# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) +pstatus_t sse2_set_8u( + BYTE val, + BYTE *pDst, + INT32 len) +{ + BYTE byte, *dptr; + __m128i xmm0; + size_t count; + + if (len < 16) return general_set_8u(val, pDst, len); + + byte = val; + dptr = (BYTE *) pDst; + + /* Seek 16-byte alignment. */ + while ((ULONG_PTR) dptr & 0x0f) + { + *dptr++ = byte; + if (--len == 0) return PRIMITIVES_SUCCESS; + } + + xmm0 = _mm_set1_epi8(byte); + + /* Cover 256-byte chunks via SSE register stores. */ + count = len >> 8; + len -= count << 8; + /* Do 256-byte chunks using one XMM register. */ + while (count--) + { + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + } + + /* Cover 16-byte chunks via SSE register stores. */ + count = len >> 4; + len -= count << 4; + /* Do 16-byte chunks using one XMM register. */ + while (count--) + { + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 16; + } + + /* Do leftover bytes. */ + while (len--) *dptr++ = byte; + + return PRIMITIVES_SUCCESS; +} +# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ +#endif /* WITH_SSE2 */ + +/* ------------------------------------------------------------------------- */ +#ifdef WITH_SSE2 +# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) +pstatus_t sse2_set_32u( + UINT32 val, + UINT32 *pDst, + INT32 len) +{ + UINT32 *dptr = (UINT32 *) pDst; + __m128i xmm0; + size_t count; + + /* If really short, just do it here. */ + if (len < 32) + { + while (len--) *dptr++ = val; + return PRIMITIVES_SUCCESS; + } + + /* Assure we can reach 16-byte alignment. */ + if (((ULONG_PTR) dptr & 0x03) != 0) + { + return general_set_32u(val, pDst, len); + } + + /* Seek 16-byte alignment. */ + while ((ULONG_PTR) dptr & 0x0f) + { + *dptr++ = val; + if (--len == 0) return PRIMITIVES_SUCCESS; + } + + xmm0 = _mm_set1_epi32(val); + + /* Cover 256-byte chunks via SSE register stores. */ + count = len >> 6; + len -= count << 6; + /* Do 256-byte chunks using one XMM register. */ + while (count--) + { + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + } + + /* Cover 16-byte chunks via SSE register stores. */ + count = len >> 2; + len -= count << 2; + /* Do 16-byte chunks using one XMM register. */ + while (count--) + { + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 4; + } + + /* Do leftover bytes. */ + while (len--) *dptr++ = val; + + return PRIMITIVES_SUCCESS; +} + +/* ------------------------------------------------------------------------- */ +pstatus_t sse2_set_32s( + INT32 val, + INT32 *pDst, + INT32 len) +{ + UINT32 uval = *((UINT32 *) &val); + return sse2_set_32u(uval, (UINT32 *) pDst, len); +} +# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ +#endif /* WITH_SSE2 */ + +#ifdef WITH_IPP +/* ------------------------------------------------------------------------- */ +pstatus_t ipp_wrapper_set_32u( + UINT32 val, + UINT32 *pDst, + INT32 len) +{ + /* A little type conversion, then use the signed version. */ + INT32 sval = *((INT32 *) &val); + return ippsSet_32s(sval, (INT32 *) pDst, len); +} +#endif + +/* ------------------------------------------------------------------------- */ +void primitives_init_set_opt(const primitives_hints_t *hints, primitives_t *prims) +{ + /* Pick tuned versions if possible. */ +#ifdef WITH_IPP + prims->set_8u = (__set_8u_t) ippsSet_8u; + prims->set_32s = (__set_32s_t) ippsSet_32s; + prims->set_32u = (__set_32u_t) ipp_wrapper_set_32u; + prims->zero = (__zero_t) ippsZero_8u; +#elif defined(WITH_SSE2) + if (hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) + { + prims->set_8u = sse2_set_8u; + prims->set_32s = sse2_set_32s; + prims->set_32u = sse2_set_32u; + } +#endif +} + diff --git a/libfreerdp/primitives/prim_shift.c b/libfreerdp/primitives/prim_shift.c index 331c7216e..bd26dc0a0 100644 --- a/libfreerdp/primitives/prim_shift.c +++ b/libfreerdp/primitives/prim_shift.c @@ -17,25 +17,15 @@ #include "config.h" #endif -#include - #include #include -#ifdef WITH_SSE2 -#include -#include -#endif /* WITH_SSE2 */ - -#ifdef WITH_IPP -#include -#endif /* WITH_IPP */ - #include "prim_internal.h" -#include "prim_templates.h" +#include "prim_shift.h" + /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_lShiftC_16s( +pstatus_t general_lShiftC_16s( const INT16 *pSrc, INT32 val, INT16 *pDst, @@ -47,7 +37,7 @@ PRIM_STATIC pstatus_t general_lShiftC_16s( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_rShiftC_16s( +pstatus_t general_rShiftC_16s( const INT16 *pSrc, INT32 val, INT16 *pDst, @@ -59,7 +49,7 @@ PRIM_STATIC pstatus_t general_rShiftC_16s( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_lShiftC_16u( +pstatus_t general_lShiftC_16u( const UINT16 *pSrc, INT32 val, UINT16 *pDst, @@ -71,7 +61,7 @@ PRIM_STATIC pstatus_t general_lShiftC_16u( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_rShiftC_16u( +pstatus_t general_rShiftC_16u( const UINT16 *pSrc, INT32 val, UINT16 *pDst, @@ -82,25 +72,8 @@ PRIM_STATIC pstatus_t general_rShiftC_16u( return PRIMITIVES_SUCCESS; } -#ifdef WITH_SSE2 -# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) /* ------------------------------------------------------------------------- */ -SSE3_SCD_ROUTINE(sse2_lShiftC_16s, INT16, general_lShiftC_16s, - _mm_slli_epi16, *dptr++ = *sptr++ << val) -/* ------------------------------------------------------------------------- */ -SSE3_SCD_ROUTINE(sse2_rShiftC_16s, INT16, general_rShiftC_16s, - _mm_srai_epi16, *dptr++ = *sptr++ >> val) -/* ------------------------------------------------------------------------- */ -SSE3_SCD_ROUTINE(sse2_lShiftC_16u, UINT16, general_lShiftC_16u, - _mm_slli_epi16, *dptr++ = *sptr++ << val) -/* ------------------------------------------------------------------------- */ -SSE3_SCD_ROUTINE(sse2_rShiftC_16u, UINT16, general_rShiftC_16u, - _mm_srli_epi16, *dptr++ = *sptr++ >> val) -# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ -#endif - -/* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_shiftC_16s( +pstatus_t general_shiftC_16s( const INT16 *pSrc, INT32 val, INT16 *pDst, @@ -115,7 +88,7 @@ PRIM_STATIC pstatus_t general_shiftC_16s( } /* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t general_shiftC_16u( +pstatus_t general_shiftC_16u( const UINT16 *pSrc, INT32 val, UINT16 *pDst, @@ -129,11 +102,6 @@ PRIM_STATIC pstatus_t general_shiftC_16u( else return prims->lShiftC_16u(pSrc, val, pDst, len); } -/* Note: the IPP version will have to call ippLShiftC_16s or ippRShiftC_16s - * depending on the sign of val. To avoid using the deprecated inplace - * routines, a wrapper can use the src for the dest. - */ - /* ------------------------------------------------------------------------- */ void primitives_init_shift( const primitives_hints_t *hints, @@ -144,24 +112,12 @@ void primitives_init_shift( prims->rShiftC_16s = general_rShiftC_16s; prims->lShiftC_16u = general_lShiftC_16u; prims->rShiftC_16u = general_rShiftC_16u; -#if defined(WITH_IPP) - prims->lShiftC_16s = (__lShiftC_16s_t) ippsLShiftC_16s; - prims->rShiftC_16s = (__rShiftC_16s_t) ippsRShiftC_16s; - prims->lShiftC_16u = (__lShiftC_16u_t) ippsLShiftC_16u; - prims->rShiftC_16u = (__rShiftC_16u_t) ippsRShiftC_16u; -#elif defined(WITH_SSE2) - if ((hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) - && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) - { - prims->lShiftC_16s = sse2_lShiftC_16s; - prims->rShiftC_16s = sse2_rShiftC_16s; - prims->lShiftC_16u = sse2_lShiftC_16u; - prims->rShiftC_16u = sse2_rShiftC_16u; - } -#endif + /* Wrappers */ prims->shiftC_16s = general_shiftC_16s; prims->shiftC_16u = general_shiftC_16u; + + primitives_init_shift_opt(hints, prims); } /* ------------------------------------------------------------------------- */ diff --git a/libfreerdp/primitives/prim_shift.h b/libfreerdp/primitives/prim_shift.h new file mode 100644 index 000000000..cad054013 --- /dev/null +++ b/libfreerdp/primitives/prim_shift.h @@ -0,0 +1,35 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Shift operations. + * vi:ts=4 sw=4 + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. Algorithms used by + * this code may be covered by patents by HP, Microsoft, or other parties. + * + */ + +#ifdef __GNUC__ +# pragma once +#endif + +#ifndef __PRIM_SHIFT_H_INCLUDED__ +#define __PRIM_SHIFT_H_INCLUDED__ + +pstatus_t general_lShiftC_16s(const INT16 *pSrc, INT32 val, INT16 *pDst, INT32 len); +pstatus_t general_rShiftC_16s(const INT16 *pSrc, INT32 val, INT16 *pDst, INT32 len); +pstatus_t general_lShiftC_16u(const UINT16 *pSrc, INT32 val, UINT16 *pDst, INT32 len); +pstatus_t general_rShiftC_16u(const UINT16 *pSrc, INT32 val, UINT16 *pDst, INT32 len); +pstatus_t general_shiftC_16s(const INT16 *pSrc, INT32 val, INT16 *pDst, INT32 len); +pstatus_t general_shiftC_16u(const UINT16 *pSrc, INT32 val, UINT16 *pDst, INT32 len); + +void primitives_init_shift_opt(const primitives_hints_t *hints, primitives_t *prims); + +#endif /* !__PRIM_SHIFT_H_INCLUDED__ */ + diff --git a/libfreerdp/primitives/prim_shift_opt.c b/libfreerdp/primitives/prim_shift_opt.c new file mode 100644 index 000000000..0e57da269 --- /dev/null +++ b/libfreerdp/primitives/prim_shift_opt.c @@ -0,0 +1,79 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Shift operations. + * vi:ts=4 sw=4: + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef WITH_SSE2 +#include +#include +#endif /* WITH_SSE2 */ + +#ifdef WITH_IPP +#include +#endif /* WITH_IPP */ + +#include "prim_internal.h" +#include "prim_templates.h" +#include "prim_shift.h" + + +#ifdef WITH_SSE2 +# if !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) +/* ------------------------------------------------------------------------- */ +SSE3_SCD_ROUTINE(sse2_lShiftC_16s, INT16, general_lShiftC_16s, + _mm_slli_epi16, *dptr++ = *sptr++ << val) +/* ------------------------------------------------------------------------- */ +SSE3_SCD_ROUTINE(sse2_rShiftC_16s, INT16, general_rShiftC_16s, + _mm_srai_epi16, *dptr++ = *sptr++ >> val) +/* ------------------------------------------------------------------------- */ +SSE3_SCD_ROUTINE(sse2_lShiftC_16u, UINT16, general_lShiftC_16u, + _mm_slli_epi16, *dptr++ = *sptr++ << val) +/* ------------------------------------------------------------------------- */ +SSE3_SCD_ROUTINE(sse2_rShiftC_16u, UINT16, general_rShiftC_16u, + _mm_srli_epi16, *dptr++ = *sptr++ >> val) +# endif /* !defined(WITH_IPP) || defined(ALL_PRIMITIVES_VERSIONS) */ +#endif + + +/* Note: the IPP version will have to call ippLShiftC_16s or ippRShiftC_16s + * depending on the sign of val. To avoid using the deprecated inplace + * routines, a wrapper can use the src for the dest. + */ + +/* ------------------------------------------------------------------------- */ +void primitives_init_shift_opt(const primitives_hints_t *hints, primitives_t *prims) +{ +#if defined(WITH_IPP) + prims->lShiftC_16s = (__lShiftC_16s_t) ippsLShiftC_16s; + prims->rShiftC_16s = (__rShiftC_16s_t) ippsRShiftC_16s; + prims->lShiftC_16u = (__lShiftC_16u_t) ippsLShiftC_16u; + prims->rShiftC_16u = (__rShiftC_16u_t) ippsRShiftC_16u; +#elif defined(WITH_SSE2) + if ((hints->x86_flags & PRIM_X86_SSE2_AVAILABLE) + && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) + { + prims->lShiftC_16s = sse2_lShiftC_16s; + prims->rShiftC_16s = sse2_rShiftC_16s; + prims->lShiftC_16u = sse2_lShiftC_16u; + prims->rShiftC_16u = sse2_rShiftC_16u; + } +#endif +} + diff --git a/libfreerdp/primitives/prim_sign.c b/libfreerdp/primitives/prim_sign.c index a3b11ee14..d7d2eb018 100644 --- a/libfreerdp/primitives/prim_sign.c +++ b/libfreerdp/primitives/prim_sign.c @@ -17,22 +17,16 @@ #include "config.h" #endif -#include - #include #include -#ifdef WITH_SSE2 -#include -#include -#endif /* WITH_SSE2 */ - #include "prim_internal.h" +#include "prim_sign.h" /* ---------------------------------------------------------------------------- * Set pDst to the sign-value of the 16-bit values in pSrc (-1, 0, or 1). */ -PRIM_STATIC pstatus_t general_sign_16s( +pstatus_t general_sign_16s( const INT16 *pSrc, INT16 *pDst, INT32 len) @@ -46,110 +40,6 @@ PRIM_STATIC pstatus_t general_sign_16s( return PRIMITIVES_SUCCESS; } -#ifdef WITH_SSE2 -/* ------------------------------------------------------------------------- */ -PRIM_STATIC pstatus_t ssse3_sign_16s( - const INT16 *pSrc, - INT16 *pDst, - INT32 len) -{ - const INT16 *sptr = (const INT16 *) pSrc; - INT16 *dptr = (INT16 *) pDst; - size_t count; - - if (len < 16) - { - return general_sign_16s(pSrc, pDst, len); - } - - /* Check for 16-byte alignment (eventually). */ - if ((ULONG_PTR) pDst & 0x01) - { - return general_sign_16s(pSrc, pDst, len); - } - - /* Seek 16-byte alignment. */ - while ((ULONG_PTR) dptr & 0x0f) - { - INT16 src = *sptr++; - *dptr++ = (src < 0) ? (-1) : ((src > 0) ? 1 : 0); - if (--len == 0) return PRIMITIVES_SUCCESS; - } - - /* Do 32-short chunks using 8 XMM registers. */ - count = len >> 5; /* / 32 */ - len -= count << 5; /* * 32 */ - if ((ULONG_PTR) sptr & 0x0f) - { - /* Unaligned */ - while (count--) - { - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - xmm0 = _mm_set1_epi16(0x0001U); - xmm1 = _mm_set1_epi16(0x0001U); - xmm2 = _mm_set1_epi16(0x0001U); - xmm3 = _mm_set1_epi16(0x0001U); - xmm4 = _mm_lddqu_si128((__m128i *) sptr); sptr += 8; - xmm5 = _mm_lddqu_si128((__m128i *) sptr); sptr += 8; - xmm6 = _mm_lddqu_si128((__m128i *) sptr); sptr += 8; - xmm7 = _mm_lddqu_si128((__m128i *) sptr); sptr += 8; - xmm0 = _mm_sign_epi16(xmm0, xmm4); - xmm1 = _mm_sign_epi16(xmm1, xmm5); - xmm2 = _mm_sign_epi16(xmm2, xmm6); - xmm3 = _mm_sign_epi16(xmm3, xmm7); - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 8; - _mm_store_si128((__m128i *) dptr, xmm1); dptr += 8; - _mm_store_si128((__m128i *) dptr, xmm2); dptr += 8; - _mm_store_si128((__m128i *) dptr, xmm3); dptr += 8; - } - } - else - { - /* Aligned */ - while (count--) - { - __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; - xmm0 = _mm_set1_epi16(0x0001U); - xmm1 = _mm_set1_epi16(0x0001U); - xmm2 = _mm_set1_epi16(0x0001U); - xmm3 = _mm_set1_epi16(0x0001U); - xmm4 = _mm_load_si128((__m128i *) sptr); sptr += 8; - xmm5 = _mm_load_si128((__m128i *) sptr); sptr += 8; - xmm6 = _mm_load_si128((__m128i *) sptr); sptr += 8; - xmm7 = _mm_load_si128((__m128i *) sptr); sptr += 8; - xmm0 = _mm_sign_epi16(xmm0, xmm4); - xmm1 = _mm_sign_epi16(xmm1, xmm5); - xmm2 = _mm_sign_epi16(xmm2, xmm6); - xmm3 = _mm_sign_epi16(xmm3, xmm7); - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 8; - _mm_store_si128((__m128i *) dptr, xmm1); dptr += 8; - _mm_store_si128((__m128i *) dptr, xmm2); dptr += 8; - _mm_store_si128((__m128i *) dptr, xmm3); dptr += 8; - } - } - - /* Do 8-short chunks using two XMM registers. */ - count = len >> 3; - len -= count << 3; - while (count--) - { - __m128i xmm0 = _mm_set1_epi16(0x0001U); - __m128i xmm1 = LOAD_SI128(sptr); sptr += 8; - xmm0 = _mm_sign_epi16(xmm0, xmm1); - _mm_store_si128((__m128i *) dptr, xmm0); dptr += 8; - } - - /* Do leftovers. */ - while (len--) - { - INT16 src = *sptr++; - *dptr++ = (src < 0) ? -1 : ((src > 0) ? 1 : 0); - } - - return PRIMITIVES_SUCCESS; -} -#endif /* WITH_SSE2 */ - /* ------------------------------------------------------------------------- */ void primitives_init_sign( const primitives_hints_t *hints, @@ -157,15 +47,8 @@ void primitives_init_sign( { /* Start with the default. */ prims->sign_16s = general_sign_16s; - /* Pick tuned versions if possible. */ - /* I didn't spot an IPP version of this. */ -#if defined(WITH_SSE2) - if ((hints->x86_flags & PRIM_X86_SSSE3_AVAILABLE) - && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) - { - prims->sign_16s = ssse3_sign_16s; - } -#endif + + primitives_init_sign_opt(hints, prims); } /* ------------------------------------------------------------------------- */ @@ -174,3 +57,4 @@ void primitives_deinit_sign( { /* Nothing to do. */ } + diff --git a/libfreerdp/primitives/prim_sign.h b/libfreerdp/primitives/prim_sign.h new file mode 100644 index 000000000..3592990ec --- /dev/null +++ b/libfreerdp/primitives/prim_sign.h @@ -0,0 +1,30 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Sign operations. + * vi:ts=4 sw=4 + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. Algorithms used by + * this code may be covered by patents by HP, Microsoft, or other parties. + * + */ + +#ifdef __GNUC__ +# pragma once +#endif + +#ifndef __PRIM_SIGN_H_INCLUDED__ +#define __PRIM_SIGN_H_INCLUDED__ + +pstatus_t general_sign_16s(const INT16 *pSrc, INT16 *pDst, INT32 len); + +void primitives_init_sign_opt(const primitives_hints_t *hints, primitives_t *prims); + +#endif /* !__PRIM_SIGN_H_INCLUDED__ */ + diff --git a/libfreerdp/primitives/prim_sign_opt.c b/libfreerdp/primitives/prim_sign_opt.c new file mode 100644 index 000000000..81842b9bd --- /dev/null +++ b/libfreerdp/primitives/prim_sign_opt.c @@ -0,0 +1,149 @@ +/* FreeRDP: A Remote Desktop Protocol Client + * Optimized sign operations. + * vi:ts=4 sw=4: + * + * (c) Copyright 2012 Hewlett-Packard Development Company, L.P. + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#ifdef WITH_SSE2 +#include +#include +#endif /* WITH_SSE2 */ + +#include "prim_internal.h" +#include "prim_sign.h" + + +#ifdef WITH_SSE2 +/* ------------------------------------------------------------------------- */ +pstatus_t ssse3_sign_16s( + const INT16 *pSrc, + INT16 *pDst, + INT32 len) +{ + const INT16 *sptr = (const INT16 *) pSrc; + INT16 *dptr = (INT16 *) pDst; + size_t count; + + if (len < 16) + { + return general_sign_16s(pSrc, pDst, len); + } + + /* Check for 16-byte alignment (eventually). */ + if ((ULONG_PTR) pDst & 0x01) + { + return general_sign_16s(pSrc, pDst, len); + } + + /* Seek 16-byte alignment. */ + while ((ULONG_PTR) dptr & 0x0f) + { + INT16 src = *sptr++; + *dptr++ = (src < 0) ? (-1) : ((src > 0) ? 1 : 0); + if (--len == 0) return PRIMITIVES_SUCCESS; + } + + /* Do 32-short chunks using 8 XMM registers. */ + count = len >> 5; /* / 32 */ + len -= count << 5; /* * 32 */ + if ((ULONG_PTR) sptr & 0x0f) + { + /* Unaligned */ + while (count--) + { + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; + xmm0 = _mm_set1_epi16(0x0001U); + xmm1 = _mm_set1_epi16(0x0001U); + xmm2 = _mm_set1_epi16(0x0001U); + xmm3 = _mm_set1_epi16(0x0001U); + xmm4 = _mm_lddqu_si128((__m128i *) sptr); sptr += 8; + xmm5 = _mm_lddqu_si128((__m128i *) sptr); sptr += 8; + xmm6 = _mm_lddqu_si128((__m128i *) sptr); sptr += 8; + xmm7 = _mm_lddqu_si128((__m128i *) sptr); sptr += 8; + xmm0 = _mm_sign_epi16(xmm0, xmm4); + xmm1 = _mm_sign_epi16(xmm1, xmm5); + xmm2 = _mm_sign_epi16(xmm2, xmm6); + xmm3 = _mm_sign_epi16(xmm3, xmm7); + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 8; + _mm_store_si128((__m128i *) dptr, xmm1); dptr += 8; + _mm_store_si128((__m128i *) dptr, xmm2); dptr += 8; + _mm_store_si128((__m128i *) dptr, xmm3); dptr += 8; + } + } + else + { + /* Aligned */ + while (count--) + { + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7; + xmm0 = _mm_set1_epi16(0x0001U); + xmm1 = _mm_set1_epi16(0x0001U); + xmm2 = _mm_set1_epi16(0x0001U); + xmm3 = _mm_set1_epi16(0x0001U); + xmm4 = _mm_load_si128((__m128i *) sptr); sptr += 8; + xmm5 = _mm_load_si128((__m128i *) sptr); sptr += 8; + xmm6 = _mm_load_si128((__m128i *) sptr); sptr += 8; + xmm7 = _mm_load_si128((__m128i *) sptr); sptr += 8; + xmm0 = _mm_sign_epi16(xmm0, xmm4); + xmm1 = _mm_sign_epi16(xmm1, xmm5); + xmm2 = _mm_sign_epi16(xmm2, xmm6); + xmm3 = _mm_sign_epi16(xmm3, xmm7); + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 8; + _mm_store_si128((__m128i *) dptr, xmm1); dptr += 8; + _mm_store_si128((__m128i *) dptr, xmm2); dptr += 8; + _mm_store_si128((__m128i *) dptr, xmm3); dptr += 8; + } + } + + /* Do 8-short chunks using two XMM registers. */ + count = len >> 3; + len -= count << 3; + while (count--) + { + __m128i xmm0 = _mm_set1_epi16(0x0001U); + __m128i xmm1 = LOAD_SI128(sptr); sptr += 8; + xmm0 = _mm_sign_epi16(xmm0, xmm1); + _mm_store_si128((__m128i *) dptr, xmm0); dptr += 8; + } + + /* Do leftovers. */ + while (len--) + { + INT16 src = *sptr++; + *dptr++ = (src < 0) ? -1 : ((src > 0) ? 1 : 0); + } + + return PRIMITIVES_SUCCESS; +} +#endif /* WITH_SSE2 */ + +/* ------------------------------------------------------------------------- */ +void primitives_init_sign_opt(const primitives_hints_t *hints, primitives_t *prims) +{ + /* Pick tuned versions if possible. */ + /* I didn't spot an IPP version of this. */ +#if defined(WITH_SSE2) + if ((hints->x86_flags & PRIM_X86_SSSE3_AVAILABLE) + && (hints->x86_flags & PRIM_X86_SSE3_AVAILABLE)) + { + prims->sign_16s = ssse3_sign_16s; + } +#endif +} + diff --git a/libfreerdp/primitives/prim_templates.h b/libfreerdp/primitives/prim_templates.h index c0b6ac10d..b530637b7 100644 --- a/libfreerdp/primitives/prim_templates.h +++ b/libfreerdp/primitives/prim_templates.h @@ -44,7 +44,7 @@ * SCD = Source, Constant, Destination */ #define SSE3_SCD_ROUTINE(_name_, _type_, _fallback_, _op_, _slowWay_) \ -PRIM_STATIC pstatus_t _name_(const _type_ *pSrc, INT32 val, _type_ *pDst, INT32 len) \ +pstatus_t _name_(const _type_ *pSrc, INT32 val, _type_ *pDst, INT32 len) \ { \ int shifts; \ UINT32 offBeatMask; \ @@ -188,7 +188,7 @@ PRIM_STATIC pstatus_t _name_(const _type_ *pSrc, INT32 val, _type_ *pDst, INT32 * PRE = preload xmm0 with the constant. */ #define SSE3_SCD_PRE_ROUTINE(_name_, _type_, _fallback_, _op_, _slowWay_) \ -PRIM_STATIC pstatus_t _name_(const _type_ *pSrc, _type_ val, _type_ *pDst, INT32 len) \ +pstatus_t _name_(const _type_ *pSrc, _type_ val, _type_ *pDst, INT32 len) \ { \ int shifts; \ UINT32 offBeatMask; \ @@ -293,7 +293,7 @@ PRIM_STATIC pstatus_t _name_(const _type_ *pSrc, _type_ val, _type_ *pDst, INT32 * SSD = Source1, Source2, Destination */ #define SSE3_SSD_ROUTINE(_name_, _type_, _fallback_, _op_, _slowWay_) \ -PRIM_STATIC pstatus_t _name_(const _type_ *pSrc1, const _type_ *pSrc2, _type_ *pDst, INT32 len) \ +pstatus_t _name_(const _type_ *pSrc1, const _type_ *pSrc2, _type_ *pDst, INT32 len) \ { \ int shifts; \ UINT32 offBeatMask; \ diff --git a/libfreerdp/primitives/primitives.c b/libfreerdp/primitives/primitives.c index ddafe7815..99c71e37f 100644 --- a/libfreerdp/primitives/primitives.c +++ b/libfreerdp/primitives/primitives.c @@ -150,7 +150,7 @@ static void set_hints(primitives_hints_t* hints) #elif defined(_M_ARM) -static UINT32 androidNeon(void) +static UINT32 getNeonSupport(void) { #ifdef __ANDROID__ if (android_getCpuFamily() != ANDROID_CPU_FAMILY_ARM) return 0; @@ -164,7 +164,9 @@ static UINT32 androidNeon(void) return PRIM_ARM_NEON_AVAILABLE; } } - /* else */ +#elif defined(__APPLE) + /* assume NEON support on iOS devices */ + return PRIM_ARM_NEON_AVAILABLE; #endif return 0; } @@ -172,7 +174,7 @@ static UINT32 androidNeon(void) static void set_hints(primitives_hints_t* hints) { /* ARM: TODO */ - hints->arm_flags |= androidNeon(); + hints->arm_flags |= getNeonSupport(); } #else diff --git a/libfreerdp/primitives/test/CMakeLists.txt b/libfreerdp/primitives/test/CMakeLists.txt index 49e1f2d3a..a39ab86bd 100644 --- a/libfreerdp/primitives/test/CMakeLists.txt +++ b/libfreerdp/primitives/test/CMakeLists.txt @@ -85,7 +85,7 @@ if(WITH_SSE2) endif() elseif(WITH_NEON) if(CMAKE_COMPILER_IS_GNUCC) - set(OPTIMZATION "${OPTFLAGS} -mfpu=neon -mfloat-abi=softfp -O2") + set(OPTIMZATION "${OPTFLAGS} -mfpu=neon -mfloat-abi=${ARM_FP_ABI} -O2") endif() # TODO: Add MSVC equivalent endif() diff --git a/server/Sample/sfreerdp.c b/server/Sample/sfreerdp.c index 680be7d87..087d444cf 100644 --- a/server/Sample/sfreerdp.c +++ b/server/Sample/sfreerdp.c @@ -655,6 +655,7 @@ static void* test_peer_mainloop(void* arg) client->settings->PrivateKeyFile = _strdup("server.key"); client->settings->NlaSecurity = FALSE; client->settings->RemoteFxCodec = TRUE; + client->settings->ColorDepth = 32; client->settings->SuppressOutput = TRUE; client->settings->RefreshRect = TRUE;