diff --git a/libfreerdp/primitives/prim_copy.c b/libfreerdp/primitives/prim_copy.c index 0d630248b..9021399eb 100644 --- a/libfreerdp/primitives/prim_copy.c +++ b/libfreerdp/primitives/prim_copy.c @@ -296,6 +296,10 @@ static INLINE pstatus_t generic_image_copy_no_overlap_dst_alpha( return generic_image_copy_bgrx32_bgrx32( pDstData, nDstStep, nXDst, nYDst, nWidth, nHeight, pSrcData, nSrcStep, nXSrc, nYSrc, srcVMultiplier, srcVOffset, dstVMultiplier, dstVOffset); + case PIXEL_FORMAT_BGR24: + return generic_image_copy_bgr24_bgrx32( + pDstData, nDstStep, nXDst, nYDst, nWidth, nHeight, pSrcData, nSrcStep, + nXSrc, nYSrc, srcVMultiplier, srcVOffset, dstVMultiplier, dstVOffset); default: break; } diff --git a/libfreerdp/primitives/prim_copy_avx2.c b/libfreerdp/primitives/prim_copy_avx2.c index a054a5cd9..ec8e8f5ea 100644 --- a/libfreerdp/primitives/prim_copy_avx2.c +++ b/libfreerdp/primitives/prim_copy_avx2.c @@ -34,6 +34,12 @@ #include #include +static INLINE pstatus_t avx2_image_copy_no_overlap_convert( + BYTE* WINPR_RESTRICT pDstData, DWORD DstFormat, UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, + UINT32 nWidth, UINT32 nHeight, const BYTE* WINPR_RESTRICT pSrcData, DWORD SrcFormat, + UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc, const gdiPalette* WINPR_RESTRICT palette, + SSIZE_T srcVMultiplier, SSIZE_T srcVOffset, SSIZE_T dstVMultiplier, SSIZE_T dstVOffset); + static INLINE pstatus_t avx2_image_copy_bgr24_bgrx32(BYTE* WINPR_RESTRICT pDstData, UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, UINT32 nHeight, @@ -169,12 +175,12 @@ static pstatus_t avx2_image_copy_no_overlap_dst_alpha( break; } - WLog_DBG(TAG, "unsupported format src %s --> dst %s", FreeRDPGetColorFormatName(SrcFormat), - FreeRDPGetColorFormatName(DstFormat)); - return -1; + return avx2_image_copy_no_overlap_convert( + pDstData, DstFormat, nDstStep, nXDst, nYDst, nWidth, nHeight, pSrcData, SrcFormat, nSrcStep, + nXSrc, nYSrc, palette, srcVMultiplier, srcVOffset, dstVMultiplier, dstVOffset); } -static INLINE pstatus_t avx2_image_copy_no_overlap_convert( +pstatus_t avx2_image_copy_no_overlap_convert( BYTE* WINPR_RESTRICT pDstData, DWORD DstFormat, UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, UINT32 nHeight, const BYTE* WINPR_RESTRICT pSrcData, DWORD SrcFormat, UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc, const gdiPalette* WINPR_RESTRICT palette, diff --git a/libfreerdp/primitives/prim_copy_sse.c b/libfreerdp/primitives/prim_copy_sse.c index 710b9f65e..c2d102e78 100644 --- a/libfreerdp/primitives/prim_copy_sse.c +++ b/libfreerdp/primitives/prim_copy_sse.c @@ -34,6 +34,12 @@ #include #include +static INLINE pstatus_t sse_image_copy_no_overlap_convert( + BYTE* WINPR_RESTRICT pDstData, DWORD DstFormat, UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, + UINT32 nWidth, UINT32 nHeight, const BYTE* WINPR_RESTRICT pSrcData, DWORD SrcFormat, + UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc, const gdiPalette* WINPR_RESTRICT palette, + SSIZE_T srcVMultiplier, SSIZE_T srcVOffset, SSIZE_T dstVMultiplier, SSIZE_T dstVOffset); + static INLINE pstatus_t sse_image_copy_bgr24_bgrx32(BYTE* WINPR_RESTRICT pDstData, UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, UINT32 nHeight, @@ -167,12 +173,13 @@ static pstatus_t sse_image_copy_no_overlap_dst_alpha( break; } - WLog_DBG(TAG, "unsupported format src %s --> dst %s", FreeRDPGetColorFormatName(SrcFormat), - FreeRDPGetColorFormatName(DstFormat)); - return -1; + /* Fall back to pixel copy */ + return sse_image_copy_no_overlap_convert( + pDstData, DstFormat, nDstStep, nXDst, nYDst, nWidth, nHeight, pSrcData, SrcFormat, nSrcStep, + nXSrc, nYSrc, palette, srcVMultiplier, srcVOffset, dstVMultiplier, dstVOffset); } -static INLINE pstatus_t sse_image_copy_no_overlap_convert( +pstatus_t sse_image_copy_no_overlap_convert( BYTE* WINPR_RESTRICT pDstData, DWORD DstFormat, UINT32 nDstStep, UINT32 nXDst, UINT32 nYDst, UINT32 nWidth, UINT32 nHeight, const BYTE* WINPR_RESTRICT pSrcData, DWORD SrcFormat, UINT32 nSrcStep, UINT32 nXSrc, UINT32 nYSrc, const gdiPalette* WINPR_RESTRICT palette,