[winpr,clipboard] define guard DIBv5 support

This commit is contained in:
akallabeth
2025-02-27 08:25:15 +01:00
parent e184536083
commit 5b9a1b5b1f
3 changed files with 29 additions and 9 deletions

View File

@@ -43,6 +43,7 @@
#cmakedefine WITH_DEBUG_EVENTS
#cmakedefine WITH_DEBUG_MUTEX
#cmakedefine WINPR_UTILS_IMAGE_DIBv5 /** @since version 3.13.0 */
#cmakedefine WINPR_UTILS_IMAGE_WEBP /** @since version 3.3.0 */
#cmakedefine WINPR_UTILS_IMAGE_PNG /** @since version 3.3.0 */
#cmakedefine WINPR_UTILS_IMAGE_JPEG /** @since version 3.3.0 */

View File

@@ -236,12 +236,15 @@ static void* clipboard_synthesize_cf_dib(wClipboard* clipboard, UINT32 formatId,
BYTE* pDstData = NULL;
SrcSize = *pSize;
#if defined(WINPR_UTILS_IMAGE_DIBv5)
if (formatId == CF_DIBV5)
{
WLog_WARN(TAG, "[DIB] Unsupported destination format %s",
ClipboardGetFormatName(clipboard, formatId));
}
else if (is_format_bitmap(clipboard, formatId))
else
#endif
if (is_format_bitmap(clipboard, formatId))
{
WINPR_BITMAP_FILE_HEADER pFileHeader = { 0 };
wStream sbuffer = { 0 };
@@ -274,7 +277,7 @@ static void* clipboard_synthesize_cf_dib(wClipboard* clipboard, UINT32 formatId,
*
* BITMAPV5HEADER structure followed by the bitmap color space information and the bitmap bits.
*/
#if defined(WINPR_UTILS_IMAGE_DIBv5)
static void* clipboard_synthesize_cf_dibv5(wClipboard* clipboard, UINT32 formatId,
WINPR_ATTR_UNUSED const void* data,
WINPR_ATTR_UNUSED UINT32* pSize)
@@ -317,6 +320,7 @@ static void* clipboard_synthesize_cf_dibv5(wClipboard* clipboard, UINT32 formatI
return NULL;
}
#endif
static void* clipboard_prepend_bmp_header(const WINPR_BITMAP_INFO_HEADER* pInfoHeader,
const void* data, size_t size, UINT32* pSize)
@@ -386,11 +390,13 @@ static void* clipboard_synthesize_image_bmp(WINPR_ATTR_UNUSED wClipboard* clipbo
return clipboard_prepend_bmp_header(&header, data, SrcSize, pSize);
}
#if defined(WINPR_UTILS_IMAGE_DIBv5)
else if (formatId == CF_DIBV5)
{
WLog_WARN(TAG, "[BMP] Unsupported destination format %s",
ClipboardGetFormatName(clipboard, formatId));
}
#endif
else
{
WLog_WARN(TAG, "[BMP] Unsupported destination format %s",
@@ -772,7 +778,9 @@ BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
* CF_DIB
*/
{
#if defined(WINPR_UTILS_IMAGE_DIBv5)
ClipboardRegisterSynthesizer(clipboard, CF_DIB, CF_DIBV5, clipboard_synthesize_cf_dibv5);
#endif
for (size_t x = 0; x < ARRAYSIZE(mime_bitmap); x++)
{
const char* mime = mime_bitmap[x];
@@ -787,6 +795,7 @@ BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
/**
* CF_DIBV5
*/
#if defined(WINPR_UTILS_IMAGE_DIBv5)
{
ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, CF_DIB, clipboard_synthesize_cf_dib);
@@ -800,6 +809,7 @@ BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
clipboard_synthesize_image_bmp);
}
}
#endif
/**
* image/bmp
@@ -811,8 +821,10 @@ BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
if (altFormatId == 0)
continue;
ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIB, clipboard_synthesize_cf_dib);
#if defined(WINPR_UTILS_IMAGE_DIBv5)
ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIBV5,
clipboard_synthesize_cf_dibv5);
#endif
}
/**
@@ -823,12 +835,14 @@ BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_png);
ClipboardRegisterSynthesizer(clipboard, CF_DIB, altFormatId,
clipboard_synthesize_image_bmp_to_png);
ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
clipboard_synthesize_image_bmp_to_png);
ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIB,
clipboard_synthesize_image_png_to_bmp);
#if defined(WINPR_UTILS_IMAGE_DIBv5)
ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
clipboard_synthesize_image_bmp_to_png);
ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIBV5,
clipboard_synthesize_image_png_to_bmp);
#endif
}
#endif
@@ -840,12 +854,14 @@ BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_webp);
ClipboardRegisterSynthesizer(clipboard, CF_DIB, altFormatId,
clipboard_synthesize_image_bmp_to_webp);
ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
clipboard_synthesize_image_webp_to_bmp);
ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIB,
clipboard_synthesize_image_webp_to_bmp);
#if defined(WINPR_UTILS_IMAGE_DIBv5)
ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
clipboard_synthesize_image_bmp_to_webp);
ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIBV5,
clipboard_synthesize_image_webp_to_bmp);
#endif
}
#endif
@@ -857,12 +873,14 @@ BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_jpeg);
ClipboardRegisterSynthesizer(clipboard, CF_DIB, altFormatId,
clipboard_synthesize_image_bmp_to_jpeg);
ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
clipboard_synthesize_image_jpeg_to_bmp);
ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIB,
clipboard_synthesize_image_bmp_to_jpeg);
clipboard_synthesize_image_jpeg_to_bmp);
#if defined(WINPR_UTILS_IMAGE_DIBv5)
ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIBV5,
clipboard_synthesize_image_jpeg_to_bmp);
ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
clipboard_synthesize_image_bmp_to_jpeg);
#endif
}
#endif

View File

@@ -36,6 +36,7 @@ if(WITH_LODEPNG)
winpr_library_add_private(${lodepng_LIBRARIES})
endif()
option(WINPR_UTILS_IMAGE_DIBv5 "[experimental] Add DIBv5 <--> BMP conversion support to clipboard" OFF)
option(WINPR_UTILS_IMAGE_PNG "Add PNG <--> BMP conversion support to clipboard" OFF)
if(WINPR_UTILS_IMAGE_PNG)
find_package(PNG REQUIRED)