20#include <winpr/config.h>
24#include <winpr/user.h>
25#include <winpr/image.h>
27#include "../utils/image.h"
31#define TAG WINPR_TAG("clipboard.synthetic")
33static const char mime_html[] =
"text/html";
34static const char mime_ms_html[] =
"HTML Format";
35static const char* mime_bitmap[] = {
"image/bmp",
"image/x-bmp",
"image/x-MS-bmp",
36 "image/x-win-bitmap" };
38static const char mime_webp[] =
"image/webp";
39static const char mime_png[] =
"image/png";
40static const char mime_jpeg[] =
"image/jpeg";
41static const char mime_tiff[] =
"image/tiff";
43static const BYTE enc_base64url[] =
44 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
46WINPR_ATTR_NODISCARD
static inline char* b64_encode(
const BYTE* WINPR_RESTRICT data,
size_t length,
50 const BYTE* WINPR_RESTRICT alphabet = enc_base64url;
53 size_t outLen = (length + 3) * 4 / 3;
57 const size_t alen = outLen + extra + 1ull;
58 BYTE* p = malloc(alen);
77 blocks = length - (length % 3);
78 for (
size_t i = 0; i < blocks; i += 3, q += 3)
80 c = (q[0] << 16) + (q[1] << 8) + q[2];
82 *p++ = alphabet[(c & 0x00FC0000) >> 18];
83 *p++ = alphabet[(c & 0x0003F000) >> 12];
84 *p++ = alphabet[(c & 0x00000FC0) >> 6];
85 *p++ = alphabet[c & 0x0000003F];
95 *p++ = alphabet[(c & 0x00FC0000) >> 18];
96 *p++ = alphabet[(c & 0x0003F000) >> 12];
99 c = (q[0] << 16) + (q[1] << 8);
100 *p++ = alphabet[(c & 0x00FC0000) >> 18];
101 *p++ = alphabet[(c & 0x0003F000) >> 12];
102 *p++ = alphabet[(c & 0x00000FC0) >> 6];
109 *plen = WINPR_ASSERTING_INT_CAST(
size_t, p - ret);
125static void* clipboard_synthesize_cf_text(wClipboard* clipboard, UINT32 formatId,
const void* data,
129 char* pDstData =
nullptr;
131 if (formatId == CF_UNICODETEXT)
133 char* str = ConvertWCharNToUtf8Alloc(data, *pSize /
sizeof(WCHAR), &size);
135 if (!str || (size > UINT32_MAX))
141 pDstData = ConvertLineEndingToCRLF(str, &size);
143 *pSize = (UINT32)size;
146 else if ((formatId == CF_TEXT) || (formatId == CF_OEMTEXT) ||
147 (formatId == ClipboardGetFormatId(clipboard, mime_text_plain)))
150 pDstData = ConvertLineEndingToCRLF(data, &size);
152 if (!pDstData || (size > UINT32_MAX))
158 *pSize = (UINT32)size;
171static void* clipboard_synthesize_cf_oemtext(wClipboard* clipboard, UINT32 formatId,
172 const void* data, UINT32* pSize)
174 return clipboard_synthesize_cf_text(clipboard, formatId, data, pSize);
183static void* clipboard_synthesize_cf_locale(WINPR_ATTR_UNUSED wClipboard* clipboard,
184 WINPR_ATTR_UNUSED UINT32 formatId,
185 WINPR_ATTR_UNUSED
const void* data,
186 WINPR_ATTR_UNUSED UINT32* pSize)
188 UINT32* pDstData =
nullptr;
189 pDstData = (UINT32*)malloc(
sizeof(UINT32));
195 return (
void*)pDstData;
204static void* clipboard_synthesize_cf_unicodetext(wClipboard* clipboard, UINT32 formatId,
205 const void* data, UINT32* pSize)
208 char* crlfStr =
nullptr;
209 WCHAR* pDstData =
nullptr;
211 if ((formatId == CF_TEXT) || (formatId == CF_OEMTEXT) ||
212 (formatId == ClipboardGetFormatId(clipboard, mime_text_plain)))
215 if (!pSize || (*pSize > INT32_MAX))
219 crlfStr = ConvertLineEndingToCRLF((
const char*)data, &size);
224 pDstData = ConvertUtf8NToWCharAlloc(crlfStr, size, &len);
227 if ((len < 1) || ((len + 1) > UINT32_MAX /
sizeof(WCHAR)))
233 const size_t slen = (len + 1) *
sizeof(WCHAR);
234 *pSize = (UINT32)slen;
237 return (
void*)pDstData;
246static void* clipboard_synthesize_utf8_string(wClipboard* clipboard, UINT32 formatId,
247 const void* data, UINT32* pSize)
249 if (formatId == CF_UNICODETEXT)
252 char* pDstData = ConvertWCharNToUtf8Alloc(data, *pSize /
sizeof(WCHAR), &size);
257 const size_t rc = ConvertLineEndingToLF(pDstData, size);
258 WINPR_ASSERT(rc <= UINT32_MAX);
262 else if ((formatId == CF_TEXT) || (formatId == CF_OEMTEXT) ||
263 (formatId == ClipboardGetFormatId(clipboard, mime_text_plain)))
265 const size_t size = *pSize;
266 char* pDstData = calloc(size + 1,
sizeof(
char));
271 CopyMemory(pDstData, data, size);
272 const size_t rc = ConvertLineEndingToLF(pDstData, size);
273 WINPR_ASSERT(rc <= UINT32_MAX);
281static BOOL is_format_bitmap(wClipboard* clipboard, UINT32 formatId)
283 for (
size_t x = 0; x < ARRAYSIZE(mime_bitmap); x++)
285 const char* mime = mime_bitmap[x];
286 const UINT32 altFormatId = ClipboardGetFormatId(clipboard, mime);
287 if (altFormatId == formatId)
300static void* clipboard_synthesize_cf_dib(wClipboard* clipboard, UINT32 formatId,
const void* data,
305 BYTE* pDstData =
nullptr;
308#if defined(WINPR_UTILS_IMAGE_DIBv5)
309 if (formatId == CF_DIBV5)
311 WLog_WARN(TAG,
"[DIB] Unsupported destination format %s",
312 ClipboardGetFormatName(clipboard, formatId));
316 if (is_format_bitmap(clipboard, formatId))
319 wStream sbuffer = WINPR_C_ARRAY_INIT;
320 wStream* s = Stream_StaticConstInit(&sbuffer, data, SrcSize);
321 if (!readBitmapFileHeader(s, &pFileHeader))
325 pDstData = (BYTE*)malloc(DstSize);
331 CopyMemory(pDstData, data, DstSize);
337 WLog_WARN(TAG,
"[DIB] Unsupported destination format %s",
338 ClipboardGetFormatName(clipboard, formatId));
349#if defined(WINPR_UTILS_IMAGE_DIBv5)
350static void* clipboard_synthesize_cf_dibv5(wClipboard* clipboard, UINT32 formatId,
351 WINPR_ATTR_UNUSED
const void* data,
352 WINPR_ATTR_UNUSED UINT32* pSize)
354 if (formatId == CF_DIB)
356 WLog_WARN(TAG,
"[DIBv5] Unsupported destination format %s",
357 ClipboardGetFormatName(clipboard, formatId));
359 else if (is_format_bitmap(clipboard, formatId))
361 WLog_WARN(TAG,
"[DIBv5] Unsupported destination format %s",
362 ClipboardGetFormatName(clipboard, formatId));
366 BOOL handled = FALSE;
367#if defined(WINPR_UTILS_IMAGE_PNG)
369 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_png);
370 if (formatId == altFormatId)
375#if defined(WINPR_UTILS_IMAGE_JPEG)
377 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_jpeg);
378 if (formatId == altFormatId)
385 WLog_WARN(TAG,
"[DIBv5] Unsupported destination format %s",
386 ClipboardGetFormatName(clipboard, formatId));
395 size_t offset,
const void* data,
size_t size,
398 WINPR_ASSERT(pInfoHeader);
402 if ((pInfoHeader->biBitCount < 1) || (pInfoHeader->biBitCount > 32))
408 if ((pInfoHeader->biSize > size) || (offset > (size - pInfoHeader->biSize)))
412 if (bitmapOffset > DstSize)
415 wStream* s = Stream_New(
nullptr, DstSize);
420 fileHeader.bfType[0] =
'B';
421 fileHeader.bfType[1] =
'M';
422 fileHeader.bfSize = (UINT32)DstSize;
423 fileHeader.bfOffBits = (UINT32)bitmapOffset;
424 if (!writeBitmapFileHeader(s, &fileHeader))
427 if (!Stream_EnsureRemainingCapacity(s, size))
429 Stream_Write(s, data, size);
432 const size_t len = Stream_GetPosition(s);
437 *pSize = (UINT32)DstSize;
440 BYTE* dst = Stream_Buffer(s);
441 Stream_Free(s, FALSE);
446 Stream_Free(s, TRUE);
456static void* clipboard_synthesize_image_bmp(WINPR_ATTR_UNUSED wClipboard* clipboard,
457 UINT32 formatId,
const void* data, UINT32* pSize)
459 UINT32 SrcSize = *pSize;
461 if (formatId == CF_DIB)
466 wStream sbuffer = WINPR_C_ARRAY_INIT;
469 wStream* s = Stream_StaticConstInit(&sbuffer, data, SrcSize);
470 if (!readBitmapInfoHeader(s, &header, &offset))
473 return clipboard_prepend_bmp_header(&header, offset, data, SrcSize, pSize);
475#if defined(WINPR_UTILS_IMAGE_DIBv5)
476 else if (formatId == CF_DIBV5)
478 WLog_WARN(TAG,
"[BMP] Unsupported destination format %s",
479 ClipboardGetFormatName(clipboard, formatId));
484 WLog_WARN(TAG,
"[BMP] Unsupported destination format %s",
485 ClipboardGetFormatName(clipboard, formatId));
491#if defined(WINPR_UTILS_IMAGE_PNG) || defined(WINPR_UTILS_IMAGE_WEBP) || \
492 defined(WINPR_UTILS_IMAGE_JPEG)
493static void* clipboard_synthesize_image_bmp_to_format(wClipboard* clipboard, UINT32 formatId,
494 UINT32 bmpFormat,
const void* data,
497 WINPR_ASSERT(clipboard);
502 void* result =
nullptr;
504 wImage* img = winpr_image_new();
505 void* bmp = clipboard_synthesize_image_bmp(clipboard, formatId, data, pSize);
506 const UINT32 SrcSize = *pSize;
512 if (winpr_image_read_buffer(img, bmp, SrcSize) <= 0)
515 result = winpr_image_write_buffer(img, bmpFormat, &dsize);
518 if (dsize <= UINT32_MAX)
519 *pSize = (UINT32)dsize;
529 winpr_image_free(img, TRUE);
534#if defined(WINPR_UTILS_IMAGE_PNG)
535static void* clipboard_synthesize_image_bmp_to_png(wClipboard* clipboard, UINT32 formatId,
536 const void* data, UINT32* pSize)
538 return clipboard_synthesize_image_bmp_to_format(clipboard, formatId, WINPR_IMAGE_PNG, data,
543#if defined(WINPR_UTILS_IMAGE_PNG) || defined(WINPR_UTILS_IMAGE_WEBP) || \
544 defined(WINPR_UTILS_IMAGE_JPEG)
545static void* clipboard_synthesize_image_format_to_bmp(WINPR_ATTR_UNUSED wClipboard* clipboard,
546 WINPR_ATTR_UNUSED UINT32 srcFormatId,
547 const void* data, UINT32* pSize)
549 WINPR_ASSERT(clipboard);
554 const UINT32 SrcSize = *pSize;
556 wImage* image = winpr_image_new();
560 const int res = winpr_image_read_buffer(image, data, SrcSize);
564 dst = winpr_image_write_buffer(image, WINPR_IMAGE_BITMAP, &size);
571 *pSize = (UINT32)size;
574 winpr_image_free(image, TRUE);
583#if defined(WINPR_UTILS_IMAGE_PNG)
584static void* clipboard_synthesize_image_png_to_bmp(wClipboard* clipboard, UINT32 formatId,
585 const void* data, UINT32* pSize)
587 return clipboard_synthesize_image_format_to_bmp(clipboard, formatId, data, pSize);
591#if defined(WINPR_UTILS_IMAGE_WEBP)
592static void* clipboard_synthesize_image_bmp_to_webp(wClipboard* clipboard, UINT32 formatId,
593 const void* data, UINT32* pSize)
595 return clipboard_synthesize_image_bmp_to_format(clipboard, formatId, WINPR_IMAGE_WEBP, data,
599static void* clipboard_synthesize_image_webp_to_bmp(wClipboard* clipboard, UINT32 formatId,
600 const void* data, UINT32* pSize)
602 return clipboard_synthesize_image_format_to_bmp(clipboard, formatId, data, pSize);
606#if defined(WINPR_UTILS_IMAGE_JPEG)
607static void* clipboard_synthesize_image_bmp_to_jpeg(wClipboard* clipboard, UINT32 formatId,
608 const void* data, UINT32* pSize)
610 return clipboard_synthesize_image_bmp_to_format(clipboard, formatId, WINPR_IMAGE_JPEG, data,
614static void* clipboard_synthesize_image_jpeg_to_bmp(wClipboard* clipboard, UINT32 formatId,
615 const void* data, UINT32* pSize)
617 return clipboard_synthesize_image_format_to_bmp(clipboard, formatId, data, pSize);
627static void* clipboard_synthesize_html_format(wClipboard* clipboard, UINT32 formatId,
628 const void* pData, UINT32* pSize)
637 char* pDstData =
nullptr;
639 pSrcData.cpv =
nullptr;
641 WINPR_ASSERT(clipboard);
644 if (formatId == ClipboardGetFormatId(clipboard, mime_html))
646 const size_t SrcSize = (size_t)*pSize;
647 const size_t DstSize = SrcSize + 200;
648 char* body =
nullptr;
649 char num[20] = WINPR_C_ARRAY_INIT;
652 pSrcData.pv = calloc(1, SrcSize + 1);
655 memcpy(pSrcData.pv, pData, SrcSize);
659 if (SrcSize > INT_MAX)
663 if ((pSrcData.cpb[0] == 0xFE) && (pSrcData.cpb[1] == 0xFF))
665 if (!ByteSwapUnicode(pSrcData.pv, (SrcSize / 2)))
670 if ((pSrcData.cpb[0] == 0xFF) && (pSrcData.cpb[1] == 0xFE))
672 char* utfString = ConvertWCharNToUtf8Alloc(&pSrcData.pv[1],
673 (SrcSize /
sizeof(WCHAR)) - 1,
nullptr);
675 pSrcData.cpc = utfString;
681 pDstData = (
char*)calloc(1, DstSize);
686 (void)sprintf_s(pDstData, DstSize,
688 "StartHTML:0000000000\r\n"
689 "EndHTML:0000000000\r\n"
690 "StartFragment:0000000000\r\n"
691 "EndFragment:0000000000\r\n");
692 body = strstr(pSrcData.cpc,
"<body");
695 body = strstr(pSrcData.cpc,
"<BODY");
698 (void)sprintf_s(num,
sizeof(num),
"%010" PRIuz
"", strnlen(pDstData, DstSize));
699 CopyMemory(&pDstData[23], num, 10);
703 if (!winpr_str_append(
"<HTML><BODY>", pDstData, DstSize,
nullptr))
707 if (!winpr_str_append(
"<!--StartFragment-->", pDstData, DstSize,
nullptr))
711 (void)sprintf_s(num,
sizeof(num),
"%010" PRIuz
"", strnlen(pDstData, SrcSize + 200));
712 CopyMemory(&pDstData[69], num, 10);
714 if (!winpr_str_append(pSrcData.cpc, pDstData, DstSize,
nullptr))
718 (void)sprintf_s(num,
sizeof(num),
"%010" PRIuz
"", strnlen(pDstData, SrcSize + 200));
719 CopyMemory(&pDstData[93], num, 10);
721 if (!winpr_str_append(
"<!--EndFragment-->", pDstData, DstSize,
nullptr))
726 if (!winpr_str_append(
"</BODY></HTML>", pDstData, DstSize,
nullptr))
731 (void)sprintf_s(num,
sizeof(num),
"%010" PRIuz
"", strnlen(pDstData, DstSize));
732 CopyMemory(&pDstData[43], num, 10);
733 *pSize = (UINT32)strnlen(pDstData, DstSize) + 1;
740static char* html_pre_write(
wStream* s,
const char* what)
742 const size_t len = strlen(what);
743 Stream_Write(s, what, len);
744 char* startHTML = Stream_PointerAs(s,
char);
745 for (
size_t x = 0; x < 10; x++)
746 Stream_Write_INT8(s,
'0');
747 Stream_Write(s,
"\r\n", 2);
751static void html_fill_number(
char* pos,
size_t val)
753 char str[11] = WINPR_C_ARRAY_INIT;
754 (void)_snprintf(str,
sizeof(str),
"%010" PRIuz, val);
755 memcpy(pos, str, 10);
758static void* clipboard_wrap_html(
const char* mime,
const char* idata,
size_t ilength,
767 char* b64 = b64_encode((
const BYTE*)idata, ilength, &b64len);
771 const size_t mimelen = strlen(mime);
772 wStream* s = Stream_New(
nullptr, b64len + 225 + mimelen);
779 char* startHTML = html_pre_write(s,
"Version:0.9\r\nStartHTML:");
780 char* endHTML = html_pre_write(s,
"EndHTML:");
781 char* startFragment = html_pre_write(s,
"StartFragment:");
782 char* endFragment = html_pre_write(s,
"EndFragment:");
784 html_fill_number(startHTML, Stream_GetPosition(s));
785 const char html[] =
"<html><!--StartFragment-->";
786 Stream_Write(s, html, strnlen(html,
sizeof(html)));
788 html_fill_number(startFragment, Stream_GetPosition(s));
790 const char body[] =
"<body><img alt=\"FreeRDP clipboard image\" src=\"data:";
791 Stream_Write(s, body, strnlen(body,
sizeof(body)));
793 Stream_Write(s, mime, mimelen);
795 const char base64[] =
";base64,";
796 Stream_Write(s, base64, strnlen(base64,
sizeof(base64)));
797 Stream_Write(s, b64, b64len);
799 const char end[] =
"\"/></body>";
800 Stream_Write(s, end, strnlen(end,
sizeof(end)));
802 html_fill_number(endFragment, Stream_GetPosition(s));
804 const char fragend[] =
"<!--EndFragment--></html>";
805 Stream_Write(s, fragend, strnlen(fragend,
sizeof(fragend)));
806 html_fill_number(endHTML, Stream_GetPosition(s));
808 void* res = Stream_Buffer(s);
809 const size_t pos = Stream_GetPosition(s);
810 *plen = WINPR_ASSERTING_INT_CAST(uint32_t, pos);
811 Stream_Free(s, FALSE);
816static void* clipboard_wrap_format_to_html(uint32_t bmpFormat,
const char* idata,
size_t ilength,
820 wImage* img = winpr_image_new();
824 if (winpr_image_read_buffer(img, (
const BYTE*)idata, ilength) <= 0)
829 void* bmp = winpr_image_write_buffer(img, bmpFormat, &bmpsize);
833 res = clipboard_wrap_html(winpr_image_format_mime(bmpFormat), bmp, bmpsize, plen);
837 winpr_image_free(img, TRUE);
841static void* clipboard_wrap_bmp_to_html(
const char* idata,
size_t ilength, uint32_t* plen)
843 const uint32_t formats[] = { WINPR_IMAGE_WEBP, WINPR_IMAGE_PNG, WINPR_IMAGE_JPEG };
845 for (
size_t x = 0; x < ARRAYSIZE(formats); x++)
847 const uint32_t format = formats[x];
848 if (winpr_image_format_is_supported(format))
850 return clipboard_wrap_format_to_html(format, idata, ilength, plen);
853 const uint32_t bmpFormat = WINPR_IMAGE_BITMAP;
854 return clipboard_wrap_html(winpr_image_format_mime(bmpFormat), idata, ilength, plen);
857static void* clipboard_synthesize_image_html(WINPR_ATTR_UNUSED wClipboard* clipboard,
858 UINT32 formatId,
const void* data, UINT32* pSize)
862 const size_t datalen = *pSize;
867 return clipboard_wrap_html(mime_tiff, data, datalen, pSize);
871 uint32_t bmplen = *pSize;
872 void* bmp = clipboard_synthesize_image_bmp(clipboard, formatId, data, &bmplen);
875 WLog_WARN(TAG,
"failed to convert formatId 0x%08" PRIx32
" [%s]", formatId,
876 ClipboardGetFormatName(clipboard, formatId));
881 void* res = clipboard_wrap_bmp_to_html(bmp, bmplen, pSize);
887 const uint32_t idWebp = ClipboardRegisterFormat(clipboard, mime_webp);
888 const uint32_t idPng = ClipboardRegisterFormat(clipboard, mime_png);
889 const uint32_t idJpeg = ClipboardRegisterFormat(clipboard, mime_jpeg);
890 const uint32_t idTiff = ClipboardRegisterFormat(clipboard, mime_tiff);
891 if (formatId == idWebp)
893 return clipboard_wrap_html(mime_webp, data, datalen, pSize);
895 else if (formatId == idPng)
897 return clipboard_wrap_html(mime_png, data, datalen, pSize);
899 else if (formatId == idJpeg)
901 return clipboard_wrap_html(mime_jpeg, data, datalen, pSize);
903 else if (formatId == idTiff)
905 return clipboard_wrap_html(mime_tiff, data, datalen, pSize);
909 for (
size_t x = 0; x < ARRAYSIZE(mime_bitmap); x++)
911 const char* mime = mime_bitmap[x];
912 const uint32_t
id = ClipboardRegisterFormat(clipboard, mime);
915 return clipboard_wrap_bmp_to_html(data, datalen, pSize);
919 WLog_WARN(TAG,
"Unsupported image format id 0x%08" PRIx32
" [%s]", formatId,
920 ClipboardGetFormatName(clipboard, formatId));
933static void* clipboard_synthesize_text_html(wClipboard* clipboard, UINT32 formatId,
934 const void* data, UINT32* pSize)
936 char* pDstData =
nullptr;
938 if (formatId == ClipboardGetFormatId(clipboard, mime_ms_html))
940 const char* str = (
const char*)data;
941 const size_t SrcSize = *pSize;
942 const char* begStr = strstr(str,
"StartHTML:");
943 const char* endStr = strstr(str,
"EndHTML:");
945 if (!begStr || !endStr)
949 const long beg = strtol(&begStr[10],
nullptr, 10);
954 const long end = strtol(&endStr[8],
nullptr, 10);
956 if ((beg < 0) || (end < 0) || ((
size_t)beg > SrcSize) || ((
size_t)end > SrcSize) ||
957 (beg >= end) || (errno != 0))
960 const size_t DstSize = (size_t)(end - beg);
961 pDstData = calloc(DstSize + 1,
sizeof(
char));
966 CopyMemory(pDstData, &str[beg], DstSize);
967 const size_t rc = ConvertLineEndingToLF(pDstData, DstSize);
968 WINPR_ASSERT(rc <= UINT32_MAX);
975BOOL ClipboardInitSynthesizers(wClipboard* clipboard)
981 if (!ClipboardRegisterSynthesizer(clipboard, CF_TEXT, CF_OEMTEXT,
982 clipboard_synthesize_cf_oemtext))
984 if (!ClipboardRegisterSynthesizer(clipboard, CF_TEXT, CF_UNICODETEXT,
985 clipboard_synthesize_cf_unicodetext))
987 if (!ClipboardRegisterSynthesizer(clipboard, CF_TEXT, CF_LOCALE,
988 clipboard_synthesize_cf_locale))
991 UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_text_plain);
992 if (!ClipboardRegisterSynthesizer(clipboard, CF_TEXT, altFormatId,
993 clipboard_synthesize_utf8_string))
1000 if (!ClipboardRegisterSynthesizer(clipboard, CF_OEMTEXT, CF_TEXT,
1001 clipboard_synthesize_cf_text))
1003 if (!ClipboardRegisterSynthesizer(clipboard, CF_OEMTEXT, CF_UNICODETEXT,
1004 clipboard_synthesize_cf_unicodetext))
1006 if (!ClipboardRegisterSynthesizer(clipboard, CF_OEMTEXT, CF_LOCALE,
1007 clipboard_synthesize_cf_locale))
1009 UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_text_plain);
1010 if (!ClipboardRegisterSynthesizer(clipboard, CF_OEMTEXT, altFormatId,
1011 clipboard_synthesize_utf8_string))
1018 if (!ClipboardRegisterSynthesizer(clipboard, CF_UNICODETEXT, CF_TEXT,
1019 clipboard_synthesize_cf_text))
1021 if (!ClipboardRegisterSynthesizer(clipboard, CF_UNICODETEXT, CF_OEMTEXT,
1022 clipboard_synthesize_cf_oemtext))
1024 if (!ClipboardRegisterSynthesizer(clipboard, CF_UNICODETEXT, CF_LOCALE,
1025 clipboard_synthesize_cf_locale))
1027 UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_text_plain);
1028 if (!ClipboardRegisterSynthesizer(clipboard, CF_UNICODETEXT, altFormatId,
1029 clipboard_synthesize_utf8_string))
1036 UINT32 formatId = ClipboardRegisterFormat(clipboard, mime_text_plain);
1040 if (!ClipboardRegisterSynthesizer(clipboard, formatId, CF_TEXT,
1041 clipboard_synthesize_cf_text))
1043 if (!ClipboardRegisterSynthesizer(clipboard, formatId, CF_OEMTEXT,
1044 clipboard_synthesize_cf_oemtext))
1046 if (!ClipboardRegisterSynthesizer(clipboard, formatId, CF_UNICODETEXT,
1047 clipboard_synthesize_cf_unicodetext))
1049 if (!ClipboardRegisterSynthesizer(clipboard, formatId, CF_LOCALE,
1050 clipboard_synthesize_cf_locale))
1058 UINT32 formatId = ClipboardRegisterFormat(clipboard, mime_text_plain);
1062 if (!ClipboardRegisterSynthesizer(clipboard, formatId, CF_TEXT,
1063 clipboard_synthesize_cf_text))
1065 if (!ClipboardRegisterSynthesizer(clipboard, formatId, CF_OEMTEXT,
1066 clipboard_synthesize_cf_oemtext))
1068 if (!ClipboardRegisterSynthesizer(clipboard, formatId, CF_UNICODETEXT,
1069 clipboard_synthesize_cf_unicodetext))
1071 if (!ClipboardRegisterSynthesizer(clipboard, formatId, CF_LOCALE,
1072 clipboard_synthesize_cf_locale))
1077 const uint32_t htmlFormat = ClipboardRegisterFormat(clipboard, mime_ms_html);
1078 const uint32_t tiffFormat = ClipboardRegisterFormat(clipboard, mime_tiff);
1083 if (!ClipboardRegisterSynthesizer(clipboard, CF_TIFF, htmlFormat,
1084 clipboard_synthesize_image_html))
1086 if (!ClipboardRegisterSynthesizer(clipboard, tiffFormat, htmlFormat,
1087 clipboard_synthesize_image_html))
1094#if defined(WINPR_UTILS_IMAGE_DIBv5)
1095 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIB, CF_DIBV5,
1096 clipboard_synthesize_cf_dibv5))
1099 for (
size_t x = 0; x < ARRAYSIZE(mime_bitmap); x++)
1101 const char* mime = mime_bitmap[x];
1102 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime);
1103 if (altFormatId == 0)
1105 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIB, altFormatId,
1106 clipboard_synthesize_image_bmp))
1109 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIB, htmlFormat,
1110 clipboard_synthesize_image_html))
1117#if defined(WINPR_UTILS_IMAGE_DIBv5)
1119 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, CF_DIB, clipboard_synthesize_cf_dib))
1122 for (
size_t x = 0; x < ARRAYSIZE(mime_bitmap); x++)
1124 const char* mime = mime_bitmap[x];
1125 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime);
1126 if (altFormatId == 0)
1128 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
1129 clipboard_synthesize_image_bmp))
1132 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, htmlFormat,
1133 clipboard_synthesize_image_html))
1141 for (
size_t x = 0; x < ARRAYSIZE(mime_bitmap); x++)
1143 const char* mime = mime_bitmap[x];
1144 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime);
1145 if (altFormatId == 0)
1147 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIB,
1148 clipboard_synthesize_cf_dib))
1150#if defined(WINPR_UTILS_IMAGE_DIBv5)
1151 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIBV5,
1152 clipboard_synthesize_cf_dibv5))
1155 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, htmlFormat,
1156 clipboard_synthesize_image_html))
1163#if defined(WINPR_UTILS_IMAGE_PNG)
1165 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_png);
1166 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIB, altFormatId,
1167 clipboard_synthesize_image_bmp_to_png))
1169 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIB,
1170 clipboard_synthesize_image_png_to_bmp))
1172 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, htmlFormat,
1173 clipboard_synthesize_image_html))
1175#if defined(WINPR_UTILS_IMAGE_DIBv5)
1176 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
1177 clipboard_synthesize_image_bmp_to_png))
1179 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIBV5,
1180 clipboard_synthesize_image_png_to_bmp))
1189#if defined(WINPR_UTILS_IMAGE_WEBP)
1191 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_webp);
1192 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIB, altFormatId,
1193 clipboard_synthesize_image_bmp_to_webp))
1195 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIB,
1196 clipboard_synthesize_image_webp_to_bmp))
1198 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, htmlFormat,
1199 clipboard_synthesize_image_html))
1201#if defined(WINPR_UTILS_IMAGE_DIBv5)
1202 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
1203 clipboard_synthesize_image_bmp_to_webp))
1205 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIBV5,
1206 clipboard_synthesize_image_webp_to_bmp))
1215#if defined(WINPR_UTILS_IMAGE_JPEG)
1217 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_jpeg);
1218 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIB, altFormatId,
1219 clipboard_synthesize_image_bmp_to_jpeg))
1221 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIB,
1222 clipboard_synthesize_image_jpeg_to_bmp))
1224 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, htmlFormat,
1225 clipboard_synthesize_image_html))
1227#if defined(WINPR_UTILS_IMAGE_DIBv5)
1228 if (!ClipboardRegisterSynthesizer(clipboard, altFormatId, CF_DIBV5,
1229 clipboard_synthesize_image_jpeg_to_bmp))
1231 if (!ClipboardRegisterSynthesizer(clipboard, CF_DIBV5, altFormatId,
1232 clipboard_synthesize_image_bmp_to_jpeg))
1242 UINT32 formatId = ClipboardRegisterFormat(clipboard, mime_ms_html);
1246 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_html);
1247 if (!ClipboardRegisterSynthesizer(clipboard, formatId, altFormatId,
1248 clipboard_synthesize_text_html))
1257 UINT32 formatId = ClipboardRegisterFormat(clipboard, mime_html);
1261 const UINT32 altFormatId = ClipboardRegisterFormat(clipboard, mime_ms_html);
1262 if (!ClipboardRegisterSynthesizer(clipboard, formatId, altFormatId,
1263 clipboard_synthesize_html_format))