From b35dc849eeca3458527490ef050217c99d1e100f Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 12 Dec 2014 17:43:14 +0100 Subject: [PATCH 1/7] build: improve X11 detection on OS X /usr/X11R6 doesn't exist on OS X per default (anymore). Therefore add PATHS to all X11 detection modules pointing to the Xquarz installation directory in /opt/X11. For FindX11 it was also necessary to ensure that the frameworks are searched as last (after PATHS) otherwise it could happen that X11 headers of a framework (e.g. Tk.framework) were used. --- cmake/FindX11.cmake | 11 +++++++++++ cmake/FindXKBFile.cmake | 2 ++ cmake/FindXRandR.cmake | 2 ++ cmake/FindXShm.cmake | 2 ++ cmake/FindXTest.cmake | 2 ++ cmake/FindXcursor.cmake | 2 ++ cmake/FindXdamage.cmake | 2 ++ cmake/FindXext.cmake | 2 ++ cmake/FindXfixes.cmake | 2 ++ cmake/FindXi.cmake | 2 ++ cmake/FindXinerama.cmake | 2 ++ cmake/FindXrender.cmake | 2 ++ cmake/FindXv.cmake | 2 ++ 13 files changed, 35 insertions(+) diff --git a/cmake/FindX11.cmake b/cmake/FindX11.cmake index 594b2c022..a2d8954db 100644 --- a/cmake/FindX11.cmake +++ b/cmake/FindX11.cmake @@ -28,15 +28,26 @@ # limitations under the License. #============================================================================= +if (APPLE) + set(CMAKE_FIND_FRAMEWORK_OLD ${CMAKE_FIND_FRAMEWORK}) + set(CMAKE_FIND_FRAMEWORK LAST) +endif () + find_path(X11_INCLUDE_DIR NAMES X11/Xlib.h PATH_SUFFIXES X11 + PATHS /opt/X11/include DOC "The X11 include directory" ) find_library(X11_LIBRARY NAMES X11 + PATHS /opt/X11/lib DOC "The X11 library" ) +if(APPLE) + set(CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_OLD}) +endif() + include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(X11 DEFAULT_MSG X11_LIBRARY X11_INCLUDE_DIR) diff --git a/cmake/FindXKBFile.cmake b/cmake/FindXKBFile.cmake index e47ff997a..bfb6c4ca0 100644 --- a/cmake/FindXKBFile.cmake +++ b/cmake/FindXKBFile.cmake @@ -30,10 +30,12 @@ find_path(XKBFILE_INCLUDE_DIR NAMES X11/extensions/XKBfile.h PATH_SUFFIXES X11/extensions + PATHS /opt/X11/include DOC "The XKBFile include directory" ) find_library(XKBFILE_LIBRARY NAMES xkbfile + PATHS /opt/X11/lib DOC "The XKBFile library" ) diff --git a/cmake/FindXRandR.cmake b/cmake/FindXRandR.cmake index e9e38c379..7b0ec7185 100644 --- a/cmake/FindXRandR.cmake +++ b/cmake/FindXRandR.cmake @@ -28,10 +28,12 @@ find_path(XRANDR_INCLUDE_DIR NAMES X11/extensions/Xrandr.h PATH_SUFFIXES X11/extensions + PATHS /opt/X11/include DOC "The XRANDR include directory" ) find_library(XRANDR_LIBRARY NAMES Xrandr + PATHS /opt/X11/lib DOC "The XRANDR library" ) diff --git a/cmake/FindXShm.cmake b/cmake/FindXShm.cmake index cc4b6d5c0..7b0796ebd 100644 --- a/cmake/FindXShm.cmake +++ b/cmake/FindXShm.cmake @@ -30,10 +30,12 @@ find_path(XSHM_INCLUDE_DIR NAMES X11/extensions/XShm.h PATH_SUFFIXES X11/extensions + PATHS /opt/X11/include DOC "The XShm include directory" ) find_library(XSHM_LIBRARY NAMES Xext + PATHS /opt/X11/lib DOC "The XShm library" ) diff --git a/cmake/FindXTest.cmake b/cmake/FindXTest.cmake index f4a8561e6..8fb21f682 100644 --- a/cmake/FindXTest.cmake +++ b/cmake/FindXTest.cmake @@ -30,10 +30,12 @@ find_path(XTEST_INCLUDE_DIR NAMES X11/extensions/XTest.h PATH_SUFFIXES X11/extensions + PATHS /opt/X11/include DOC "The XTest include directory" ) find_library(XTEST_LIBRARY NAMES Xtst + PATHS /opt/X11/lib DOC "The XTest library" ) diff --git a/cmake/FindXcursor.cmake b/cmake/FindXcursor.cmake index cc22bbd39..a333ecd4e 100644 --- a/cmake/FindXcursor.cmake +++ b/cmake/FindXcursor.cmake @@ -30,10 +30,12 @@ find_path(XCURSOR_INCLUDE_DIR NAMES X11/Xcursor/Xcursor.h PATH_SUFFIXES X11/Xcursor + PATHS /opt/X11/include DOC "The Xcursor include directory" ) find_library(XCURSOR_LIBRARY NAMES Xcursor + PATHS /opt/X11/lib DOC "The Xcursor library" ) diff --git a/cmake/FindXdamage.cmake b/cmake/FindXdamage.cmake index a3ddf28a2..16f8f6473 100644 --- a/cmake/FindXdamage.cmake +++ b/cmake/FindXdamage.cmake @@ -30,10 +30,12 @@ find_path(XDAMAGE_INCLUDE_DIR NAMES X11/extensions/Xdamage.h PATH_SUFFIXES X11/extensions + PATHS /opt/X11/include DOC "The Xdamage include directory" ) find_library(XDAMAGE_LIBRARY NAMES Xdamage + PATHS /opt/X11/lib DOC "The Xdamage library" ) diff --git a/cmake/FindXext.cmake b/cmake/FindXext.cmake index 8cfe552f8..bb054003f 100644 --- a/cmake/FindXext.cmake +++ b/cmake/FindXext.cmake @@ -30,10 +30,12 @@ find_path(XEXT_INCLUDE_DIR NAMES X11/extensions/Xext.h PATH_SUFFIXES X11/extensions + PATHS /opt/X11/include DOC "The Xext include directory" ) find_library(XEXT_LIBRARY NAMES Xext + PATHS /opt/X11/lib DOC "The Xext library" ) diff --git a/cmake/FindXfixes.cmake b/cmake/FindXfixes.cmake index a7e633ea2..ca3e5119b 100644 --- a/cmake/FindXfixes.cmake +++ b/cmake/FindXfixes.cmake @@ -30,10 +30,12 @@ find_path(XFIXES_INCLUDE_DIR NAMES X11/extensions/Xfixes.h PATH_SUFFIXES X11/extensions + PATHS /opt/X11/include DOC "The Xfixes include directory" ) find_library(XFIXES_LIBRARY NAMES Xfixes + PATHS /opt/X11/lib DOC "The Xfixes library" ) diff --git a/cmake/FindXi.cmake b/cmake/FindXi.cmake index cdd352d82..39d9ea716 100644 --- a/cmake/FindXi.cmake +++ b/cmake/FindXi.cmake @@ -32,9 +32,11 @@ include(CheckSymbolExists) find_path(XI_INCLUDE_DIR NAMES X11/extensions/XInput2.h + PATHS /opt/X11/include DOC "The Xi include directory") find_library(XI_LIBRARY NAMES Xi + PATHS /opt/X11/lib DOC "The Xi library") include(FindPackageHandleStandardArgs) diff --git a/cmake/FindXinerama.cmake b/cmake/FindXinerama.cmake index ff9f4d1f2..8863d8c7b 100644 --- a/cmake/FindXinerama.cmake +++ b/cmake/FindXinerama.cmake @@ -29,11 +29,13 @@ #============================================================================= find_path(XINERAMA_INCLUDE_DIR NAMES X11/extensions/Xinerama.h + PATHS /opt/X11/include PATH_SUFFIXES X11/extensions DOC "The Xinerama include directory" ) find_library(XINERAMA_LIBRARY NAMES Xinerama + PATHS /opt/X11/lib DOC "The Xinerama library" ) diff --git a/cmake/FindXrender.cmake b/cmake/FindXrender.cmake index efcf72595..8fb45af00 100644 --- a/cmake/FindXrender.cmake +++ b/cmake/FindXrender.cmake @@ -27,9 +27,11 @@ #============================================================================= find_path(XRENDER_INCLUDE_DIR NAMES X11/extensions/Xrender.h + PATHS /opt/X11/include DOC "The Xrender include directory") find_library(XRENDER_LIBRARY NAMES Xrender + PATHS /opt/X11/lib DOC "The Xrender library") include(FindPackageHandleStandardArgs) diff --git a/cmake/FindXv.cmake b/cmake/FindXv.cmake index 0ba833d8a..ded749698 100644 --- a/cmake/FindXv.cmake +++ b/cmake/FindXv.cmake @@ -29,10 +29,12 @@ #============================================================================= find_path(XV_INCLUDE_DIR NAMES X11/extensions/Xv.h + PATHS /opt/X11/include DOC "The Xv include directory" ) find_library(XV_LIBRARY NAMES Xv + PATHS /opt/X11/lib DOC "The Xv library" ) From ec0de7f6f6c4845b5c4e54ea326b29f1ac28952b Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 12 Dec 2014 17:53:33 +0100 Subject: [PATCH 2/7] rdtk: build samples only if WITH_SAMPLE is enabled --- rdtk/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rdtk/CMakeLists.txt b/rdtk/CMakeLists.txt index 35b005212..063f19576 100644 --- a/rdtk/CMakeLists.txt +++ b/rdtk/CMakeLists.txt @@ -66,8 +66,10 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) add_subdirectory(include) add_subdirectory(librdtk) -if(WITH_X11) - add_subdirectory(sample) +if(WITH_SAMPLE) + if(WITH_X11) + add_subdirectory(sample) + endif() endif() # Exporting From 10ee2f72d9b3acc58b7dff784d1f79cb52dcc4fa Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 12 Dec 2014 19:25:43 +0100 Subject: [PATCH 3/7] Mac: set policy to silent cmake >= 3.0 warnings Set the following policies to "OLD" if cmake version is greater than 2.8.12: CMP0026 - Disallow use of the LOCATION target property CMP0045 - Error on non-existent target in get_target_property --- client/Mac/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/Mac/CMakeLists.txt b/client/Mac/CMakeLists.txt index 8f0aca4dc..07fcecfed 100644 --- a/client/Mac/CMakeLists.txt +++ b/client/Mac/CMakeLists.txt @@ -1,6 +1,12 @@ project(MacFreeRDP-library) + +if(${CMAKE_VERSION} GREATER 2.8.12) + cmake_policy(SET CMP0026 OLD) + cmake_policy(SET CMP0045 OLD) +endif() + set(MODULE_NAME "MacFreeRDP-library") set(MODULE_OUTPUT_NAME "MacFreeRDP") set(MODULE_PREFIX "FREERDP_CLIENT_MAC_LIBRARY") From 1b663ceffe51008af7ae9749e5b7999b2f7d6698 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 12 Dec 2014 18:26:45 +0100 Subject: [PATCH 4/7] build: cmake 3.1 compatibility * fix problem with REMOVE_DUPLICATES on undefined lists * since 3.1 file(GLOB FILEPATHS RELATIVE .. returns single / instead of // as previously - necessary adoptions for regex and matches done. Should work with all cmake versions. Tested with 3.1.0-rc3 --- channels/CMakeLists.txt | 4 ++-- channels/client/CMakeLists.txt | 2 ++ client/CMakeLists.txt | 4 ++-- server/CMakeLists.txt | 4 ++-- third-party/CMakeLists.txt | 6 +++--- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/channels/CMakeLists.txt b/channels/CMakeLists.txt index c4e6048b5..540b1ac91 100644 --- a/channels/CMakeLists.txt +++ b/channels/CMakeLists.txt @@ -253,8 +253,8 @@ set(FILENAME "ChannelOptions.cmake") file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}") foreach(FILEPATH ${FILEPATHS}) - if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}") - string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" DIR ${FILEPATH}) + if(${FILEPATH} MATCHES "^([^/]*)/+${FILENAME}") + string(REGEX REPLACE "^([^/]*)/+${FILENAME}" "\\1" DIR ${FILEPATH}) set(CHANNEL_OPTION) include(${FILEPATH}) if(${CHANNEL_OPTION}) diff --git a/channels/client/CMakeLists.txt b/channels/client/CMakeLists.txt index 049bc7b0c..2db18e8ee 100644 --- a/channels/client/CMakeLists.txt +++ b/channels/client/CMakeLists.txt @@ -24,7 +24,9 @@ set(${MODULE_PREFIX}_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/addin.c ${CMAKE_CURRENT_SOURCE_DIR}/addin.h) +if(CHANNEL_STATIC_CLIENT_ENTRIES) list(REMOVE_DUPLICATES CHANNEL_STATIC_CLIENT_ENTRIES) +endif() foreach(STATIC_ENTRY ${CHANNEL_STATIC_CLIENT_ENTRIES}) foreach(STATIC_MODULE ${CHANNEL_STATIC_CLIENT_MODULES}) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 14ed3633f..b8b769922 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -63,8 +63,8 @@ set(FILENAME "ModuleOptions.cmake") file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}") foreach(FILEPATH ${FILEPATHS}) - if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}") - string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" FREERDP_CLIENT ${FILEPATH}) + if(${FILEPATH} MATCHES "^([^/]*)/+${FILENAME}") + string(REGEX REPLACE "^([^/]*)/+${FILENAME}" "\\1" FREERDP_CLIENT ${FILEPATH}) set(FREERDP_CLIENT_ENABLED 0) include(${FILEPATH}) if(FREERDP_CLIENT_ENABLED) diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index cda14bacd..ee9458e4b 100644 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -48,8 +48,8 @@ set(FILENAME "ModuleOptions.cmake") file(GLOB FILEPATHS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/${FILENAME}") foreach(FILEPATH ${FILEPATHS}) - if(${FILEPATH} MATCHES "^([^/]*)//${FILENAME}") - string(REGEX REPLACE "^([^/]*)//${FILENAME}" "\\1" FREERDP_SERVER ${FILEPATH}) + if(${FILEPATH} MATCHES "^([^/]*)/+${FILENAME}") + string(REGEX REPLACE "^([^/]*)/+${FILENAME}" "\\1" FREERDP_SERVER ${FILEPATH}) set(FREERDP_SERVER_ENABLED 0) include(${FILEPATH}) if(FREERDP_SERVER_ENABLED) diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt index 09b1fd46e..610f35e9d 100644 --- a/third-party/CMakeLists.txt +++ b/third-party/CMakeLists.txt @@ -22,11 +22,11 @@ file(GLOB all_valid_subdirs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*/CMakeLists.txt") foreach(dir ${all_valid_subdirs}) - if(${dir} MATCHES "^([^/]*)//CMakeLists.txt") - string(REGEX REPLACE "^([^/]*)//CMakeLists.txt" "\\1" dir_trimmed ${dir}) + if(${dir} MATCHES "^([^/]*)/+CMakeLists.txt") + string(REGEX REPLACE "^([^/]*)/+CMakeLists.txt" "\\1" dir_trimmed ${dir}) message(STATUS "Adding third-party component ${dir_trimmed}") add_subdirectory(${dir_trimmed}) endif() endforeach(dir) -set(THIRD_PARTY_INCLUDES ${THIRD_PARTY_INCLUDES} PARENT_SCOPE) \ No newline at end of file +set(THIRD_PARTY_INCLUDES ${THIRD_PARTY_INCLUDES} PARENT_SCOPE) From 43beef36ff1521756bc41378cfa251c843375f49 Mon Sep 17 00:00:00 2001 From: Bernhard Miklautz Date: Fri, 12 Dec 2014 18:57:40 +0100 Subject: [PATCH 5/7] rdtk/shadow: install libraries versioned --- rdtk/CMakeLists.txt | 5 +++-- rdtk/librdtk/CMakeLists.txt | 4 ++++ server/shadow/CMakeLists.txt | 4 ++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/rdtk/CMakeLists.txt b/rdtk/CMakeLists.txt index 063f19576..73c64facd 100644 --- a/rdtk/CMakeLists.txt +++ b/rdtk/CMakeLists.txt @@ -44,8 +44,9 @@ include(CMakePackageConfigHelpers) set(RDTK_VERSION_MAJOR "1") set(RDTK_VERSION_MINOR "1") set(RDTK_VERSION_REVISION "0") -set(RDTK_VERSION "${RDTK_VERSION_MAJOR}.${RDTK_VERSION_MINOR}") -set(RDTK_VERSION_FULL "${RDTK_VERSION}.${RDTK_VERSION_REVISION}") +set(RDTK_API_VERSION "${RDTK_VERSION_MAJOR}.${RDTK_VERSION_MINOR}") +set(RDTK_VERSION "${RDTK_API_VERSION}.${RDTK_VERSION_REVISION}") +set(RDTK_VERSION_FULL "${RDTK_VERSION}") set(RDTK_VERSION_FULL ${RDTK_VERSION_FULL} PARENT_SCOPE) # Default to release build type diff --git a/rdtk/librdtk/CMakeLists.txt b/rdtk/librdtk/CMakeLists.txt index 8a81964bd..950cc7d4b 100644 --- a/rdtk/librdtk/CMakeLists.txt +++ b/rdtk/librdtk/CMakeLists.txt @@ -58,6 +58,10 @@ add_library(${MODULE_NAME} ${${MODULE_PREFIX}_SRCS}) list(APPEND ${MODULE_PREFIX}_LIBS winpr) list(APPEND ${MODULE_PREFIX}_LIBS freerdp) +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${RDTK_VERSION} SOVERSION ${RDTK_API_VERSION}) +endif() + target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} EXPORT RdTkTargets) diff --git a/server/shadow/CMakeLists.txt b/server/shadow/CMakeLists.txt index 78f85b03a..26a5c7b9a 100644 --- a/server/shadow/CMakeLists.txt +++ b/server/shadow/CMakeLists.txt @@ -238,6 +238,10 @@ list(APPEND ${MODULE_PREFIX}_LIBS rdtk) target_link_libraries(${MODULE_NAME} ${${MODULE_PREFIX}_LIBS}) +if (WITH_LIBRARY_VERSIONING) + set_target_properties(${MODULE_NAME} PROPERTIES VERSION ${FREERDP_VERSION} SOVERSION ${FREERDP_API_VERSION}) +endif() + install(TARGETS ${MODULE_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT server) set_property(TARGET ${MODULE_NAME} PROPERTY FOLDER "Server/shadow") From 5c68b1cf22ba03faa9185cddf2d17edb4a6433f0 Mon Sep 17 00:00:00 2001 From: Norbert Federa Date: Mon, 15 Dec 2014 16:34:09 +0100 Subject: [PATCH 6/7] xfreerdp: fix RDP order color conversion Note: /gdi:sw was working fine, this commit fixes /gdi:hw * calculate color channel shifts based on X11 visual color masks * fast path to skip conversion if visual color masks equal rdp color masks * successfully tested 8/15/16/24/32 bpp rdp sessions on 16/24/32 bpp visuals --- client/X11/xf_client.c | 17 +++++++-- client/X11/xf_gdi.c | 74 ++++++++++++++++++++++++++++++++++------ client/X11/xf_gdi.h | 1 + client/X11/xf_graphics.c | 5 +-- client/X11/xfreerdp.h | 7 ++++ 5 files changed, 89 insertions(+), 15 deletions(-) diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index 71534ab15..8631dcc3a 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -656,6 +656,14 @@ void xf_unlock_x11(xfContext* xfc, BOOL display) } } +static void xf_calculate_color_shifts(UINT32 mask, UINT8* rsh, UINT8* lsh) +{ + for (*lsh = 0; !(mask & 1); mask >>= 1) + (*lsh)++; + for (*rsh = 8; mask; mask >>= 1) + (*rsh)--; +} + BOOL xf_get_pixmap_info(xfContext* xfc) { int i; @@ -720,7 +728,7 @@ BOOL xf_get_pixmap_info(xfContext* xfc) } } - if (vi) + if (xfc->visual) { /* * Detect if the server visual has an inverted colormap @@ -730,6 +738,11 @@ BOOL xf_get_pixmap_info(xfContext* xfc) { xfc->invert = TRUE; } + + /* calculate color shifts required for rdp order color conversion */ + xf_calculate_color_shifts(vi->red_mask, &xfc->red_shift_r, &xfc->red_shift_l); + xf_calculate_color_shifts(vi->green_mask, &xfc->green_shift_r, &xfc->green_shift_l); + xf_calculate_color_shifts(vi->blue_mask, &xfc->blue_shift_r, &xfc->blue_shift_l); } XFree(vis); @@ -1294,7 +1307,7 @@ void* xf_input_thread(void *arg) while(1) { status = WaitForMultipleObjects(2, event, FALSE, INFINITE); - + if(status == WAIT_OBJECT_0 + 1) { do diff --git a/client/X11/xf_gdi.c b/client/X11/xf_gdi.c index 0b3880817..131080fa2 100644 --- a/client/X11/xf_gdi.c +++ b/client/X11/xf_gdi.c @@ -219,6 +219,58 @@ BOOL xf_set_rop3(xfContext* xfc, int rop3) return TRUE; } +UINT32 xf_convert_rdp_order_color(xfContext* xfc, UINT32 color) +{ + UINT32 r, g, b; + + switch (xfc->srcBpp) + { + case 32: + case 24: + if (xfc->visual->red_mask == 0xFF0000 && + xfc->visual->green_mask == 0xFF00 && + xfc->visual->blue_mask == 0xFF) + { + return color; + } + GetRGB32(r, g, b, color); + break; + + case 16: + color = (color & 0xFF00) | ((color >> 16) & 0xFF); + if (xfc->visual->red_mask == 0xF800 && + xfc->visual->green_mask == 0x07E0 && + xfc->visual->blue_mask == 0x001F) + { + return color; + } + GetRGB16(r, g, b, color); + break; + + case 15: + color = (color & 0xFF00) | ((color >> 16) & 0xFF); + GetRGB15(r, g, b, color); + break; + + case 8: + color = (color >> 16) & (UINT32) 0xFF; + if (xfc->palette) + { + r = xfc->palette[(color * 4) + 2]; + g = xfc->palette[(color * 4) + 1]; + b = xfc->palette[(color * 4) + 0]; + } + break; + + default: + return color; + } + + return ( ((r >> xfc->red_shift_r) << xfc->red_shift_l) | + ((g >> xfc->green_shift_r) << xfc->green_shift_l) | + ((b >> xfc->blue_shift_r) << xfc->blue_shift_l) ); +} + Pixmap xf_brush_new(xfContext* xfc, int width, int height, int bpp, BYTE* data) { GC gc; @@ -463,8 +515,8 @@ void xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) brush = &patblt->brush; xf_set_rop3(xfc, gdi_rop3_code(patblt->bRop)); - foreColor = freerdp_convert_gdi_order_color(patblt->foreColor, context->settings->ColorDepth, xfc->format, xfc->palette); - backColor = freerdp_convert_gdi_order_color(patblt->backColor, context->settings->ColorDepth, xfc->format, xfc->palette); + foreColor = xf_convert_rdp_order_color(xfc, patblt->foreColor); + backColor = xf_convert_rdp_order_color(xfc, patblt->backColor); if (brush->style == GDI_BS_SOLID) { @@ -565,7 +617,7 @@ void xf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) xf_lock_x11(xfc, FALSE); - color = freerdp_convert_gdi_order_color(opaque_rect->color, context->settings->ColorDepth, xfc->format, xfc->palette); + color = xf_convert_rdp_order_color(xfc, opaque_rect->color); XSetFunction(xfc->display, xfc->gc, GXcopy); XSetFillStyle(xfc->display, xfc->gc, FillSolid); @@ -593,7 +645,7 @@ void xf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* mult xf_lock_x11(xfc, FALSE); - color = freerdp_convert_gdi_order_color(multi_opaque_rect->color, context->settings->ColorDepth, xfc->format, xfc->palette); + color = xf_convert_rdp_order_color(xfc, multi_opaque_rect->color); XSetFunction(xfc->display, xfc->gc, GXcopy); XSetFillStyle(xfc->display, xfc->gc, FillSolid); @@ -629,7 +681,7 @@ void xf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) xf_lock_x11(xfc, FALSE); xf_set_rop2(xfc, line_to->bRop2); - color = freerdp_convert_gdi_order_color(line_to->penColor, context->settings->ColorDepth, xfc->format, xfc->palette); + color = xf_convert_rdp_order_color(xfc, line_to->penColor); XSetFillStyle(xfc->display, xfc->gc, FillSolid); XSetForeground(xfc->display, xfc->gc, color); @@ -705,7 +757,7 @@ void xf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) xf_lock_x11(xfc, FALSE); xf_set_rop2(xfc, polyline->bRop2); - color = freerdp_convert_gdi_order_color(polyline->penColor, context->settings->ColorDepth, xfc->format, xfc->palette); + color = xf_convert_rdp_order_color(xfc, polyline->penColor); XSetFillStyle(xfc->display, xfc->gc, FillSolid); XSetForeground(xfc->display, xfc->gc, color); @@ -773,8 +825,8 @@ void xf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt) brush = &mem3blt->brush; bitmap = (xfBitmap*) mem3blt->bitmap; xf_set_rop3(xfc, gdi_rop3_code(mem3blt->bRop)); - foreColor = freerdp_convert_gdi_order_color(mem3blt->foreColor, context->settings->ColorDepth, xfc->format, xfc->palette); - backColor = freerdp_convert_gdi_order_color(mem3blt->backColor, context->settings->ColorDepth, xfc->format, xfc->palette); + foreColor = xf_convert_rdp_order_color(xfc, mem3blt->foreColor); + backColor = xf_convert_rdp_order_color(xfc, mem3blt->backColor); if (brush->style == GDI_BS_PATTERN) { @@ -840,7 +892,7 @@ void xf_gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) xf_lock_x11(xfc, FALSE); xf_set_rop2(xfc, polygon_sc->bRop2); - brush_color = freerdp_convert_gdi_order_color(polygon_sc->brushColor, context->settings->ColorDepth, xfc->format, xfc->palette); + brush_color = xf_convert_rdp_order_color(xfc, polygon_sc->brushColor); npoints = polygon_sc->numPoints + 1; points = malloc(sizeof(XPoint) * npoints); @@ -900,8 +952,8 @@ void xf_gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) brush = &(polygon_cb->brush); xf_set_rop2(xfc, polygon_cb->bRop2); - foreColor = freerdp_convert_gdi_order_color(polygon_cb->foreColor, context->settings->ColorDepth, xfc->format, xfc->palette); - backColor = freerdp_convert_gdi_order_color(polygon_cb->backColor, context->settings->ColorDepth, xfc->format, xfc->palette); + foreColor = xf_convert_rdp_order_color(xfc, polygon_cb->foreColor); + backColor = xf_convert_rdp_order_color(xfc, polygon_cb->backColor); npoints = polygon_cb->numPoints + 1; points = malloc(sizeof(XPoint) * npoints); diff --git a/client/X11/xf_gdi.h b/client/X11/xf_gdi.h index eefd97c6d..bd36d58e6 100644 --- a/client/X11/xf_gdi.h +++ b/client/X11/xf_gdi.h @@ -27,5 +27,6 @@ void xf_gdi_register_update_callbacks(rdpUpdate* update); void xf_gdi_bitmap_update(rdpContext* context, BITMAP_UPDATE* bitmapUpdate); +UINT32 xf_convert_rdp_order_color(xfContext* xfc, UINT32 color); #endif /* __XF_GDI_H */ diff --git a/client/X11/xf_graphics.c b/client/X11/xf_graphics.c index e73833aed..b4c6e005e 100644 --- a/client/X11/xf_graphics.c +++ b/client/X11/xf_graphics.c @@ -35,6 +35,7 @@ #include #include "xf_graphics.h" +#include "xf_gdi.h" #include #define TAG CLIENT_TAG("x11") @@ -381,8 +382,8 @@ void xf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height { xfContext* xfc = (xfContext*) context; - bgcolor = freerdp_convert_gdi_order_color(bgcolor, context->settings->ColorDepth, xfc->format, xfc->palette); - fgcolor = freerdp_convert_gdi_order_color(fgcolor, context->settings->ColorDepth, xfc->format, xfc->palette); + bgcolor = xf_convert_rdp_order_color(xfc, bgcolor); + fgcolor = xf_convert_rdp_order_color(xfc, fgcolor); xf_lock_x11(xfc, FALSE); diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index 75dcd84e6..8a49ae2f8 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -132,6 +132,13 @@ struct xf_context UINT16 frame_x2; UINT16 frame_y2; + UINT8 red_shift_l; + UINT8 red_shift_r; + UINT8 green_shift_l; + UINT8 green_shift_r; + UINT8 blue_shift_l; + UINT8 blue_shift_r; + int XInputOpcode; #ifdef WITH_XRENDER From d647fd2f36bef1f5a88da19fc728377d313d929d Mon Sep 17 00:00:00 2001 From: erobertor Date: Mon, 15 Dec 2014 18:36:56 +0100 Subject: [PATCH 7/7] Update drdynvc_main.c fixed memory leak --- channels/drdynvc/client/drdynvc_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/channels/drdynvc/client/drdynvc_main.c b/channels/drdynvc/client/drdynvc_main.c index aaebeec02..cd7a2218b 100644 --- a/channels/drdynvc/client/drdynvc_main.c +++ b/channels/drdynvc/client/drdynvc_main.c @@ -531,6 +531,7 @@ static void* drdynvc_virtual_channel_client_thread(void* arg) { data = (wStream*) message.wParam; drdynvc_order_recv(drdynvc, data); + Stream_Free(data, TRUE); } } }